acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
291 lines (290 loc) • 33.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable, Inject } from '@angular/core';
import { Template } from '../../../core/models/template.model';
import { Metadata } from '../../../core/metadata/models/metadata-model';
import { DiagramService } from './diagram.service';
import { CreationServiceInjectorToken } from '../../constants';
import { ArrayCheckerService } from './array-checker.service';
import { DecisionPointsCreationService } from './decision-points-creation.service';
import { Rules } from '../../../core/rules/models/rules.model';
import { TemplatePartial } from '../../../core/endpoint/template-partial';
var TemplateManagerService = /** @class */ (function () {
function TemplateManagerService(diagramService, elememtcreationService, arrayCheckerService, decisionPointsCreationService) {
this.diagramService = diagramService;
this.elememtcreationService = elememtcreationService;
this.arrayCheckerService = arrayCheckerService;
this.decisionPointsCreationService = decisionPointsCreationService;
this.endPointXMLString = [];
this.stringParser = require('string');
}
/**
* @param {?} templateContent
* @return {?}
*/
TemplateManagerService.prototype.getTemplate = /**
* @param {?} templateContent
* @return {?}
*/
function (templateContent) {
var /** @type {?} */ template = new Template();
var /** @type {?} */ templateContentAsJSON;
templateContentAsJSON = this.parseToJson(templateContent);
if (template === undefined) {
throw new Error('Unable to parse the template');
}
template.metadata = this.getMetaData(templateContentAsJSON.Metadata);
template.dataElements = this.getDataElements(templateContentAsJSON.DataElements);
if (templateContentAsJSON.Rules) {
template.rules = new Rules();
template.rules.decisionPoints = this.decisionPointsCreationService.
createDecisionPoints(templateContentAsJSON.Rules.DecisionPoint);
}
template.templatePartial = this.returnEndpoints(templateContent);
template.endPointsString = this.endPointXMLString;
template.xmlContent = templateContent;
// console.log(template.templatePartial);
//console.log(template.endPointsString);
return template;
};
/**
* @param {?} templatePartialJSON
* @return {?}
*/
TemplateManagerService.prototype.getTemplatePartial = /**
* @param {?} templatePartialJSON
* @return {?}
*/
function (templatePartialJSON) {
var /** @type {?} */ templatePartial = new TemplatePartial;
templatePartial.id = templatePartialJSON.Attr.Id;
templatePartial.sectionIfNotValue = templatePartialJSON.SectionIfValueNot;
templatePartial.sectionIfValues = templatePartialJSON.SectionIfValue;
return templatePartial;
};
/**
* @param {?} content
* @param {?} startToken
* @param {?} endToken
* @return {?}
*/
TemplateManagerService.prototype.returnEndPointContents = /**
* @param {?} content
* @param {?} startToken
* @param {?} endToken
* @return {?}
*/
function (content, startToken, endToken) {
var /** @type {?} */ contents = new Array();
var /** @type {?} */ templateSearchIndexPosition = 0;
while (true) {
var /** @type {?} */ contentStartPosition = content.indexOf(startToken, templateSearchIndexPosition);
var /** @type {?} */ contentEndPosition = content.indexOf(endToken, templateSearchIndexPosition);
if (contentStartPosition >= 0 && contentEndPosition >= 0) {
var /** @type {?} */ endPosition = contentEndPosition + endToken.length;
var /** @type {?} */ contentData = content.substring(contentStartPosition, endPosition);
contents.push(contentData);
templateSearchIndexPosition = endPosition + 1;
}
else {
break;
}
}
return contents;
};
/**
* @param {?} templatePartialArray
* @return {?}
*/
TemplateManagerService.prototype.returnTemplatePartials = /**
* @param {?} templatePartialArray
* @return {?}
*/
function (templatePartialArray) {
var /** @type {?} */ templatePartials = new Array();
try {
for (var templatePartialArray_1 = tslib_1.__values(templatePartialArray), templatePartialArray_1_1 = templatePartialArray_1.next(); !templatePartialArray_1_1.done; templatePartialArray_1_1 = templatePartialArray_1.next()) {
var arrayItem = templatePartialArray_1_1.value;
var /** @type {?} */ templatePartial = new TemplatePartial();
var /** @type {?} */ templatePartialAsJSON = this.parseToJson(arrayItem);
templatePartial.id = templatePartialAsJSON.Attr.Id;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (templatePartialArray_1_1 && !templatePartialArray_1_1.done && (_a = templatePartialArray_1.return)) _a.call(templatePartialArray_1);
}
finally { if (e_1) throw e_1.error; }
}
return templatePartials;
var e_1, _a;
};
/**
* @param {?} xmlData
* @return {?}
*/
TemplateManagerService.prototype.returnEndpoints = /**
* @param {?} xmlData
* @return {?}
*/
function (xmlData) {
var /** @type {?} */ endPointStartToken = '<EndPoints>';
var /** @type {?} */ endPointEndToken = '</EndPoints>';
var /** @type {?} */ endPointStartTokenPosition = xmlData.indexOf(endPointStartToken);
var /** @type {?} */ endPointEndTokenPosition = xmlData.indexOf(endPointEndToken);
if (endPointStartTokenPosition >= 0 && endPointEndTokenPosition >= 0) {
var /** @type {?} */ contentStartPosition = (endPointStartTokenPosition + endPointStartToken.length);
var /** @type {?} */ endPointContent = xmlData.substring(contentStartPosition, endPointEndTokenPosition);
if (endPointContent.length > 0) {
var /** @type {?} */ templatePartials = this.returnEndPointContents(endPointContent, '<TemplatePartial', '</TemplatePartial>');
this.endPointXMLString = this.returnEndPointContents(endPointContent, '<EndPoint', '</EndPoint>');
return templatePartials;
}
}
};
/**
* @param {?} xmlData
* @return {?}
*/
TemplateManagerService.prototype.parseToJson = /**
* @param {?} xmlData
* @return {?}
*/
function (xmlData) {
var /** @type {?} */ jsonResult;
var /** @type {?} */ parseString = require('xml2js').parseString;
parseString(xmlData, { explicitRoot: false, explicitArray: false, attrkey: 'Attr' }, function (err, result) {
jsonResult = result;
});
return jsonResult;
};
/**
* @param {?} metadataJSON
* @return {?}
*/
TemplateManagerService.prototype.getMetaData = /**
* @param {?} metadataJSON
* @return {?}
*/
function (metadataJSON) {
var /** @type {?} */ metadata = new Metadata();
metadata.label = metadataJSON.Label;
metadata.id = metadataJSON.ID;
metadata.schemaVersion = metadataJSON.SchemaVersion;
metadata.ruleVersion = metadataJSON.RuleVersion;
var /** @type {?} */ diagramsAsJSON = metadataJSON.Info.Diagrams.Diagram;
metadata.diagrams = this.diagramService.returnDiagrams(diagramsAsJSON);
metadata.approvedBy = metadataJSON.ApprovedBy;
metadata.createdDate = metadataJSON.CreatedDate;
metadata.lastModifiedDate = metadataJSON.LastModifiedDate;
metadata.reviewedBy = metadataJSON.ReviewedBy;
metadata.developedBy = metadataJSON.DevelopedBy;
metadata.radElementSetID = metadataJSON.RadElementSetID;
return metadata;
};
/**
* @param {?} elementType
* @param {?} dataElementsJSON
* @return {?}
*/
TemplateManagerService.prototype.returnDataElement = /**
* @param {?} elementType
* @param {?} dataElementsJSON
* @return {?}
*/
function (elementType, dataElementsJSON) {
var /** @type {?} */ dataElements = new Array();
var /** @type {?} */ dataElementCreationServiceInstance;
try {
for (var _a = tslib_1.__values(this.elememtcreationService), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataElementCreationService = _b.value;
if (dataElementCreationService.elementType === elementType) {
dataElementCreationServiceInstance = dataElementCreationService;
break;
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_2) throw e_2.error; }
}
if (dataElementCreationServiceInstance !== undefined && dataElementsJSON !== undefined) {
if (this.arrayCheckerService.isArray(dataElementsJSON)) {
try {
for (var dataElementsJSON_1 = tslib_1.__values(dataElementsJSON), dataElementsJSON_1_1 = dataElementsJSON_1.next(); !dataElementsJSON_1_1.done; dataElementsJSON_1_1 = dataElementsJSON_1.next()) {
var dataElementJSON = dataElementsJSON_1_1.value;
var /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementJSON);
dataElements.push(dataElement);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (dataElementsJSON_1_1 && !dataElementsJSON_1_1.done && (_d = dataElementsJSON_1.return)) _d.call(dataElementsJSON_1);
}
finally { if (e_3) throw e_3.error; }
}
}
else {
var /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementsJSON);
dataElements.push(dataElement);
}
}
return dataElements;
var e_2, _c, e_3, _d;
};
/**
* @param {?} dataElementsJSON
* @return {?}
*/
TemplateManagerService.prototype.getDataElements = /**
* @param {?} dataElementsJSON
* @return {?}
*/
function (dataElementsJSON) {
var /** @type {?} */ dataElements = new Array();
dataElements = dataElements.concat(this.returnDataElement('ChoiceDataElement', dataElementsJSON.ChoiceDataElement));
dataElements = dataElements.concat(this.returnDataElement('MultiChoiceDataElement', dataElementsJSON.MultiChoiceDataElement));
dataElements = dataElements.concat(this.returnDataElement('NumericDataElement', dataElementsJSON.NumericDataElement));
dataElements = dataElements.concat(this.returnDataElement('GlobalValue', dataElementsJSON.GlobalValue));
dataElements = dataElements.concat(this.returnDataElement('ComputedDataElement', dataElementsJSON.ComputedDataElement));
dataElements = dataElements.concat(this.returnDataElement('IntegerDataElement', dataElementsJSON.IntegerDataElement));
dataElements = dataElements.concat(this.returnDataElement('DateTimeDataElement', dataElementsJSON.DateTimeDataElement));
dataElements = dataElements.concat(this.returnDataElement('DurationDataElement', dataElementsJSON.TimeSpanDataElement));
return dataElements;
};
TemplateManagerService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
TemplateManagerService.ctorParameters = function () { return [
{ type: DiagramService },
{ type: Array, decorators: [{ type: Inject, args: [CreationServiceInjectorToken,] }] },
{ type: ArrayCheckerService },
{ type: DecisionPointsCreationService }
]; };
return TemplateManagerService;
}());
export { TemplateManagerService };
function TemplateManagerService_tsickle_Closure_declarations() {
/** @type {?} */
TemplateManagerService.prototype.endPointXMLString;
/** @type {?} */
TemplateManagerService.prototype.stringParser;
/** @type {?} */
TemplateManagerService.prototype.diagramService;
/** @type {?} */
TemplateManagerService.prototype.elememtcreationService;
/** @type {?} */
TemplateManagerService.prototype.arrayCheckerService;
/** @type {?} */
TemplateManagerService.prototype.decisionPointsCreationService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtbWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy90ZW1wbGF0ZS1tYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFHLE1BQU0sRUFBRyxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztJQVl4RSxnQ0FBcUIsY0FBOEIsRUFDSCxzQkFBd0QsRUFDOUYscUJBQW1ELDZCQUE0RDtRQUZwRyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDSCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQWtDO1FBQzlGLHdCQUFtQixHQUFuQixtQkFBbUI7UUFBZ0Msa0NBQTZCLEdBQTdCLDZCQUE2QixDQUErQjtpQ0FObkYsRUFBRTs0QkFFWixPQUFPLENBQUMsUUFBUSxDQUFDO0tBSWlGOzs7OztJQUU5SCw0Q0FBVzs7OztJQUFYLFVBQVksZUFBdUI7UUFDbEMscUJBQU0sUUFBUSxHQUFHLElBQUksUUFB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cUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ3hILE1BQU0sQ0FBQyxZQUFZLENBQUM7OztnQkExSnRCLFVBQVU7Ozs7Z0JBZEYsY0FBYzs0Q0FxQmxCLE1BQU0sU0FBQyw0QkFBNEI7Z0JBakIvQixtQkFBbUI7Z0JBQ25CLDZCQUE2Qjs7aUNBVHRDOztTQW1CYSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlICwgSW5qZWN0ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1RlbXBsYXRlfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy90ZW1wbGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tZXRhZGF0YS9tb2RlbHMvbWV0YWRhdGEtbW9kZWwnO1xyXG5pbXBvcnQgeyBEaWFncmFtIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZGlhZ3JhbS5tb2RlbCc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHtEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2V9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RlY2lzaW9uLXBvaW50cy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUnVsZXMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL21vZGVscy9ydWxlcy5tb2RlbCc7XHJcbmltcG9ydCB7IGZhaWwgfSBmcm9tICdhc3NlcnQnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBhcnRpYWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3RlbXBsYXRlLXBhcnRpYWwnO1xyXG5pbXBvcnQgeyBTZWN0aW9uSWZWYWx1ZU5vdENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW5kcG9pbnQvc2VjdGlvbi1pZi12YWx1ZS1ub3QtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3NlY3Rpb24taWYtdmFsdWUtY29uZGl0aW9uJztcclxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlTWFuYWdlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgZW5kUG9pbnRYTUxTdHJpbmc6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgc3RyaW5nUGFyc2VyOiBhbnkgPSByZXF1aXJlKCdzdHJpbmcnKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSAgZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlICxcclxuICAgIEBJbmplY3QoQ3JlYXRpb25TZXJ2aWNlSW5qZWN0b3JUb2tlbikgcHJpdmF0ZSBlbGVtZW10Y3JlYXRpb25TZXJ2aWNlOiBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2VbXSAsXHJcbiAgICBwcml2YXRlIGFycmF5Q2hlY2tlclNlcnZpY2U6IEFycmF5Q2hlY2tlclNlcnZpY2UgLCBwcml2YXRlIGRlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlOiBEZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZSkgeyB9XHJcblxyXG4gIGdldFRlbXBsYXRlKHRlbXBsYXRlQ29udGVudDogc3RyaW5nKTogVGVtcGxhdGUgIHtcclxuICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoKTtcclxuICAgbGV0IHRlbXBsYXRlQ29udGVudEFzSlNPTjogYW55O1xyXG4gICB0ZW1wbGF0ZUNvbnRlbnRBc0pTT04gPSB0aGlzLnBhcnNlVG9Kc29uKHRlbXBsYXRlQ29udGVudCk7XHJcbiAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aHJvdyAgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgdGhlIHRlbXBsYXRlJyk7XHJcbiAgIH1cclxuICAgdGVtcGxhdGUubWV0YWRhdGEgPSB0aGlzLmdldE1ldGFEYXRhKHRlbXBsYXRlQ29udGVudEFzSlNPTi5NZXRhZGF0YSk7XHJcbiAgIHRlbXBsYXRlLmRhdGFFbGVtZW50cyA9IHRoaXMuZ2V0RGF0YUVsZW1lbnRzKHRlbXBsYXRlQ29udGVudEFzSlNPTi5EYXRhRWxlbWVudHMpO1xyXG4gICBpZiAodGVtcGxhdGVDb250ZW50QXNKU09OLlJ1bGVzKSB7XHJcbiAgICB0ZW1wbGF0ZS5ydWxlcyAgPSBuZXcgUnVsZXMoKTtcclxuICAgIHRlbXBsYXRlLnJ1bGVzLmRlY2lzaW9uUG9pbnRzID0gdGhpcy5kZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWNpc2lvblBvaW50cyh0ZW1wbGF0ZUNvbnRlbnRBc0pTT04uUnVsZXMuRGVjaXNpb25Qb2ludCk7XHJcbiAgfVxyXG4gICAgdGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsID0gdGhpcy5yZXR1cm5FbmRwb2ludHModGVtcGxhdGVDb250ZW50KTtcclxuICAgIHRlbXBsYXRlLmVuZFBvaW50c1N0cmluZyA9IHRoaXMuZW5kUG9pbnRYTUxTdHJpbmc7XHJcbiAgICB0ZW1wbGF0ZS54bWxDb250ZW50ID0gdGVtcGxhdGVDb250ZW50O1xyXG5cclxuLy8gY29uc29sZS5sb2codGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsKTtcclxuLy9jb25zb2xlLmxvZyh0ZW1wbGF0ZS5lbmRQb2ludHNTdHJpbmcpO1xyXG5cclxuICAgIHJldHVybiB0ZW1wbGF0ZTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRlbXBsYXRlUGFydGlhbCh0ZW1wbGF0ZVBhcnRpYWxKU09OOiBhbnkpOiBUZW1wbGF0ZVBhcnRpYWwge1xyXG4gICAgY29uc3QgdGVtcGxhdGVQYXJ0aWFsID0gbmV3IFRlbXBsYXRlUGFydGlhbDtcclxuICAgIHRlbXBsYXRlUGFydGlhbC5pZCA9IHRlbXBsYXRlUGFydGlhbEpTT04uQXR0ci5JZDtcclxuICAgIHRlbXBsYXRlUGFydGlhbC5zZWN0aW9uSWZOb3RWYWx1ZSA9IHRlbXBsYXRlUGFydGlhbEpTT04uU2VjdGlvbklmVmFsdWVOb3Q7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWwuc2VjdGlvbklmVmFsdWVzID0gdGVtcGxhdGVQYXJ0aWFsSlNPTi5TZWN0aW9uSWZWYWx1ZTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVBhcnRpYWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldHVybkVuZFBvaW50Q29udGVudHMoY29udGVudDogc3RyaW5nLCBzdGFydFRva2VuOiBzdHJpbmcsIGVuZFRva2VuOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBjb250ZW50cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdGVtcGxhdGVTZWFyY2hJbmRleFBvc2l0aW9uID0gMDtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRTdGFydFBvc2l0aW9uID0gY29udGVudC5pbmRleE9mKHN0YXJ0VG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRFbmRQb3NpdGlvbiAgPSBjb250ZW50LmluZGV4T2YoZW5kVG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcblxyXG4gICAgICAgICBpZiAoY29udGVudFN0YXJ0UG9zaXRpb24gPj0gMCAgJiYgY29udGVudEVuZFBvc2l0aW9uID49IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBjb250ZW50RW5kUG9zaXRpb24gKyBlbmRUb2tlbi5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREYXRhID0gY29udGVudC5zdWJzdHJpbmcoY29udGVudFN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgY29udGVudHMucHVzaChjb250ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IGVuZFBvc2l0aW9uICsgMTtcclxuICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGNvbnRlbnRzO1xyXG4gIH1cclxuXHJcbnByaXZhdGUgcmV0dXJuVGVtcGxhdGVQYXJ0aWFscyh0ZW1wbGF0ZVBhcnRpYWxBcnJheTogc3RyaW5nW10pOiBUZW1wbGF0ZVBhcnRpYWxbXSB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbHMgPSBuZXcgQXJyYXk8VGVtcGxhdGVQYXJ0aWFsPigpO1xyXG4gICAgICBmb3IgKGNvbnN0IGFycmF5SXRlbSBvZiB0ZW1wbGF0ZVBhcnRpYWxBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbCA9IG5ldyBUZW1wbGF0ZVBhcnRpYWwoKTtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWxBc0pTT04gPSB0aGlzLnBhcnNlVG9Kc29uKGFycmF5SXRlbSk7XHJcbiAgICAgICAgdGVtcGxhdGVQYXJ0aWFsLmlkID0gdGVtcGxhdGVQYXJ0aWFsQXNKU09OLkF0dHIuSWQ7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGVtcGxhdGVQYXJ0aWFscztcclxufVxyXG5cclxuICBwcml2YXRlIHJldHVybkVuZHBvaW50cyh4bWxEYXRhOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBlbmRQb2ludFN0YXJ0VG9rZW4gPSAnPEVuZFBvaW50cz4nO1xyXG4gICAgY29uc3QgZW5kUG9pbnRFbmRUb2tlbiA9ICc8L0VuZFBvaW50cz4nO1xyXG5cclxuICAgIGNvbnN0IGVuZFBvaW50U3RhcnRUb2tlblBvc2l0aW9uID0geG1sRGF0YS5pbmRleE9mKGVuZFBvaW50U3RhcnRUb2tlbik7XHJcbiAgICBjb25zdCBlbmRQb2ludEVuZFRva2VuUG9zaXRpb24gPSB4bWxEYXRhLmluZGV4T2YoZW5kUG9pbnRFbmRUb2tlbik7XHJcbiAgICBpZiAoZW5kUG9pbnRTdGFydFRva2VuUG9zaXRpb24gPj0gMCAgJiYgZW5kUG9pbnRFbmRUb2tlblBvc2l0aW9uID49IDAgKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRTdGFydFBvc2l0aW9uID0gIChlbmRQb2ludFN0YXJ0VG9rZW5Qb3NpdGlvbiArIGVuZFBvaW50U3RhcnRUb2tlbi5sZW5ndGgpO1xyXG4gICAgICBjb25zdCBlbmRQb2ludENvbnRlbnQgPSB4bWxEYXRhLnN1YnN0cmluZyhjb250ZW50U3RhcnRQb3NpdGlvbiAsIGVuZFBvaW50RW5kVG9rZW5Qb3NpdGlvbik7XHJcbiAgICBpZiAoZW5kUG9pbnRDb250ZW50Lmxlbmd0aCA+IDAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbHMgPSB0aGlzLnJldHVybkVuZFBvaW50Q29udGVudHMoZW5kUG9pbnRDb250ZW50LCAnPFRlbXBsYXRlUGFydGlhbCcgLCAnPC9UZW1wbGF0ZVBhcnRpYWw+Jyk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kUG9pbnRYTUxTdHJpbmcgPSB0aGlzLnJldHVybkVuZFBvaW50Q29udGVudHMoZW5kUG9pbnRDb250ZW50LCAnPEVuZFBvaW50JyAsICc8L0VuZFBvaW50PicpO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlUGFydGlhbHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5wcml2YXRlIHBhcnNlVG9Kc29uKHhtbERhdGE6IHN0cmluZyk6IGFueSB7XHJcbiAgICBsZXQganNvblJlc3VsdDogSlNPTjtcclxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gIHJlcXVpcmUoJ3htbDJqcycpLnBhcnNlU3RyaW5nO1xyXG4gICAgcGFyc2VTdHJpbmcoeG1sRGF0YSwge2V4cGxpY2l0Um9vdCA6IGZhbHNlLCBleHBsaWNpdEFycmF5IDogZmFsc2UsIGF0dHJrZXkgOiAnQXR0cid9ICwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XHJcbiAgICAgICAganNvblJlc3VsdCAgPSByZXN1bHQ7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGpzb25SZXN1bHQ7XHJcbiB9XHJcblxyXG4gcHJpdmF0ZSBnZXRNZXRhRGF0YShtZXRhZGF0YUpTT046IGFueSk6IE1ldGFkYXRhIHtcclxuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7XHJcbiAgICBtZXRhZGF0YS5sYWJlbCA9IG1ldGFkYXRhSlNPTi5MYWJlbDtcclxuICAgIG1ldGFkYXRhLmlkID0gbWV0YWRhdGFKU09OLklEO1xyXG4gICAgbWV0YWRhdGEuc2NoZW1hVmVyc2lvbiA9IG1ldGFkYXRhSlNPTi5TY2hlbWFWZXJzaW9uO1xyXG4gICAgbWV0YWRhdGEucnVsZVZlcnNpb24gPSBtZXRhZGF0YUpTT04uUnVsZVZlcnNpb247XHJcbiAgICBjb25zdCBkaWFncmFtc0FzSlNPTiA9IG1ldGFkYXRhSlNPTi5JbmZvLkRpYWdyYW1zLkRpYWdyYW07XHJcbiAgICBtZXRhZGF0YS5kaWFncmFtcyA9IHRoaXMuZGlhZ3JhbVNlcnZpY2UucmV0dXJuRGlhZ3JhbXMoZGlhZ3JhbXNBc0pTT04pO1xyXG5cclxuICAgIG1ldGFkYXRhLmFwcHJvdmVkQnkgPSBtZXRhZGF0YUpTT04uQXBwcm92ZWRCeTtcclxuICAgIG1ldGFkYXRhLmNyZWF0ZWREYXRlID0gbWV0YWRhdGFKU09OLkNyZWF0ZWREYXRlO1xyXG4gICAgbWV0YWRhdGEubGFzdE1vZGlmaWVkRGF0ZSA9IG1ldGFkYXRhSlNPTi5MYXN0TW9kaWZpZWREYXRlO1xyXG4gICAgbWV0YWRhdGEucmV2aWV3ZWRCeSA9IG1ldGFkYXRhSlNPTi5SZXZpZXdlZEJ5O1xyXG4gICAgbWV0YWRhdGEuZGV2ZWxvcGVkQnkgPSBtZXRhZGF0YUpTT04uRGV2ZWxvcGVkQnk7XHJcbiAgICBtZXRhZGF0YS5yYWRFbGVtZW50U2V0SUQgPSBtZXRhZGF0YUpTT04uUmFkRWxlbWVudFNldElEO1xyXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gfVxyXG5cclxuIHByaXZhdGUgIHJldHVybkRhdGFFbGVtZW50IChlbGVtZW50VHlwZTogc3RyaW5nLCBkYXRhRWxlbWVudHNKU09OOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnRbXSB7XHJcbiAgICBjb25zdCAgZGF0YUVsZW1lbnRzID0gbmV3IEFycmF5PEJhc2VEYXRhRWxlbWVudD4oKTtcclxuICAgIGxldCBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlOiBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2U7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIG9mIHRoaXMuZWxlbWVtdGNyZWF0aW9uU2VydmljZSkge1xyXG4gICAgICAgICAgaWYgKGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSkge1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlID0gZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgZGF0YUVsZW1lbnRzSlNPTiAhPT0gdW5kZWZpbmVkKSAge1xyXG4gICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGRhdGFFbGVtZW50c0pTT04pKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkYXRhRWxlbWVudEpTT04gb2YgZGF0YUVsZW1lbnRzSlNPTikge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhRWxlbWVudCA9IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlSW5zdGFuY2UuY3JlYXRlRWxlbWVudChkYXRhRWxlbWVudEpTT04pO1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudHMucHVzaChkYXRhRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGRhdGFFbGVtZW50ID0gZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZS5jcmVhdGVFbGVtZW50KGRhdGFFbGVtZW50c0pTT04pO1xyXG4gICAgICAgIGRhdGFFbGVtZW50cy5wdXNoKGRhdGFFbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50cztcclxuIH1cclxuXHJcbiBwcml2YXRlIGdldERhdGFFbGVtZW50cyhkYXRhRWxlbWVudHNKU09OOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnRbXSB7XHJcbiAgIGxldCAgZGF0YUVsZW1lbnRzID0gbmV3IEFycmF5PEJhc2VEYXRhRWxlbWVudD4oKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdDaG9pY2VEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uQ2hvaWNlRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdNdWx0aUNob2ljZURhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5NdWx0aUNob2ljZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnTnVtZXJpY0RhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5OdW1lcmljRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdHbG9iYWxWYWx1ZScsIGRhdGFFbGVtZW50c0pTT04uR2xvYmFsVmFsdWUpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdDb21wdXRlZERhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5Db21wdXRlZERhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnSW50ZWdlckRhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5JbnRlZ2VyRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdEYXRlVGltZURhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5EYXRlVGltZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnRHVyYXRpb25EYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uVGltZVNwYW5EYXRhRWxlbWVudCkpO1xyXG4gICByZXR1cm4gZGF0YUVsZW1lbnRzO1xyXG4gfVxyXG59XHJcbiJdfQ==