UNPKG

bpm-engine

Version:

Business Process Management Engine for JavaScript

253 lines (198 loc) 22.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _bpmnModdle = require('bpmn-moddle'); var _bpmnModdle2 = _interopRequireDefault(_bpmnModdle); var _debug = require('./debug'); var _debug2 = _interopRequireDefault(_debug); var _getFlowObjectType = require('./getFlowObjectType'); var _getFlowObjectType2 = _interopRequireDefault(_getFlowObjectType); var _Elements = require('./Elements'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const log = (0, _debug2.default)('engine'); const moddle = new _bpmnModdle2.default(); const setParticipants = (flowElements, id, name) => { flowElements.forEach(flowElement => { flowElement.participant = { id, name }; if (flowElement.flowElements) { setParticipants(flowElement.flowElements, id, name); } }); }; const setLanes = (flowElements, lane) => { flowElements.forEach(flowElement => { if (!flowElement.lanes) { flowElement.lanes = [{ id: lane.id, name: lane.name }]; } else { flowElement.lanes.push({ id: lane.id, name: lane.name }); } if (flowElement.flowElements) { setLanes(flowElement.flowElements, lane); } }); }; const getNexts = flowObject => // eslint-disable-next-line flowObject.next ? [flowObject.next] : flowObject.definition.outgoing ? flowObject.definition.outgoing : [flowObject.definition.targetRef]; const parseParticipantsAndLanes = rootElements => { // set participant for all flowElements rootElements.forEach(el => { if (el.$type === 'bpmn:Collaboration') { el.get('participants').forEach(({ id, name, processRef }) => { setParticipants(processRef.flowElements, id, name); }); } }); // set lanes for all flowElements rootElements.forEach(el => { if (el.$type === 'bpmn:Process') { el.get('laneSets').forEach(laneSet => { if (laneSet.lanes) { laneSet.lanes.forEach(lane => { setLanes(lane.flowNodeRef, lane); if (lane.childLaneSet) { lane.childLaneSet.lanes.forEach(childLane => { setLanes(childLane.flowNodeRef, childLane); }); } }); } }); } }); }; class TokenInstance { constructor({ processId, tokenId, payload, workflowDefinition, status, currentActivity, isSubProcess, parent, engine }) { var _this = this; this.initialize = () => new _promise2.default((resolve, reject) => { moddle.fromXML(this.workflowDefinition, 'bpmn:Definitions', (err, definitions) => { if (err) { return reject(err); } const rootElements = definitions.get('rootElements'); const rootElement = rootElements.find(rootEl => rootEl.$type === 'bpmn:Process' && rootEl.flowElements.find(flowEl => flowEl.$type === 'bpmn:StartEvent')); this.flowObjects = rootElement.get('flowElements'); parseParticipantsAndLanes(rootElements); log('flowObjects parsed'); return resolve(); }); }); this.execute = (0, _asyncToGenerator3.default)(function* () { if (_this.next) { _this.lastActivity = _this.next.id; } if (!_this.status) { _this.next = _this.flowObjects.find(function (el) { return el.$type === 'bpmn:StartEvent'; }); } else if (_this.nexts) { if (_this.nexts.length === 1) { var _nexts = (0, _slicedToArray3.default)(_this.nexts, 1); _this.next = _nexts[0]; } else { log('TODO'); return _promise2.default.resolve(); } } if (!_this.next) { throw new Error('No next flowObject'); } const flowObject = _this.createFlowObject(_this.next); // if thhe current flow object is not a sequenceflow // - make it ready // - make it active if (flowObject.constructor.name !== 'SequenceFlow') { // if we execute a paused token // make it move if (_this.status === 'paused') { _this.status = 'running'; } else { // call the makeReady of the current flowObject yield flowObject.makeReady(); // if the token is still moving (makeReady did not make it pause) // then call the makeActive of the current flowObject if (_this.status === 'running') { yield flowObject.makeActive(); } } // if we are in a moving token // - complete the activity if (_this.status === 'running') { yield flowObject.makeComplete(); } } // if the token is still moving // continue execution (automation KEY-concept) if (_this.status === 'running') { _this.nexts = getNexts(flowObject); return _this.execute(); } return _promise2.default.resolve(); }); this.persistUpdate = () => this.engine.persist.tokenInstance.update({ tokenId: this.tokenId }, { $set: this.toJSON() }); this.persistCreate = () => this.engine.persist.tokenInstance.create(this.toJSON()); this.workflowDefinition = workflowDefinition; this.engine = engine; (0, _assign2.default)(this, { tokenId, processId, payload, parent, isSubProcess, currentActivity, status }); } toJSON() { const result = {}; result.currentActivity = this.next && this.next.id; result.processId = this.processId; result.tokenId = this.tokenId; result.payload = this.payload; result.parent = this.parent; result.isSubProcess = this.isSubProcess; result.status = this.status; return result; } createFlowObject(definition) { const FlowObjectType = (0, _getFlowObjectType2.default)(definition); const scopedPlugins = this.engine.plugins; const plugins = (0, _assign2.default)({}, scopedPlugins.element); if (FlowObjectType === _Elements.UserTask) { (0, _assign2.default)(plugins, scopedPlugins.userTask); } if (FlowObjectType === _Elements.ServiceTask) { (0, _assign2.default)(plugins, scopedPlugins.serviceTask); } const flowObject = new FlowObjectType({ definition, plugins, tokenInstance: this }); return flowObject; } } exports.default = TokenInstance; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvVG9rZW5JbnN0YW5jZS5qcyJdLCJuYW1lcyI6WyJsb2ciLCJtb2RkbGUiLCJCUE1OTW9kZGxlIiwic2V0UGFydGljaXBhbnRzIiwiZmxvd0VsZW1lbnRzIiwiaWQiLCJuYW1lIiwiZm9yRWFjaCIsImZsb3dFbGVtZW50IiwicGFydGljaXBhbnQiLCJzZXRMYW5lcyIsImxhbmUiLCJsYW5lcyIsInB1c2giLCJnZXROZXh0cyIsImZsb3dPYmplY3QiLCJuZXh0IiwiZGVmaW5pdGlvbiIsIm91dGdvaW5nIiwidGFyZ2V0UmVmIiwicGFyc2VQYXJ0aWNpcGFudHNBbmRMYW5lcyIsInJvb3RFbGVtZW50cyIsImVsIiwiJHR5cGUiLCJnZXQiLCJwcm9jZXNzUmVmIiwibGFuZVNldCIsImZsb3dOb2RlUmVmIiwiY2hpbGRMYW5lU2V0IiwiY2hpbGRMYW5lIiwiVG9rZW5JbnN0YW5jZSIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc0lkIiwidG9rZW5JZCIsInBheWxvYWQiLCJ3b3JrZmxvd0RlZmluaXRpb24iLCJzdGF0dXMiLCJjdXJyZW50QWN0aXZpdHkiLCJpc1N1YlByb2Nlc3MiLCJwYXJlbnQiLCJlbmdpbmUiLCJpbml0aWFsaXplIiwicmVzb2x2ZSIsInJlamVjdCIsImZyb21YTUwiLCJlcnIiLCJkZWZpbml0aW9ucyIsInJvb3RFbGVtZW50IiwiZmluZCIsInJvb3RFbCIsImZsb3dFbCIsImZsb3dPYmplY3RzIiwiZXhlY3V0ZSIsImxhc3RBY3Rpdml0eSIsIm5leHRzIiwibGVuZ3RoIiwiRXJyb3IiLCJjcmVhdGVGbG93T2JqZWN0IiwibWFrZVJlYWR5IiwibWFrZUFjdGl2ZSIsIm1ha2VDb21wbGV0ZSIsInBlcnNpc3RVcGRhdGUiLCJwZXJzaXN0IiwidG9rZW5JbnN0YW5jZSIsInVwZGF0ZSIsIiRzZXQiLCJ0b0pTT04iLCJwZXJzaXN0Q3JlYXRlIiwiY3JlYXRlIiwicmVzdWx0IiwiRmxvd09iamVjdFR5cGUiLCJzY29wZWRQbHVnaW5zIiwicGx1Z2lucyIsImVsZW1lbnQiLCJVc2VyVGFzayIsInVzZXJUYXNrIiwiU2VydmljZVRhc2siLCJzZXJ2aWNlVGFzayJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUEsTUFBTUEsTUFBTSxxQkFBTSxRQUFOLENBQVo7O0FBRUEsTUFBTUMsU0FBUyxJQUFJQyxvQkFBSixFQUFmOztBQUVBLE1BQU1DLGtCQUFrQixDQUFDQyxZQUFELEVBQWVDLEVBQWYsRUFBbUJDLElBQW5CLEtBQTRCO0FBQ2xERixlQUFhRyxPQUFiLENBQXNCQyxXQUFELElBQWlCO0FBQ3BDQSxnQkFBWUMsV0FBWixHQUEwQjtBQUN4QkosUUFEd0I7QUFFeEJDO0FBRndCLEtBQTFCOztBQUtBLFFBQUlFLFlBQVlKLFlBQWhCLEVBQThCO0FBQzVCRCxzQkFBZ0JLLFlBQVlKLFlBQTVCLEVBQTBDQyxFQUExQyxFQUE4Q0MsSUFBOUM7QUFDRDtBQUNGLEdBVEQ7QUFVRCxDQVhEOztBQWFBLE1BQU1JLFdBQVcsQ0FBQ04sWUFBRCxFQUFlTyxJQUFmLEtBQXdCO0FBQ3ZDUCxlQUFhRyxPQUFiLENBQXNCQyxXQUFELElBQWlCO0FBQ3BDLFFBQUksQ0FBQ0EsWUFBWUksS0FBakIsRUFBd0I7QUFDdEJKLGtCQUFZSSxLQUFaLEdBQW9CLENBQUMsRUFBRVAsSUFBSU0sS0FBS04sRUFBWCxFQUFlQyxNQUFNSyxLQUFLTCxJQUExQixFQUFELENBQXBCO0FBQ0QsS0FGRCxNQUdLO0FBQ0hFLGtCQUFZSSxLQUFaLENBQWtCQyxJQUFsQixDQUF1QixFQUFFUixJQUFJTSxLQUFLTixFQUFYLEVBQWVDLE1BQU1LLEtBQUtMLElBQTFCLEVBQXZCO0FBQ0Q7O0FBRUQsUUFBSUUsWUFBWUosWUFBaEIsRUFBOEI7QUFDNUJNLGVBQVNGLFlBQVlKLFlBQXJCLEVBQW1DTyxJQUFuQztBQUNEO0FBQ0YsR0FYRDtBQVlELENBYkQ7O0FBZUEsTUFBTUcsV0FBV0M7QUFDZjtB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dkI7QUFDQSxVQUFNc0QsZ0JBQWdCLEtBQUsvQixNQUFMLENBQVlnQyxPQUFsQzs7QUFFQSxVQUFNQSxVQUFVLHNCQUFjLEVBQWQsRUFBa0JELGNBQWNFLE9BQWhDLENBQWhCOztBQUVBLFFBQUlILG1CQUFtQkksa0JBQXZCLEVBQWlDO0FBQy9CLDRCQUFjRixPQUFkLEVBQXVCRCxjQUFjSSxRQUFyQztBQUNEO0FBQ0QsUUFBSUwsbUJBQW1CTSxxQkFBdkIsRUFBb0M7QUFDbEMsNEJBQWNKLE9BQWQsRUFBdUJELGNBQWNNLFdBQXJDO0FBQ0Q7O0FBRUQsVUFBTTlELGFBQWEsSUFBSXVELGNBQUosQ0FBbUI7QUFDcENyRCxnQkFEb0M7QUFFcEN1RCxhQUZvQztBQUdwQ1QscUJBQWU7QUFIcUIsS0FBbkIsQ0FBbkI7O0FBTUEsV0FBT2hELFVBQVA7QUFDRDs7QUFsRmdDO2tCQUFkZSxhIiwiZmlsZSI6IlRva2VuSW5zdGFuY2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQlBNTk1vZGRsZSBmcm9tICdicG1uLW1vZGRsZSc7XG5pbXBvcnQgZGVidWcgZnJvbSAnbGliL2RlYnVnJztcbmltcG9ydCBnZXRGbG93T2JqZWN0VHlwZSBmcm9tICdsaWIvZ2V0Rmxvd09iamVjdFR5cGUnO1xuaW1wb3J0IHsgVXNlclRhc2ssIFNlcnZpY2VUYXNrIH0gZnJvbSAnbGliL0VsZW1lbnRzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ2VuZ2luZScpO1xuXG5jb25zdCBtb2RkbGUgPSBuZXcgQlBNTk1vZGRsZSgpO1xuXG5jb25zdCBzZXRQYXJ0aWNpcGFudHMgPSAoZmxvd0VsZW1lbnRzLCBpZCwgbmFtZSkgPT4ge1xuICBmbG93RWxlbWVudHMuZm9yRWFjaCgoZmxvd0VsZW1lbnQpID0+IHtcbiAgICBmbG93RWxlbWVudC5wYXJ0aWNpcGFudCA9IHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICB9O1xuXG4gICAgaWYgKGZsb3dFbGVtZW50LmZsb3dFbGVtZW50cykge1xuICAgICAgc2V0UGFydGljaXBhbnRzKGZsb3dFbGVtZW50LmZsb3dFbGVtZW50cywgaWQsIG5hbWUpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCBzZXRMYW5lcyA9IChmbG93RWxlbWVudHMsIGxhbmUpID0+IHtcbiAgZmxvd0VsZW1lbnRzLmZvckVhY2goKGZsb3dFbGVtZW50KSA9PiB7XG4gICAgaWYgKCFmbG93RWxlbWVudC5sYW5lcykge1xuICAgICAgZmxvd0VsZW1lbnQubGFuZXMgPSBbeyBpZDogbGFuZS5pZCwgbmFtZTogbGFuZS5uYW1lIH1dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZsb3dFbGVtZW50LmxhbmVzLnB1c2goeyBpZDogbGFuZS5pZCwgbmFtZTogbGFuZS5uYW1lIH0pO1xuICAgIH1cblxuICAgIGlmIChmbG93RWxlbWVudC5mbG93RWxlbWVudHMpIHtcbiAgICAgIHNldExhbmVzKGZsb3dFbGVtZW50LmZsb3dFbGVtZW50cywgbGFuZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IGdldE5leHRzID0gZmxvd09iamVjdCA9PlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgKGZsb3dPYmplY3QubmV4dFxuICAgID8gW2Zsb3dPYmplY3QubmV4dF1cbiAgICA6IGZsb3dPYmplY3QuZGVmaW5pdGlvbi5vdXRnb2luZ1xuICAgICAgPyBmbG93T2JqZWN0LmRlZmluaXRpb24ub3V0Z29pbmdcbiAgICAgIDogW2Zsb3dPYmplY3QuZGVmaW5pdGlvbi50YXJnZXRSZWZdKTtcblxuY29uc3QgcGFyc2VQYXJ0aWNpcGFudHNBbmRMYW5lcyA9IChyb290RWxlbWVudHMpID0+IHtcbiAgLy8gc2V0IHBhcnRpY2lwYW50IGZvciBhbGwgZmxvd0VsZW1lbnRzXG4gIHJvb3RFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlmIChlbC4kdHlwZSA9PT0gJ2JwbW46Q29sbGFib3JhdGlvbicpIHtcbiAgICAgIGVsLmdldCgncGFydGljaXBhbnRzJykuZm9yRWFjaCgoeyBpZCwgbmFtZSwgcHJvY2Vzc1JlZiB9KSA9PiB7XG4gICAgICAgIHNldFBhcnRpY2lwYW50cyhwcm9jZXNzUmVmLmZsb3dFbGVtZW50cywgaWQsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBzZXQgbGFuZXMgZm9yIGFsbCBmbG93RWxlbWVudHNcbiAgcm9vdEVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgaWYgKGVsLiR0eXBlID09PSAnYnBtbjpQcm9jZXNzJykge1xuICAgICAgZWwuZ2V0KCdsYW5lU2V0cycpLmZvckVhY2goKGxhbmVTZXQpID0+IHtcbiAgICAgICAgaWYgKGxhbmVTZXQubGFuZXMpIHtcbiAgICAgICAgICBsYW5lU2V0LmxhbmVzLmZvckVhY2goKGxhbmUpID0+IHtcbiAgICAgICAgICAgIHNldExhbmVzKGxhbmUuZmxvd05vZGVSZWYsIGxhbmUpO1xuICAgICAgICAgICAgaWYgKGxhbmUuY2hpbGRMYW5lU2V0KSB7XG4gICAgICAgICAgICAgIGxhbmUuY2hpbGRMYW5lU2V0LmxhbmVzLmZvckVhY2goKGNoaWxkTGFuZSkgPT4ge1xuICAgICAgICAgICAgICAgIHNldExhbmVzKGNoaWxkTGFuZS5mbG93Tm9kZVJlZiwgY2hpbGRMYW5lKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2tlbkluc3RhbmNlIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHByb2Nlc3NJZCxcbiAgICB0b2tlbklkLFxuICAgIHBheWxvYWQsXG4gICAgd29ya2Zsb3dEZWZpbml0aW9uLFxuICAgIHN0YXR1cyxcbiAgICBjdXJyZW50QWN0aXZpdHksXG4gICAgaXNTdWJQcm9jZXNzLFxuICAgIHBhcmVudCxcbiAgICBlbmdpbmUsXG4gIH0pIHtcbiAgICB0aGlzLndvcmtmbG93RGVmaW5pdGlvbiA9IHdvcmtmbG93RGVmaW5pdGlvbjtcbiAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcblxuICAgIE9iamVjdC5hc3NpZ24odGhpcywge1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHByb2Nlc3NJZCxcbiAgICAgIHBheWxvYWQsXG4gICAgICBwYXJlbnQsXG4gICAgICBpc1N1YlByb2Nlc3MsXG4gICAgICBjdXJyZW50QWN0aXZpdHksXG4gICAgICBzdGF0dXMsXG4gICAgfSk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgcmVzdWx0LmN1cnJlbnRBY3Rpdml0eSA9IHRoaXMubmV4dCAmJiB0aGlzLm5leHQuaWQ7XG4gICAgcmVzdWx0LnByb2Nlc3NJZCA9IHRoaXMucHJvY2Vzc0lkO1xuICAgIHJlc3VsdC50b2tlbklkID0gdGhpcy50b2tlbklkO1xuICAgIHJlc3VsdC5wYXlsb2FkID0gdGhpcy5wYXlsb2FkO1xuICAgIHJlc3VsdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICByZXN1bHQuaXNTdWJQcm9jZXNzID0gdGhpcy5pc1N1YlByb2Nlc3M7XG4gICAgcmVzdWx0LnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGluaXRpYWxpemUgPSAoKSA9PlxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1vZGRsZS5mcm9tWE1MKHRoaXMud29ya2Zsb3dEZWZpbml0aW9uLCAnYnBtbjpEZWZpbml0aW9ucycsIChlcnIsIGRlZmluaXRpb25zKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb290RWxlbWVudHMgPSBkZWZpbml0aW9ucy5nZXQoJ3Jvb3RFbGVtZW50cycpO1xuXG4gICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnRzLmZpbmQocm9vdEVsID0+XG4gICAgICAgICAgcm9vdEVsLiR0eXBlID09PSAnYnBtbjpQcm9jZXNzJyAmJlxuICAgICAgICAgICAgcm9vdEVsLmZsb3dFbGVtZW50cy5maW5kKGZsb3dFbCA9PiBmbG93RWwuJHR5cGUgPT09ICdicG1uOlN0YXJ0RXZlbnQnKSk7XG5cbiAgICAgICAgdGhpcy5mbG93T2JqZWN0cyA9IHJvb3RFbGVtZW50LmdldCgnZmxvd0VsZW1lbnRzJyk7XG5cbiAgICAgICAgcGFyc2VQYXJ0aWNpcGFudHNBbmRMYW5lcyhyb290RWxlbWVudHMpO1xuXG4gICAgICAgIGxvZygnZmxvd09iamVjdHMgcGFyc2VkJyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGNyZWF0ZUZsb3dPYmplY3QoZGVmaW5pdGlvbikge1xuICAgIGNvbnN0IEZsb3dPYmplY3RUeXBlID0gZ2V0Rmxvd09iamVjdFR5cGUoZGVmaW5pdGlvbik7XG4gICAgY29uc3Qgc2NvcGVkUGx1Z2lucyA9IHRoaXMuZW5naW5lLnBsdWdpbnM7XG5cbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmFzc2lnbih7fSwgc2NvcGVkUGx1Z2lucy5lbGVtZW50KTtcblxuICAgIGlmIChGbG93T2JqZWN0VHlwZSA9PT0gVXNlclRhc2spIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2lucywgc2NvcGVkUGx1Z2lucy51c2VyVGFzayk7XG4gICAgfVxuICAgIGlmIChGbG93T2JqZWN0VHlwZSA9PT0gU2VydmljZVRhc2spIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2lucywgc2NvcGVkUGx1Z2lucy5zZXJ2aWNlVGFzayk7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvd09iamVjdCA9IG5ldyBGbG93T2JqZWN0VHlwZSh7XG4gICAgICBkZWZpbml0aW9uLFxuICAgICAgcGx1Z2lucyxcbiAgICAgIHRva2VuSW5zdGFuY2U6IHRoaXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmxvd09iamVjdDtcbiAgfVxuXG4gIGV4ZWN1dGUgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRoaXMubmV4dCkge1xuICAgICAgdGhpcy5sYXN0QWN0aXZpdHkgPSB0aGlzLm5leHQuaWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdGF0dXMpIHtcbiAgICAgIHRoaXMubmV4dCA9IHRoaXMuZmxvd09iamVjdHMuZmluZChlbCA9PiBlbC4kdHlwZSA9PT0gJ2JwbW46U3RhcnRFdmVudCcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLm5leHRzKSB7XG4gICAgICBpZiAodGhpcy5uZXh0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgW3RoaXMubmV4dF0gPSB0aGlzLm5leHRzO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvZygnVE9ETycpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbmV4dCBmbG93T2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvd09iamVjdCA9IHRoaXMuY3JlYXRlRmxvd09iamVjdCh0aGlzLm5leHQpO1xuXG4gICAgLy8gaWYgdGhoZSBjdXJyZW50IGZsb3cgb2JqZWN0IGlzIG5vdCBhIHNlcXVlbmNlZmxvd1xuICAgIC8vIC0gbWFrZSBpdCByZWFkeVxuICAgIC8vIC0gbWFrZSBpdCBhY3RpdmVcbiAgICBpZiAoZmxvd09iamVjdC5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnU2VxdWVuY2VGbG93Jykge1xuICAgICAgLy8gaWYgd2UgZXhlY3V0ZSBhIHBhdXNlZCB0b2tlblxuICAgICAgLy8gbWFrZSBpdCBtb3ZlXG4gICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdwYXVzZWQnKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIGNhbGwgdGhlIG1ha2VSZWFkeSBvZiB0aGUgY3VycmVudCBmbG93T2JqZWN0XG4gICAgICAgIGF3YWl0IGZsb3dPYmplY3QubWFrZVJlYWR5KCk7XG5cbiAgICAgICAgLy8gaWYgdGhlIHRva2VuIGlzIHN0aWxsIG1vdmluZyAobWFrZVJlYWR5IGRpZCBub3QgbWFrZSBpdCBwYXVzZSlcbiAgICAgICAgLy8gdGhlbiBjYWxsIHRoZSBtYWtlQWN0aXZlIG9mIHRoZSBjdXJyZW50IGZsb3dPYmplY3RcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgICAgICBhd2FpdCBmbG93T2JqZWN0Lm1ha2VBY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBhcmUgaW4gYSBtb3ZpbmcgdG9rZW5cbiAgICAgIC8vIC0gY29tcGxldGUgdGhlIGFjdGl2aXR5XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICBhd2FpdCBmbG93T2JqZWN0Lm1ha2VDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRoZSB0b2tlbiBpcyBzdGlsbCBtb3ZpbmdcbiAgICAvLyBjb250aW51ZSBleGVjdXRpb24gKGF1dG9tYXRpb24gS0VZLWNvbmNlcHQpXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgIHRoaXMubmV4dHMgPSBnZXROZXh0cyhmbG93T2JqZWN0KTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH07XG5cbiAgcGVyc2lzdFVwZGF0ZSA9ICgpID0+XG4gICAgdGhpcy5lbmdpbmUucGVyc2lzdC50b2tlbkluc3RhbmNlLnVwZGF0ZSh7IHRva2VuSWQ6IHRoaXMudG9rZW5JZCB9LCB7ICRzZXQ6IHRoaXMudG9KU09OKCkgfSk7XG5cbiAgcGVyc2lzdENyZWF0ZSA9ICgpID0+IHRoaXMuZW5naW5lLnBlcnNpc3QudG9rZW5JbnN0YW5jZS5jcmVhdGUodGhpcy50b0pTT04oKSk7XG59XG4iXX0=