UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

287 lines (283 loc) 39.2 kB
import "core-js/modules/es.error.cause.js"; import "core-js/modules/es.array.push.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.regexp.to-string.js"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"; import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each"; import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"; import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties"; import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property"; import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice"; import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from"; import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol"; import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method"; import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array"; import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator"; var _excluded = ["url", "body"]; 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 _context8; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context8 = Object.prototype.toString.call(o)).call(_context8, 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; } import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import _Promise from "@babel/runtime-corejs3/core-js-stable/promise"; import _setTimeout from "@babel/runtime-corejs3/core-js-stable/set-timeout"; import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes"; import _keysInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/keys"; function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context6, _context7; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context6 = ownKeys(Object(t), !0)).call(_context6, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context7 = ownKeys(Object(t))).call(_context7, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; } import { Readable } from 'stream'; import fetch, { Response } from 'node-fetch'; import createHttpsProxyAgent from 'https-proxy-agent'; import { createHttpRequestHandlerStreams, executeWithTimeout, isRedirect, performRedirectRequest } from './request-helper'; import { getLogger } from './util/logger'; import is from '@sindresorhus/is'; /** * */ var defaults = {}; /** * */ export function setDefaults(defaults_) { defaults = defaults_; } /** * */ function startFetchRequest(_x, _x2, _x3, _x4, _x5) { return _startFetchRequest.apply(this, arguments); } /** * */ function _startFetchRequest() { _startFetchRequest = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(request, options, input, output, emitter) { var _options$retry$status, _options$retry, _options$retry$maxRet, _options$retry2, _options$retry$minTim, _options$retry3, _options$retry$timeou, _options$retry4, _options$retry$errorC, _options$retry5, _options$retry$method, _options$retry6, _context4; var counter, logger, httpProxy, followRedirect, agent, url, body, rrequest, controller, retryCount, retryOpts, shouldRetryRequest, fetchWithRetries, res, headers, _iterator, _step, headerName, response, _args2 = arguments; return _regeneratorRuntime.wrap(function _callee2$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: counter = _args2.length > 5 && _args2[5] !== undefined ? _args2[5] : 0; logger = getLogger('fetch'); httpProxy = options.httpProxy, followRedirect = options.followRedirect; agent = httpProxy ? createHttpsProxyAgent(httpProxy) : undefined; url = request.url, body = request.body, rrequest = _objectWithoutProperties(request, _excluded); controller = new AbortController(); retryCount = 0; retryOpts = { statusCodes: (_options$retry$status = (_options$retry = options.retry) === null || _options$retry === void 0 ? void 0 : _options$retry.statusCodes) !== null && _options$retry$status !== void 0 ? _options$retry$status : [420, 429, 500, 502, 503, 504], maxRetries: (_options$retry$maxRet = (_options$retry2 = options.retry) === null || _options$retry2 === void 0 ? void 0 : _options$retry2.maxRetries) !== null && _options$retry$maxRet !== void 0 ? _options$retry$maxRet : 5, minTimeout: (_options$retry$minTim = (_options$retry3 = options.retry) === null || _options$retry3 === void 0 ? void 0 : _options$retry3.minTimeout) !== null && _options$retry$minTim !== void 0 ? _options$retry$minTim : 500, timeoutFactor: (_options$retry$timeou = (_options$retry4 = options.retry) === null || _options$retry4 === void 0 ? void 0 : _options$retry4.timeoutFactor) !== null && _options$retry$timeou !== void 0 ? _options$retry$timeou : 2, errorCodes: (_options$retry$errorC = (_options$retry5 = options.retry) === null || _options$retry5 === void 0 ? void 0 : _options$retry5.errorCodes) !== null && _options$retry$errorC !== void 0 ? _options$retry$errorC : ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ENETDOWN', 'ENETUNREACH', 'EHOSTDOWN', 'UND_ERR_SOCKET', 'ETIMEDOUT', 'EPIPE'], methods: (_options$retry$method = (_options$retry6 = options.retry) === null || _options$retry6 === void 0 ? void 0 : _options$retry6.methods) !== null && _options$retry$method !== void 0 ? _options$retry$method : ['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE'] }; shouldRetryRequest = function shouldRetryRequest(maxRetry, resOrErr) { var _context; if (!_includesInstanceProperty(_context = retryOpts.methods).call(_context, request.method)) return false; if (resOrErr instanceof Response) { var _context2; if (_includesInstanceProperty(_context2 = retryOpts.statusCodes).call(_context2, resOrErr.status)) { if (maxRetry === retryCount) { return false; } else { return true; } } return false; } else { var _retryOpts$errorCodes; if (maxRetry === retryCount) return false; // only retry on operational errors // https://github.com/node-fetch/node-fetch/blob/2.x/ERROR-HANDLING.md#error-handling-with-node-fetch if (resOrErr.name != 'FetchError') return false; if (is.nodeStream(body) && Readable.isDisturbed(body)) { logger.debug('Body of type stream was read, unable to retry request.'); return false; } if ('code' in resOrErr && resOrErr.code && retryOpts !== null && retryOpts !== void 0 && (_retryOpts$errorCodes = retryOpts.errorCodes) !== null && _retryOpts$errorCodes !== void 0 && _includesInstanceProperty(_retryOpts$errorCodes).call(_retryOpts$errorCodes, resOrErr.code)) return true; return false; } }; fetchWithRetries = /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var maxRetry, fetchOpts, _res, error, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: maxRetry = _args.length > 0 && _args[0] !== undefined ? _args[0] : retryOpts === null || retryOpts === void 0 ? void 0 : retryOpts.maxRetries; fetchOpts = _objectSpread(_objectSpread(_objectSpread({}, rrequest), input && /^(post|put|patch)$/i.test(request.method) ? { body: input } : {}), {}, { redirect: 'manual', signal: controller.signal, agent: agent }); _context3.prev = 2; _context3.next = 5; return fetch(url, fetchOpts); case 5: _res = _context3.sent; if (!shouldRetryRequest(retryOpts.maxRetries, _res)) { _context3.next = 16; break; } logger.debug("retrying for the ".concat(retryCount + 1, " time")); logger.debug('reason: statusCode match'); _context3.next = 11; return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount)); case 11: // NOTE: this event is only used by tests and will be removed at any time. // jsforce may switch to node's fetch which doesn't emit this event on retries. emitter.emit('retry', retryCount); retryCount++; _context3.next = 15; return fetchWithRetries(maxRetry); case 15: return _context3.abrupt("return", _context3.sent); case 16: return _context3.abrupt("return", _res); case 19: _context3.prev = 19; _context3.t0 = _context3["catch"](2); logger.debug('Request failed'); error = _context3.t0; // request was canceled by consumer (AbortController), skip retry and rethrow. if (!(error.name === 'AbortError')) { _context3.next = 25; break; } throw error; case 25: if (!shouldRetryRequest(retryOpts.maxRetries, error)) { _context3.next = 33; break; } logger.debug("retrying for the ".concat(retryCount + 1, " time")); logger.debug("Error: ".concat(_context3.t0.message)); _context3.next = 30; return sleep(retryCount === 0 ? retryOpts.minTimeout : retryOpts.minTimeout * Math.pow(retryOpts.timeoutFactor, retryCount)); case 30: // NOTE: this event is only used by tests and will be removed at any time. // jsforce may switch to node's fetch which doesn't emit this event on retries. emitter.emit('retry', retryCount); retryCount++; return _context3.abrupt("return", fetchWithRetries(maxRetry)); case 33: logger.debug('Skipping retry...'); if (!(maxRetry === retryCount)) { _context3.next = 38; break; } throw _context3.t0; case 38: throw _context3.t0; case 39: case "end": return _context3.stop(); } }, _callee, null, [[2, 19]]); })); return function fetchWithRetries() { return _ref.apply(this, arguments); }; }(); _context5.prev = 10; _context5.next = 13; return executeWithTimeout(fetchWithRetries, options.timeout, function () { return controller.abort(); }); case 13: res = _context5.sent; _context5.next = 20; break; case 16: _context5.prev = 16; _context5.t0 = _context5["catch"](10); emitter.emit('error', _context5.t0); return _context5.abrupt("return"); case 20: headers = {}; _iterator = _createForOfIteratorHelper(_keysInstanceProperty(_context4 = res.headers).call(_context4)); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { headerName = _step.value; headers[headerName.toLowerCase()] = res.headers.get(headerName); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } response = { statusCode: res.status, headers: headers }; if (!(followRedirect && isRedirect(response.statusCode))) { _context5.next = 27; break; } try { performRedirectRequest(request, response, followRedirect, counter, function (req) { return startFetchRequest(req, options, undefined, output, emitter, counter + 1); }); } catch (err) { emitter.emit('error', err); } return _context5.abrupt("return"); case 27: emitter.emit('response', response); res.body.pipe(output); case 29: case "end": return _context5.stop(); } }, _callee2, null, [[10, 16]]); })); return _startFetchRequest.apply(this, arguments); } export default function request(req) { var options_ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = _objectSpread(_objectSpread({}, defaults), options_); var _createHttpRequestHan = createHttpRequestHandlerStreams(req, options), input = _createHttpRequestHan.input, output = _createHttpRequestHan.output, stream = _createHttpRequestHan.stream; startFetchRequest(req, options, input, output, stream); return stream; } var sleep = function sleep(ms) { return new _Promise(function (r) { return _setTimeout(r, ms); }); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFkYWJsZSIsImZldGNoIiwiUmVzcG9uc2UiLCJjcmVhdGVIdHRwc1Byb3h5QWdlbnQiLCJjcmVhdGVIdHRwUmVxdWVzdEhhbmRsZXJTdHJlYW1zIiwiZXhlY3V0ZVdpdGhUaW1lb3V0IiwiaXNSZWRpcmVjdCIsInBlcmZvcm1SZWRpcmVjdFJlcXVlc3QiLCJnZXRMb2dnZXIiLCJpcyIsImRlZmF1bHRzIiwic2V0RGVmYXVsdHMiLCJkZWZhdWx0c18iLCJzdGFydEZldGNoUmVxdWVzdCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiX3N0YXJ0RmV0Y2hSZXF1ZXN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTIiLCJyZXF1ZXN0Iiwib3B0aW9ucyIsImlucHV0Iiwib3V0cHV0IiwiZW1pdHRlciIsIl9vcHRpb25zJHJldHJ5JHN0YXR1cyIsIl9vcHRpb25zJHJldHJ5IiwiX29wdGlvbnMkcmV0cnkkbWF4UmV0IiwiX29wdGlvbnMkcmV0cnkyIiwiX29wdGlvbnMkcmV0cnkkbWluVGltIiwiX29wdGlvbnMkcmV0cnkzIiwiX29wdGlvbnMkcmV0cnkkdGltZW91IiwiX29wdGlvbnMkcmV0cnk0IiwiX29wdGlvbnMkcmV0cnkkZXJyb3JDIiwiX29wdGlvbnMkcmV0cnk1IiwiX29wdGlvbnMkcmV0cnkkbWV0aG9kIiwiX29wdGlvbnMkcmV0cnk2IiwiX2NvbnRleHQ0IiwiY291bnRlciIsImxvZ2dlciIsImh0dHBQcm94eSIsImZvbGxvd1JlZGlyZWN0IiwiYWdlbnQiLCJ1cmwiLCJib2R5IiwicnJlcXVlc3QiLCJjb250cm9sbGVyIiwicmV0cnlDb3VudCIsInJldHJ5T3B0cyIsInNob3VsZFJldHJ5UmVxdWVzdCIsImZldGNoV2l0aFJldHJpZXMiLCJyZXMiLCJoZWFkZXJzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJoZWFkZXJOYW1lIiwicmVzcG9uc2UiLCJfYXJnczIiLCJ3cmFwIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQ1IiwicHJldiIsIm5leHQiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJBYm9ydENvbnRyb2xsZXIiLCJzdGF0dXNDb2RlcyIsInJldHJ5IiwibWF4UmV0cmllcyIsIm1pblRpbWVvdXQiLCJ0aW1lb3V0RmFjdG9yIiwiZXJyb3JDb2RlcyIsIm1ldGhvZHMiLCJtYXhSZXRyeSIsInJlc09yRXJyIiwiX2NvbnRleHQiLCJfaW5jbHVkZXNJbnN0YW5jZVByb3BlcnR5IiwiY2FsbCIsIm1ldGhvZCIsIl9jb250ZXh0MiIsInN0YXR1cyIsIl9yZXRyeU9wdHMkZXJyb3JDb2RlcyIsIm5hbWUiLCJub2RlU3RyZWFtIiwiaXNEaXN0dXJiZWQiLCJkZWJ1ZyIsImNvZGUiLCJfcmVmIiwiX2NhbGxlZSIsImZldGNoT3B0cyIsIl9yZXMiLCJlcnJvciIsIl9hcmdzIiwiX2NhbGxlZSQiLCJfY29udGV4dDMiLCJfb2JqZWN0U3ByZWFkIiwidGVzdCIsInJlZGlyZWN0Iiwic2lnbmFsIiwic2VudCIsImNvbmNhdCIsInNsZWVwIiwiTWF0aCIsInBvdyIsImVtaXQiLCJhYnJ1cHQiLCJ0MCIsIm1lc3NhZ2UiLCJzdG9wIiwidGltZW91dCIsImFib3J0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfa2V5c0luc3RhbmNlUHJvcGVydHkiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsInRvTG93ZXJDYXNlIiwiZ2V0IiwiZXJyIiwiZSIsImYiLCJzdGF0dXNDb2RlIiwicmVxIiwicGlwZSIsIm9wdGlvbnNfIiwiX2NyZWF0ZUh0dHBSZXF1ZXN0SGFuIiwic3RyZWFtIiwibXMiLCJfUHJvbWlzZSIsInIiLCJfc2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBEdXBsZXgsIFJlYWRhYmxlLCBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgZmV0Y2gsIHsgUmVzcG9uc2UsIFJlcXVlc3RJbml0LCBGZXRjaEVycm9yIH0gZnJvbSAnbm9kZS1mZXRjaCc7XG5pbXBvcnQgY3JlYXRlSHR0cHNQcm94eUFnZW50IGZyb20gJ2h0dHBzLXByb3h5LWFnZW50JztcbmltcG9ydCB7XG4gIGNyZWF0ZUh0dHBSZXF1ZXN0SGFuZGxlclN0cmVhbXMsXG4gIGV4ZWN1dGVXaXRoVGltZW91dCxcbiAgaXNSZWRpcmVjdCxcbiAgcGVyZm9ybVJlZGlyZWN0UmVxdWVzdCxcbn0gZnJvbSAnLi9yZXF1ZXN0LWhlbHBlcic7XG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL3V0aWwvbG9nZ2VyJztcbmltcG9ydCBpcyBmcm9tICdAc2luZHJlc29yaHVzL2lzJztcblxuLyoqXG4gKlxuICovXG5sZXQgZGVmYXVsdHM6IEh0dHBSZXF1ZXN0T3B0aW9ucyA9IHt9O1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0cyhkZWZhdWx0c186IEh0dHBSZXF1ZXN0T3B0aW9ucykge1xuICBkZWZhdWx0cyA9IGRlZmF1bHRzXztcbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEZldGNoUmVxdWVzdChcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3QsXG4gIG9wdGlvbnM6IEh0dHBSZXF1ZXN0T3B0aW9ucyxcbiAgaW5wdXQ6IFJlYWRhYmxlIHwgdW5kZWZpbmVkLFxuICBvdXRwdXQ6IFdyaXRhYmxlLFxuICBlbWl0dGVyOiBFdmVudEVtaXR0ZXIsXG4gIGNvdW50ZXI6IG51bWJlciA9IDAsXG4pIHtcbiAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKCdmZXRjaCcpO1xuICBjb25zdCB7IGh0dHBQcm94eSwgZm9sbG93UmVkaXJlY3QgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFnZW50ID0gaHR0cFByb3h5ID8gY3JlYXRlSHR0cHNQcm94eUFnZW50KGh0dHBQcm94eSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgdXJsLCBib2R5LCAuLi5ycmVxdWVzdCB9ID0gcmVxdWVzdDtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgY29uc3QgcmV0cnlPcHRzOiBSZXF1aXJlZDxIdHRwUmVxdWVzdE9wdGlvbnNbJ3JldHJ5J10+ID0ge1xuICAgIHN0YXR1c0NvZGVzOiBvcHRpb25zLnJldHJ5Py5zdGF0dXNDb2RlcyA/PyBbNDIwLCA0MjksIDUwMCwgNTAyLCA1MDMsIDUwNF0sXG4gICAgbWF4UmV0cmllczogb3B0aW9ucy5yZXRyeT8ubWF4UmV0cmllcyA/PyA1LFxuICAgIG1pblRpbWVvdXQ6IG9wdGlvbnMucmV0cnk/Lm1pblRpbWVvdXQgPz8gNTAwLFxuICAgIHRpbWVvdXRGYWN0b3I6IG9wdGlvbnMucmV0cnk/LnRpbWVvdXRGYWN0b3IgPz8gMixcbiAgICBlcnJvckNvZGVzOiBvcHRpb25zLnJldHJ5Py5lcnJvckNvZGVzID8/IFtcbiAgICAgICdFQ09OTlJFU0VUJyxcbiAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgJ0VOT1RGT1VORCcsXG4gICAgICAnRU5FVERPV04nLFxuICAgICAgJ0VORVRVTlJFQUNIJyxcbiAgICAgICdFSE9TVERPV04nLFxuICAgICAgJ1VORF9FUlJfU09DS0VUJyxcbiAgICAgICdFVElNRURPVVQnLFxuICAgICAgJ0VQSVBFJyxcbiAgICBdLFxuICAgIG1ldGhvZHM6IG9wdGlvbnMucmV0cnk/Lm1ldGhvZHMgPz8gW1xuICAgICAgJ0dFVCcsXG4gICAgICAnUFVUJyxcbiAgICAgICdIRUFEJyxcbiAgICAgICdPUFRJT05TJyxcbiAgICAgICdERUxFVEUnLFxuICAgIF0sXG4gIH07XG5cbiAgY29uc3Qgc2hvdWxkUmV0cnlSZXF1ZXN0ID0gKFxuICAgIG1heFJldHJ5OiBudW1iZXIsXG4gICAgcmVzT3JFcnI6IFJlc3BvbnNlIHwgRXJyb3IgfCBGZXRjaEVycm9yLFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXJldHJ5T3B0cy5tZXRob2RzLmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHJlc09yRXJyIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXRyeU9wdHMuc3RhdHVzQ29kZXMuaW5jbHVkZXMocmVzT3JFcnIuc3RhdHVzKSkge1xuICAgICAgICBpZiAobWF4UmV0cnkgPT09IHJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF4UmV0cnkgPT09IHJldHJ5Q291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gb25seSByZXRyeSBvbiBvcGVyYXRpb25hbCBlcnJvcnNcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL25vZGUtZmV0Y2gvYmxvYi8yLngvRVJST1ItSEFORExJTkcubWQjZXJyb3ItaGFuZGxpbmctd2l0aC1ub2RlLWZldGNoXG4gICAgICBpZiAocmVzT3JFcnIubmFtZSAhPSAnRmV0Y2hFcnJvcicpIHJldHVybiBmYWxzZTtcblxuICAgICAgaWYgKGlzLm5vZGVTdHJlYW0oYm9keSkgJiYgUmVhZGFibGUuaXNEaXN0dXJiZWQoYm9keSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdCb2R5IG9mIHR5cGUgc3RyZWFtIHdhcyByZWFkLCB1bmFibGUgdG8gcmV0cnkgcmVxdWVzdC4nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICdjb2RlJyBpbiByZXNPckVyciAmJlxuICAgICAgICByZXNPckVyci5jb2RlICYmXG4gICAgICAgIHJldHJ5T3B0cz8uZXJyb3JDb2Rlcz8uaW5jbHVkZXMocmVzT3JFcnIuY29kZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZmV0Y2hXaXRoUmV0cmllcyA9IGFzeW5jIChcbiAgICBtYXhSZXRyeSA9IHJldHJ5T3B0cz8ubWF4UmV0cmllcyxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgIGNvbnN0IGZldGNoT3B0czogUmVxdWVzdEluaXQgPSB7XG4gICAgICAuLi5ycmVxdWVzdCxcbiAgICAgIC4uLihpbnB1dCAmJiAvXihwb3N0fHB1dHxwYXRjaCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZClcbiAgICAgICAgPyB7IGJvZHk6IGlucHV0IH1cbiAgICAgICAgOiB7fSksXG4gICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgYWdlbnQsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIGZldGNoT3B0cyk7XG4gICAgICBpZiAoc2hvdWxkUmV0cnlSZXF1ZXN0KHJldHJ5T3B0cy5tYXhSZXRyaWVzLCByZXMpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmV0cnlpbmcgZm9yIHRoZSAke3JldHJ5Q291bnQgKyAxfSB0aW1lYCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygncmVhc29uOiBzdGF0dXNDb2RlIG1hdGNoJyk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoXG4gICAgICAgICAgcmV0cnlDb3VudCA9PT0gMFxuICAgICAgICAgICAgPyByZXRyeU9wdHMubWluVGltZW91dFxuICAgICAgICAgICAgOiByZXRyeU9wdHMubWluVGltZW91dCAqIHJldHJ5T3B0cy50aW1lb3V0RmFjdG9yICoqIHJldHJ5Q291bnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTk9URTogdGhpcyBldmVudCBpcyBvbmx5IHVzZWQgYnkgdGVzdHMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhdCBhbnkgdGltZS5cbiAgICAgICAgLy8ganNmb3JjZSBtYXkgc3dpdGNoIHRvIG5vZGUncyBmZXRjaCB3aGljaCBkb2Vzbid0IGVtaXQgdGhpcyBldmVudCBvbiByZXRyaWVzLlxuICAgICAgICBlbWl0dGVyLmVtaXQoJ3JldHJ5JywgcmV0cnlDb3VudCk7XG4gICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hXaXRoUmV0cmllcyhtYXhSZXRyeSk7XG4gICAgICB9XG4gICAgICAvLyBzaG91bGQgd2UgdGhyb3cgaGVyZSBpZiB0aGUgbWF4UmV0cnkgYWxyZWFkeSBoYXBwZW5lZCBhbmQgc3RpbGwgZ290IHRoZSBzYW1lIHN0YXR1c0NvZGU/XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGZhaWxlZCcpO1xuICAgICAgY29uc3QgZXJyb3IgPSBlcnIgYXMgRXJyb3IgfCBGZXRjaEVycm9yO1xuXG4gICAgICAvLyByZXF1ZXN0IHdhcyBjYW5jZWxlZCBieSBjb25zdW1lciAoQWJvcnRDb250cm9sbGVyKSwgc2tpcCByZXRyeSBhbmQgcmV0aHJvdy5cbiAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZXRyeVJlcXVlc3QocmV0cnlPcHRzLm1heFJldHJpZXMsIGVycm9yKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYHJldHJ5aW5nIGZvciB0aGUgJHtyZXRyeUNvdW50ICsgMX0gdGltZWApO1xuICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoXG4gICAgICAgICAgcmV0cnlDb3VudCA9PT0gMFxuICAgICAgICAgICAgPyByZXRyeU9wdHMubWluVGltZW91dFxuICAgICAgICAgICAgOiByZXRyeU9wdHMubWluVGltZW91dCAqIHJldHJ5T3B0cy50aW1lb3V0RmFjdG9yICoqIHJldHJ5Q291bnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTk9URTogdGhpcyBldmVudCBpcyBvbmx5IHVzZWQgYnkgdGVzdHMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhdCBhbnkgdGltZS5cbiAgICAgICAgLy8ganNmb3JjZSBtYXkgc3dpdGNoIHRvIG5vZGUncyBmZXRjaCB3aGljaCBkb2Vzbid0IGVtaXQgdGhpcyBldmVudCBvbiByZXRyaWVzLlxuICAgICAgICBlbWl0dGVyLmVtaXQoJ3JldHJ5JywgcmV0cnlDb3VudCk7XG4gICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICByZXR1cm4gZmV0Y2hXaXRoUmV0cmllcyhtYXhSZXRyeSk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgcmV0cnkuLi4nKTtcblxuICAgICAgaWYgKG1heFJldHJ5ID09PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgbGV0IHJlczogUmVzcG9uc2U7XG5cbiAgdHJ5IHtcbiAgICByZXMgPSBhd2FpdCBleGVjdXRlV2l0aFRpbWVvdXQoZmV0Y2hXaXRoUmV0cmllcywgb3B0aW9ucy50aW1lb3V0LCAoKSA9PlxuICAgICAgY29udHJvbGxlci5hYm9ydCgpLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVtaXR0ZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIGZvciAoY29uc3QgaGVhZGVyTmFtZSBvZiByZXMuaGVhZGVycy5rZXlzKCkpIHtcbiAgICBoZWFkZXJzW2hlYWRlck5hbWUudG9Mb3dlckNhc2UoKV0gPSByZXMuaGVhZGVycy5nZXQoaGVhZGVyTmFtZSk7XG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1cyxcbiAgICBoZWFkZXJzLFxuICB9O1xuICBpZiAoZm9sbG93UmVkaXJlY3QgJiYgaXNSZWRpcmVjdChyZXNwb25zZS5zdGF0dXNDb2RlKSkge1xuICAgIHRyeSB7XG4gICAgICBwZXJmb3JtUmVkaXJlY3RSZXF1ZXN0KFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXNwb25zZSxcbiAgICAgICAgZm9sbG93UmVkaXJlY3QsXG4gICAgICAgIGNvdW50ZXIsXG4gICAgICAgIChyZXEpID0+XG4gICAgICAgICAgc3RhcnRGZXRjaFJlcXVlc3QoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgZW1pdHRlcixcbiAgICAgICAgICAgIGNvdW50ZXIgKyAxLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZW1pdHRlci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBlbWl0dGVyLmVtaXQoJ3Jlc3BvbnNlJywgcmVzcG9uc2UpO1xuICByZXMuYm9keS5waXBlKG91dHB1dCk7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVxdWVzdChcbiAgcmVxOiBIdHRwUmVxdWVzdCxcbiAgb3B0aW9uc186IEh0dHBSZXF1ZXN0T3B0aW9ucyA9IHt9LFxuKTogRHVwbGV4IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uZGVmYXVsdHMsIC4uLm9wdGlvbnNfIH07XG4gIGNvbnN0IHsgaW5wdXQsIG91dHB1dCwgc3RyZWFtIH0gPSBjcmVhdGVIdHRwUmVxdWVzdEhhbmRsZXJTdHJlYW1zKFxuICAgIHJlcSxcbiAgICBvcHRpb25zLFxuICApO1xuICBzdGFydEZldGNoUmVxdWVzdChyZXEsIG9wdGlvbnMsIGlucHV0LCBvdXRwdXQsIHN0cmVhbSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxTQUFpQkEsUUFBUSxRQUFrQixRQUFRO0FBQ25ELE9BQU9DLEtBQUssSUFBSUMsUUFBUSxRQUFpQyxZQUFZO0FBQ3JFLE9BQU9DLHFCQUFxQixNQUFNLG1CQUFtQjtBQUNyRCxTQUNFQywrQkFBK0IsRUFDL0JDLGtCQUFrQixFQUNsQkMsVUFBVSxFQUNWQyxzQkFBc0IsUUFDakIsa0JBQWtCO0FBRXpCLFNBQVNDLFNBQVMsUUFBUSxlQUFlO0FBQ3pDLE9BQU9DLEVBQUUsTUFBTSxrQkFBa0I7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBLElBQUlDLFFBQTRCLEdBQUcsQ0FBQyxDQUFDOztBQUVyQztBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLFdBQVdBLENBQUNDLFNBQTZCLEVBQUU7RUFDekRGLFFBQVEsR0FBR0UsU0FBUztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFGQSxTQUdlQyxpQkFBaUJBLENBQUFDLEVBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQTtFQUFBLE9BQUFDLGtCQUFBLENBQUFDLEtBQUEsT0FBQUMsU0FBQTtBQUFBO0FBa01oQztBQUNBO0FBQ0E7QUFGQSxTQUFBRixtQkFBQTtFQUFBQSxrQkFBQSxHQUFBRyxpQkFBQSxlQUFBQyxt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