PDF_Generation_and_Automation/node_modules/jsforce/browser/query.js
2025-08-24 12:01:08 +05:30

1240 lines
144 KiB
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 _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 _typeof from "@babel/runtime-corejs3/helpers/typeof";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray";
import _toConsumableArray from "@babel/runtime-corejs3/helpers/toConsumableArray";
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties";
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 _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf";
import _inherits from "@babel/runtime-corejs3/helpers/inherits";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
var _excluded = ["fields", "includes", "sort"],
_excluded2 = ["conditions", "fields"];
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 _context37; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context37 = {}.toString.call(r)).call(_context37, 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 _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.includes.js";
import "core-js/modules/es.array.join.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.array.sort.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 "core-js/modules/es.string.includes.js";
import "core-js/modules/es.string.split.js";
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; })(); }
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 _context35, _context36; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context35 = ownKeys(Object(t), !0)).call(_context35, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context36 = ownKeys(Object(t))).call(_context36, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
import _sortInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/sort";
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
import _JSON$stringify from "@babel/runtime-corejs3/core-js-stable/json/stringify";
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
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 _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
import _Object$entries from "@babel/runtime-corejs3/core-js-stable/object/entries";
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
/**
* @file Manages query for records in Salesforce
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
*/
import { EventEmitter } from 'events';
import { getLogger } from './util/logger';
import RecordStream, { Serializable } from './record-stream';
import { createSOQL } from './soql-builder';
/**
*
*/
/**
*
*/
/**
*
*/
var ResponseTargetValues = ['QueryResult', 'Records', 'SingleRecord', 'Count'];
export var ResponseTargets = _reduceInstanceProperty(ResponseTargetValues).call(ResponseTargetValues, function (values, target) {
return _objectSpread(_objectSpread({}, values), {}, _defineProperty({}, target, target));
}, {});
// QRT extends 'Count'
/**
*
*/
var DEFAULT_BULK_THRESHOLD = 200;
var DEFAULT_BULK_API_VERSION = 1;
/**
* Query
*/
export var Query = /*#__PURE__*/function (_EventEmitter) {
/**
*
*/
function Query(conn, config, options) {
var _this;
_classCallCheck(this, Query);
_this = _callSuper(this, Query);
_defineProperty(_this, "_config", {});
_defineProperty(_this, "_children", []);
_defineProperty(_this, "_executed", false);
_defineProperty(_this, "_finished", false);
_defineProperty(_this, "_chaining", false);
_defineProperty(_this, "totalSize", 0);
_defineProperty(_this, "totalFetched", 0);
_defineProperty(_this, "records", []);
/**
* Synonym of Query#skip()
*/
_defineProperty(_this, "offset", _this.skip);
/**
* Synonym of Query#sort()
*/
_defineProperty(_this, "orderby", _sortInstanceProperty(_this));
/**
* Synonym of Query#execute()
*/
_defineProperty(_this, "exec", _this.execute);
/**
* Synonym of Query#execute()
*/
_defineProperty(_this, "run", _this.execute);
/**
* Synonym of Query#destroy()
*/
_defineProperty(_this, "delete", _this.destroy);
/**
* Synonym of Query#destroy()
*/
_defineProperty(_this, "del", _this.destroy);
_this._conn = conn;
_this._logger = conn._logLevel ? Query._logger.createInstance(conn._logLevel) : Query._logger;
if (typeof config === 'string') {
_this._soql = config;
_this._logger.debug("config is soql: ".concat(config));
} else if (typeof config.locator === 'string') {
var locator = config.locator;
_this._logger.debug("config is locator: ".concat(locator));
_this._locator = _includesInstanceProperty(locator).call(locator, '/') ? _this.urlToLocator(locator) : locator;
} else {
_this._logger.debug("config is QueryConfig: ".concat(_JSON$stringify(config)));
var _ref = config,
_fields = _ref.fields,
includes = _includesInstanceProperty(_ref),
_sort2 = _sortInstanceProperty(_ref),
_config = _objectWithoutProperties(_ref, _excluded);
_this._config = _config;
_this.select(_fields);
if (includes) {
_this.includeChildren(includes);
}
if (_sort2) {
_sortInstanceProperty(_this).call(_this, _sort2);
}
}
_this._options = _objectSpread({
headers: {},
maxFetch: 10000,
autoFetch: false,
scanAll: false,
responseTarget: 'QueryResult'
}, options || {});
// promise instance
_this._promise = new _Promise(function (resolve, reject) {
_this.on('response', resolve);
_this.on('error', reject);
});
_this._stream = new Serializable();
_this.on('record', function (record) {
return _this._stream.push(record);
});
_this.on('end', function () {
return _this._stream.push(null);
});
_this.on('error', function (err) {
try {
_this._stream.emit('error', err);
} catch (e) {
// eslint-disable-line no-empty
}
});
return _this;
}
/**
* Select fields to include in the returning result
*/
_inherits(Query, _EventEmitter);
return _createClass(Query, [{
key: "select",
value: function select() {
var fields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '*';
if (this._soql) {
throw Error('Cannot set select fields for the query which has already built SOQL.');
}
function toFieldArray(fields) {
var _context, _context2, _context4, _context5;
return typeof fields === 'string' ? fields.split(/\s*,\s*/) : _Array$isArray(fields) ? _reduceInstanceProperty(_context = _mapInstanceProperty(_context2 = fields).call(_context2, toFieldArray)).call(_context, function (fs, f) {
var _context3;
return _concatInstanceProperty(_context3 = []).call(_context3, _toConsumableArray(fs), _toConsumableArray(f));
}, []) : _reduceInstanceProperty(_context4 = _mapInstanceProperty(_context5 = _Object$entries(fields)).call(_context5, function (_ref2) {
var _ref3 = _slicedToArray(_ref2, 2),
f = _ref3[0],
v = _ref3[1];
if (typeof v === 'number' || typeof v === 'boolean') {
return v ? [f] : [];
} else {
var _context6;
return _mapInstanceProperty(_context6 = toFieldArray(v)).call(_context6, function (p) {
var _context7;
return _concatInstanceProperty(_context7 = "".concat(f, ".")).call(_context7, p);
});
}
})).call(_context4, function (fs, f) {
var _context8;
return _concatInstanceProperty(_context8 = []).call(_context8, _toConsumableArray(fs), _toConsumableArray(f));
}, []);
}
if (fields) {
this._config.fields = toFieldArray(fields);
}
// force convert query record type without changing instance;
return this;
}
/**
* Set query conditions to filter the result records
*/
}, {
key: "where",
value: function where(conditions) {
if (this._soql) {
throw Error('Cannot set where conditions for the query which has already built SOQL.');
}
this._config.conditions = conditions;
return this;
}
/**
* Limit the returning result
*/
}, {
key: "limit",
value: function limit(_limit) {
if (this._soql) {
throw Error('Cannot set limit for the query which has already built SOQL.');
}
this._config.limit = _limit;
return this;
}
/**
* Skip records
*/
}, {
key: "skip",
value: function skip(offset) {
if (this._soql) {
throw Error('Cannot set skip/offset for the query which has already built SOQL.');
}
this._config.offset = offset;
return this;
}
}, {
key: "sort",
value: function (_sort) {
function sort(_x, _x2) {
return _sort.apply(this, arguments);
}
sort.toString = function () {
return _sort.toString();
};
return sort;
}(function (sort, dir) {
if (this._soql) {
throw Error('Cannot set sort for the query which has already built SOQL.');
}
if (typeof sort === 'string' && typeof dir !== 'undefined') {
this._config.sort = [[sort, dir]];
} else {
this._config.sort = sort;
}
return this;
})
}, {
key: "include",
value: function include(childRelName, conditions, fields) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
if (this._soql) {
throw Error('Cannot include child relationship into the query which has already built SOQL.');
}
var childConfig = {
fields: fields === null ? undefined : fields,
table: childRelName,
conditions: conditions === null ? undefined : conditions,
limit: options.limit,
offset: options.offset,
sort: _sortInstanceProperty(options)
};
// eslint-disable-next-line no-use-before-define
var childQuery = new SubQuery(this._conn, childRelName, childConfig, this);
this._children.push(childQuery);
return childQuery;
}
/**
* Include child relationship queries, but not moving down to the children context
*/
}, {
key: "includeChildren",
value: function includeChildren(includes) {
if (this._soql) {
throw Error('Cannot include child relationship into the query which has already built SOQL.');
}
for (var _i = 0, _arr = _Object$keys(includes); _i < _arr.length; _i++) {
var crname = _arr[_i];
var _ref4 = includes[crname],
_conditions = _ref4.conditions,
_fields2 = _ref4.fields,
_options = _objectWithoutProperties(_ref4, _excluded2);
this.include(crname, _conditions, _fields2, _options);
}
return this;
}
/**
* Setting maxFetch query option
*/
}, {
key: "maxFetch",
value: function maxFetch(_maxFetch) {
this._options.maxFetch = _maxFetch;
return this;
}
/**
* Switching auto fetch mode
*/
}, {
key: "autoFetch",
value: function autoFetch(_autoFetch) {
this._options.autoFetch = _autoFetch;
return this;
}
/**
* Set flag to scan all records including deleted and archived.
*/
}, {
key: "scanAll",
value: function scanAll(_scanAll) {
this._options.scanAll = _scanAll;
return this;
}
/**
*
*/
}, {
key: "setResponseTarget",
value: function setResponseTarget(responseTarget) {
if (responseTarget in ResponseTargets) {
this._options.responseTarget = responseTarget;
}
// force change query response target without changing instance
return this;
}
/**
* Execute query and fetch records from server.
*/
}, {
key: "execute",
value: function execute() {
var _this2 = this;
var options_ = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (this._executed) {
throw new Error('re-executing already executed query');
}
if (this._finished) {
throw new Error('executing already closed query');
}
var options = {
headers: options_.headers || this._options.headers,
responseTarget: options_.responseTarget || this._options.responseTarget,
autoFetch: options_.autoFetch || this._options.autoFetch,
maxFetch: options_.maxFetch || this._options.maxFetch,
scanAll: options_.scanAll || this._options.scanAll
};
// collect fetched records in array
// only when response target is Records and
// either callback or chaining promises are available to this query.
this.once('fetch', function () {
if (options.responseTarget === ResponseTargets.Records && _this2._chaining) {
_this2._logger.debug('--- collecting all fetched records ---');
var records = [];
var onRecord = function onRecord(record) {
return records.push(record);
};
_this2.on('record', onRecord);
_this2.once('end', function () {
_this2.removeListener('record', onRecord);
_this2.emit('response', records, _this2);
});
}
});
// flag to prevent re-execution
this._executed = true;
_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
return _regeneratorRuntime.wrap(function _callee$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
// start actual query
_this2._logger.debug('>>> Query start >>>');
_context9.prev = 1;
_context9.next = 4;
return _this2._execute(options);
case 4:
_this2._logger.debug('*** Query finished ***');
_context9.next = 11;
break;
case 7:
_context9.prev = 7;
_context9.t0 = _context9["catch"](1);
_this2._logger.debug('--- Query error ---', _context9.t0);
_this2.emit('error', _context9.t0);
case 11:
case "end":
return _context9.stop();
}
}, _callee, null, [[1, 7]]);
}))();
// return Query instance for chaining
return this;
}
}, {
key: "locatorToUrl",
value: function locatorToUrl() {
return this._locator ? [this._conn._baseUrl(), '/query/', this._locator].join('') : '';
}
}, {
key: "urlToLocator",
value: function urlToLocator(url) {
return url.split('/').pop();
}
}, {
key: "constructResponse",
value: function constructResponse(rawDone, responseTarget) {
var _this$records$, _this$records;
switch (responseTarget) {
case 'Count':
return this.totalSize;
case 'SingleRecord':
return (_this$records$ = (_this$records = this.records) === null || _this$records === void 0 ? void 0 : _this$records[0]) !== null && _this$records$ !== void 0 ? _this$records$ : null;
case 'Records':
return this.records;
// QueryResult is default response target
default:
return _objectSpread(_objectSpread({}, {
records: this.records,
totalSize: this.totalSize,
done: rawDone !== null && rawDone !== void 0 ? rawDone : true // when no records, done is omitted
}), this._locator ? {
nextRecordsUrl: this.locatorToUrl()
} : {});
}
}
/**
* @private
*/
}, {
key: "_execute",
value: (function () {
var _execute2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(options) {
var _this$records2, _context10, _data$records$length, _data$records;
var headers, responseTarget, autoFetch, maxFetch, scanAll, url, soql, data, numRecords, totalFetched, i, record, response;
return _regeneratorRuntime.wrap(function _callee2$(_context11) {
while (1) switch (_context11.prev = _context11.next) {
case 0:
headers = options.headers, responseTarget = options.responseTarget, autoFetch = options.autoFetch, maxFetch = options.maxFetch, scanAll = options.scanAll;
this._logger.debug('execute with options', options);
if (!this._locator) {
_context11.next = 6;
break;
}
url = this.locatorToUrl();
_context11.next = 11;
break;
case 6:
_context11.next = 8;
return this.toSOQL();
case 8:
soql = _context11.sent;
this._logger.debug("SOQL = ".concat(soql));
url = [this._conn._baseUrl(), '/', scanAll ? 'queryAll' : 'query', '?q=', encodeURIComponent(soql)].join('');
case 11:
_context11.next = 13;
return this._conn.request({
method: 'GET',
url: url,
headers: headers
});
case 13:
data = _context11.sent;
this.emit('fetch');
this.totalSize = data.totalSize;
this.records = (_this$records2 = this.records) === null || _this$records2 === void 0 ? void 0 : _concatInstanceProperty(_this$records2).call(_this$records2, maxFetch - this.records.length > data.records.length ? data.records : _sliceInstanceProperty(_context10 = data.records).call(_context10, 0, maxFetch - this.records.length));
this._locator = data.nextRecordsUrl ? this.urlToLocator(data.nextRecordsUrl) : undefined;
this._finished = this._finished || data.done || !autoFetch || this.records.length === maxFetch ||
// this is what the response looks like when there are no results
data.records.length === 0 && data.done === undefined;
// streaming record instances
numRecords = (_data$records$length = (_data$records = data.records) === null || _data$records === void 0 ? void 0 : _data$records.length) !== null && _data$records$length !== void 0 ? _data$records$length : 0;
totalFetched = this.totalFetched;
i = 0;
case 22:
if (!(i < numRecords)) {
_context11.next = 32;
break;
}
if (!(totalFetched >= maxFetch)) {
_context11.next = 26;
break;
}
this._finished = true;
return _context11.abrupt("break", 32);
case 26:
record = data.records[i];
this.emit('record', record, totalFetched, this);
totalFetched += 1;
case 29:
i++;
_context11.next = 22;
break;
case 32:
this.totalFetched = totalFetched;
if (!this._finished) {
_context11.next = 40;
break;
}
response = this.constructResponse(data.done, responseTarget); // only fire response event when it should be notified per fetch
if (responseTarget !== ResponseTargets.Records) {
this.emit('response', response, this);
}
this.emit('end');
return _context11.abrupt("return", response);
case 40:
return _context11.abrupt("return", this._execute(options));
case 41:
case "end":
return _context11.stop();
}
}, _callee2, this);
}));
function _execute(_x3) {
return _execute2.apply(this, arguments);
}
return _execute;
}()
/**
* Obtain readable stream instance
*/
)
}, {
key: "stream",
value: function stream() {
var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'csv';
if (!this._finished && !this._executed) {
this.execute({
autoFetch: true
});
}
return type === 'record' ? this._stream : this._stream.stream(type);
}
/**
* Pipe the queried records to another stream
* This is for backward compatibility; Query is not a record stream instance anymore in 2.0.
* If you want a record stream instance, use `Query#stream('record')`.
*/
}, {
key: "pipe",
value: function pipe(stream) {
return this.stream('record').pipe(stream);
}
/**
* @protected
*/
}, {
key: "_expandFields",
value: (function () {
var _expandFields2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(sobject_) {
var _context12, _context13, _context14, _context16, _context17;
var _this$_config, _this$_config$fields, fields, _this$_config$table, table, sobject, _yield$Promise$all, _yield$Promise$all2, efields;
return _regeneratorRuntime.wrap(function _callee4$(_context18) {
while (1) switch (_context18.prev = _context18.next) {
case 0:
if (!this._soql) {
_context18.next = 2;
break;
}
throw new Error('Cannot expand fields for the query which has already built SOQL.');
case 2:
_this$_config = this._config, _this$_config$fields = _this$_config.fields, fields = _this$_config$fields === void 0 ? [] : _this$_config$fields, _this$_config$table = _this$_config.table, table = _this$_config$table === void 0 ? '' : _this$_config$table;
sobject = sobject_ || table;
this._logger.debug(_concatInstanceProperty(_context12 = "_expandFields: sobject = ".concat(sobject, ", fields = ")).call(_context12, fields.join(', ')));
_context18.next = 7;
return _Promise.all(_concatInstanceProperty(_context13 = [this._expandAsteriskFields(sobject, fields)]).call(_context13, _toConsumableArray(_mapInstanceProperty(_context14 = this._children).call(_context14, /*#__PURE__*/function () {
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(childQuery) {
return _regeneratorRuntime.wrap(function _callee3$(_context15) {
while (1) switch (_context15.prev = _context15.next) {
case 0:
_context15.next = 2;
return childQuery._expandFields();
case 2:
return _context15.abrupt("return", []);
case 3:
case "end":
return _context15.stop();
}
}, _callee3);
}));
return function (_x5) {
return _ref6.apply(this, arguments);
};
}()))));
case 7:
_yield$Promise$all = _context18.sent;
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 1);
efields = _yield$Promise$all2[0];
this._config.fields = efields;
this._config.includes = _reduceInstanceProperty(_context16 = _mapInstanceProperty(_context17 = this._children).call(_context17, function (cquery) {
var cconfig = cquery._query._config;
return [cconfig.table, cconfig];
})).call(_context16, function (includes, _ref7) {
var _ref8 = _slicedToArray(_ref7, 2),
ctable = _ref8[0],
cconfig = _ref8[1];
return _objectSpread(_objectSpread({}, includes), {}, _defineProperty({}, ctable, cconfig));
}, {});
case 12:
case "end":
return _context18.stop();
}
}, _callee4, this);
}));
function _expandFields(_x4) {
return _expandFields2.apply(this, arguments);
}
return _expandFields;
}()
/**
*
*/
)
}, {
key: "_findRelationObject",
value: (function () {
var _findRelationObject2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(relName) {
var _context19;
var table, sobject, upperRname, _iterator, _step, cr;
return _regeneratorRuntime.wrap(function _callee5$(_context20) {
while (1) switch (_context20.prev = _context20.next) {
case 0:
table = this._config.table;
if (table) {
_context20.next = 3;
break;
}
throw new Error('No table information provided in the query');
case 3:
this._logger.debug(_concatInstanceProperty(_context19 = "finding table for relation \"".concat(relName, "\" in \"")).call(_context19, table, "\"..."));
_context20.next = 6;
return this._conn.describe$(table);
case 6:
sobject = _context20.sent;
upperRname = relName.toUpperCase();
_iterator = _createForOfIteratorHelper(sobject.childRelationships);
_context20.prev = 9;
_iterator.s();
case 11:
if ((_step = _iterator.n()).done) {
_context20.next = 17;
break;
}
cr = _step.value;
if (!((cr.relationshipName || '').toUpperCase() === upperRname && cr.childSObject)) {
_context20.next = 15;
break;
}
return _context20.abrupt("return", cr.childSObject);
case 15:
_context20.next = 11;
break;
case 17:
_context20.next = 22;
break;
case 19:
_context20.prev = 19;
_context20.t0 = _context20["catch"](9);
_iterator.e(_context20.t0);
case 22:
_context20.prev = 22;
_iterator.f();
return _context20.finish(22);
case 25:
throw new Error("No child relationship found: ".concat(relName));
case 26:
case "end":
return _context20.stop();
}
}, _callee5, this, [[9, 19, 22, 25]]);
}));
function _findRelationObject(_x6) {
return _findRelationObject2.apply(this, arguments);
}
return _findRelationObject;
}()
/**
*
*/
)
}, {
key: "_expandAsteriskFields",
value: (function () {
var _expandAsteriskFields2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(sobject, fields) {
var _this3 = this;
var expandedFields;
return _regeneratorRuntime.wrap(function _callee7$(_context23) {
while (1) switch (_context23.prev = _context23.next) {
case 0:
_context23.next = 2;
return _Promise.all(_mapInstanceProperty(fields).call(fields, /*#__PURE__*/function () {
var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(field) {
return _regeneratorRuntime.wrap(function _callee6$(_context21) {
while (1) switch (_context21.prev = _context21.next) {
case 0:
return _context21.abrupt("return", _this3._expandAsteriskField(sobject, field));
case 1:
case "end":
return _context21.stop();
}
}, _callee6);
}));
return function (_x9) {
return _ref9.apply(this, arguments);
};
}()));
case 2:
expandedFields = _context23.sent;
return _context23.abrupt("return", _reduceInstanceProperty(expandedFields).call(expandedFields, function (eflds, flds) {
var _context22;
return _concatInstanceProperty(_context22 = []).call(_context22, _toConsumableArray(eflds), _toConsumableArray(flds));
}, []));
case 4:
case "end":
return _context23.stop();
}
}, _callee7);
}));
function _expandAsteriskFields(_x7, _x8) {
return _expandAsteriskFields2.apply(this, arguments);
}
return _expandAsteriskFields;
}()
/**
*
*/
)
}, {
key: "_expandAsteriskField",
value: (function () {
var _expandAsteriskField2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8(sobject, field) {
var _context24;
var fpath, _context26, so, rname, _iterator2, _step2, f, rfield, referenceTo, rtable, fpaths;
return _regeneratorRuntime.wrap(function _callee8$(_context27) {
while (1) switch (_context27.prev = _context27.next) {
case 0:
this._logger.debug(_concatInstanceProperty(_context24 = "expanding field \"".concat(field, "\" in \"")).call(_context24, sobject, "\"..."));
fpath = field.split('.');
if (!(fpath[fpath.length - 1] === '*')) {
_context27.next = 34;
break;
}
_context27.next = 5;
return this._conn.describe$(sobject);
case 5:
so = _context27.sent;
this._logger.debug("table ".concat(sobject, " has been described"));
if (!(fpath.length > 1)) {
_context27.next = 33;
break;
}
rname = fpath.shift();
_iterator2 = _createForOfIteratorHelper(so.fields);
_context27.prev = 10;
_iterator2.s();
case 12:
if ((_step2 = _iterator2.n()).done) {
_context27.next = 24;
break;
}
f = _step2.value;
if (!(f.relationshipName && rname && f.relationshipName.toUpperCase() === rname.toUpperCase())) {
_context27.next = 22;
break;
}
rfield = f;
referenceTo = rfield.referenceTo || [];
rtable = referenceTo.length === 1 ? referenceTo[0] : 'Name';
_context27.next = 20;
return this._expandAsteriskField(rtable, fpath.join('.'));
case 20:
fpaths = _context27.sent;
return _context27.abrupt("return", _mapInstanceProperty(fpaths).call(fpaths, function (fp) {
var _context25;
return _concatInstanceProperty(_context25 = "".concat(rname, ".")).call(_context25, fp);
}));
case 22:
_context27.next = 12;
break;
case 24:
_context27.next = 29;
break;
case 26:
_context27.prev = 26;
_context27.t0 = _context27["catch"](10);
_iterator2.e(_context27.t0);
case 29:
_context27.prev = 29;
_iterator2.f();
return _context27.finish(29);
case 32:
return _context27.abrupt("return", []);
case 33:
return _context27.abrupt("return", _mapInstanceProperty(_context26 = so.fields).call(_context26, function (f) {
return f.name;
}));
case 34:
return _context27.abrupt("return", [field]);
case 35:
case "end":
return _context27.stop();
}
}, _callee8, this, [[10, 26, 29, 32]]);
}));
function _expandAsteriskField(_x10, _x11) {
return _expandAsteriskField2.apply(this, arguments);
}
return _expandAsteriskField;
}()
/**
* Explain plan for executing query
*/
)
}, {
key: "explain",
value: (function () {
var _explain = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee9() {
var soql, url;
return _regeneratorRuntime.wrap(function _callee9$(_context28) {
while (1) switch (_context28.prev = _context28.next) {
case 0:
_context28.next = 2;
return this.toSOQL();
case 2:
soql = _context28.sent;
this._logger.debug("SOQL = ".concat(soql));
url = "/query/?explain=".concat(encodeURIComponent(soql));
return _context28.abrupt("return", this._conn.request(url));
case 6:
case "end":
return _context28.stop();
}
}, _callee9, this);
}));
function explain() {
return _explain.apply(this, arguments);
}
return explain;
}()
/**
* Return SOQL expression for the query
*/
)
}, {
key: "toSOQL",
value: (function () {
var _toSOQL = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee10() {
return _regeneratorRuntime.wrap(function _callee10$(_context29) {
while (1) switch (_context29.prev = _context29.next) {
case 0:
if (!this._soql) {
_context29.next = 2;
break;
}
return _context29.abrupt("return", this._soql);
case 2:
_context29.next = 4;
return this._expandFields();
case 4:
return _context29.abrupt("return", createSOQL(this._config));
case 5:
case "end":
return _context29.stop();
}
}, _callee10, this);
}));
function toSOQL() {
return _toSOQL.apply(this, arguments);
}
return toSOQL;
}()
/**
* Promise/A+ interface
* http://promises-aplus.github.io/promises-spec/
*
* Delegate to deferred promise, return promise instance for query result
*/
)
}, {
key: "then",
value: function then(onResolve, onReject) {
this._chaining = true;
if (!this._finished && !this._executed) {
this.execute();
}
if (!this._promise) {
throw new Error('invalid state: promise is not set after query execution');
}
return this._promise.then(onResolve, onReject);
}
}, {
key: "catch",
value: function _catch(onReject) {
return this.then(null, onReject);
}
}, {
key: "promise",
value: function promise() {
// TODO(cristian): verify this is correct
return _Promise.resolve(this);
}
/**
* Bulk delete queried records
*/
}, {
key: "destroy",
value: function destroy(type, options) {
var _options$bulkApiVersi,
_this4 = this;
if (_typeof(type) === 'object' && type !== null) {
options = type;
type = undefined;
}
options = options || {};
var type_ = type || this._config.table;
if (!type_) {
throw new Error('SOQL based query needs SObject type information to bulk delete.');
}
// Set the threshold number to pass to bulk API
var thresholdNum = options.allowBulk === false ? -1 : typeof options.bulkThreshold === 'number' ? options.bulkThreshold :
// determine threshold if the connection version supports SObject collection API or not
this._conn._ensureVersion(42) ? DEFAULT_BULK_THRESHOLD : this._conn._maxRequest / 2;
var bulkApiVersion = (_options$bulkApiVersi = options.bulkApiVersion) !== null && _options$bulkApiVersi !== void 0 ? _options$bulkApiVersi : DEFAULT_BULK_API_VERSION;
return new _Promise(function (resolve, reject) {
var createBatch = function createBatch() {
return _this4._conn.sobject(type_).deleteBulk().on('response', resolve).on('error', reject);
};
var records = [];
var batch = null;
var handleRecord = function handleRecord(rec) {
if (!rec.Id) {
var err = new Error('Queried record does not include Salesforce record ID.');
_this4.emit('error', err);
return;
}
var record = {
Id: rec.Id
};
if (batch) {
batch.write(record);
} else {
records.push(record);
if (thresholdNum >= 0 && records.length > thresholdNum && bulkApiVersion === 1) {
// Use bulk delete instead of SObject REST API
batch = createBatch();
for (var _i2 = 0, _records = records; _i2 < _records.length; _i2++) {
var _record = _records[_i2];
batch.write(_record);
}
records = [];
}
}
};
var handleEnd = function handleEnd() {
if (batch) {
batch.end();
} else {
var ids = _mapInstanceProperty(records).call(records, function (record) {
return record.Id;
});
if (records.length > thresholdNum && bulkApiVersion === 2) {
_this4._conn.bulk2.loadAndWaitForResults({
object: type_,
operation: 'delete',
input: records
}).then(function (allResults) {
return resolve(_this4.mapBulkV2ResultsToSaveResults(allResults));
}, reject);
} else {
_this4._conn.sobject(type_).destroy(ids, {
allowRecursive: true
}).then(resolve, reject);
}
}
};
_this4.stream('record').on('data', handleRecord).on('end', handleEnd).on('error', reject);
});
}
}, {
key: "update",
value: function update(mapping, type, options) {
var _options$bulkApiVersi2,
_this5 = this;
if (_typeof(type) === 'object' && type !== null) {
options = type;
type = undefined;
}
options = options || {};
var type_ = type || this._config && this._config.table;
if (!type_) {
throw new Error('SOQL based query needs SObject type information to bulk update.');
}
var updateStream = typeof mapping === 'function' ? _mapInstanceProperty(RecordStream).call(RecordStream, mapping) : RecordStream.recordMapStream(mapping, options.skipRecordTemplateEval);
// Set the threshold number to pass to bulk API
var thresholdNum = options.allowBulk === false ? -1 : typeof options.bulkThreshold === 'number' ? options.bulkThreshold :
// determine threshold if the connection version supports SObject collection API or not
this._conn._ensureVersion(42) ? DEFAULT_BULK_THRESHOLD : this._conn._maxRequest / 2;
var bulkApiVersion = (_options$bulkApiVersi2 = options.bulkApiVersion) !== null && _options$bulkApiVersi2 !== void 0 ? _options$bulkApiVersi2 : DEFAULT_BULK_API_VERSION;
return new _Promise(function (resolve, reject) {
var createBatch = function createBatch() {
return _this5._conn.sobject(type_).updateBulk().on('response', resolve).on('error', reject);
};
var records = [];
var batch = null;
var handleRecord = function handleRecord(record) {
if (batch) {
batch.write(record);
} else {
records.push(record);
}
if (thresholdNum >= 0 && records.length > thresholdNum && bulkApiVersion === 1) {
// Use bulk update instead of SObject REST API
batch = createBatch();
for (var _i3 = 0, _records2 = records; _i3 < _records2.length; _i3++) {
var _record2 = _records2[_i3];
batch.write(_record2);
}
records = [];
}
};
var handleEnd = function handleEnd() {
if (batch) {
batch.end();
} else {
if (records.length > thresholdNum && bulkApiVersion === 2) {
_this5._conn.bulk2.loadAndWaitForResults({
object: type_,
operation: 'update',
input: records
}).then(function (allResults) {
return resolve(_this5.mapBulkV2ResultsToSaveResults(allResults));
}, reject);
} else {
_this5._conn.sobject(type_).update(records, {
allowRecursive: true
}).then(resolve, reject);
}
}
};
_this5.stream('record').on('error', reject).pipe(updateStream).on('data', handleRecord).on('end', handleEnd).on('error', reject);
});
}
}, {
key: "mapBulkV2ResultsToSaveResults",
value: function mapBulkV2ResultsToSaveResults(bulkJobAllResults) {
var _context30, _context31, _context32;
var successSaveResults = _mapInstanceProperty(_context30 = bulkJobAllResults.successfulResults).call(_context30, function (r) {
var saveResult = {
id: r.sf__Id,
success: true,
errors: []
};
return saveResult;
});
var failedSaveResults = _mapInstanceProperty(_context31 = bulkJobAllResults.failedResults).call(_context31, function (r) {
var saveResult = {
success: false,
errors: [{
errorCode: r.sf__Error,
message: r.sf__Error
}]
};
return saveResult;
});
return _concatInstanceProperty(_context32 = []).call(_context32, _toConsumableArray(successSaveResults), _toConsumableArray(failedSaveResults));
}
}]);
}(EventEmitter);
/*--------------------------------------------*/
/**
* SubQuery object for representing child relationship query
*/
_defineProperty(Query, "_logger", getLogger('query'));
export var SubQuery = /*#__PURE__*/function () {
/**
*
*/
function SubQuery(conn, relName, config, parent) {
_classCallCheck(this, SubQuery);
/**
* Synonym of SubQuery#skip()
*/
_defineProperty(this, "offset", this.skip);
/**
* Synonym of SubQuery#sort()
*/
_defineProperty(this, "orderby", _sortInstanceProperty(this));
this._relName = relName;
this._query = new Query(conn, config);
this._parent = parent;
}
/**
*
*/
return _createClass(SubQuery, [{
key: "select",
value: function select(fields) {
// force convert query record type without changing instance
this._query = this._query.select(fields);
return this;
}
/**
*
*/
}, {
key: "where",
value: function where(conditions) {
this._query = this._query.where(conditions);
return this;
}
/**
* Limit the returning result
*/
}, {
key: "limit",
value: function limit(_limit2) {
this._query = this._query.limit(_limit2);
return this;
}
/**
* Skip records
*/
}, {
key: "skip",
value: function skip(offset) {
this._query = this._query.skip(offset);
return this;
}
}, {
key: "sort",
value: function (_sort3) {
function sort(_x12, _x13) {
return _sort3.apply(this, arguments);
}
sort.toString = function () {
return _sort3.toString();
};
return sort;
}(function (sort, dir) {
var _context33;
this._query = _sortInstanceProperty(_context33 = this._query).call(_context33, sort, dir);
return this;
})
}, {
key: "_expandFields",
value: (
/**
*
*/
function () {
var _expandFields3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee11() {
var sobject;
return _regeneratorRuntime.wrap(function _callee11$(_context34) {
while (1) switch (_context34.prev = _context34.next) {
case 0:
_context34.next = 2;
return this._parent._findRelationObject(this._relName);
case 2:
sobject = _context34.sent;
return _context34.abrupt("return", this._query._expandFields(sobject));
case 4:
case "end":
return _context34.stop();
}
}, _callee11, this);
}));
function _expandFields() {
return _expandFields3.apply(this, arguments);
}
return _expandFields;
}()
/**
* Back the context to parent query object
*/
)
}, {
key: "end",
value: function end() {
return this._parent;
}
}]);
}();
export default Query;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJnZXRMb2dnZXIiLCJSZWNvcmRTdHJlYW0iLCJTZXJpYWxpemFibGUiLCJjcmVhdGVTT1FMIiwiUmVzcG9uc2VUYXJnZXRWYWx1ZXMiLCJSZXNwb25zZVRhcmdldHMiLCJfcmVkdWNlSW5zdGFuY2VQcm9wZXJ0eSIsImNhbGwiLCJ2YWx1ZXMiLCJ0YXJnZXQiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5IiwiREVGQVVMVF9CVUxLX1RIUkVTSE9MRCIsIkRFRkFVTFRfQlVMS19BUElfVkVSU0lPTiIsIlF1ZXJ5IiwiX0V2ZW50RW1pdHRlciIsImNvbm4iLCJjb25maWciLCJvcHRpb25zIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY2FsbFN1cGVyIiwic2tpcCIsIl9zb3J0SW5zdGFuY2VQcm9wZXJ0eSIsImV4ZWN1dGUiLCJkZXN0cm95IiwiX2Nvbm4iLCJfbG9nZ2VyIiwiX2xvZ0xldmVsIiwiY3JlYXRlSW5zdGFuY2UiLCJfc29xbCIsImRlYnVnIiwiY29uY2F0IiwibG9jYXRvciIsIl9sb2NhdG9yIiwiX2luY2x1ZGVzSW5zdGFuY2VQcm9wZXJ0eSIsInVybFRvTG9jYXRvciIsIl9KU09OJHN0cmluZ2lmeSIsIl9yZWYiLCJmaWVsZHMiLCJpbmNsdWRlcyIsInNvcnQiLCJfY29uZmlnIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwic2VsZWN0IiwiaW5jbHVkZUNoaWxkcmVuIiwiX29wdGlvbnMiLCJoZWFkZXJzIiwibWF4RmV0Y2giLCJhdXRvRmV0Y2giLCJzY2FuQWxsIiwicmVzcG9uc2VUYXJnZXQiLCJfcHJvbWlzZSIsIl9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiX3N0cmVhbSIsInJlY29yZCIsInB1c2giLCJlcnIiLCJlbWl0IiwiZSIsIl9pbmhlcml0cyIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJ0b0ZpZWxkQXJyYXkiLCJfY29udGV4dCIsIl9jb250ZXh0MiIsIl9jb250ZXh0NCIsIl9jb250ZXh0NSIsInNwbGl0IiwiX0FycmF5JGlzQXJyYXkiLCJfbWFwSW5zdGFuY2VQcm9wZXJ0eSIsImZzIiwiZiIsIl9jb250ZXh0MyIsIl9jb25jYXRJbnN0YW5jZVByb3BlcnR5IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX09iamVjdCRlbnRyaWVzIiwiX3JlZjIiLCJfcmVmMyIsIl9zbGljZWRUb0FycmF5IiwidiIsIl9jb250ZXh0NiIsInAiLCJfY29udGV4dDciLCJfY29udGV4dDgiLCJ3aGVyZSIsImNvbmRpdGlvbnMiLCJsaW1pdCIsIm9mZnNldCIsIl9zb3J0IiwiX3giLCJfeDIiLCJhcHBseSIsInRvU3RyaW5nIiwiZGlyIiwiaW5jbHVkZSIsImNoaWxkUmVsTmFtZSIsImNoaWxkQ29uZmlnIiwidGFibGUiLCJjaGlsZFF1ZXJ5IiwiU3ViUXVlcnkiLCJfY2hpbGRyZW4iLCJfaSIsIl9hcnIiLCJfT2JqZWN0JGtleXMiLCJjcm5hbWUiLCJfcmVmNCIsIl9leGNsdWRlZDIiLCJzZXRSZXNwb25zZVRhcmdldCIsIl90aGlzMiIsIm9wdGlvbnNfIiwiX2V4ZWN1dGVkIiwiX2ZpbmlzaGVkIiwib25jZSIsIlJlY29yZHMiLCJfY2hhaW5pbmciLCJyZWNvcmRzIiwib25SZWNvcmQiLCJyZW1vdmVMaXN0ZW5lciIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQ5IiwicHJldiIsIm5leHQiLCJfZXhlY3V0ZSIsInQwIiwic3RvcCIsImxvY2F0b3JUb1VybCIsIl9iYXNlVXJsIiwiam9pbiIsInVybCIsInBvcCIsImNvbnN0cnVjdFJlc3BvbnNlIiwicmF3RG9uZSIsIl90aGlzJHJlY29yZHMkIiwiX3RoaXMkcmVjb3JkcyIsInRvdGFsU2l6ZSIsImRvbmUiLCJuZXh0UmVjb3Jkc1VybCIsIl9leGVjdXRlMiIsIl9jYWxsZWUyIiwiX3RoaXMkcmVjb3JkczIiLCJfY29udGV4dDEwIiwiX2RhdGEkcmVjb3JkcyRsZW5ndGgiLCJfZGF0YSRyZWNvcmRzIiwic29xbCIsImRhdGEiLCJudW1SZWNvcmRzIiwidG90YWxGZXRjaGVkIiwiaSIsInJlc3BvbnNlIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQxMSIsInRvU09RTCIsInNlbnQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXF1ZXN0IiwibWV0aG9kIiwiX3NsaWNlSW5zdGFuY2VQcm9wZXJ0eSIsImFicnVwdCIsIl94MyIsInN0cmVhbSIsInR5cGUiLCJwaXBlIiwiX2V4cGFuZEZpZWxkczIiLCJfY2FsbGVlNCIsInNvYmplY3RfIiwiX2NvbnRleHQxMiIsIl9jb250ZXh0MTMiLCJfY29udGV4dDE0IiwiX2NvbnRleHQxNiIsIl9jb250ZXh0MTciLCJfdGhpcyRfY29uZmlnIiwiX3RoaXMkX2NvbmZpZyRmaWVsZHMiLCJfdGhpcyRfY29uZmlnJHRhYmxlIiwic29iamVjdCIsIl95aWVsZCRQcm9taXNlJGFsbCIsIl95aWVsZCRQcm9taXNlJGFsbDIiLCJlZmllbGRzIiwiX2NhbGxlZTQkIiwiX2NvbnRleHQxOCIsImFsbCIsIl9leHBhbmRBc3Rlcmlza0ZpZWxkcyIsIl9yZWY2IiwiX2NhbGxlZTMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDE1IiwiX2V4cGFuZEZpZWxkcyIsIl94NSIsImNxdWVyeSIsImNjb25maWciLCJfcXVlcnkiLCJfcmVmNyIsIl9yZWY4IiwiY3RhYmxlIiwiX3g0IiwiX2ZpbmRSZWxhdGlvbk9iamVjdDIiLCJfY2FsbGVlNSIsInJlbE5hbWUiLCJfY29udGV4dDE5IiwidXBwZXJSbmFtZSIsIl9pdGVyYXRvciIsIl9zdGVwIiwiY3IiLCJfY2FsbGVlNSQiLCJfY29udGV4dDIwIiwiZGVzY3JpYmUkIiwidG9VcHBlckNhc2UiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsImNoaWxkUmVsYXRpb25zaGlwcyIsInMiLCJuIiwicmVsYXRpb25zaGlwTmFtZSIsImNoaWxkU09iamVjdCIsImZpbmlzaCIsIl9maW5kUmVsYXRpb25PYmplY3QiLCJfeDYiLCJfZXhwYW5kQXN0ZXJpc2tGaWVsZHMyIiwiX2NhbGxlZTciLCJfdGhpczMiLCJleHBhbmRlZEZpZWxkcyIsIl9jYWxsZWU3JCIsIl9jb250ZXh0MjMiLCJfcmVmOSIsIl9jYWxsZWU2IiwiZmllbGQiLCJfY2FsbGVlNiQiLCJfY29udGV4dDIxIiwiX2V4cGFuZEFzdGVyaXNrRmllbGQiLCJfeDkiLCJlZmxkcyIsImZsZHMiLCJfY29udGV4dDIyIiwiX3g3IiwiX3g4IiwiX2V4cGFuZEFzdGVyaXNrRmllbGQyIiwiX2NhbGxlZTgiLCJfY29udGV4dDI0IiwiZnBhdGgiLCJfY29udGV4dDI2Iiwic28iLCJybmFtZSIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJyZmllbGQiLCJyZWZlcmVuY2VUbyIsInJ0YWJsZSIsImZwYXRocyIsIl9jYWxsZWU4JCIsIl9jb250ZXh0MjciLCJzaGlmdCIsImZwIiwiX2NvbnRleHQyNSIsIm5hbWUiLCJfeDEwIiwiX3gxMSIsIl9leHBsYWluIiwiX2NhbGxlZTkiLCJfY2FsbGVlOSQiLCJfY29udGV4dDI4IiwiZXhwbGFpbiIsIl90b1NPUUwiLCJfY2FsbGVlMTAiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQyOSIsInRoZW4iLCJvblJlc29sdmUiLCJvblJlamVjdCIsImNhdGNoIiwicHJvbWlzZSIsIl9vcHRpb25zJGJ1bGtBcGlWZXJzaSIsIl90aGlzNCIsIl90eXBlb2YiLCJ0eXBlXyIsInRocmVzaG9sZE51bSIsImFsbG93QnVsayIsImJ1bGtUaHJlc2hvbGQiLCJfZW5zdXJlVmVyc2lvbiIsIl9tYXhSZXF1ZXN0IiwiYnVsa0FwaVZlcnNpb24iLCJjcmVhdGVCYXRjaCIsImRlbGV0ZUJ1bGsiLCJiYXRjaCIsImhhbmRsZVJlY29yZCIsInJlYyIsIklkIiwid3JpdGUiLCJfaTIiLCJfcmVjb3JkcyIsImhhbmRsZUVuZCIsImVuZCIsImlkcyIsImJ1bGsyIiwibG9hZEFuZFdhaXRGb3JSZXN1bHRzIiwib2JqZWN0Iiwib3BlcmF0aW9uIiwiaW5wdXQiLCJhbGxSZXN1bHRzIiwibWFwQnVsa1YyUmVzdWx0c1RvU2F2ZVJlc3VsdHMiLCJhbGxvd1JlY3Vyc2l2ZSIsInVwZGF0ZSIsIm1hcHBpbmciLCJfb3B0aW9ucyRidWxrQXBpVmVyc2kyIiwiX3RoaXM1IiwidXBkYXRlU3RyZWFtIiwicmVjb3JkTWFwU3RyZWFtIiwic2tpcFJlY29yZFRlbXBsYXRlRXZhbCIsInVwZGF0ZUJ1bGsiLCJfaTMiLCJfcmVjb3JkczIiLCJidWxrSm9iQWxsUmVzdWx0cyIsIl9jb250ZXh0MzAiLCJfY29udGV4dDMxIiwiX2NvbnRleHQzMiIsInN1Y2Nlc3NTYXZlUmVzdWx0cyIsInN1Y2Nlc3NmdWxSZXN1bHRzIiwiciIsInNhdmVSZXN1bHQiLCJpZCIsInNmX19JZCIsInN1Y2Nlc3MiLCJlcnJvcnMiLCJmYWlsZWRTYXZlUmVzdWx0cyIsImZhaWxlZFJlc3VsdHMiLCJlcnJvckNvZGUiLCJzZl9fRXJyb3IiLCJtZXNzYWdlIiwicGFyZW50IiwiX3JlbE5hbWUiLCJfcGFyZW50IiwiX3NvcnQzIiwiX3gxMiIsIl94MTMiLCJfY29udGV4dDMzIiwiX2V4cGFuZEZpZWxkczMiLCJfY2FsbGVlMTEiLCJfY2FsbGVlMTEkIiwiX2NvbnRleHQzNCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWVyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIE1hbmFnZXMgcXVlcnkgZm9yIHJlY29yZHMgaW4gU2FsZXNmb3JjZVxuICogQGF1dGhvciBTaGluaWNoaSBUb21pdGEgPHNoaW5pY2hpLnRvbWl0YUBnbWFpbC5jb20+XG4gKi9cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBMb2dnZXIsIGdldExvZ2dlciB9IGZyb20gJy4vdXRpbC9sb2dnZXInO1xuaW1wb3J0IFJlY29yZFN0cmVhbSwgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3JlY29yZC1zdHJlYW0nO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi9jb25uZWN0aW9uJztcbmltcG9ydCB7IGNyZWF0ZVNPUUwgfSBmcm9tICcuL3NvcWwtYnVpbGRlcic7XG5pbXBvcnQgeyBRdWVyeUNvbmZpZyBhcyBTT1FMUXVlcnlDb25maWcsIFNvcnREaXIgfSBmcm9tICcuL3NvcWwtYnVpbGRlcic7XG5pbXBvcnQge1xuICBSZWNvcmQsXG4gIE9wdGlvbmFsLFxuICBTY2hlbWEsXG4gIFNPYmplY3ROYW1lcyxcbiAgQ2hpbGRSZWxhdGlvbnNoaXBOYW1lcyxcbiAgQ2hpbGRSZWxhdGlvbnNoaXBTT2JqZWN0TmFtZSxcbiAgRmllbGRQcm9qZWN0aW9uQ29uZmlnLFxuICBGaWVsZFBhdGhTcGVjaWZpZXIsXG4gIEZpZWxkUGF0aFNjb3BlZFByb2plY3Rpb24sXG4gIFNPYmplY3RSZWNvcmQsXG4gIFNPYmplY3RJbnB1dFJlY29yZCxcbiAgU09iamVjdFVwZGF0ZVJlY29yZCxcbiAgU2F2ZVJlc3VsdCxcbiAgRGF0ZVN0cmluZyxcbiAgU09iamVjdENoaWxkUmVsYXRpb25zaGlwUHJvcCxcbiAgU09iamVjdEZpZWxkTmFtZXMsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IFNmRGF0ZSBmcm9tICcuL2RhdGUnO1xuaW1wb3J0IHsgSW5nZXN0Sm9iVjJSZXN1bHRzIH0gZnJvbSAnLi9hcGkvYnVsazInO1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5RmllbGQ8XG4gIFMgZXh0ZW5kcyBTY2hlbWEsXG4gIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gIEZQIGV4dGVuZHMgRmllbGRQYXRoU3BlY2lmaWVyPFMsIE4+ID0gRmllbGRQYXRoU3BlY2lmaWVyPFMsIE4+XG4+ID0gRlAgfCBGUFtdIHwgc3RyaW5nIHwgc3RyaW5nW10gfCB7IFtmaWVsZDogc3RyaW5nXTogbnVtYmVyIHwgYm9vbGVhbiB9O1xuXG4vKipcbiAqXG4gKi9cbnR5cGUgQ1ZhbHVlPFQ+ID0gVCBleHRlbmRzIERhdGVTdHJpbmdcbiAgPyBTZkRhdGVcbiAgOiBUIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuICA/IFRcbiAgOiBuZXZlcjtcblxudHlwZSBDb25kT3A8VD4gPVxuICB8IFsnJGVxJywgQ1ZhbHVlPFQ+IHwgbnVsbF1cbiAgfCBbJyRuZScsIENWYWx1ZTxUPiB8IG51bGxdXG4gIHwgWyckZ3QnLCBDVmFsdWU8VD5dXG4gIHwgWyckZ3RlJywgQ1ZhbHVlPFQ+XVxuICB8IFsnJGx0JywgQ1ZhbHVlPFQ+XVxuICB8IFsnJGx0ZScsIENWYWx1ZTxUPl1cbiAgfCBbJyRsaWtlJywgVCBleHRlbmRzIHN0cmluZyA/IFQgOiBuZXZlcl1cbiAgfCBbJyRubGlrZScsIFQgZXh0ZW5kcyBzdHJpbmcgPyBUIDogbmV2ZXJdXG4gIHwgWyckaW4nLCBBcnJheTxDVmFsdWU8VD4+XVxuICB8IFsnJG5pbicsIEFycmF5PENWYWx1ZTxUPj5dXG4gIHwgWyckaW5jbHVkZXMnLCBUIGV4dGVuZHMgc3RyaW5nID8gVFtdIDogbmV2ZXJdXG4gIHwgWyckZXhjbHVkZXMnLCBUIGV4dGVuZHMgc3RyaW5nID8gVFtdIDogbmV2ZXJdXG4gIHwgWyckZXhpc3RzJywgYm9vbGVhbl07XG5cbnR5cGUgQ29uZFZhbHVlT2JqPFQsIE9wID0gQ29uZE9wPFQ+WzBdPiA9IE9wIGV4dGVuZHMgQ29uZE9wPFQ+WzBdXG4gID8gT3AgZXh0ZW5kcyBzdHJpbmdcbiAgICA/IHsgW0sgaW4gT3BdOiBFeHRyYWN0PENvbmRPcDxUPiwgW09wLCBhbnldPlsxXSB9XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIENvbmRWYWx1ZTxUPiA9IENWYWx1ZTxUPiB8IEFycmF5PENWYWx1ZTxUPj4gfCBudWxsIHwgQ29uZFZhbHVlT2JqPFQ+O1xuXG50eXBlIENvbmRpdGlvblNldDxSIGV4dGVuZHMgUmVjb3JkPiA9IHtcbiAgW0sgaW4ga2V5b2YgUl0/OiBDb25kVmFsdWU8UltLXT47XG59O1xuXG5leHBvcnQgdHlwZSBRdWVyeUNvbmRpdGlvbjxTIGV4dGVuZHMgU2NoZW1hLCBOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+PiA9XG4gIHwge1xuICAgICAgJG9yOiBBcnJheTxRdWVyeUNvbmRpdGlvbjxTLCBOPj47XG4gICAgfVxuICB8IHtcbiAgICAgICRhbmQ6IEFycmF5PFF1ZXJ5Q29uZGl0aW9uPFMsIE4+PjtcbiAgICB9XG4gIHwgQ29uZGl0aW9uU2V0PFNPYmplY3RSZWNvcmQ8UywgTj4+O1xuXG5leHBvcnQgdHlwZSBRdWVyeVNvcnQ8XG4gIFMgZXh0ZW5kcyBTY2hlbWEsXG4gIE4gZXh0ZW5kcyBTT2JqZWN0TmFtZXM8Uz4sXG4gIFIgZXh0ZW5kcyBTT2JqZWN0UmVjb3JkPFMsIE4+ID0gU09iamVjdFJlY29yZDxTLCBOPlxuPiA9XG4gIHwge1xuICAgICAgW0sgaW4ga2V5b2YgUl0/OiBTb3J0RGlyO1xuICAgIH1cbiAgfCBBcnJheTxba2V5b2YgUiwgU29ydERpcl0+O1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5Q29uZmlnPFxuICBTIGV4dGVuZHMgU2NoZW1hLFxuICBOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+LFxuICBGUCBleHRlbmRzIEZpZWxkUGF0aFNwZWNpZmllcjxTLCBOPiA9IEZpZWxkUGF0aFNwZWNpZmllcjxTLCBOPlxuPiA9IHtcbiAgZmllbGRzPzogUXVlcnlGaWVsZDxTLCBOLCBGUD47XG4gIGluY2x1ZGVzPzoge1xuICAgIFtDUk4gaW4gQ2hpbGRSZWxhdGlvbnNoaXBOYW1lczxTLCBOPl0/OiBRdWVyeUNvbmZpZzxcbiAgICAgIFMsXG4gICAgICBDaGlsZFJlbGF0aW9uc2hpcFNPYmplY3ROYW1lPFMsIE4sIENSTj5cbiAgICA+O1xuICB9O1xuICB0YWJsZT86IHN0cmluZztcbiAgY29uZGl0aW9ucz86IFF1ZXJ5Q29uZGl0aW9uPFMsIE4+O1xuICBzb3J0PzogUXVlcnlTb3J0PFMsIE4+O1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUXVlcnlPcHRpb25zID0ge1xuICBoZWFkZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgbWF4RmV0Y2g6IG51bWJlcjtcbiAgYXV0b0ZldGNoOiBib29sZWFuO1xuICBzY2FuQWxsOiBib29sZWFuO1xuICByZXNwb25zZVRhcmdldDogUXVlcnlSZXNwb25zZVRhcmdldDtcbn07XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UmVzdWx0PFIgZXh0ZW5kcyBSZWNvcmQ+ID0ge1xuICBkb25lOiBib29sZWFuO1xuICB0b3RhbFNpemU6IG51bWJlcjtcbiAgcmVjb3JkczogUltdO1xuICBuZXh0UmVjb3Jkc1VybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXhwbGFpblJlc3VsdCA9IHtcbiAgcGxhbnM6IEFycmF5PHtcbiAgICBjYXJkaW5hbGl0eTogbnVtYmVyO1xuICAgIGZpZWxkczogc3RyaW5nW107XG4gICAgbGVhZGluZ09wZXJhdGlvblR5cGU6ICdJbmRleCcgfCAnT3RoZXInIHwgJ1NoYXJpbmcnIHwgJ1RhYmxlU2Nhbic7XG4gICAgbm90ZXM6IEFycmF5PHtcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBmaWVsZHM6IHN0cmluZ1tdO1xuICAgICAgdGFibGVFbnVtT3JJZDogc3RyaW5nO1xuICAgIH0+O1xuICAgIHJlbGF0aXZlQ29zdDogbnVtYmVyO1xuICAgIHNvYmplY3RDYXJkaW5hbGl0eTogbnVtYmVyO1xuICAgIHNvYmplY3RUeXBlOiBzdHJpbmc7XG4gIH0+O1xufTtcblxuY29uc3QgUmVzcG9uc2VUYXJnZXRWYWx1ZXMgPSBbXG4gICdRdWVyeVJlc3VsdCcsXG4gICdSZWNvcmRzJyxcbiAgJ1NpbmdsZVJlY29yZCcsXG4gICdDb3VudCcsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWVyeVJlc3BvbnNlVGFyZ2V0ID0gdHlwZW9mIFJlc3BvbnNlVGFyZ2V0VmFsdWVzW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBSZXNwb25zZVRhcmdldHM6IHtcbiAgW0sgaW4gUXVlcnlSZXNwb25zZVRhcmdldF06IEs7XG59ID0gUmVzcG9uc2VUYXJnZXRWYWx1ZXMucmVkdWNlKFxuICAodmFsdWVzLCB0YXJnZXQpID0+ICh7IC4uLnZhbHVlcywgW3RhcmdldF06IHRhcmdldCB9KSxcbiAge30gYXMge1xuICAgIFtLIGluIFF1ZXJ5UmVzcG9uc2VUYXJnZXRdOiBLO1xuICB9LFxuKTtcblxuZXhwb3J0IHR5cGUgUXVlcnlSZXNwb25zZTxcbiAgUiBleHRlbmRzIFJlY29yZCxcbiAgUVJUIGV4dGVuZHMgUXVlcnlSZXNwb25zZVRhcmdldCA9IFF1ZXJ5UmVzcG9uc2VUYXJnZXRcbj4gPSBRUlQgZXh0ZW5kcyAnUXVlcnlSZXN1bHQnXG4gID8gUXVlcnlSZXN1bHQ8Uj5cbiAgOiBRUlQgZXh0ZW5kcyAnUmVjb3JkcydcbiAgPyBSW11cbiAgOiBRUlQgZXh0ZW5kcyAnU2luZ2xlUmVjb3JkJ1xuICA/IFIgfCBudWxsXG4gIDogbnVtYmVyOyAvLyBRUlQgZXh0ZW5kcyAnQ291bnQnXG5cbmV4cG9ydCB0eXBlIEJ1bGtBcGlWZXJzaW9uID0gMSB8IDI7XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RGVzdHJveU9wdGlvbnMgPSB7XG4gIGFsbG93QnVsaz86IGJvb2xlYW47XG4gIGJ1bGtUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIGJ1bGtBcGlWZXJzaW9uPzogQnVsa0FwaVZlcnNpb247XG59O1xuXG5leHBvcnQgdHlwZSBRdWVyeVVwZGF0ZU9wdGlvbnMgPSB7XG4gIGFsbG93QnVsaz86IGJvb2xlYW47XG4gIGJ1bGtUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIGJ1bGtBcGlWZXJzaW9uPzogQnVsa0FwaVZlcnNpb247XG4gIC8qKlxuICAgKiBTa2lwIHJlY29yZCB0ZW1wbGF0ZSBldmFsdWF0aW9uLlxuICAgKi9cbiAgc2tpcFJlY29yZFRlbXBsYXRlRXZhbD86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqXG4gKi9cbmNvbnN0IERFRkFVTFRfQlVMS19USFJFU0hPTEQgPSAyMDA7XG5jb25zdCBERUZBVUxUX0JVTEtfQVBJX1ZFUlNJT04gPSAxO1xuXG4vKipcbiAqIFF1ZXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeTxcbiAgUyBleHRlbmRzIFNjaGVtYSxcbiAgTiBleHRlbmRzIFNPYmplY3ROYW1lczxTPixcbiAgUiBleHRlbmRzIFJlY29yZCA9IFJlY29yZCxcbiAgUVJUIGV4dGVuZHMgUXVlcnlSZXNwb25zZVRhcmdldCA9IFF1ZXJ5UmVzcG9uc2VUYXJnZXRcbj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgX2xvZ2dlciA9IGdldExvZ2dlcigncXVlcnknKTtcblxuICBfY29ubjogQ29ubmVjdGlvbjxTPjtcbiAgX2xvZ2dlcjogTG9nZ2VyO1xuICBfc29xbDogT3B0aW9uYWw8c3RyaW5nPjtcbiAgX2xvY2F0b3I6IE9wdGlvbmFsPHN0cmluZz47XG4gIF9jb25maWc6IFNPUUxRdWVyeUNvbmZpZyA9IHt9O1xuICBfY2hpbGRyZW46IEFycmF5PFN1YlF1ZXJ5PFMsIE4sIFIsIFFSVCwgYW55LCBhbnksIGFueT4+ID0gW107XG4gIF9vcHRpb25zOiBRdWVyeU9wdGlvbnM7XG4gIF9leGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBfZmluaXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX2NoYWluaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIF9wcm9taXNlOiBQcm9taXNlPFF1ZXJ5UmVzcG9uc2U8UiwgUVJUPj47XG4gIF9zdHJlYW06IFNlcmlhbGl6YWJsZTxSPjtcblxuICB0b3RhbFNpemUgPSAwO1xuICB0b3RhbEZldGNoZWQgPSAwO1xuICByZWNvcmRzOiBSW10gPSBbXTtcblxuICAvKipcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbm46IENvbm5lY3Rpb248Uz4sXG4gICAgY29uZmlnOiBzdHJpbmcgfCBRdWVyeUNvbmZpZzxTLCBOPiB8IHsgbG9jYXRvcjogc3RyaW5nIH0sXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8UXVlcnlPcHRpb25zPixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jb25uID0gY29ubjtcbiAgICB0aGlzLl9sb2dnZXIgPSBjb25uLl9sb2dMZXZlbFxuICAgICAgPyBRdWVyeS5fbG9nZ2VyLmNyZWF0ZUluc3RhbmNlKGNvbm4uX2xvZ0xldmVsKVxuICAgICAgOiBRdWVyeS5fbG9nZ2VyO1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fc29xbCA9IGNvbmZpZztcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgY29uZmlnIGlzIHNvcWw6ICR7Y29uZmlnfWApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIChjb25maWcgYXMgYW55KS5sb2NhdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbG9jYXRvcjogc3RyaW5nID0gKGNvbmZpZyBhcyBhbnkpLmxvY2F0b3I7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoYGNvbmZpZyBpcyBsb2NhdG9yOiAke2xvY2F0b3J9YCk7XG4gICAgICB0aGlzLl9sb2NhdG9yID0gbG9jYXRvci5pbmNsdWRlcygnLycpXG4gICAgICAgID8gdGhpcy51cmxUb0xvY2F0b3IobG9jYXRvcilcbiAgICAgICAgOiBsb2NhdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoYGNvbmZpZyBpcyBRdWVyeUNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWApO1xuICAgICAgY29uc3QgeyBmaWVsZHMsIGluY2x1ZGVzLCBzb3J0LCAuLi5fY29uZmlnIH0gPSBjb25maWcgYXMgUXVlcnlDb25maWc8XG4gICAgICAgIFMsXG4gICAgICAgIE5cbiAgICAgID47XG4gICAgICB0aGlzLl9jb25maWcgPSBfY29uZmlnO1xuICAgICAgdGhpcy5zZWxlY3QoZmllbGRzKTtcbiAgICAgIGlmIChpbmNsdWRlcykge1xuICAgICAgICB0aGlzLmluY2x1ZGVDaGlsZHJlbihpbmNsdWRlcyk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydCkge1xuICAgICAgICB0aGlzLnNvcnQoc29ydCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX29wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIG1heEZldGNoOiAxMDAwMCxcbiAgICAgIGF1dG9GZXRjaDogZmFsc2UsXG4gICAgICBzY2FuQWxsOiBmYWxzZSxcbiAgICAgIHJlc3BvbnNlVGFyZ2V0OiAnUXVlcnlSZXN1bHQnLFxuICAgICAgLi4uKG9wdGlvbnMgfHwge30pLFxuICAgIH0gYXMgUXVlcnlPcHRpb25zO1xuICAgIC8vIHByb21pc2UgaW5zdGFuY2VcbiAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5vbigncmVzcG9uc2UnLCByZXNvbHZlKTtcbiAgICAgIHRoaXMub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgICB0aGlzLl9zdHJlYW0gPSBuZXcgU2VyaWFsaXphYmxlKCk7XG4gICAgdGhpcy5vbigncmVjb3JkJywgKHJlY29yZCkgPT4gdGhpcy5fc3RyZWFtLnB1c2gocmVjb3JkKSk7XG4gICAgdGhpcy5vbignZW5kJywgKCkgPT4gdGhpcy5fc3RyZWFtLnB1c2gobnVsbCkpO1xuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBmaWVsZHMgdG8gaW5jbHVkZSBpbiB0aGUgcmV0dXJuaW5nIHJlc3VsdFxuICAgKi9cbiAgc2VsZWN0PFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmQsXG4gICAgRlAgZXh0ZW5kcyBGaWVsZFBhdGhTcGVjaWZpZXI8UywgTj4gPSBGaWVsZFBhdGhTcGVjaWZpZXI8UywgTj4sXG4gICAgRlBDIGV4dGVuZHMgRmllbGRQcm9qZWN0aW9uQ29uZmlnID0gRmllbGRQYXRoU2NvcGVkUHJvamVjdGlvbjxTLCBOLCBGUD4sXG4gICAgUjIgZXh0ZW5kcyBTT2JqZWN0UmVjb3JkPFMsIE4sIEZQQywgUj4gPSBTT2JqZWN0UmVjb3JkPFMsIE4sIEZQQywgUj5cbiAgPihmaWVsZHM6IFF1ZXJ5RmllbGQ8UywgTiwgRlA+ID0gJyonKTogUXVlcnk8UywgTiwgUjIsIFFSVD4ge1xuICAgIGlmICh0aGlzLl9zb3FsKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBzZXQgc2VsZWN0IGZpZWxkcyBmb3IgdGhlIHF1ZXJ5IHdoaWNoIGhhcyBhbHJlYWR5IGJ1aWx0IFNPUUwuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRvRmllbGRBcnJheShmaWVsZHM6IFF1ZXJ5RmllbGQ8UywgTiwgRlA+KTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHR5cGVvZiBmaWVsZHMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gZmllbGRzLnNwbGl0KC9cXHMqLFxccyovKVxuICAgICAgICA6IEFycmF5LmlzQXJyYXkoZmllbGRzKVxuICAgICAgICA/IChmaWVsZHMgYXMgQXJyYXk8c3RyaW5nIHwgRlA+KVxuICAgICAgICAgICAgLm1hcCh0b0ZpZWxkQXJyYXkpXG4gICAgICAgICAgICAucmVkdWNlPHN0cmluZ1tdPigoZnMsIGYpID0+IFsuLi5mcywgLi4uZl0sIFtdKVxuICAgICAgICA6IE9iamVjdC5lbnRyaWVzKGZpZWxkcyBhcyB7IFtuYW1lOiBzdHJpbmddOiBRdWVyeUZpZWxkPFMsIE4sIEZQPiB9KVxuICAgICAgICAgICAgLm1hcCgoW2YsIHZdKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2ID8gW2ZdIDogW107XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvRmllbGRBcnJheSh2KS5tYXAoKHApID0+IGAke2Z9LiR7cH1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZWR1Y2U8c3RyaW5nW10+KChmcywgZikgPT4gWy4uLmZzLCAuLi5mXSwgW10pO1xuICAgIH1cbiAgICBpZiAoZmllbGRzKSB7XG4gICAgICB0aGlzLl9jb25maWcuZmllbGRzID0gdG9GaWVsZEFycmF5KGZpZWxkcyk7XG4gICAgfVxuICAgIC8vIGZvcmNlIGNvbnZlcnQgcXVlcnkgcmVjb3JkIHR5cGUgd2l0aG91dCBjaGFuZ2luZyBpbnN0YW5jZTtcbiAgICByZXR1cm4gKHRoaXMgYXMgYW55KSBhcyBRdWVyeTxTLCBOLCBSMiwgUVJUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcXVlcnkgY29uZGl0aW9ucyB0byBmaWx0ZXIgdGhlIHJlc3VsdCByZWNvcmRzXG4gICAqL1xuICB3aGVyZShjb25kaXRpb25zOiBRdWVyeUNvbmRpdGlvbjxTLCBOPiB8IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9zb3FsKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBzZXQgd2hlcmUgY29uZGl0aW9ucyBmb3IgdGhlIHF1ZXJ5IHdoaWNoIGhhcyBhbHJlYWR5IGJ1aWx0IFNPUUwuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX2NvbmZpZy5jb25kaXRpb25zID0gY29uZGl0aW9ucztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW1pdCB0aGUgcmV0dXJuaW5nIHJlc3VsdFxuICAgKi9cbiAgbGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLl9zb3FsKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBzZXQgbGltaXQgZm9yIHRoZSBxdWVyeSB3aGljaCBoYXMgYWxyZWFkeSBidWlsdCBTT1FMLicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTa2lwIHJlY29yZHNcbiAgICovXG4gIHNraXAob2Zmc2V0OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fc29xbCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdDYW5ub3Qgc2V0IHNraXAvb2Zmc2V0IGZvciB0aGUgcXVlcnkgd2hpY2ggaGFzIGFscmVhZHkgYnVpbHQgU09RTC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fY29uZmlnLm9mZnNldCA9IG9mZnNldDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5vbnltIG9mIFF1ZXJ5I3NraXAoKVxuICAgKi9cbiAgb2Zmc2V0ID0gdGhpcy5za2lwO1xuXG4gIC8qKlxuICAgKiBTZXQgcXVlcnkgc29ydCB3aXRoIGRpcmVjdGlvblxuICAgKi9cbiAgc29ydChzb3J0OiBRdWVyeVNvcnQ8UywgTj58c3RyaW5nKTogdGhpcztcbiAgc29ydChzb3J0OiBTT2JqZWN0RmllbGROYW1lczxTLCBOPnxzdHJpbmcsIGRpcjogU29ydERpcik6IHRoaXM7XG4gIHNvcnQoXG4gICAgc29ydDogUXVlcnlTb3J0PFMsIE4+IHwgU09iamVjdEZpZWxkTmFtZXM8UywgTj4gfCBzdHJpbmcsXG4gICAgZGlyPzogU29ydERpcixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX3NvcWwpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnQ2Fubm90IHNldCBzb3J0IGZvciB0aGUgcXVlcnkgd2hpY2ggaGFzIGFscmVhZHkgYnVpbHQgU09RTC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzb3J0ID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZGlyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5fY29uZmlnLnNvcnQgPSBbW3NvcnQsIGRpcl1dO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb25maWcuc29ydCA9IHNvcnQgYXMgc3RyaW5nIHwgeyBbZmllbGQ6IHN0cmluZ106IFNvcnREaXIgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3lub255bSBvZiBRdWVyeSNzb3J0KClcbiAgICovXG4gIG9yZGVyYnk6IHR5cGVvZiBRdWVyeS5wcm90b3R5cGUuc29ydCA9IHRoaXMuc29ydDtcblxuICAvKipcbiAgICogSW5jbHVkZSBjaGlsZCByZWxhdGlvbnNoaXAgcXVlcnkgYW5kIG1vdmUgZG93biB0byB0aGUgY2hpbGQgcXVlcnkgY29udGV4dFxuICAgKi9cbiAgaW5jbHVkZTxcbiAgICBDUk4gZXh0ZW5kcyBDaGlsZFJlbGF0aW9uc2hpcE5hbWVzPFMsIE4+LFxuICAgIENOIGV4dGVuZHMgQ2hpbGRSZWxhdGlvbnNoaXBTT2JqZWN0TmFtZTxTLCBOLCBDUk4+LFxuICAgIENGUCBleHRlbmRzIEZpZWxkUGF0aFNwZWNpZmllcjxTLCBDTj4gPSBGaWVsZFBhdGhTcGVjaWZpZXI8UywgQ04+LFxuICAgIENGUEMgZXh0ZW5kcyBGaWVsZFByb2plY3Rpb25Db25maWcgPSBGaWVsZFBhdGhTY29wZWRQcm9qZWN0aW9uPFMsIENOLCBDRlA+LFxuICAgIENSIGV4dGVuZHMgUmVjb3JkID0gU09iamVjdFJlY29yZDxTLCBDTiwgQ0ZQQz5cbiAgPihcbiAgICBjaGlsZFJlbE5hbWU6IENSTixcbiAgICBjb25kaXRpb25zPzogT3B0aW9uYWw8UXVlcnlDb25kaXRpb248UywgQ04+PixcbiAgICBmaWVsZHM/OiBPcHRpb25hbDxRdWVyeUZpZWxkPFMsIENOLCBDRlA+PixcbiAgICBvcHRpb25zPzogeyBsaW1pdD86IG51bWJlcjsgb2Zmc2V0PzogbnVtYmVyOyBzb3J0PzogUXVlcnlTb3J0PFMsIENOPiB9LFxuICApOiBTdWJRdWVyeTxTLCBOLCBSLCBRUlQsIENSTiwgQ04sIENSPjtcbiAgaW5jbHVkZTxcbiAgICBDUk4gZXh0ZW5kcyBDaGlsZFJlbGF0aW9uc2hpcE5hbWVzPFMsIE4+LFxuICAgIENOIGV4dGVuZHMgU09iamVjdE5hbWVzPFM+LFxuICAgIENSIGV4dGVuZHMgUmVjb3JkID0gU09iamVjdFJlY29yZDxTLCBDTj5cbiAgPihcbiAgICBjaGlsZFJlbE5hbWU6IHN0cmluZyxcbiAgICBjb25kaXRpb25zPzogT3B0aW9uYWw8UXVlcnlDb25kaXRpb248UywgQ04+PixcbiAgICBmaWVsZHM/OiBPcHRpb25hbDxRdWVyeUZpZWxkPFMsIENOPj4sXG4gICAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlcjsgc29ydD86IFF1ZXJ5U29ydDxTLCBDTj4gfSxcbiAgKTogU3ViUXVlcnk8UywgTiwgUiwgUVJULCBDUk4sIENOLCBDUj47XG5cbiAgaW5jbHVkZTxcbiAgICBDUk4gZXh0ZW5kcyBDaGlsZFJlbGF0aW9uc2hpcE5hbWVzPFMsIE4+LFxuICAgIENOIGV4dGVuZHMgQ2hpbGRSZWxhdGlvbnNoaXBTT2JqZWN0TmFtZTxTLCBOLCBDUk4+LFxuICAgIENGUCBleHRlbmRzIEZpZWxkUGF0aFNwZWNpZmllcjxTLCBDTj4gPSBGaWVsZFBhdGhTcGVjaWZpZXI8UywgQ04+LFxuICAgIENGUEMgZXh0ZW5kcyBGaWVsZFByb2plY3Rpb25Db25maWcgPSBGaWVsZFBhdGhTY29wZWRQcm9qZWN0aW9uPFMsIENOLCBDRlA+LFxuICAgIENSIGV4dGVuZHMgUmVjb3JkID0gU09iamVjdFJlY29yZDxTLCBDTiwgQ0ZQQz5cbiAgPihcbiAgICBjaGlsZFJlbE5hbWU6IENSTiB8IHN0cmluZyxcbiAgICBjb25kaXRpb25zPzogT3B0aW9uYWw8UXVlcnlDb25kaXRpb248UywgQ04+PixcbiAgICBmaWVsZHM/OiBPcHRpb25hbDxRdWVyeUZpZWxkPFMsIENOLCBDRlA+PixcbiAgICBvcHRpb25zOiB7IGxpbWl0PzogbnVtYmVyOyBvZmZzZXQ/OiBudW1iZXI7IHNvcnQ/OiBRdWVyeVNvcnQ8UywgQ04+IH0gPSB7fSxcbiAgKTogU3ViUXVlcnk8UywgTiwgUiwgUVJULCBDUk4sIENOLCBDUj4ge1xuICAgIGlmICh0aGlzLl9zb3FsKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBpbmNsdWRlIGNoaWxkIHJlbGF0aW9uc2hpcCBpbnRvIHRoZSBxdWVyeSB3aGljaCBoYXMgYWxyZWFkeSBidWlsdCBTT1FMLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZENvbmZpZzogUXVlcnlDb25maWc8UywgQ04sIENGUD4gPSB7XG4gICAgICBmaWVsZHM6IGZpZWxkcyA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZpZWxkcyxcbiAgICAgIHRhYmxlOiBjaGlsZFJlbE5hbWUsXG4gICAgICBjb25kaXRpb25zOiBjb25kaXRpb25zID09PSBudWxsID8gdW5kZWZpbmVkIDogY29uZGl0aW9ucyxcbiAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0LFxuICAgICAgb2Zmc2V0OiBvcHRpb25zLm9mZnNldCxcbiAgICAgIHNvcnQ6IG9wdGlvbnMuc29ydCxcbiAgICB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIGNvbnN0IGNoaWxkUXVlcnkgPSBuZXcgU3ViUXVlcnk8UywgTiwgUiwgUVJULCBDUk4sIENOLCBDUj4oXG4gICAgICB0aGlzLl9jb25uLFxuICAgICAgY2hpbGRSZWxOYW1lIGFzIENSTixcbiAgICAgIGNoaWxkQ29uZmlnLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goY2hpbGRRdWVyeSk7XG4gICAgcmV0dXJuIGNoaWxkUXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogSW5jbHVkZSBjaGlsZCByZWxhdGlvbnNoaXAgcXVlcmllcywgYnV0IG5vdCBtb3ZpbmcgZG93biB0byB0aGUgY2hpbGRyZW4gY29udGV4dFxuICAgKi9cbiAgaW5jbHVkZUNoaWxkcmVuKFxuICAgIGluY2x1ZGVzOiB7XG4gICAgICBbQ1JOIGluIENoaWxkUmVsYXRpb25zaGlwTmFtZXM8UywgTj5dPzogUXVlcnlDb25maWc8XG4gICAgICAgIFMsXG4gICAgICAgIENoaWxkUmVsYXRpb25zaGlwU09iamVjdE5hbWU8UywgTiwgQ1JOPlxuICAgICAgPjtcbiAgICB9LFxuICApIHtcbiAgICB0eXBlIENSTiA9IENoaWxkUmVsYXRpb25zaGlwTmFtZXM8UywgTj47XG4gICAgaWYgKHRoaXMuX3NvcWwpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGluY2x1ZGUgY2hpbGQgcmVsYXRpb25zaGlwIGludG8gdGhlIHF1ZXJ5IHdoaWNoIGhhcyBhbHJlYWR5IGJ1aWx0IFNPUUwuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY3JuYW1lIG9mIE9iamVjdC5rZXlzKGluY2x1ZGVzKSBhcyBDUk5bXSkge1xuICAgICAgY29uc3QgeyBjb25kaXRpb25zLCBmaWVsZHMsIC4uLm9wdGlvbnMgfSA9IGluY2x1ZGVzW1xuICAgICAgICBjcm5hbWVcbiAgICAgIF0gYXMgUXVlcnlDb25maWc8UywgQ2hpbGRSZWxhdGlvbnNoaXBTT2JqZWN0TmFtZTxTLCBOLCBDUk4+PjtcbiAgICAgIHRoaXMuaW5jbHVkZShjcm5hbWUsIGNvbmRpdGlvbnMsIGZpZWxkcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgbWF4RmV0Y2ggcXVlcnkgb3B0aW9uXG4gICAqL1xuICBtYXhGZXRjaChtYXhGZXRjaDogbnVtYmVyKSB7XG4gICAgdGhpcy5fb3B0aW9ucy5tYXhGZXRjaCA9IG1heEZldGNoO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGluZyBhdXRvIGZldGNoIG1vZGVcbiAgICovXG4gIGF1dG9GZXRjaChhdXRvRmV0Y2g6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9vcHRpb25zLmF1dG9GZXRjaCA9IGF1dG9GZXRjaDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmxhZyB0byBzY2FuIGFsbCByZWNvcmRzIGluY2x1ZGluZyBkZWxldGVkIGFuZCBhcmNoaXZlZC5cbiAgICovXG4gIHNjYW5BbGwoc2NhbkFsbDogYm9vbGVhbikge1xuICAgIHRoaXMuX29wdGlvbnMuc2NhbkFsbCA9IHNjYW5BbGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHNldFJlc3BvbnNlVGFyZ2V0PFFSVDEgZXh0ZW5kcyBRdWVyeVJlc3BvbnNlVGFyZ2V0PihcbiAgICByZXNwb25zZVRhcmdldDogUVJUMSxcbiAgKTogUXVlcnk8UywgTiwgUiwgUVJUMT4ge1xuICAgIGlmIChyZXNwb25zZVRhcmdldCBpbiBSZXNwb25zZVRhcmdldHMpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMucmVzcG9uc2VUYXJnZXQgPSByZXNwb25zZVRhcmdldDtcbiAgICB9XG4gICAgLy8gZm9yY2UgY2hhbmdlIHF1ZXJ5IHJlc3BvbnNlIHRhcmdldCB3aXRob3V0IGNoYW5naW5nIGluc3RhbmNlXG4gICAgcmV0dXJuICh0aGlzIGFzIFF1ZXJ5PFMsIE4sIFI+KSBhcyBRdWVyeTxTLCBOLCBSLCBRUlQxPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHF1ZXJ5IGFuZCBmZXRjaCByZWNvcmRzIGZyb20gc2VydmVyLlxuICAgKi9cbiAgZXhlY3V0ZTxRUlQxIGV4dGVuZHMgUXVlcnlSZXNwb25zZVRhcmdldCA9IFFSVD4oXG4gICAgb3B0aW9uc186IFBhcnRpYWw8UXVlcnlPcHRpb25zPiAmIHsgcmVzcG9uc2VUYXJnZXQ/OiBRUlQxIH0gPSB7fSxcbiAgKTogUXVlcnk8UywgTiwgUiwgUVJUMT4ge1xuICAgIGlmICh0aGlzLl9leGVjdXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZS1leGVjdXRpbmcgYWxyZWFkeSBleGVjdXRlZCBxdWVyeScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9maW5pc2hlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleGVjdXRpbmcgYWxyZWFkeSBjbG9zZWQgcXVlcnknKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgaGVhZGVyczogb3B0aW9uc18uaGVhZGVycyB8fCB0aGlzLl9vcHRpb25zLmhlYWRlcnMsXG4gICAgICByZXNwb25zZVRhcmdldDogb3B0aW9uc18ucmVzcG9uc2VUYXJnZXQgfHwgdGhpcy5fb3B0aW9ucy5yZXNwb25zZVRhcmdldCxcbiAgICAgIGF1dG9GZXRjaDogb3B0aW9uc18uYXV0b0ZldGNoIHx8IHRoaXMuX29wdGlvbnMuYXV0b0ZldGNoLFxuICAgICAgbWF4RmV0Y2g6IG9wdGlvbnNfLm1heEZldGNoIHx8IHRoaXMuX29wdGlvbnMubWF4RmV0Y2gsXG4gICAgICBzY2FuQWxsOiBvcHRpb25zXy5zY2FuQWxsIHx8IHRoaXMuX29wdGlvbnMuc2NhbkFsbCxcbiAgICB9O1xuXG4gICAgLy8gY29sbGVjdCBmZXRjaGVkIHJlY29yZHMgaW4gYXJyYXlcbiAgICAvLyBvbmx5IHdoZW4gcmVzcG9uc2UgdGFyZ2V0IGlzIFJlY29yZHMgYW5kXG4gICAgLy8gZWl0aGVyIGNhbGxiYWNrIG9yIGNoYWluaW5nIHByb21pc2VzIGFyZSBhdmFpbGFibGUgdG8gdGhpcyBxdWVyeS5cbiAgICB0aGlzLm9uY2UoJ2ZldGNoJywgKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zLnJlc3BvbnNlVGFyZ2V0ID09PSBSZXNwb25zZVRhcmdldHMuUmVjb3JkcyAmJlxuICAgICAgICB0aGlzLl9jaGFpbmluZ1xuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnLS0tIGNvbGxlY3RpbmcgYWxsIGZldGNoZWQgcmVjb3JkcyAtLS0nKTtcbiAgICAgICAgY29uc3QgcmVjb3JkczogUmVjb3JkW10gPSBbXTtcbiAgICAgICAgY29uc3Qgb25SZWNvcmQgPSAocmVjb3JkOiBSZWNvcmQpID0+IHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICB0aGlzLm9uKCdyZWNvcmQnLCBvblJlY29yZCk7XG4gICAgICAgIHRoaXMub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlY29yZCcsIG9uUmVjb3JkKTtcbiAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc3BvbnNlJywgcmVjb3JkcywgdGhpcyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZmxhZyB0byBwcmV2ZW50IHJlLWV4ZWN1dGlvblxuICAgIHRoaXMuX2V4ZWN1dGVkID0gdHJ1ZTtcblxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBzdGFydCBhY3R1YWwgcXVlcnlcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnPj4+IFF1ZXJ5IHN0YXJ0ID4+PicpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZShvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCcqKiogUXVlcnkgZmluaXNoZWQgKioqJyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJy0tLSBRdWVyeSBlcnJvciAtLS0nLCBlcnJvcik7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIC8vIHJldHVybiBRdWVyeSBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICByZXR1cm4gKHRoaXMgYXMgUXVlcnk8UywgTiwgUj4pIGFzIFF1ZXJ5PFMsIE4sIFIsIFFSVDE+O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bm9ueW0gb2YgUXVlcnkjZXhlY3V0ZSgpXG4gICAqL1xuICBleGVjID0gdGhpcy5leGVjdXRlO1xuXG4gIC8qKlxuICAgKiBTeW5vbnltIG9mIFF1ZXJ5I2V4ZWN1dGUoKVxuICAgKi9cbiAgcnVuID0gdGhpcy5leGVjdXRlO1xuXG4gIHByaXZhdGUgbG9jYXRvclRvVXJsKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhdG9yXG4gICAgICA/IFt0aGlzLl9jb25uLl9iYXNlVXJsKCksICcvcXVlcnkvJywgdGhpcy5fbG9jYXRvcl0uam9pbignJylcbiAgICAgIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHVybFRvTG9jYXRvcih1cmw6IHN0cmluZykge1xuICAgIHJldHVybiB1cmwuc3BsaXQoJy8nKS5wb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0UmVzcG9uc2UoXG4gICAgcmF3RG9uZTogYm9vbGVhbixcbiAgICByZXNwb25zZVRhcmdldDogUXVlcnlSZXNwb25zZVRhcmdldFszXSxcbiAgKTogbnVtYmVyO1xuICBwcml2YXRlIGNvbnN0cnVjdFJlc3BvbnNlKFxuICAgIHJhd0RvbmU6IGJvb2xlYW4sXG4gICAgcmVzcG9uc2VUYXJnZXQ6IFF1ZXJ5UmVzcG9uc2VUYXJnZXRbMl0sXG4gICk6IFI7XG4gIHByaXZhdGUgY29uc3RydWN0UmVzcG9uc2UoXG4gICAgcmF3RG9uZTogYm9vbGVhbixcbiAgICByZXNwb25zZVRhcmdldDogUXVlcnlSZXNwb25zZVRhcmdldFsxXSxcbiAgKTogUltdO1xuICBwcml2YXRlIGNvbnN0cnVjdFJlc3BvbnNlKFxuICAgIHJhd0RvbmU6IGJvb2xlYW4sXG4gICAgcmVzcG9uc2VUYXJnZXQ6IFF1ZXJ5UmVzcG9uc2VUYXJnZXRbMF0sXG4gICk6IFF1ZXJ5UmVzdWx0PFI+O1xuICBwcml2YXRlIGNvbnN0cnVjdFJlc3BvbnNlKFxuICAgIHJhd0RvbmU6IGJvb2xlYW4sXG4gICAgcmVzcG9uc2VUYXJnZXQ6IFF1ZXJ5UmVzcG9uc2VUYXJnZXQsXG4gICk6IFF1ZXJ5UmVzdWx0PFI+IHwgUltdIHwgbnVtYmVyIHwgUiB7XG4gICAgc3dpdGNoIChyZXNwb25zZVRhcmdldCkge1xuICAgICAgY2FzZSAnQ291bnQnOlxuICAgICAgICByZXR1cm4gdGhpcy50b3RhbFNpemU7XG4gICAgICBjYXNlICdTaW5nbGVSZWNvcmQnOlxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRzPy5bMF0gPz8gbnVsbDtcbiAgICAgIGNhc2UgJ1JlY29yZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRzO1xuICAgICAgLy8gUXVlcnlSZXN1bHQgaXMgZGVmYXVsdCByZXNwb25zZSB0YXJnZXRcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ue1xuICAgICAgICAgICAgcmVjb3JkczogdGhpcy5yZWNvcmRzLFxuICAgICAgICAgICAgdG90YWxTaXplOiB0aGlzLnRvdGFsU2l6ZSxcbiAgICAgICAgICAgIGRvbmU6IHJhd0RvbmUgPz8gdHJ1ZSwgLy8gd2hlbiBubyByZWNvcmRzLCBkb25lIGlzIG9taXR0ZWRcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLih0aGlzLl9sb2NhdG9yID8geyBuZXh0UmVjb3Jkc1VybDogdGhpcy5sb2NhdG9yVG9VcmwoKSB9IDoge30pLFxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9leGVjdXRlKG9wdGlvbnM6IFF1ZXJ5T3B0aW9ucyk6IFByb21pc2U8UXVlcnlSZXNwb25zZTxSPj4ge1xuICAgIGNvbnN0IHsgaGVhZGVycywgcmVzcG9uc2VUYXJnZXQsIGF1dG9GZXRjaCwgbWF4RmV0Y2gsIHNjYW5BbGwgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdleGVjdXRlIHdpdGggb3B0aW9ucycsIG9wdGlvbnMpO1xuICAgIGxldCB1cmw7XG4gICAgaWYgKHRoaXMuX2xvY2F0b3IpIHtcbiAgICAgIHVybCA9IHRoaXMubG9jYXRvclRvVXJsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNvcWwgPSBhd2FpdCB0aGlzLnRvU09RTCgpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKGBTT1FMID0gJHtzb3FsfWApO1xuICAgICAgdXJsID0gW1xuICAgICAgICB0aGlzLl9jb25uLl9iYXNlVXJsKCksXG4gICAgICAgICcvJyxcbiAgICAgICAgc2NhbkFsbCA/ICdxdWVyeUFsbCcgOiAncXVlcnknLFxuICAgICAgICAnP3E9JyxcbiAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHNvcWwpLFxuICAgICAgXS5qb2luKCcnKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2Nvbm4ucmVxdWVzdDxSPih7IG1ldGhvZDogJ0dFVCcsIHVybCwgaGVhZGVycyB9KTtcbiAgICB0aGlzLmVtaXQoJ2ZldGNoJyk7XG4gICAgdGhpcy50b3RhbFNpemUgPSBkYXRhLnRvdGFsU2l6ZTtcbiAgICB0aGlzLnJlY29yZHMgPSB0aGlzLnJlY29yZHM/LmNvbmNhdChcbiAgICAgIG1heEZldGNoIC0gdGhpcy5yZWNvcmRzLmxlbmd0aCA+IGRhdGEucmVjb3Jkcy5sZW5ndGhcbiAgICAgICAgPyBkYXRhLnJlY29yZHNcbiAgICAgICAgOiBkYXRhLnJlY29yZHMuc2xpY2UoMCwgbWF4RmV0Y2ggLSB0aGlzLnJlY29yZHMubGVuZ3RoKSxcbiAgICApO1xuICAgIHRoaXMuX2xvY2F0b3IgPSBkYXRhLm5leHRSZWNvcmRzVXJsXG4gICAgICA/IHRoaXMudXJsVG9Mb2NhdG9yKGRhdGEubmV4dFJlY29yZHNVcmwpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9maW5pc2hlZCA9XG4gICAgICB0aGlzLl9maW5pc2hlZCB8fFxuICAgICAgZGF0YS5kb25lIHx8XG4gICAgICAhYXV0b0ZldGNoIHx8XG4gICAgICB0aGlzLnJlY29yZHMubGVuZ3RoID09PSBtYXhGZXRjaCB8fFxuICAgICAgLy8gdGhpcyBpcyB3aGF0IHRoZSByZXNwb25zZSBsb29rcyBsaWtlIHdoZW4gdGhlcmUgYXJlIG5vIHJlc3VsdHNcbiAgICAgIChkYXRhLnJlY29yZHMubGVuZ3RoID09PSAwICYmIGRhdGEuZG9uZSA9PT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIHN0cmVhbWluZyByZWNvcmQgaW5zdGFuY2VzXG4gICAgY29uc3QgbnVtUmVjb3JkcyA9IGRhdGEucmVjb3Jkcz8ubGVuZ3RoID8/IDA7XG4gICAgbGV0IHRvdGFsRmV0Y2hlZCA9IHRoaXMudG90YWxGZXRjaGVkO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUmVjb3JkczsgaSsrKSB7XG4gICAgICBpZiAodG90YWxGZXRjaGVkID49IG1heEZldGNoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCByZWNvcmQgPSBkYXRhLnJlY29yZHNbaV07XG4gICAgICB0aGlzLmVtaXQoJ3JlY29yZCcsIHJlY29yZCwgdG90YWxGZXRjaGVkLCB0aGlzKTtcbiAgICAgIHRvdGFsRmV0Y2hlZCArPSAxO1xuICAgIH1cbiAgICB0aGlzLnRvdGFsRmV0Y2hlZCA9IHRvdGFsRmV0Y2hlZDtcblxuICAgIGlmICh0aGlzLl9maW5pc2hlZCkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmNvbnN0cnVjdFJlc3BvbnNlKGRhdGEuZG9uZSwgcmVzcG9uc2VUYXJnZXQpO1xuICAgICAgLy8gb25seSBmaXJlIHJlc3BvbnNlIGV2ZW50IHdoZW4gaXQgc2hvdWxkIGJlIG5vdGlmaWVkIHBlciBmZXRjaFxuICAgICAgaWYgKHJlc3BvbnNlVGFyZ2V0ICE9PSBSZXNwb25zZVRhcmdldHMuUmVjb3Jkcykge1xuICAgICAgICB0aGlzLmVtaXQoJ3Jlc3BvbnNlJywgcmVzcG9uc2UsIHRoaXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGUob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9idGFpbiByZWFkYWJsZSBzdHJlYW0gaW5zdGFuY2VcbiAgICovXG4gIHN0cmVhbSh0eXBlOiAncmVjb3JkJyk6IFNlcmlhbGl6YWJsZTxSPjtcbiAgc3RyZWFtKHR5cGU6ICdjc3YnKTogUmVhZGFibGU7XG4gIHN0cmVhbSh0eXBlOiAncmVjb3JkJyB8ICdjc3YnID0gJ2NzdicpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkICYmICF0aGlzLl9leGVjdXRlZCkge1xuICAgICAgdGhpcy5leGVjdXRlKHsgYXV0b0ZldGNoOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZSA9PT0gJ3JlY29yZCcgPyB0aGlzLl9zdHJlYW0gOiB0aGlzLl9zdHJlYW0uc3RyZWFtKHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpcGUgdGhlIHF1ZXJpZWQgcmVjb3JkcyB0byBhbm90aGVyIHN0cmVhbVxuICAgKiBUaGlzIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OyBRdWVyeSBpcyBub3QgYSByZWNvcmQgc3RyZWFtIGluc3RhbmNlIGFueW1vcmUgaW4gMi4wLlxuICAgKiBJZiB5b3Ugd2FudCBhIHJlY29yZCBzdHJlYW0gaW5zdGFuY2UsIHVzZSBgUXVlcnkjc3RyZWFtKCdyZWNvcmQnKWAuXG4gICAqL1xuICBwaXBlKHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtKCdyZWNvcmQnKS5waXBlKHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgX2V4cGFuZEZpZWxkcyhzb2JqZWN0Xz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9zb3FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZXhwYW5kIGZpZWxkcyBmb3IgdGhlIHF1ZXJ5IHdoaWNoIGhhcyBhbHJlYWR5IGJ1aWx0IFNPUUwuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRzID0gW10sIHRhYmxlID0gJycgfSA9IHRoaXMuX2NvbmZpZztcbiAgICBjb25zdCBzb2JqZWN0ID0gc29iamVjdF8gfHwgdGFibGU7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKFxuICAgICAgYF9leHBhbmRGaWVsZHM6IHNvYmplY3QgPSAke3NvYmplY3R9LCBmaWVsZHMgPSAke2ZpZWxkcy5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgICBjb25zdCBbZWZpZWxkc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLl9leHBhbmRBc3Rlcmlza0ZpZWxkcyhzb2JqZWN0LCBmaWVsZHMpLFxuICAgICAgLi4udGhpcy5fY2hpbGRyZW4ubWFwKGFzeW5jIChjaGlsZFF1ZXJ5KSA9PiB7XG4gICAgICAgIGF3YWl0IGNoaWxkUXVlcnkuX2V4cGFuZEZpZWxkcygpO1xuICAgICAgICByZXR1cm4gW10gYXMgc3RyaW5nW107XG4gICAgICB9KSxcbiAgICBdKTtcbiAgICB0aGlzLl9jb25maWcuZmllbGRzID0gZWZpZWxkcztcbiAgICB0aGlzLl9jb25maWcuaW5jbHVkZXMgPSB0aGlzLl9jaGlsZHJlblxuICAgICAgLm1hcCgoY3F1ZXJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNjb25maWcgPSBjcXVlcnkuX3F1ZXJ5Ll9jb25maWc7XG4gICAgICAgIHJldHVybiBbY2NvbmZpZy50YWJsZSwgY2NvbmZpZ10gYXMgW3N0cmluZywgU09RTFF1ZXJ5Q29uZmlnXTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlPHsgW25hbWU6IHN0cmluZ106IFNPUUxRdWVyeUNvbmZpZyB9PihcbiAgICAgICAgKGluY2x1ZGVzLCBbY3RhYmxlLCBjY29uZmlnXSkgPT4gKHtcbiAgICAgICAgICAuLi5pbmNsdWRlcyxcbiAgICAgICAgICBbY3RhYmxlXTogY2NvbmZpZyxcbiAgICAgICAgfSksXG4gICAgICAgIHt9LFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgYXN5bmMgX2ZpbmRSZWxhdGlvbk9iamVjdChyZWxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fY29uZmlnLnRhYmxlO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGFibGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlIHF1ZXJ5Jyk7XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhcbiAgICAgIGBmaW5kaW5nIHRhYmxlIGZvciByZWxhdGlvbiBcIiR7cmVsTmFtZX1cIiBpbiBcIiR7dGFibGV9XCIuLi5gLFxuICAgICk7XG4gICAgY29uc3Qgc29iamVjdCA9IGF3YWl0IHRoaXMuX2Nvbm4uZGVzY3JpYmUkKHRhYmxlKTtcbiAgICBjb25zdCB1cHBlclJuYW1lID0gcmVsTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIGZvciAoY29uc3QgY3Igb2Ygc29iamVjdC5jaGlsZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNyLnJlbGF0aW9uc2hpcE5hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCkgPT09IHVwcGVyUm5hbWUgJiZcbiAgICAgICAgY3IuY2hpbGRTT2JqZWN0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGNyLmNoaWxkU09iamVjdDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBjaGlsZCByZWxhdGlvbnNoaXAgZm91bmQ6ICR7cmVsTmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgYXN5bmMgX2V4cGFuZEFzdGVyaXNrRmllbGRzKFxuICAgIHNvYmplY3Q6IHN0cmluZyxcbiAgICBmaWVsZHM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgZXhwYW5kZWRGaWVsZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpZWxkcy5tYXAoYXN5bmMgKGZpZWxkKSA9PiB0aGlzLl9leHBhbmRBc3Rlcmlza0ZpZWxkKHNvYmplY3QsIGZpZWxkKSksXG4gICAgKTtcbiAgICByZXR1cm4gZXhwYW5kZWRGaWVsZHMucmVkdWNlKFxuICAgICAgKGVmbGRzOiBzdHJpbmdbXSwgZmxkczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiBbLi4uZWZsZHMsIC4uLmZsZHNdLFxuICAgICAgW10sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgYXN5bmMgX2V4cGFuZEFzdGVyaXNrRmllbGQoXG4gICAgc29iamVjdDogc3RyaW5nLFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoYGV4cGFuZGluZyBmaWVsZCBcIiR7ZmllbGR9XCIgaW4gXCIke3NvYmplY3R9XCIuLi5gKTtcbiAgICBjb25zdCBmcGF0aCA9IGZpZWxkLnNwbGl0KCcuJyk7XG4gICAgaWYgKGZwYXRoW2ZwYXRoLmxlbmd0aCAtIDFdID09PSAnKicpIHtcbiAgICAgIGNvbnN0IHNvID0gYXdhaXQgdGhpcy5fY29ubi5kZXNjcmliZSQoc29iamVjdCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoYHRhYmxlICR7c29iamVjdH0gaGFzIGJlZW4gZGVzY3JpYmVkYCk7XG4gICAgICBpZiAoZnBhdGgubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBybmFtZSA9IGZwYXRoLnNoaWZ0KCk7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBzby5maWVsZHMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmLnJlbGF0aW9uc2hpcE5hbWUgJiZcbiAgICAgICAgICAgIHJuYW1lICYmXG4gICAgICAgICAgICBmLnJlbGF0aW9uc2hpcE5hbWUudG9VcHBlckNhc2UoKSA9PT0gcm5hbWUudG9VcHBlckNhc2UoKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmZpZWxkID0gZjtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZVRvID0gcmZpZWxkLnJlZmVyZW5jZVRvIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgcnRhYmxlID0gcmVmZXJlbmNlVG8ubGVuZ3RoID09PSAxID8gcmVmZXJlbmNlVG9bMF0gOiAnTmFtZSc7XG4gICAgICAgICAgICBjb25zdCBmcGF0aHMgPSBhd2FpdCB0aGlzLl9leHBhbmRBc3Rlcmlza0ZpZWxkKFxuICAgICAgICAgICAgICBydGFibGUsXG4gICAgICAgICAgICAgIGZwYXRoLmpvaW4oJy4nKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZnBhdGhzLm1hcCgoZnApID0+IGAke3JuYW1lfS4ke2ZwfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gc28uZmllbGRzLm1hcCgoZikgPT4gZi5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIFtmaWVsZF07XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbiBwbGFuIGZvciBleGVjdXRpbmcgcXVlcnlcbiAgICovXG4gIGFzeW5jIGV4cGxhaW4oKSB7XG4gICAgY29uc3Qgc29xbCA9IGF3YWl0IHRoaXMudG9TT1FMKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKGBTT1FMID0gJHtzb3FsfWApO1xuICAgIGNvbnN0IHVybCA9IGAvcXVlcnkvP2V4cGxhaW49JHtlbmNvZGVVUklDb21wb25lbnQoc29xbCl9YDtcbiAgICByZXR1cm4gdGhpcy5fY29ubi5yZXF1ZXN0PFF1ZXJ5RXhwbGFpblJlc3VsdD4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gU09RTCBleHByZXNzaW9uIGZvciB0aGUgcXVlcnlcbiAgICovXG4gIGFzeW5jIHRvU09RTCgpIHtcbiAgICBpZiAodGhpcy5fc29xbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NvcWw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuX2V4cGFuZEZpZWxkcygpO1xuICAgIHJldHVybiBjcmVhdGVTT1FMKHRoaXMuX2NvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogUHJvbWlzZS9BKyBpbnRlcmZhY2VcbiAgICogaHR0cDovL3Byb21pc2VzLWFwbHVzLmdpdGh1Yi5pby9wcm9taXNlcy1zcGVjL1xuICAgKlxuICAgKiBEZWxlZ2F0ZSB0byBkZWZlcnJlZCBwcm9taXNlLCByZXR1cm4gcHJvbWlzZSBpbnN0YW5jZSBmb3IgcXVlcnkgcmVzdWx0XG4gICAqL1xuICB0aGVuPFUsIFY+KFxuICAgIG9uUmVzb2x2ZT86XG4gICAgICB8ICgocXI6IFF1ZXJ5UmVzcG9uc2U8UiwgUVJUPikgPT4gVSB8IFByb21pc2U8VT4pXG4gICAgICB8IG51bGxcbiAgICAgIHwgdW5kZWZpbmVkLFxuICAgIG9uUmVqZWN0PzogKChlcnI6IEVycm9yKSA9PiBWIHwgUHJvbWlzZTxWPikgfCBudWxsIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFUgfCBWPiB7XG4gICAgdGhpcy5fY2hhaW5pbmcgPSB0cnVlO1xuICAgIGlmICghdGhpcy5fZmluaXNoZWQgJiYgIXRoaXMuX2V4ZWN1dGVkKSB7XG4gICAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9wcm9taXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdpbnZhbGlkIHN0YXRlOiBwcm9taXNlIGlzIG5vdCBzZXQgYWZ0ZXIgcXVlcnkgZXhlY3V0aW9uJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG4gIH1cblxuICBjYXRjaChcbiAgICBvblJlamVjdDogKFxuICAgICAgZXJyOiBFcnJvcixcbiAgICApID0+IFF1ZXJ5UmVzcG9uc2U8UiwgUVJUPiB8IFByb21pc2U8UXVlcnlSZXNwb25zZTxSLCBRUlQ+PixcbiAgKTogUHJvbWlzZTxRdWVyeVJlc3BvbnNlPFIsIFFSVD4+IHtcbiAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0KTtcbiAgfVxuXG4gIHByb21pc2UoKTogUHJvbWlzZTxRdWVyeVJlc3BvbnNlPFIsIFFSVD4+IHtcbiAgICAvLyBUT0RPKGNyaXN0aWFuKTogdmVyaWZ5IHRoaXMgaXMgY29ycmVjdFxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKHRoaXMgYXMgdW5rbm93bikgYXMgUXVlcnlSZXNwb25zZTxSLCBRUlQ+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWxrIGRlbGV0ZSBxdWVyaWVkIHJlY29yZHNcbiAgICovXG4gIGRlc3Ryb3kob3B0aW9ucz86IFF1ZXJ5RGVzdHJveU9wdGlvbnMpOiBQcm9taXNlPFNhdmVSZXN1bHRbXT47XG4gIGRlc3Ryb3kodHlwZTogTiwgb3B0aW9ucz86IFF1ZXJ5RGVzdHJveU9wdGlvbnMpOiBQcm9taXNlPFNhdmVSZXN1bHRbXT47XG4gIGRlc3Ryb3kodHlwZT86IE4gfCBRdWVyeURlc3Ryb3lPcHRpb25zLCBvcHRpb25zPzogUXVlcnlEZXN0cm95T3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucyA9IHR5cGU7XG4gICAgICB0eXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCB0eXBlXzogT3B0aW9uYWw8Tj4gPSB0eXBlIHx8ICh0aGlzLl9jb25maWcudGFibGUgYXMgT3B0aW9uYWw8Tj4pO1xuICAgIGlmICghdHlwZV8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1NPUUwgYmFzZWQgcXVlcnkgbmVlZHMgU09iamVjdCB0eXBlIGluZm9ybWF0aW9uIHRvIGJ1bGsgZGVsZXRlLicsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBTZXQgdGhlIHRocmVzaG9sZCBudW1iZXIgdG8gcGFzcyB0byBidWxrIEFQSVxuICAgIGNvbnN0IHRocmVzaG9sZE51bSA9XG4gICAgICBvcHRpb25zLmFsbG93QnVsayA9PT0gZmFsc2VcbiAgICAgICAgPyAtMVxuICAgICAgICA6IHR5cGVvZiBvcHRpb25zLmJ1bGtUaHJlc2hvbGQgPT09ICdudW1iZXInXG4gICAgICAgID8gb3B0aW9ucy5idWxrVGhyZXNob2xkXG4gICAgICAgIDogLy8gZGV0ZXJtaW5lIHRocmVzaG9sZCBpZiB0aGUgY29ubmVjdGlvbiB2ZXJzaW9uIHN1cHBvcnRzIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgb3Igbm90XG4gICAgICAgIHRoaXMuX2Nvbm4uX2Vuc3VyZVZlcnNpb24oNDIpXG4gICAgICAgID8gREVGQVVMVF9CVUxLX1RIUkVTSE9MRFxuICAgICAgICA6IHRoaXMuX2Nvbm4uX21heFJlcXVlc3QgLyAyO1xuXG4gICAgY29uc3QgYnVsa0FwaVZlcnNpb24gPSBvcHRpb25zLmJ1bGtBcGlWZXJzaW9uID8/IERFRkFVTFRfQlVMS19BUElfVkVSU0lPTjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjcmVhdGVCYXRjaCA9ICgpID0+XG4gICAgICAgIHRoaXMuX2Nvbm5cbiAgICAgICAgICAuc29iamVjdCh0eXBlXylcbiAgICAgICAgICAuZGVsZXRlQnVsaygpXG4gICAgICAgICAgLm9uKCdyZXNwb25zZScsIHJlc29sdmUpXG4gICAgICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICBsZXQgcmVjb3JkczogUmVjb3JkW10gPSBbXTtcbiAgICAgIGxldCBiYXRjaDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQmF0Y2g+IHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBoYW5kbGVSZWNvcmQgPSAocmVjOiBSZWNvcmQpID0+IHtcbiAgICAgICAgaWYgKCFyZWMuSWQpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnUXVlcmllZCByZWNvcmQgZG9lcyBub3QgaW5jbHVkZSBTYWxlc2ZvcmNlIHJlY29yZCBJRC4nLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkID0geyBJZDogcmVjLklkIH07XG4gICAgICAgIGlmIChiYXRjaCkge1xuICAgICAgICAgIGJhdGNoLndyaXRlKHJlY29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhyZXNob2xkTnVtID49IDAgJiZcbiAgICAgICAgICAgIHJlY29yZHMubGVuZ3RoID4gdGhyZXNob2xkTnVtICYmXG4gICAgICAgICAgICBidWxrQXBpVmVyc2lvbiA9PT0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gVXNlIGJ1bGsgZGVsZXRlIGluc3RlYWQgb2YgU09iamVjdCBSRVNUIEFQSVxuICAgICAgICAgICAgYmF0Y2ggPSBjcmVhdGVCYXRjaCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICAgICAgICBiYXRjaC53cml0ZShyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb3JkcyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGhhbmRsZUVuZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGJhdGNoKSB7XG4gICAgICAgICAgYmF0Y2guZW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaWRzID0gcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gcmVjb3JkLklkIGFzIHN0cmluZyk7XG4gICAgICAgICAgaWYgKHJlY29yZHMubGVuZ3RoID4gdGhyZXNob2xkTnVtICYmIGJ1bGtBcGlWZXJzaW9uID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25uLmJ1bGsyXG4gICAgICAgICAgICAgIC5sb2FkQW5kV2FpdEZvclJlc3VsdHMoe1xuICAgICAgICAgICAgICAgIG9iamVjdDogdHlwZV8sXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICBpbnB1dDogcmVjb3JkcyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgKGFsbFJlc3VsdHMpID0+XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMubWFwQnVsa1YyUmVzdWx0c1RvU2F2ZVJlc3VsdHMoYWxsUmVzdWx0cykpLFxuICAgICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29ublxuICAgICAgICAgICAgICAuc29iamVjdCh0eXBlXylcbiAgICAgICAgICAgICAgLmRlc3Ryb3koaWRzLCB7IGFsbG93UmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5zdHJlYW0oJ3JlY29yZCcpXG4gICAgICAgIC5vbignZGF0YScsIGhhbmRsZVJlY29yZClcbiAgICAgICAgLm9uKCdlbmQnLCBoYW5kbGVFbmQpXG4gICAgICAgIC5vbignZXJyb3InLCByZWplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bm9ueW0gb2YgUXVlcnkjZGVzdHJveSgpXG4gICAqL1xuICBkZWxldGUgPSB0aGlzLmRlc3Ryb3k7XG5cbiAgLyoqXG4gICAqIFN5bm9ueW0gb2YgUXVlcnkjZGVzdHJveSgpXG4gICAqL1xuICBkZWwgPSB0aGlzLmRlc3Ryb3k7XG5cbiAgLyoqXG4gICAqIEJ1bGsgdXBkYXRlIHF1ZXJpZWQgcmVjb3JkcywgdXNpbmcgZ2l2ZW4gbWFwcGluZyBmdW5jdGlvbi9vYmplY3RcbiAgICovXG4gIHVwZGF0ZTxVUiBleHRlbmRzIFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPj4oXG4gICAgbWFwcGluZzogKChyZWM6IFIpID0+IFVSKSB8IFVSLFxuICAgIHR5cGU6IE4sXG4gICAgb3B0aW9ucz86IFF1ZXJ5VXBkYXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICB1cGRhdGU8VVIgZXh0ZW5kcyBTT2JqZWN0SW5wdXRSZWNvcmQ8UywgTj4+KFxuICAgIG1hcHBpbmc6ICgocmVjOiBSKSA9PiBVUikgfCBVUixcbiAgICBvcHRpb25zPzogUXVlcnlVcGRhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPFNhdmVSZXN1bHRbXT47XG4gIHVwZGF0ZTxVUiBleHRlbmRzIFNPYmplY3RJbnB1dFJlY29yZDxTLCBOPj4oXG4gICAgbWFwcGluZzogKChyZWM6IFIpID0+IFVSKSB8IFVSLFxuICAgIHR5cGU/OiBOIHwgUXVlcnlVcGRhdGVPcHRpb25zLFxuICAgIG9wdGlvbnM/OiBRdWVyeVVwZGF0ZU9wdGlvbnMsXG4gICkge1xuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucyA9IHR5cGU7XG4gICAgICB0eXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCB0eXBlXzogT3B0aW9uYWw8Tj4gPVxuICAgICAgdHlwZSB8fCAodGhpcy5fY29uZmlnICYmICh0aGlzLl9jb25maWcudGFibGUgYXMgT3B0aW9uYWw8Tj4pKTtcbiAgICBpZiAoIXR5cGVfKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdTT1FMIGJhc2VkIHF1ZXJ5IG5lZWRzIFNPYmplY3QgdHlwZSBpbmZvcm1hdGlvbiB0byBidWxrIHVwZGF0ZS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlU3RyZWFtID1cbiAgICAgIHR5cGVvZiBtYXBwaW5nID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gUmVjb3JkU3RyZWFtLm1hcChtYXBwaW5nKVxuICAgICAgICA6IFJlY29yZFN0cmVhbS5yZWNvcmRNYXBTdHJlYW0obWFwcGluZywgb3B0aW9ucy5za2lwUmVjb3JkVGVtcGxhdGVFdmFsKTtcbiAgICAvLyBTZXQgdGhlIHRocmVzaG9sZCBudW1iZXIgdG8gcGFzcyB0byBidWxrIEFQSVxuICAgIGNvbnN0IHRocmVzaG9sZE51bSA9XG4gICAgICBvcHRpb25zLmFsbG93QnVsayA9PT0gZmFsc2VcbiAgICAgICAgPyAtMVxuICAgICAgICA6IHR5cGVvZiBvcHRpb25zLmJ1bGtUaHJlc2hvbGQgPT09ICdudW1iZXInXG4gICAgICAgID8gb3B0aW9ucy5idWxrVGhyZXNob2xkXG4gICAgICAgIDogLy8gZGV0ZXJtaW5lIHRocmVzaG9sZCBpZiB0aGUgY29ubmVjdGlvbiB2ZXJzaW9uIHN1cHBvcnRzIFNPYmplY3QgY29sbGVjdGlvbiBBUEkgb3Igbm90XG4gICAgICAgIHRoaXMuX2Nvbm4uX2Vuc3VyZVZlcnNpb24oNDIpXG4gICAgICAgID8gREVGQVVMVF9CVUxLX1RIUkVTSE9MRFxuICAgICAgICA6IHRoaXMuX2Nvbm4uX21heFJlcXVlc3QgLyAyO1xuICAgIGNvbnN0IGJ1bGtBcGlWZXJzaW9uID0gb3B0aW9ucy5idWxrQXBpVmVyc2lvbiA/PyBERUZBVUxUX0JVTEtfQVBJX1ZFUlNJT047XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZUJhdGNoID0gKCkgPT5cbiAgICAgICAgdGhpcy5fY29ublxuICAgICAgICAgIC5zb2JqZWN0KHR5cGVfKVxuICAgICAgICAgIC51cGRhdGVCdWxrKClcbiAgICAgICAgICAub24oJ3Jlc3BvbnNlJywgcmVzb2x2ZSlcbiAgICAgICAgICAub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIGxldCByZWNvcmRzOiBBcnJheTxTT2JqZWN0VXBkYXRlUmVjb3JkPFMsIE4+PiA9IFtdO1xuICAgICAgbGV0IGJhdGNoOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVCYXRjaD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IGhhbmRsZVJlY29yZCA9IChyZWNvcmQ6IFJlY29yZCkgPT4ge1xuICAgICAgICBpZiAoYmF0Y2gpIHtcbiAgICAgICAgICBiYXRjaC53cml0ZShyZWNvcmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY29yZHMucHVzaChyZWNvcmQgYXMgU09iamVjdFVwZGF0ZVJlY29yZDxTLCBOPik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRocmVzaG9sZE51bSA+PSAwICYmXG4gICAgICAgICAgcmVjb3Jkcy5sZW5ndGggPiB0aHJlc2hvbGROdW0gJiZcbiAgICAgICAgICBidWxrQXBpVmVyc2lvbiA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBVc2UgYnVsayB1cGRhdGUgaW5zdGVhZCBvZiBTT2JqZWN0IFJFU1QgQVBJXG4gICAgICAgICAgYmF0Y2ggPSBjcmVhdGVCYXRjaCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIGJhdGNoLndyaXRlKHJlY29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGhhbmRsZUVuZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGJhdGNoKSB7XG4gICAgICAgICAgYmF0Y2guZW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlY29yZHMubGVuZ3RoID4gdGhyZXNob2xkTnVtICYmIGJ1bGtBcGlWZXJzaW9uID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25uLmJ1bGsyXG4gICAgICAgICAgICAgIC5sb2FkQW5kV2FpdEZvclJlc3VsdHMoe1xuICAgICAgICAgICAgICAgIG9iamVjdDogdHlwZV8sXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgICAgICAgICBpbnB1dDogcmVjb3JkcyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgKGFsbFJlc3VsdHMpID0+XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMubWFwQnVsa1YyUmVzdWx0c1RvU2F2ZVJlc3VsdHMoYWxsUmVzdWx0cykpLFxuICAgICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29ublxuICAgICAgICAgICAgICAuc29iamVjdCh0eXBlXylcbiAgICAgICAgICAgICAgLnVwZGF0ZShyZWNvcmRzLCB7IGFsbG93UmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5zdHJlYW0oJ3JlY29yZCcpXG4gICAgICAgIC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIC5waXBlKHVwZGF0ZVN0cmVhbSlcbiAgICAgICAgLm9uKCdkYXRhJywgaGFuZGxlUmVjb3JkKVxuICAgICAgICAub24oJ2VuZCcsIGhhbmRsZUVuZClcbiAgICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hcEJ1bGtWMlJlc3VsdHNUb1NhdmVSZXN1bHRzKFxuICAgIGJ1bGtKb2JBbGxSZXN1bHRzOiBJbmdlc3RKb2JWMlJlc3VsdHM8Uz4sXG4gICk6IFNhdmVSZXN1bHRbXSB7XG4gICAgY29uc3Qgc3VjY2Vzc1NhdmVSZXN1bHRzOiBTYXZlUmVzdWx0W10gPSBidWxrSm9iQWxsUmVzdWx0cy5zdWNjZXNzZnVsUmVzdWx0cy5tYXAoXG4gICAgICAocikgPT4ge1xuICAgICAgICBjb25zdCBzYXZlUmVzdWx0OiBTYXZlUmVzdWx0ID0ge1xuICAgICAgICAgIGlkOiByLnNmX19JZCxcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGVycm9yczogW10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzYXZlUmVzdWx0O1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgZmFpbGVkU2F2ZVJlc3VsdHMgPSBidWxrSm9iQWxsUmVzdWx0cy5mYWlsZWRSZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgY29uc3Qgc2F2ZVJlc3VsdDogU2F2ZVJlc3VsdCA9IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yQ29kZTogci5zZl9fRXJyb3IsXG4gICAgICAgICAgICBtZXNzYWdlOiByLnNmX19FcnJvcixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBzYXZlUmVzdWx0O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFsuLi5zdWNjZXNzU2F2ZVJlc3VsdHMsIC4uLmZhaWxlZFNhdmVSZXN1bHRzXTtcbiAgfVxufVxuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqXG4gKiBTdWJRdWVyeSBvYmplY3QgZm9yIHJlcHJlc2VudGluZyBjaGlsZCByZWxhdGlvbnNoaXAgcXVlcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFN1YlF1ZXJ5PFxuICBTIGV4dGVuZHMgU2NoZW1hLFxuICBQTiBleHRlbmRzIFNPYmplY3ROYW1lczxTPixcbiAgUFIgZXh0ZW5kcyBSZWNvcmQsXG4gIFBRUlQgZXh0ZW5kcyBRdWVyeVJlc3BvbnNlVGFyZ2V0LFxuICBDUk4gZXh0ZW5kcyBDaGlsZFJlbGF0aW9uc2hpcE5hbWVzPFMsIFBOPiA9IENoaWxkUmVsYXRpb25zaGlwTmFtZXM8UywgUE4+LFxuICBDTiBleHRlbmRzIFNPYmplY3ROYW1lczxTPiA9IENoaWxkUmVsYXRpb25zaGlwU09iamVjdE5hbWU8UywgUE4sIENSTj4sXG4gIENSIGV4dGVuZHMgUmVjb3JkID0gUmVjb3JkXG4+IHtcbiAgX3JlbE5hbWU6IENSTjtcbiAgX3F1ZXJ5OiBRdWVyeTxTLCBDTiwgQ1I+O1xuICBfcGFyZW50OiBRdWVyeTxTLCBQTiwgUFIsIFBRUlQ+O1xuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgY29ubjogQ29ubmVjdGlvbjxTPixcbiAgICByZWxOYW1lOiBDUk4sXG4gICAgY29uZmlnOiBRdWVyeUNvbmZpZzxTLCBDTj4sXG4gICAgcGFyZW50OiBRdWVyeTxTLCBQTiwgUFIsIFBRUlQ+LFxuICApIHtcbiAgICB0aGlzLl9yZWxOYW1lID0gcmVsTmFtZTtcbiAgICB0aGlzLl9xdWVyeSA9IG5ldyBRdWVyeShjb25uLCBjb25maWcpO1xuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgc2VsZWN0PFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmQsXG4gICAgRlAgZXh0ZW5kcyBGaWVsZFBhdGhTcGVjaWZpZXI8UywgQ04+ID0gRmllbGRQYXRoU3BlY2lmaWVyPFMsIENOPixcbiAgICBGUEMgZXh0ZW5kcyBGaWVsZFByb2plY3Rpb25Db25maWcgPSBGaWVsZFBhdGhTY29wZWRQcm9qZWN0aW9uPFMsIENOLCBGUD5cbiAgPihcbiAgICBmaWVsZHM6IFF1ZXJ5RmllbGQ8UywgQ04sIEZQPixcbiAgKTogU3ViUXVlcnk8UywgUE4sIFBSLCBQUVJULCBDUk4sIENOLCBTT2JqZWN0UmVjb3JkPFMsIENOLCBGUEMsIFI+PiB7XG4gICAgLy8gZm9yY2UgY29udmVydCBxdWVyeSByZWNvcmQgdHlwZSB3aXRob3V0IGNoYW5naW5nIGluc3RhbmNlXG4gICAgdGhpcy5fcXVlcnkgPSB0aGlzLl9xdWVyeS5zZWxlY3QoZmllbGRzKSBhcyBhbnk7XG4gICAgcmV0dXJuICh0aGlzIGFzIGFueSkgYXMgU3ViUXVlcnk8XG4gICAgICBTLFxuICAgICAgUE4sXG4gICAgICBQUixcbiAgICAgIFBRUlQsXG4gICAgICBDUk4sXG4gICAgICBDTixcbiAgICAgIFNPYmplY3RSZWNvcmQ8UywgQ04sIEZQQywgUj5cbiAgICA+O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICB3aGVyZShjb25kaXRpb25zOiBRdWVyeUNvbmRpdGlvbjxTLCBDTj4gfCBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLl9xdWVyeSA9IHRoaXMuX3F1ZXJ5LndoZXJlKGNvbmRpdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbWl0IHRoZSByZXR1cm5pbmcgcmVzdWx0XG4gICAqL1xuICBsaW1pdChsaW1pdDogbnVtYmVyKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB0aGlzLl9xdWVyeS5saW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCByZWNvcmRzXG4gICAqL1xuICBza2lwKG9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB0aGlzLl9xdWVyeS5za2lwKG9mZnNldCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3lub255bSBvZiBTdWJRdWVyeSNza2lwKClcbiAgICovXG4gIG9mZnNldCA9IHRoaXMuc2tpcDtcblxuICAvKipcbiAgICogU2V0IHF1ZXJ5IHNvcnQgd2l0aCBkaXJlY3Rpb25cbiAgICovXG4gIHNvcnQoc29ydDogUXVlcnlTb3J0PFMsIENOPik6IHRoaXM7XG4gIHNvcnQoc29ydDogc3RyaW5nfCBTT2JqZWN0RmllbGROYW1lczxTLCBDTj4sIGRpcjogU29ydERpcik6IHRoaXM7XG4gIHNvcnQoXG4gICAgc29ydDogUXVlcnlTb3J0PFMsIENOPiB8IFNPYmplY3RGaWVsZE5hbWVzPFMsIENOPiB8IHN0cmluZyxcbiAgICBkaXI/OiBTb3J0RGlyLFxuICApIHtcbiAgICB0aGlzLl9xdWVyeSA9IHRoaXMuX3F1ZXJ5LnNvcnQoc29ydCBhcyBhbnksIGRpciBhcyBTb3J0RGlyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5vbnltIG9mIFN1YlF1ZXJ5I3NvcnQoKVxuICAgKi9cbiAgb3JkZXJieTogdHlwZW9mIFN1YlF1ZXJ5LnByb3RvdHlwZS5zb3J0ID0gdGhpcy5zb3J0O1xuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgYXN5bmMgX2V4cGFuZEZpZWxkcygpIHtcbiAgICBjb25zdCBzb2JqZWN0ID0gYXdhaXQgdGhpcy5fcGFyZW50Ll9maW5kUmVsYXRpb25PYmplY3QodGhpcy5fcmVsTmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5Ll9leHBhbmRGaWVsZHMoc29iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQmFjayB0aGUgY29udGV4dCB0byBwYXJlbnQgcXVlcnkgb2JqZWN0XG4gICAqL1xuICBlbmQ8XG4gICAgQ1JQIGV4dGVuZHMgU09iamVjdENoaWxkUmVsYXRpb25zaGlwUHJvcDxcbiAgICAgIENSTixcbiAgICAgIENSXG4gICAgPiA9IFNPYmplY3RDaGlsZFJlbGF0aW9uc2hpcFByb3A8Q1JOLCBDUj4sXG4gICAgUFIxIGV4dGVuZHMgUmVjb3JkID0gUFIgJiBDUlBcbiAgPigpOiBRdWVyeTxTLCBQTiwgUFIxLCBQUVJUPiB7XG4gICAgcmV0dXJuICh0aGlzLl9wYXJlbnQgYXMgYW55KSBhcyBRdWVyeTxTLCBQTiwgUFIxLCBQUVJUPjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBRdWVyeTtcbiJdLCJt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QUFBLE9BQUFGLE1BQUEsQ0FBQWxQLEtBQUEsT0FBQWpDLFNBQUE7TUFBQTtNQUFKM0IsSUFBSSxDQUFBNkQsUUFBQTtRQUFBLE9BQUFpUCxNQUFBLENBQUFqUCxRQUFBO01BQUE7TUFBQSxPQUFKN0QsSUFBSTtJQUFBLEVBQUosVUFDRUEsSUFBMEQsRUFDMUQ4RCxHQUFhLEVBQ2I7TUFBQSxJQUFBbVAsVUFBQTtNQUNBLElBQUksQ0FBQzlJLE1BQU0sR0FBR3JMLHFCQUFBLENBQUFtVSxVQUFBLE9BQUksQ0FBQzlJLE1BQU0sRUFBQXJNLElBQUEsQ0FBQW1WLFVBQUEsRUFBTWpULElBQUksRUFBUzhELEdBQWMsQ0FBQztNQUMzRCxPQUFPLElBQUk7SUFDYixDQUFDO0VBQUE7SUFBQXJDLEdBQUE7SUFBQUMsS0FBQTtJQU9EO0FBQ0Y7QUFDQTtJQUZFO01BQUEsSUFBQXdSLGNBQUEsR0FBQTNOLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FHQSxTQUFBME4sVUFBQTtRQUFBLElBQUFoSyxPQUFBO1FBQUEsT0FBQTNELG1CQUFBLENBQUFHLElBQUEsVUFBQXlOLFdBQUFDLFVBQUE7VUFBQSxrQkFBQUEsVUFBQSxDQUFBdk4sSUFBQSxHQUFBdU4sVUFBQSxDQUFBdE4sSUFBQTtZQUFBO2NBQUFzTixVQUFBLENBQUF0TixJQUFBO2NBQUEsT0FDd0IsSUFBSSxDQUFDOE0sT0FBTyxDQUFDbEgsbUJBQW1CLENBQUMsSUFBSSxDQUFDaUgsUUFBUSxDQUFDO1lBQUE7Y0FBL0R6SixPQUFPLEdBQUFrSyxVQUFBLENBQUF2TCxJQUFBO2NBQUEsT0FBQXVMLFVBQUEsQ0FBQWxMLE1BQUEsV0FDTixJQUFJLENBQUNnQyxNQUFNLENBQUNKLGFBQWEsQ0FBQ1osT0FBTyxDQUFDO1lBQUE7WUFBQTtjQUFBLE9BQUFrSyxVQUFBLENBQUFuTixJQUFBO1VBQUE7UUFBQSxHQUFBaU4sU0FBQTtNQUFBLENBQzFDO01BQUEsU0FIS3BKLGFBQWFBLENBQUE7UUFBQSxPQUFBbUosY0FBQSxDQUFBdFAsS0FBQSxPQUFBakMsU0FBQTtNQUFBO01BQUEsT0FBYm9JLGFBQWE7SUFBQTtJQUtuQjtBQUNGO0FBQ0E7SUFGRTtFQUFBO0lBQUF0SSxHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBNE8sR0FBR0EsQ0FBQSxFQU0wQjtNQUMzQixPQUFRLElBQUksQ0FBQ3VDLE9BQU87SUFDdEI7RUFBQztBQUFBO0FBR0gsZUFBZXhVLEtBQUsiLCJpZ25vcmVMaXN0IjpbXX0=