jsforce
Version:
Salesforce API Library for JavaScript
381 lines (371 loc) • 39.7 kB
JavaScript
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 _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties";
var _excluded = ["type", "attributes"];
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
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 _context12, _context13; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context12 = ownKeys(Object(t), !0)).call(_context12, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context13 = ownKeys(Object(t))).call(_context13, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && _getIteratorMethod(r) || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { var _context11; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context11 = {}.toString.call(r)).call(_context11, 8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.exec.js";
import "core-js/modules/es.regexp.test.js";
import "core-js/modules/es.regexp.to-string.js";
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
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 _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
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";
/**
* @file Salesforce SOAP API
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
*/
import { registerModule } from '../jsforce';
import SOAP from '../soap';
import { ApiSchemas } from './soap/schema';
/**
*
*/
function toSoapRecord(records) {
var _context;
return _mapInstanceProperty(_context = _Array$isArray(records) ? records : [records]).call(_context, function (record) {
var _context2;
var type = record.type,
attributes = record.attributes,
rec = _objectWithoutProperties(record, _excluded);
var t = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type);
if (!t) {
throw new Error('Given record is not including sObject type information');
}
var fieldsToNull = _filterInstanceProperty(_context2 = _Object$keys(rec)).call(_context2, function (field) {
return record[field] === null;
});
var _iterator = _createForOfIteratorHelper(fieldsToNull),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var field = _step.value;
delete rec[field];
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return fieldsToNull.length > 0 ? _objectSpread({
type: t,
fieldsToNull: fieldsToNull
}, rec) : _objectSpread({
type: t
}, rec);
});
}
/**
* API class for Partner SOAP call
*/
export var SoapApi = /*#__PURE__*/function () {
function SoapApi(conn) {
_classCallCheck(this, SoapApi);
this._conn = conn;
}
/**
* Call SOAP Api (Partner) endpoint
* @private
*/
return _createClass(SoapApi, [{
key: "_invoke",
value: (function () {
var _invoke2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, message, schema) {
var _context3;
var soapEndpoint, res;
return _regeneratorRuntime.wrap(function _callee$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
soapEndpoint = new SOAP(this._conn, {
xmlns: 'urn:partner.soap.sforce.com',
endpointUrl: _concatInstanceProperty(_context3 = "".concat(this._conn.instanceUrl, "/services/Soap/u/")).call(_context3, this._conn.version)
});
_context4.next = 3;
return soapEndpoint.invoke(method, message, schema ? {
result: schema
} : undefined, ApiSchemas);
case 3:
res = _context4.sent;
return _context4.abrupt("return", res.result);
case 5:
case "end":
return _context4.stop();
}
}, _callee, this);
}));
function _invoke(_x, _x2, _x3) {
return _invoke2.apply(this, arguments);
}
return _invoke;
}()
/**
* Converts a Lead into an Account, Contact, or (optionally) an Opportunity.
*/
)
}, {
key: "convertLead",
value: function () {
var _convertLead = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(leadConverts) {
var schema;
return _regeneratorRuntime.wrap(function _callee2$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
schema = _Array$isArray(leadConverts) ? [ApiSchemas.LeadConvertResult] : ApiSchemas.LeadConvertResult;
return _context5.abrupt("return", this._invoke('convertLead', {
leadConverts: leadConverts
}, schema));
case 2:
case "end":
return _context5.stop();
}
}, _callee2, this);
}));
function convertLead(_x4) {
return _convertLead.apply(this, arguments);
}
return convertLead;
}()
/**
* Merge up to three records into one
*/
}, {
key: "merge",
value: function () {
var _merge = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(mergeRequests) {
var schema;
return _regeneratorRuntime.wrap(function _callee3$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
schema = _Array$isArray(mergeRequests) ? [ApiSchemas.MergeResult] : ApiSchemas.MergeResult;
return _context6.abrupt("return", this._invoke('merge', {
mergeRequests: mergeRequests
}, schema));
case 2:
case "end":
return _context6.stop();
}
}, _callee3, this);
}));
function merge(_x5) {
return _merge.apply(this, arguments);
}
return merge;
}()
/**
* Delete records from the recycle bin immediately
*/
}, {
key: "emptyRecycleBin",
value: (function () {
var _emptyRecycleBin = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(ids) {
return _regeneratorRuntime.wrap(function _callee4$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
return _context7.abrupt("return", this._invoke('emptyRecycleBin', {
ids: ids
}, [ApiSchemas.EmptyRecycleBinResult]));
case 1:
case "end":
return _context7.stop();
}
}, _callee4, this);
}));
function emptyRecycleBin(_x6) {
return _emptyRecycleBin.apply(this, arguments);
}
return emptyRecycleBin;
}()
/**
* Returns information about the standard and custom apps available to the logged-in user
*/
)
}, {
key: "describeTabs",
value: (function () {
var _describeTabs = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
return _regeneratorRuntime.wrap(function _callee5$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
return _context8.abrupt("return", this._invoke('describeTabs', {}, [ApiSchemas.DescribeTabSetResult]));
case 1:
case "end":
return _context8.stop();
}
}, _callee5, this);
}));
function describeTabs() {
return _describeTabs.apply(this, arguments);
}
return describeTabs;
}()
/**
* Retrieves the current system timestamp (Coordinated Universal Time (UTC) time zone) from the API
*/
)
}, {
key: "getServerTimestamp",
value: (function () {
var _getServerTimestamp = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
return _regeneratorRuntime.wrap(function _callee6$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
return _context9.abrupt("return", this._invoke('getServerTimestamp', {}, ApiSchemas.GetServerTimestampResult));
case 1:
case "end":
return _context9.stop();
}
}, _callee6, this);
}));
function getServerTimestamp() {
return _getServerTimestamp.apply(this, arguments);
}
return getServerTimestamp;
}()
/**
* Retrieves personal information for the user associated with the current session
*/
)
}, {
key: "getUserInfo",
value: (function () {
var _getUserInfo = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7() {
return _regeneratorRuntime.wrap(function _callee7$(_context10) {
while (1) switch (_context10.prev = _context10.next) {
case 0:
return _context10.abrupt("return", this._invoke('getUserInfo', {}, ApiSchemas.GetUserInfoResult));
case 1:
case "end":
return _context10.stop();
}
}, _callee7, this);
}));
function getUserInfo() {
return _getUserInfo.apply(this, arguments);
}
return getUserInfo;
}()
/**
* Sets the specified user’s password to the specified value
*/
)
}, {
key: "setPassword",
value: function setPassword(userId, password) {
return this._invoke('setPassword', {
userId: userId,
password: password
}, 'string');
}
/**
* Resets the specified user’s password
*/
}, {
key: "resetPassword",
value: function resetPassword(userId) {
return this._invoke('resetPassword', {
userId: userId
}, ApiSchemas.ResetPasswordResult);
}
/**
* Adds one or more new records to your organization’s data
*/
}, {
key: "create",
value: function create(sObjects) {
var schema = _Array$isArray(sObjects) ? [ApiSchemas.SaveResult] : ApiSchemas.SaveResult;
var args = {
'@xmlns': 'urn:partner.soap.sforce.com',
'@xmlns:ns1': 'sobject.partner.soap.sforce.com',
'ns1:sObjects': toSoapRecord(sObjects)
};
return this._invoke('create', args, schema);
}
/**
* Updates one or more existing records in your organization’s data.
*/
}, {
key: "update",
value: function update(sObjects) {
var schema = _Array$isArray(sObjects) ? [ApiSchemas.SaveResult] : ApiSchemas.SaveResult;
var args = {
'@xmlns': 'urn:partner.soap.sforce.com',
'@xmlns:ns1': 'sobject.partner.soap.sforce.com',
'ns1:sObjects': toSoapRecord(sObjects)
};
return this._invoke('update', args, schema);
}
/**
* Creates new records and updates existing records in your organization’s data.
*/
}, {
key: "upsert",
value: function upsert(externalIdFieldName, sObjects) {
var schema = _Array$isArray(sObjects) ? [ApiSchemas.UpsertResult] : ApiSchemas.UpsertResult;
var args = {
'@xmlns': 'urn:partner.soap.sforce.com',
'@xmlns:ns1': 'sobject.partner.soap.sforce.com',
'ns1:externalIDFieldName': externalIdFieldName,
'ns1:sObjects': toSoapRecord(sObjects)
};
return this._invoke('upsert', args, schema);
}
/**
* Deletes one or more records from your organization’s data
*/
}, {
key: "delete",
value: function _delete(ids) {
var schema = _Array$isArray(ids) ? [ApiSchemas.DeleteResult] : ApiSchemas.DeleteResult;
var args = {
'@xmlns': 'urn:partner.soap.sforce.com',
'@xmlns:ns1': 'sobject.partner.soap.sforce.com',
'ns1:ids': ids
};
return this._invoke('delete', args, schema);
}
/**
* Undelete records from the recycle bin immediately
*/
}, {
key: "undelete",
value: function undelete(ids) {
var schema = [ApiSchemas.UndeleteResult];
var args = {
'@xmlns': 'urn:partner.soap.sforce.com',
'@xmlns:ns1': 'sobject.partner.soap.sforce.com',
'ns1:ids': ids
};
return this._invoke('undelete', args, schema);
}
}]);
}();
/*--------------------------------------------*/
/*
* Register hook in connection instantiation for dynamically adding this API module features
*/
registerModule('soap', function (conn) {
return new SoapApi(conn);
});
export default SoapApi;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3Rlck1vZHVsZSIsIlNPQVAiLCJBcGlTY2hlbWFzIiwidG9Tb2FwUmVjb3JkIiwicmVjb3JkcyIsIl9jb250ZXh0IiwiX21hcEluc3RhbmNlUHJvcGVydHkiLCJfQXJyYXkkaXNBcnJheSIsImNhbGwiLCJyZWNvcmQiLCJfY29udGV4dDIiLCJ0eXBlIiwiYXR0cmlidXRlcyIsInJlYyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInQiLCJFcnJvciIsImZpZWxkc1RvTnVsbCIsIl9maWx0ZXJJbnN0YW5jZVByb3BlcnR5IiwiX09iamVjdCRrZXlzIiwiZmllbGQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJlcnIiLCJlIiwiZiIsImxlbmd0aCIsIl9vYmplY3RTcHJlYWQiLCJTb2FwQXBpIiwiY29ubiIsIl9jbGFzc0NhbGxDaGVjayIsIl9jb25uIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwiX2ludm9rZTIiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIm1ldGhvZCIsIm1lc3NhZ2UiLCJzY2hlbWEiLCJfY29udGV4dDMiLCJzb2FwRW5kcG9pbnQiLCJyZXMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dDQiLCJwcmV2IiwibmV4dCIsInhtbG5zIiwiZW5kcG9pbnRVcmwiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsImluc3RhbmNlVXJsIiwidmVyc2lvbiIsImludm9rZSIsInJlc3VsdCIsInVuZGVmaW5lZCIsInNlbnQiLCJhYnJ1cHQiLCJzdG9wIiwiX2ludm9rZSIsIl94IiwiX3gyIiwiX3gzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfY29udmVydExlYWQiLCJfY2FsbGVlMiIsImxlYWRDb252ZXJ0cyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0NSIsIkxlYWRDb252ZXJ0UmVzdWx0IiwiY29udmVydExlYWQiLCJfeDQiLCJfbWVyZ2UiLCJfY2FsbGVlMyIsIm1lcmdlUmVxdWVzdHMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDYiLCJNZXJnZVJlc3VsdCIsIm1lcmdlIiwiX3g1IiwiX2VtcHR5UmVjeWNsZUJpbiIsIl9jYWxsZWU0IiwiaWRzIiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ3IiwiRW1wdHlSZWN5Y2xlQmluUmVzdWx0IiwiZW1wdHlSZWN5Y2xlQmluIiwiX3g2IiwiX2Rlc2NyaWJlVGFicyIsIl9jYWxsZWU1IiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ4IiwiRGVzY3JpYmVUYWJTZXRSZXN1bHQiLCJkZXNjcmliZVRhYnMiLCJfZ2V0U2VydmVyVGltZXN0YW1wIiwiX2NhbGxlZTYiLCJfY2FsbGVlNiQiLCJfY29udGV4dDkiLCJHZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQiLCJnZXRTZXJ2ZXJUaW1lc3RhbXAiLCJfZ2V0VXNlckluZm8iLCJfY2FsbGVlNyIsIl9jYWxsZWU3JCIsIl9jb250ZXh0MTAiLCJHZXRVc2VySW5mb1Jlc3VsdCIsImdldFVzZXJJbmZvIiwic2V0UGFzc3dvcmQiLCJ1c2VySWQiLCJwYXNzd29yZCIsInJlc2V0UGFzc3dvcmQiLCJSZXNldFBhc3N3b3JkUmVzdWx0IiwiY3JlYXRlIiwic09iamVjdHMiLCJTYXZlUmVzdWx0IiwiYXJncyIsInVwZGF0ZSIsInVwc2VydCIsImV4dGVybmFsSWRGaWVsZE5hbWUiLCJVcHNlcnRSZXN1bHQiLCJkZWxldGUiLCJEZWxldGVSZXN1bHQiLCJ1bmRlbGV0ZSIsIlVuZGVsZXRlUmVzdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb2FwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgU2FsZXNmb3JjZSBTT0FQIEFQSVxuICogQGF1dGhvciBTaGluaWNoaSBUb21pdGEgPHNoaW5pY2hpLnRvbWl0YUBnbWFpbC5jb20+XG4gKi9cbmltcG9ydCB7IHJlZ2lzdGVyTW9kdWxlIH0gZnJvbSAnLi4vanNmb3JjZSc7XG5pbXBvcnQgQ29ubmVjdGlvbiBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCBTT0FQIGZyb20gJy4uL3NvYXAnO1xuaW1wb3J0IHsgU2NoZW1hLCBSZWNvcmQsIFNvYXBTY2hlbWFEZWYsIFNvYXBTY2hlbWEgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICBBcGlTY2hlbWFzLFxuICBMZWFkQ29udmVydCxcbiAgTGVhZENvbnZlcnRSZXN1bHQsXG4gIE1lcmdlUmVxdWVzdCxcbiAgTWVyZ2VSZXN1bHQsXG4gIEVtcHR5UmVjeWNsZUJpblJlc3VsdCxcbiAgVW5kZWxldGVSZXN1bHQsXG4gIERlc2NyaWJlVGFiU2V0UmVzdWx0LFxuICBHZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQsXG4gIEdldFVzZXJJbmZvUmVzdWx0LFxuICBSZXNldFBhc3N3b3JkUmVzdWx0LFxuICBTYXZlUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbn0gZnJvbSAnLi9zb2FwL3NjaGVtYSc7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gdG9Tb2FwUmVjb3JkKHJlY29yZHM6IFJlY29yZCB8IFJlY29yZFtdKTogUmVjb3JkIHwgUmVjb3JkW10ge1xuICByZXR1cm4gKEFycmF5LmlzQXJyYXkocmVjb3JkcykgPyByZWNvcmRzIDogW3JlY29yZHNdKS5tYXAoKHJlY29yZCkgPT4ge1xuICAgIGNvbnN0IHsgdHlwZSwgYXR0cmlidXRlcywgLi4ucmVjIH0gPSByZWNvcmQ7XG4gICAgY29uc3QgdCA9IHR5cGUgfHwgYXR0cmlidXRlcz8udHlwZTtcbiAgICBpZiAoIXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2l2ZW4gcmVjb3JkIGlzIG5vdCBpbmNsdWRpbmcgc09iamVjdCB0eXBlIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkc1RvTnVsbCA9IE9iamVjdC5rZXlzKHJlYykuZmlsdGVyKFxuICAgICAgKGZpZWxkKSA9PiByZWNvcmRbZmllbGRdID09PSBudWxsLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb051bGwpIHtcbiAgICAgIGRlbGV0ZSByZWNbZmllbGRdO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzVG9OdWxsLmxlbmd0aCA+IDBcbiAgICAgID8geyB0eXBlOiB0LCBmaWVsZHNUb051bGwsIC4uLnJlYyB9XG4gICAgICA6IHsgdHlwZTogdCwgLi4ucmVjIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEFQSSBjbGFzcyBmb3IgUGFydG5lciBTT0FQIGNhbGxcbiAqL1xuZXhwb3J0IGNsYXNzIFNvYXBBcGk8UyBleHRlbmRzIFNjaGVtYT4ge1xuICBfY29ubjogQ29ubmVjdGlvbjxTPjtcblxuICBjb25zdHJ1Y3Rvcihjb25uOiBDb25uZWN0aW9uPFM+KSB7XG4gICAgdGhpcy5fY29ubiA9IGNvbm47XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBTT0FQIEFwaSAoUGFydG5lcikgZW5kcG9pbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9pbnZva2UoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogb2JqZWN0LFxuICAgIHNjaGVtYTogU29hcFNjaGVtYSB8IFNvYXBTY2hlbWFEZWYsXG4gICkge1xuICAgIGNvbnN0IHNvYXBFbmRwb2ludCA9IG5ldyBTT0FQKHRoaXMuX2Nvbm4sIHtcbiAgICAgIHhtbG5zOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgIGVuZHBvaW50VXJsOiBgJHt0aGlzLl9jb25uLmluc3RhbmNlVXJsfS9zZXJ2aWNlcy9Tb2FwL3UvJHt0aGlzLl9jb25uLnZlcnNpb259YCxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBzb2FwRW5kcG9pbnQuaW52b2tlKFxuICAgICAgbWV0aG9kLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNjaGVtYSA/ICh7IHJlc3VsdDogc2NoZW1hIH0gYXMgU29hcFNjaGVtYSkgOiB1bmRlZmluZWQsXG4gICAgICBBcGlTY2hlbWFzLFxuICAgICk7XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBMZWFkIGludG8gYW4gQWNjb3VudCwgQ29udGFjdCwgb3IgKG9wdGlvbmFsbHkpIGFuIE9wcG9ydHVuaXR5LlxuICAgKi9cbiAgY29udmVydExlYWQoXG4gICAgbGVhZENvbnZlcnRzOiBBcnJheTxQYXJ0aWFsPExlYWRDb252ZXJ0Pj4sXG4gICk6IFByb21pc2U8TGVhZENvbnZlcnRSZXN1bHRbXT47XG4gIGNvbnZlcnRMZWFkKGxlYWRDb252ZXJ0OiBQYXJ0aWFsPExlYWRDb252ZXJ0Pik6IFByb21pc2U8TGVhZENvbnZlcnRSZXN1bHQ+O1xuICBjb252ZXJ0TGVhZChcbiAgICBsZWFkQ29udmVydDogUGFydGlhbDxMZWFkQ29udmVydD4gfCBBcnJheTxQYXJ0aWFsPExlYWRDb252ZXJ0Pj4sXG4gICk6IFByb21pc2U8TGVhZENvbnZlcnRSZXN1bHQgfCBMZWFkQ29udmVydFJlc3VsdFtdPjtcbiAgYXN5bmMgY29udmVydExlYWQoXG4gICAgbGVhZENvbnZlcnRzOiBQYXJ0aWFsPExlYWRDb252ZXJ0PiB8IEFycmF5PFBhcnRpYWw8TGVhZENvbnZlcnQ+PixcbiAgKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gQXJyYXkuaXNBcnJheShsZWFkQ29udmVydHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLkxlYWRDb252ZXJ0UmVzdWx0XVxuICAgICAgOiBBcGlTY2hlbWFzLkxlYWRDb252ZXJ0UmVzdWx0O1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2NvbnZlcnRMZWFkJywgeyBsZWFkQ29udmVydHMgfSwgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSB1cCB0byB0aHJlZSByZWNvcmRzIGludG8gb25lXG4gICAqL1xuICBtZXJnZShtZXJnZVJlcXVlc3RzOiBBcnJheTxQYXJ0aWFsPE1lcmdlUmVxdWVzdD4+KTogUHJvbWlzZTxNZXJnZVJlc3VsdFtdPjtcbiAgbWVyZ2UobWVyZ2VSZXF1ZXN0OiBQYXJ0aWFsPE1lcmdlUmVxdWVzdD4pOiBQcm9taXNlPE1lcmdlUmVzdWx0PjtcbiAgbWVyZ2UoXG4gICAgbWVyZ2VSZXF1ZXN0OiBQYXJ0aWFsPE1lcmdlUmVxdWVzdD4gfCBBcnJheTxQYXJ0aWFsPE1lcmdlUmVxdWVzdD4+LFxuICApOiBQcm9taXNlPE1lcmdlUmVzdWx0IHwgTWVyZ2VSZXN1bHRbXT47XG4gIGFzeW5jIG1lcmdlKFxuICAgIG1lcmdlUmVxdWVzdHM6IFBhcnRpYWw8TWVyZ2VSZXF1ZXN0PiB8IEFycmF5PFBhcnRpYWw8TWVyZ2VSZXF1ZXN0Pj4sXG4gICkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkobWVyZ2VSZXF1ZXN0cylcbiAgICAgID8gW0FwaVNjaGVtYXMuTWVyZ2VSZXN1bHRdXG4gICAgICA6IEFwaVNjaGVtYXMuTWVyZ2VSZXN1bHQ7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgnbWVyZ2UnLCB7IG1lcmdlUmVxdWVzdHMgfSwgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcmVjb3JkcyBmcm9tIHRoZSByZWN5Y2xlIGJpbiBpbW1lZGlhdGVseVxuICAgKi9cbiAgYXN5bmMgZW1wdHlSZWN5Y2xlQmluKGlkczogc3RyaW5nW10pOiBQcm9taXNlPEVtcHR5UmVjeWNsZUJpblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2VtcHR5UmVjeWNsZUJpbicsIHsgaWRzIH0sIFtcbiAgICAgIEFwaVNjaGVtYXMuRW1wdHlSZWN5Y2xlQmluUmVzdWx0LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YW5kYXJkIGFuZCBjdXN0b20gYXBwcyBhdmFpbGFibGUgdG8gdGhlIGxvZ2dlZC1pbiB1c2VyXG4gICAqL1xuICBhc3luYyBkZXNjcmliZVRhYnMoKTogUHJvbWlzZTxEZXNjcmliZVRhYlNldFJlc3VsdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgnZGVzY3JpYmVUYWJzJywge30sIFtBcGlTY2hlbWFzLkRlc2NyaWJlVGFiU2V0UmVzdWx0XSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lc3RhbXAgKENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIChVVEMpIHRpbWUgem9uZSkgZnJvbSB0aGUgQVBJXG4gICAqL1xuICBhc3luYyBnZXRTZXJ2ZXJUaW1lc3RhbXAoKTogUHJvbWlzZTxHZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKFxuICAgICAgJ2dldFNlcnZlclRpbWVzdGFtcCcsXG4gICAgICB7fSxcbiAgICAgIEFwaVNjaGVtYXMuR2V0U2VydmVyVGltZXN0YW1wUmVzdWx0LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHBlcnNvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgdXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlckluZm8oKTogUHJvbWlzZTxHZXRVc2VySW5mb1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2dldFVzZXJJbmZvJywge30sIEFwaVNjaGVtYXMuR2V0VXNlckluZm9SZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNwZWNpZmllZCB1c2Vy4oCZcyBwYXNzd29yZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAqL1xuICBzZXRQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgnc2V0UGFzc3dvcmQnLCB7IHVzZXJJZCwgcGFzc3dvcmQgfSwgJ3N0cmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc3BlY2lmaWVkIHVzZXLigJlzIHBhc3N3b3JkXG4gICAqL1xuICByZXNldFBhc3N3b3JkKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcbiAgICAgICdyZXNldFBhc3N3b3JkJyxcbiAgICAgIHsgdXNlcklkIH0sXG4gICAgICBBcGlTY2hlbWFzLlJlc2V0UGFzc3dvcmRSZXN1bHQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9uZSBvciBtb3JlIG5ldyByZWNvcmRzIHRvIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBkYXRhXG4gICAqL1xuICBjcmVhdGUoc09iamVjdDogUmVjb3JkW10pOiBQcm9taXNlPFNhdmVSZXN1bHRbXT47XG4gIGNyZWF0ZShzT2JqZWN0OiBSZWNvcmQpOiBQcm9taXNlPFNhdmVSZXN1bHQ+O1xuICBjcmVhdGUoc09iamVjdHM6IFJlY29yZCB8IFJlY29yZFtdKTogUHJvbWlzZTxTYXZlUmVzdWx0IHwgU2F2ZVJlc3VsdFtdPjtcbiAgY3JlYXRlKHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkoc09iamVjdHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLlNhdmVSZXN1bHRdXG4gICAgICA6IEFwaVNjaGVtYXMuU2F2ZVJlc3VsdDtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgJ0B4bWxucyc6ICd1cm46cGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ0B4bWxuczpuczEnOiAnc29iamVjdC5wYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgICAnbnMxOnNPYmplY3RzJzogdG9Tb2FwUmVjb3JkKHNPYmplY3RzKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2NyZWF0ZScsIGFyZ3MsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBvbmUgb3IgbW9yZSBleGlzdGluZyByZWNvcmRzIGluIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBkYXRhLlxuICAgKi9cbiAgdXBkYXRlKHNPYmplY3Q6IFJlY29yZFtdKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICB1cGRhdGUoc09iamVjdDogUmVjb3JkKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgdXBkYXRlKHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSk6IFByb21pc2U8U2F2ZVJlc3VsdCB8IFNhdmVSZXN1bHRbXT47XG4gIHVwZGF0ZShzT2JqZWN0czogUmVjb3JkIHwgUmVjb3JkW10pIHtcbiAgICBjb25zdCBzY2hlbWEgPSBBcnJheS5pc0FycmF5KHNPYmplY3RzKVxuICAgICAgPyBbQXBpU2NoZW1hcy5TYXZlUmVzdWx0XVxuICAgICAgOiBBcGlTY2hlbWFzLlNhdmVSZXN1bHQ7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTpzT2JqZWN0cyc6IHRvU29hcFJlY29yZChzT2JqZWN0cyksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCd1cGRhdGUnLCBhcmdzLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IHJlY29yZHMgYW5kIHVwZGF0ZXMgZXhpc3RpbmcgcmVjb3JkcyBpbiB5b3VyIG9yZ2FuaXphdGlvbuKAmXMgZGF0YS5cbiAgICovXG4gIHVwc2VydChcbiAgICBleHRlcm5hbElkRmllbGROYW1lOiBzdHJpbmcsXG4gICAgc09iamVjdHM6IFJlY29yZFtdLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdFtdPjtcbiAgdXBzZXJ0KGV4dGVybmFsSWRGaWVsZE5hbWU6IHN0cmluZywgc09iamVjdDogUmVjb3JkKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+O1xuICB1cHNlcnQoXG4gICAgZXh0ZXJuYWxJZEZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQgfCBVcHNlcnRSZXN1bHRbXT47XG4gIHVwc2VydChleHRlcm5hbElkRmllbGROYW1lOiBzdHJpbmcsIHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkoc09iamVjdHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLlVwc2VydFJlc3VsdF1cbiAgICAgIDogQXBpU2NoZW1hcy5VcHNlcnRSZXN1bHQ7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTpleHRlcm5hbElERmllbGROYW1lJzogZXh0ZXJuYWxJZEZpZWxkTmFtZSxcbiAgICAgICduczE6c09iamVjdHMnOiB0b1NvYXBSZWNvcmQoc09iamVjdHMpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgndXBzZXJ0JywgYXJncywgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIG9uZSBvciBtb3JlIHJlY29yZHMgZnJvbSB5b3VyIG9yZ2FuaXphdGlvbuKAmXMgZGF0YVxuICAgKi9cbiAgZGVsZXRlKGlkczogc3RyaW5nIHwgc3RyaW5nW10pOiBQcm9taXNlPERlbGV0ZVJlc3VsdFtdPjtcbiAgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPERlbGV0ZVJlc3VsdD47XG4gIGRlbGV0ZShpZHM6IHN0cmluZyB8IHN0cmluZ1tdKTogUHJvbWlzZTxEZWxldGVSZXN1bHQgfCBEZWxldGVSZXN1bHRbXT47XG4gIGRlbGV0ZShpZHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gQXJyYXkuaXNBcnJheShpZHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLkRlbGV0ZVJlc3VsdF1cbiAgICAgIDogQXBpU2NoZW1hcy5EZWxldGVSZXN1bHQ7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTppZHMnOiBpZHMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCdkZWxldGUnLCBhcmdzLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZGVsZXRlIHJlY29yZHMgZnJvbSB0aGUgcmVjeWNsZSBiaW4gaW1tZWRpYXRlbHlcbiAgICovXG4gIHVuZGVsZXRlKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFVuZGVsZXRlUmVzdWx0W10+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBbQXBpU2NoZW1hcy5VbmRlbGV0ZVJlc3VsdF07XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTppZHMnOiBpZHMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCd1bmRlbGV0ZScsIGFyZ3MsIHNjaGVtYSk7XG4gIH1cbn1cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKlxuICogUmVnaXN0ZXIgaG9vayBpbiBjb25uZWN0aW9uIGluc3RhbnRpYXRpb24gZm9yIGR5bmFtaWNhbGx5IGFkZGluZyB0aGlzIEFQSSBtb2R1bGUgZmVhdHVyZXNcbiAqL1xucmVnaXN0ZXJNb2R1bGUoJ3NvYXAnLCAoY29ubikgPT4gbmV3IFNvYXBBcGkoY29ubikpO1xuXG5leHBvcnQgZGVmYXVsdCBTb2FwQXBpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxjQUFjLFFBQVEsWUFBWTtBQUUzQyxPQUFPQyxJQUFJLE1BQU0sU0FBUztBQUUxQixTQUNFQyxVQUFVLFFBY0wsZUFBZTs7QUFFdEI7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsWUFBWUEsQ0FBQ0MsT0FBMEIsRUFBcUI7RUFBQSxJQUFBQyxRQUFBO0VBQ25FLE9BQU9DLG9CQUFBLENBQUFELFFBQUEsR0FBQ0UsY0FBQSxDQUFjSCxPQUFPLENBQUMsR0FBR0EsT0FBTyxHQUFHLENBQUNBLE9BQU8sQ0FBQyxFQUFBSSxJQUFBLENBQUFILFFBQUEsRUFBTSxVQUFDSSxNQUFNLEVBQUs7SUFBQSxJQUFBQyxTQUFBO0lBQ3BFLElBQVFDLElBQUksR0FBeUJGLE1BQU0sQ0FBbkNFLElBQUk7TUFBRUMsVUFBVSxHQUFhSCxNQUFNLENBQTdCRyxVQUFVO01BQUtDLEdBQUcsR0FBQUMsd0JBQUEsQ0FBS0wsTUFBTSxFQUFBTSxTQUFBO0lBQzNDLElBQU1DLENBQUMsR0FBR0wsSUFBSSxLQUFJQyxVQUFVLGFBQVZBLFVBQVUsdUJBQVZBLFVBQVUsQ0FBRUQsSUFBSTtJQUNsQyxJQUFJLENBQUNLLENBQUMsRUFBRTtNQUNOLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHdEQUF3RCxDQUFDO0lBQzNFO0lBQ0EsSUFBTUMsWUFBWSxHQUFHQyx1QkFBQSxDQUFBVCxTQUFBLEdBQUFVLFlBQUEsQ0FBWVAsR0FBRyxDQUFDLEVBQUFMLElBQUEsQ0FBQUUsU0FBQSxFQUNuQyxVQUFDVyxLQUFLO01BQUEsT0FBS1osTUFBTSxDQUFDWSxLQUFLLENBQUMsS0FBSyxJQUFJO0lBQUEsQ0FDbkMsQ0FBQztJQUFDLElBQUFDLFNBQUEsR0FBQUMsMEJBQUEsQ0FDa0JMLFlBQVk7TUFBQU0s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