jsforce
Version:
Salesforce API Library for JavaScript
316 lines (306 loc) • 39.3 kB
JavaScript
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 _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck";
import _createClass from "@babel/runtime-corejs3/helpers/createClass";
import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn";
import _get from "@babel/runtime-corejs3/helpers/get";
import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf";
import _inherits from "@babel/runtime-corejs3/helpers/inherits";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
import "core-js/modules/es.array.join.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.number.constructor.js";
import "core-js/modules/es.regexp.exec.js";
import "core-js/modules/es.regexp.test.js";
import "core-js/modules/es.string.replace.js";
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
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; }
/**
* @file Manages method call to SOAP endpoint
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
*/
import HttpApi from './http-api';
import { isMapObject, isObject } from './util/function';
import { getBodySize } from './util/get-body-size';
/**
*
*/
function getPropsSchema(schema, schemaDict) {
if (schema.extends && schemaDict[schema.extends]) {
var extendSchema = schemaDict[schema.extends];
return _objectSpread(_objectSpread({}, getPropsSchema(extendSchema, schemaDict)), schema.props);
}
return schema.props;
}
function isNillValue(value) {
return value == null || isMapObject(value) && isMapObject(value.$) && value.$['xsi:nil'] === 'true';
}
/**
*
*/
export function castTypeUsingSchema(value, schema) {
var schemaDict = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (_Array$isArray(schema)) {
var _context;
var nillable = schema.length === 2 && schema[0] === '?';
var schema_ = nillable ? schema[1] : schema[0];
if (value == null) {
return nillable ? null : [];
}
return _mapInstanceProperty(_context = _Array$isArray(value) ? value : [value]).call(_context, function (v) {
return castTypeUsingSchema(v, schema_, schemaDict);
});
} else if (isMapObject(schema)) {
var _context2;
// if schema is Schema Definition, not schema element
if ('type' in schema && 'props' in schema && isMapObject(schema.props)) {
var props = getPropsSchema(schema, schemaDict);
return castTypeUsingSchema(value, props, schemaDict);
}
var _nillable = '?' in schema;
var _schema_ = '?' in schema ? schema['?'] : schema;
if (_nillable && isNillValue(value)) {
return null;
}
var obj = isMapObject(value) ? value : {};
return _reduceInstanceProperty(_context2 = _Object$keys(_schema_)).call(_context2, function (o, k) {
var s = _schema_[k];
var v = obj[k];
var nillable = _Array$isArray(s) && s.length === 2 && s[0] === '?' || isMapObject(s) && '?' in s || typeof s === 'string' && _startsWithInstanceProperty(s).call(s, '?');
if (typeof v === 'undefined' && nillable) {
return o;
}
return _objectSpread(_objectSpread({}, o), {}, _defineProperty({}, k, castTypeUsingSchema(v, s, schemaDict)));
}, obj);
} else {
var _nillable2 = typeof schema === 'string' && _startsWithInstanceProperty(schema).call(schema, '?');
var type = typeof schema === 'string' ? _nillable2 ? schema.substring(1) : schema : 'any';
switch (type) {
case 'string':
return isNillValue(value) ? _nillable2 ? null : '' : String(value);
case 'number':
return isNillValue(value) ? _nillable2 ? null : 0 : Number(value);
case 'boolean':
return isNillValue(value) ? _nillable2 ? null : false : value === 'true';
case 'null':
return null;
default:
{
if (schemaDict[type]) {
var cvalue = castTypeUsingSchema(value, schemaDict[type], schemaDict);
var isEmpty = isMapObject(cvalue) && _Object$keys(cvalue).length === 0;
return isEmpty && _nillable2 ? null : cvalue;
}
return value;
}
}
}
}
/**
* @private
*/
function lookupValue(obj, propRegExps) {
var regexp = propRegExps.shift();
if (!regexp) {
return obj;
}
if (isMapObject(obj)) {
for (var _i = 0, _Object$keys2 = _Object$keys(obj); _i < _Object$keys2.length; _i++) {
var prop = _Object$keys2[_i];
if (regexp.test(prop)) {
return lookupValue(obj[prop], propRegExps);
}
}
return null;
}
}
/**
* @private
*/
function toXML(name, value) {
if (isObject(name)) {
value = name;
name = null;
}
if (_Array$isArray(value)) {
return _mapInstanceProperty(value).call(value, function (v) {
return toXML(name, v);
}).join('');
} else {
var attrs = [];
if (value === null) {
attrs.push('xsi:nil="true"');
value = '';
} else if (isMapObject(value)) {
var elems = [];
for (var _i2 = 0, _Object$keys3 = _Object$keys(value); _i2 < _Object$keys3.length; _i2++) {
var k = _Object$keys3[_i2];
var v = value[k];
if (_startsWithInstanceProperty(k).call(k, '@')) {
var _context3;
var kk = k.substring(1);
attrs.push(_concatInstanceProperty(_context3 = "".concat(kk, "=\"")).call(_context3, v, "\""));
} else {
elems.push(toXML(k, v));
}
}
value = elems.join('');
} else {
value = String(value).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
}
var startTag = name ? '<' + name + (attrs.length > 0 ? ' ' + attrs.join(' ') : '') + '>' : '';
var endTag = name ? '</' + name + '>' : '';
return startTag + value + endTag;
}
}
/**
*
*/
/**
* Class for SOAP endpoint of Salesforce
*
* @protected
* @class
* @constructor
* @param {Connection} conn - Connection instance
* @param {Object} options - SOAP endpoint setting options
* @param {String} options.endpointUrl - SOAP endpoint URL
* @param {String} [options.xmlns] - XML namespace for method call (default is "urn:partner.soap.sforce.com")
*/
export var SOAP = /*#__PURE__*/function (_HttpApi) {
function SOAP(conn, options) {
var _this;
_classCallCheck(this, SOAP);
_this = _callSuper(this, SOAP, [conn, options]);
_this._endpointUrl = options.endpointUrl;
_this._xmlns = options.xmlns || 'urn:partner.soap.sforce.com';
return _this;
}
/**
* Invoke SOAP call using method and arguments
*/
_inherits(SOAP, _HttpApi);
return _createClass(SOAP, [{
key: "invoke",
value: (function () {
var _invoke = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, args, schema, schemaDict) {
var res;
return _regeneratorRuntime.wrap(function _callee$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return this.request({
method: 'POST',
url: this._endpointUrl,
headers: {
'Content-Type': 'text/xml',
SOAPAction: '""'
},
_message: _defineProperty({}, method, args)
});
case 2:
res = _context4.sent;
return _context4.abrupt("return", schema ? castTypeUsingSchema(res, schema, schemaDict) : res);
case 4:
case "end":
return _context4.stop();
}
}, _callee, this);
}));
function invoke(_x, _x2, _x3, _x4) {
return _invoke.apply(this, arguments);
}
return invoke;
}() /** @override */)
}, {
key: "beforeSend",
value: function beforeSend(request) {
request.body = this._createEnvelope(request._message);
var headers = request.headers || {};
var bodySize = getBodySize(request.body, request.headers);
if (request.method === 'POST' && !('transfer-encoding' in headers) && !('content-length' in headers) && !!bodySize) {
this._logger.debug("missing 'content-length' header, setting it to: ".concat(bodySize));
headers['content-length'] = String(bodySize);
}
request.headers = headers;
}
/** @override **/
}, {
key: "isSessionExpired",
value: function isSessionExpired(response) {
return response.statusCode === 500 && /<faultcode>[a-zA-Z]+:INVALID_SESSION_ID<\/faultcode>/.test(response.body);
}
/** @override **/
}, {
key: "parseError",
value: function parseError(body) {
var error = lookupValue(body, [/:Envelope$/, /:Body$/, /:Fault$/]);
return {
errorCode: error.faultcode,
message: error.faultstring
};
}
/** @override **/
}, {
key: "getResponseBody",
value: (function () {
var _getResponseBody = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(response) {
var body;
return _regeneratorRuntime.wrap(function _callee2$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
_context5.next = 2;
return _get(_getPrototypeOf(SOAP.prototype), "getResponseBody", this).call(this, response);
case 2:
body = _context5.sent;
return _context5.abrupt("return", lookupValue(body, [/:Envelope$/, /:Body$/, /.+/]));
case 4:
case "end":
return _context5.stop();
}
}, _callee2, this);
}));
function getResponseBody(_x5) {
return _getResponseBody.apply(this, arguments);
}
return getResponseBody;
}()
/**
* @private
*/
)
}, {
key: "_createEnvelope",
value: function _createEnvelope(message) {
var header = {};
var conn = this._conn;
if (conn.accessToken) {
header.SessionHeader = {
sessionId: conn.accessToken
};
}
if (conn._callOptions) {
header.CallOptions = conn._callOptions;
}
return ['<?xml version="1.0" encoding="UTF-8"?>', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"', ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"', ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">', '<soapenv:Header xmlns="' + this._xmlns + '">', toXML(header), '</soapenv:Header>', '<soapenv:Body xmlns="' + this._xmlns + '">', toXML(message), '</soapenv:Body>', '</soapenv:Envelope>'].join('');
}
}]);
}(HttpApi);
export default SOAP;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIdHRwQXBpIiwiaXNNYXBPYmplY3QiLCJpc09iamVjdCIsImdldEJvZHlTaXplIiwiZ2V0UHJvcHNTY2hlbWEiLCJzY2hlbWEiLCJzY2hlbWFEaWN0IiwiZXh0ZW5kcyIsImV4dGVuZFNjaGVtYSIsIl9vYmplY3RTcHJlYWQiLCJwcm9wcyIsImlzTmlsbFZhbHVlIiwidmFsdWUiLCIkIiwiY2FzdFR5cGVVc2luZ1NjaGVtYSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIl9BcnJheSRpc0FycmF5IiwiX2NvbnRleHQiLCJuaWxsYWJsZSIsInNjaGVtYV8iLCJfbWFwSW5zdGFuY2VQcm9wZXJ0eSIsImNhbGwiLCJ2IiwiX2NvbnRleHQyIiwib2JqIiwiX3JlZHVjZUluc3RhbmNlUHJvcGVydHkiLCJfT2JqZWN0JGtleXMiLCJvIiwiayIsInMiLCJfc3RhcnRzV2l0aEluc3RhbmNlUHJvcGVydHkiLCJfZGVmaW5lUHJvcGVydHkiLCJ0eXBlIiwic3Vic3RyaW5nIiwiU3RyaW5nIiwiTnVtYmVyIiwiY3ZhbHVlIiwiaXNFbXB0eSIsImxvb2t1cFZhbHVlIiwicHJvcFJlZ0V4cHMiLCJyZWdleHAiLCJzaGlmdCIsIl9pIiwiX09iamVjdCRrZXlzMiIsInByb3AiLCJ0ZXN0IiwidG9YTUwiLCJuYW1lIiwiam9pbiIsImF0dHJzIiwicHVzaCIsImVsZW1zIiwiX2kyIiwiX09iamVjdCRrZXlzMyIsIl9jb250ZXh0MyIsImtrIiwiX2NvbmNhdEluc3RhbmNlUHJvcGVydHkiLCJjb25jYXQiLCJyZXBsYWNlIiwic3RhcnRUYWciLCJlbmRUYWciLCJTT0FQIiwiX0h0dHBBcGkiLCJjb25uIiwib3B0aW9ucyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NhbGxTdXBlciIsIl9lbmRwb2ludFVybCIsImVuZHBvaW50VXJsIiwiX3htbG5zIiwieG1sbnMiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJfaW52b2tlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJtZXRob2QiLCJhcmdzIiwicmVzIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQ0IiwicHJldiIsIm5leHQiLCJyZXF1ZXN0IiwidXJsIiwiaGVhZGVycyIsIlNPQVBBY3Rpb24iLCJfbWVzc2FnZSIsInNlbnQiLCJhYnJ1cHQiLCJzdG9wIiwiaW52b2tlIiwiX3giLCJfeDIiLCJfeDMiLCJfeDQiLCJhcHBseSIsImJlZm9yZVNlbmQiLCJib2R5IiwiX2NyZWF0ZUVudmVsb3BlIiwiYm9keVNpemUiLCJfbG9nZ2VyIiwiZGVidWciLCJpc1Nlc3Npb25FeHBpcmVkIiwicmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwicGFyc2VFcnJvciIsImVycm9yIiwiZXJyb3JDb2RlIiwiZmF1bHRjb2RlIiwibWVzc2FnZSIsImZhdWx0c3RyaW5nIiwiX2dldFJlc3BvbnNlQm9keSIsIl9jYWxsZWUyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQ1IiwiX2dldCIsIl9nZXRQcm90b3R5cGVPZiIsInByb3RvdHlwZSIsImdldFJlc3BvbnNlQm9keSIsIl94NSIsImhlYWRlciIsIl9jb25uIiwiYWNjZXNzVG9rZW4iLCJTZXNzaW9uSGVhZGVyIiwic2Vzc2lvbklkIiwiX2NhbGxPcHRpb25zIiwiQ2FsbE9wdGlvbnMiXSwic291cmNlcyI6WyIuLi9zcmMvc29hcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIE1hbmFnZXMgbWV0aG9kIGNhbGwgdG8gU09BUCBlbmRwb2ludFxuICogQGF1dGhvciBTaGluaWNoaSBUb21pdGEgPHNoaW5pY2hpLnRvbWl0YUBnbWFpbC5jb20+XG4gKi9cbmltcG9ydCBIdHRwQXBpIGZyb20gJy4vaHR0cC1hcGknO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi9jb25uZWN0aW9uJztcbmltcG9ydCB7XG4gIFNjaGVtYSxcbiAgSHR0cFJlc3BvbnNlLFxuICBIdHRwUmVxdWVzdCxcbiAgU29hcFNjaGVtYSxcbiAgU29hcFNjaGVtYURlZixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBpc01hcE9iamVjdCwgaXNPYmplY3QgfSBmcm9tICcuL3V0aWwvZnVuY3Rpb24nO1xuaW1wb3J0IHsgZ2V0Qm9keVNpemUgfSBmcm9tICcuL3V0aWwvZ2V0LWJvZHktc2l6ZSc7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcHNTY2hlbWEoXG4gIHNjaGVtYTogU29hcFNjaGVtYURlZixcbiAgc2NoZW1hRGljdDogeyBbbmFtZTogc3RyaW5nXTogU29hcFNjaGVtYURlZiB9LFxuKTogU29hcFNjaGVtYURlZlsncHJvcHMnXSB7XG4gIGlmIChzY2hlbWEuZXh0ZW5kcyAmJiBzY2hlbWFEaWN0W3NjaGVtYS5leHRlbmRzXSkge1xuICAgIGNvbnN0IGV4dGVuZFNjaGVtYSA9IHNjaGVtYURpY3Rbc2NoZW1hLmV4dGVuZHNdO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5nZXRQcm9wc1NjaGVtYShleHRlbmRTY2hlbWEsIHNjaGVtYURpY3QpLFxuICAgICAgLi4uc2NoZW1hLnByb3BzLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHNjaGVtYS5wcm9wcztcbn1cblxuZnVuY3Rpb24gaXNOaWxsVmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgKGlzTWFwT2JqZWN0KHZhbHVlKSAmJlxuICAgICAgaXNNYXBPYmplY3QodmFsdWUuJCkgJiZcbiAgICAgIHZhbHVlLiRbJ3hzaTpuaWwnXSA9PT0gJ3RydWUnKVxuICApO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXN0VHlwZVVzaW5nU2NoZW1hKFxuICB2YWx1ZTogdW5rbm93bixcbiAgc2NoZW1hPzogU29hcFNjaGVtYSB8IFNvYXBTY2hlbWFEZWYsXG4gIHNjaGVtYURpY3Q6IHsgW25hbWU6IHN0cmluZ106IFNvYXBTY2hlbWFEZWYgfSA9IHt9LFxuKTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGNvbnN0IG5pbGxhYmxlID0gc2NoZW1hLmxlbmd0aCA9PT0gMiAmJiBzY2hlbWFbMF0gPT09ICc/JztcbiAgICBjb25zdCBzY2hlbWFfID0gbmlsbGFibGUgPyBzY2hlbWFbMV0gOiBzY2hlbWFbMF07XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuaWxsYWJsZSA/IG51bGwgOiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSkubWFwKCh2KSA9PlxuICAgICAgY2FzdFR5cGVVc2luZ1NjaGVtYSh2LCBzY2hlbWFfLCBzY2hlbWFEaWN0KSxcbiAgICApO1xuICB9IGVsc2UgaWYgKGlzTWFwT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAvLyBpZiBzY2hlbWEgaXMgU2NoZW1hIERlZmluaXRpb24sIG5vdCBzY2hlbWEgZWxlbWVudFxuICAgIGlmICgndHlwZScgaW4gc2NoZW1hICYmICdwcm9wcycgaW4gc2NoZW1hICYmIGlzTWFwT2JqZWN0KHNjaGVtYS5wcm9wcykpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gZ2V0UHJvcHNTY2hlbWEoc2NoZW1hIGFzIFNvYXBTY2hlbWFEZWYsIHNjaGVtYURpY3QpO1xuICAgICAgcmV0dXJuIGNhc3RUeXBlVXNpbmdTY2hlbWEodmFsdWUsIHByb3BzLCBzY2hlbWFEaWN0KTtcbiAgICB9XG4gICAgY29uc3QgbmlsbGFibGUgPSAnPycgaW4gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYV8gPVxuICAgICAgJz8nIGluIHNjaGVtYSA/IChzY2hlbWFbJz8nXSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA6IHNjaGVtYTtcbiAgICBpZiAobmlsbGFibGUgJiYgaXNOaWxsVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gaXNNYXBPYmplY3QodmFsdWUpID8gdmFsdWUgOiB7fTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hXykucmVkdWNlKChvLCBrKSA9PiB7XG4gICAgICBjb25zdCBzID0gc2NoZW1hX1trXTtcbiAgICAgIGNvbnN0IHYgPSBvYmpba107XG4gICAgICBjb25zdCBuaWxsYWJsZSA9XG4gICAgICAgIChBcnJheS5pc0FycmF5KHMpICYmIHMubGVuZ3RoID09PSAyICYmIHNbMF0gPT09ICc/JykgfHxcbiAgICAgICAgKGlzTWFwT2JqZWN0KHMpICYmICc/JyBpbiBzKSB8fFxuICAgICAgICAodHlwZW9mIHMgPT09ICdzdHJpbmcnICYmIHMuc3RhcnRzV2l0aCgnPycpKTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgJiYgbmlsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG87XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vLFxuICAgICAgICBba106IGNhc3RUeXBlVXNpbmdTY2hlbWEodiwgcywgc2NoZW1hRGljdCksXG4gICAgICB9O1xuICAgIH0sIG9iaik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbmlsbGFibGUgPSB0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJyAmJiBzY2hlbWEuc3RhcnRzV2l0aCgnPycpO1xuICAgIGNvbnN0IHR5cGUgPVxuICAgICAgdHlwZW9mIHNjaGVtYSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBuaWxsYWJsZVxuICAgICAgICAgID8gc2NoZW1hLnN1YnN0cmluZygxKVxuICAgICAgICAgIDogc2NoZW1hXG4gICAgICAgIDogJ2FueSc7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpID8gKG5pbGxhYmxlID8gbnVsbCA6ICcnKSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpID8gKG5pbGxhYmxlID8gbnVsbCA6IDApIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpXG4gICAgICAgICAgPyBuaWxsYWJsZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgOiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAoc2NoZW1hRGljdFt0eXBlXSkge1xuICAgICAgICAgIGNvbnN0IGN2YWx1ZSA9IGNhc3RUeXBlVXNpbmdTY2hlbWEoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHNjaGVtYURpY3RbdHlwZV0sXG4gICAgICAgICAgICBzY2hlbWFEaWN0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9XG4gICAgICAgICAgICBpc01hcE9iamVjdChjdmFsdWUpICYmIE9iamVjdC5rZXlzKGN2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgICAgIHJldHVybiBpc0VtcHR5ICYmIG5pbGxhYmxlID8gbnVsbCA6IGN2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgYXMgYW55O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvb2t1cFZhbHVlKG9iajogdW5rbm93biwgcHJvcFJlZ0V4cHM6IFJlZ0V4cFtdKTogdW5rbm93biB7XG4gIGNvbnN0IHJlZ2V4cCA9IHByb3BSZWdFeHBzLnNoaWZ0KCk7XG4gIGlmICghcmVnZXhwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoaXNNYXBPYmplY3Qob2JqKSkge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICBpZiAocmVnZXhwLnRlc3QocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIGxvb2t1cFZhbHVlKG9ialtwcm9wXSwgcHJvcFJlZ0V4cHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvWE1MKG5hbWU6IG9iamVjdCB8IHN0cmluZyB8IG51bGwsIHZhbHVlPzogYW55KTogc3RyaW5nIHtcbiAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgdmFsdWUgPSBuYW1lO1xuICAgIG5hbWUgPSBudWxsO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKHYpID0+IHRvWE1MKG5hbWUsIHYpKS5qb2luKCcnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhdHRycyA9IFtdO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgYXR0cnMucHVzaCgneHNpOm5pbD1cInRydWVcIicpO1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9IGVsc2UgaWYgKGlzTWFwT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgZWxlbXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlW2tdO1xuICAgICAgICBpZiAoay5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICBjb25zdCBrayA9IGsuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgIGF0dHJzLnB1c2goYCR7a2t9PVwiJHt2IGFzIHN0cmluZ31cImApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1zLnB1c2godG9YTUwoaywgdikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGVsZW1zLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAgICAgLnJlcGxhY2UoLycvZywgJyZhcG9zOycpO1xuICAgIH1cbiAgICBjb25zdCBzdGFydFRhZyA9IG5hbWVcbiAgICAgID8gJzwnICsgbmFtZSArIChhdHRycy5sZW5ndGggPiAwID8gJyAnICsgYXR0cnMuam9pbignICcpIDogJycpICsgJz4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGVuZFRhZyA9IG5hbWUgPyAnPC8nICsgbmFtZSArICc+JyA6ICcnO1xuICAgIHJldHVybiBzdGFydFRhZyArIHZhbHVlICsgZW5kVGFnO1xuICB9XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IHR5cGUgU09BUE9wdGlvbnMgPSB7XG4gIGVuZHBvaW50VXJsOiBzdHJpbmc7XG4gIHhtbG5zPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBDbGFzcyBmb3IgU09BUCBlbmRwb2ludCBvZiBTYWxlc2ZvcmNlXG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubiAtIENvbm5lY3Rpb24gaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gU09BUCBlbmRwb2ludCBzZXR0aW5nIG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmVuZHBvaW50VXJsIC0gU09BUCBlbmRwb2ludCBVUkxcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy54bWxuc10gLSBYTUwgbmFtZXNwYWNlIGZvciBtZXRob2QgY2FsbCAoZGVmYXVsdCBpcyBcInVybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbVwiKVxuICovXG5leHBvcnQgY2xhc3MgU09BUDxTIGV4dGVuZHMgU2NoZW1hPiBleHRlbmRzIEh0dHBBcGk8Uz4ge1xuICBfZW5kcG9pbnRVcmw6IHN0cmluZztcbiAgX3htbG5zOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29ubjogQ29ubmVjdGlvbjxTPiwgb3B0aW9uczogU09BUE9wdGlvbnMpIHtcbiAgICBzdXBlcihjb25uLCBvcHRpb25zKTtcbiAgICB0aGlzLl9lbmRwb2ludFVybCA9IG9wdGlvbnMuZW5kcG9pbnRVcmw7XG4gICAgdGhpcy5feG1sbnMgPSBvcHRpb25zLnhtbG5zIHx8ICd1cm46cGFydG5lci5zb2FwLnNmb3JjZS5jb20nO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBTT0FQIGNhbGwgdXNpbmcgbWV0aG9kIGFuZCBhcmd1bWVudHNcbiAgICovXG4gIGFzeW5jIGludm9rZShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBhcmdzOiBvYmplY3QsXG4gICAgc2NoZW1hPzogU29hcFNjaGVtYSB8IFNvYXBTY2hlbWFEZWYsXG4gICAgc2NoZW1hRGljdD86IHsgW25hbWU6IHN0cmluZ106IFNvYXBTY2hlbWFEZWYgfSxcbiAgKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiB0aGlzLl9lbmRwb2ludFVybCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCcsXG4gICAgICAgIFNPQVBBY3Rpb246ICdcIlwiJyxcbiAgICAgIH0sXG4gICAgICBfbWVzc2FnZTogeyBbbWV0aG9kXTogYXJncyB9LFxuICAgIH0gYXMgSHR0cFJlcXVlc3QpO1xuICAgIHJldHVybiBzY2hlbWEgPyBjYXN0VHlwZVVzaW5nU2NoZW1hKHJlcywgc2NoZW1hLCBzY2hlbWFEaWN0KSA6IHJlcztcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKi9cbiAgYmVmb3JlU2VuZChyZXF1ZXN0OiBIdHRwUmVxdWVzdCAmIHsgX21lc3NhZ2U6IG9iamVjdCB9KSB7XG4gICAgcmVxdWVzdC5ib2R5ID0gdGhpcy5fY3JlYXRlRW52ZWxvcGUocmVxdWVzdC5fbWVzc2FnZSk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzIHx8IHt9O1xuXG4gICAgY29uc3QgYm9keVNpemUgPSBnZXRCb2R5U2l6ZShyZXF1ZXN0LmJvZHksIHJlcXVlc3QuaGVhZGVycyk7XG5cbiAgICBpZiAoXG4gICAgICByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnICYmXG4gICAgICAhKCd0cmFuc2Zlci1lbmNvZGluZycgaW4gaGVhZGVycykgJiZcbiAgICAgICEoJ2NvbnRlbnQtbGVuZ3RoJyBpbiBoZWFkZXJzKSAmJlxuICAgICAgISFib2R5U2l6ZVxuICAgICkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgbWlzc2luZyAnY29udGVudC1sZW5ndGgnIGhlYWRlciwgc2V0dGluZyBpdCB0bzogJHtib2R5U2l6ZX1gLFxuICAgICAgKTtcbiAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPSBTdHJpbmcoYm9keVNpemUpO1xuICAgIH1cblxuICAgIHJlcXVlc3QuaGVhZGVycyA9IGhlYWRlcnM7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBpc1Nlc3Npb25FeHBpcmVkKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNTAwICYmXG4gICAgICAvPGZhdWx0Y29kZT5bYS16QS1aXSs6SU5WQUxJRF9TRVNTSU9OX0lEPFxcL2ZhdWx0Y29kZT4vLnRlc3QocmVzcG9uc2UuYm9keSlcbiAgICApO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgcGFyc2VFcnJvcihib2R5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBlcnJvciA9IGxvb2t1cFZhbHVlKGJvZHksIFsvOkVudmVsb3BlJC8sIC86Qm9keSQvLCAvOkZhdWx0JC9dKSBhcyB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yQ29kZTogZXJyb3IuZmF1bHRjb2RlLFxuICAgICAgbWVzc2FnZTogZXJyb3IuZmF1bHRzdHJpbmcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGFzeW5jIGdldFJlc3BvbnNlQm9keShyZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHN1cGVyLmdldFJlc3BvbnNlQm9keShyZXNwb25zZSk7XG4gICAgcmV0dXJuIGxvb2t1cFZhbHVlKGJvZHksIFsvOkVudmVsb3BlJC8sIC86Qm9keSQvLCAvLisvXSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGVFbnZlbG9wZShtZXNzYWdlOiBvYmplY3QpIHtcbiAgICBjb25zdCBoZWFkZXI6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgY29uc3QgY29ubiA9IHRoaXMuX2Nvbm47XG4gICAgaWYgKGNvbm4uYWNjZXNzVG9rZW4pIHtcbiAgICAgIGhlYWRlci5TZXNzaW9uSGVhZGVyID0geyBzZXNzaW9uSWQ6IGNvbm4uYWNjZXNzVG9rZW4gfTtcbiAgICB9XG4gICAgaWYgKGNvbm4uX2NhbGxPcHRpb25zKSB7XG4gICAgICBoZWFkZXIuQ2FsbE9wdGlvbnMgPSBjb25uLl9jYWxsT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4nLFxuICAgICAgJzxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiJyxcbiAgICAgICcgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIicsXG4gICAgICAnIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCI+JyxcbiAgICAgICc8c29hcGVudjpIZWFkZXIgeG1sbnM9XCInICsgdGhpcy5feG1sbnMgKyAnXCI+JyxcbiAgICAgIHRvWE1MKGhlYWRlciksXG4gICAgICAnPC9zb2FwZW52OkhlYWRlcj4nLFxuICAgICAgJzxzb2FwZW52OkJvZHkgeG1sbnM9XCInICsgdGhpcy5feG1sbnMgKyAnXCI+JyxcbiAgICAgIHRvWE1MKG1lc3NhZ2UpLFxuICAgICAgJzwvc29hcGVudjpCb2R5PicsXG4gICAgICAnPC9zb2FwZW52OkVudmVsb3BlPicsXG4gICAgXS5qb2luKCcnKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTT0FQO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLE9BQU8sTUFBTSxZQUFZO0FBU2hDLFNBQVNDLFdBQVcsRUFBRUMsUUFBUSxRQUFRLGlCQUFpQjtBQUN2RCxTQUFTQyxXQUFXLFFBQVEsc0JBQXNCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQSxTQUFTQyxjQUFjQSxDQUNyQkMsTUFBcUIsRUFDckJDLFVBQTZDLEVBQ3JCO0VBQ3hCLElBQUlELE1BQU0sQ0FBQ0UsT0FBTyxJQUFJRCxVQUFVLENBQUNELE1BQU0sQ0FBQ0UsT0FBTyxDQUFDLEVBQUU7SUFDaEQsSUFBTUMsWUFBWSxHQUFHRixVQUFVLENBQUNELE1BQU0sQ0FBQ0UsT0FBTyxDQUFDO0lBQy9DLE9BQUFFLGFBQUEsQ0FBQUEsYUFBQSxLQUNLTCxjQUFjLENBQUNJLFlBQVksRUFBRUYsVUFBVSxDQUFDLEdBQ3hDRCxNQUFNLENBQUNLLEtBQUs7RUFFbkI7RUFDQSxPQUFPTCxNQUFNLENBQUNLLEtBQUs7QUFDckI7QUFFQSxTQUFTQyxXQUFXQSxDQUFDQyxLQUFjLEVBQUU7RUFDbkMsT0FDRUEsS0FBSyxJQUFJLElBQUksSUFDWlgsV0FBVyxDQUFD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