UNPKG

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
/** * @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==