UNPKG

acr-assist-simulator-module

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.

223 lines (222 loc) 30.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ 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'; export class TemplateManagerService { /** * @param {?} diagramService * @param {?} elememtcreationService * @param {?} arrayCheckerService * @param {?} decisionPointsCreationService */ constructor(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 {?} */ getTemplate(templateContent) { const /** @type {?} */ template = new Template(); let /** @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 {?} */ getTemplatePartial(templatePartialJSON) { const /** @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 {?} */ returnEndPointContents(content, startToken, endToken) { const /** @type {?} */ contents = new Array(); let /** @type {?} */ templateSearchIndexPosition = 0; while (true) { const /** @type {?} */ contentStartPosition = content.indexOf(startToken, templateSearchIndexPosition); const /** @type {?} */ contentEndPosition = content.indexOf(endToken, templateSearchIndexPosition); if (contentStartPosition >= 0 && contentEndPosition >= 0) { const /** @type {?} */ endPosition = contentEndPosition + endToken.length; const /** @type {?} */ contentData = content.substring(contentStartPosition, endPosition); contents.push(contentData); templateSearchIndexPosition = endPosition + 1; } else { break; } } return contents; } /** * @param {?} templatePartialArray * @return {?} */ returnTemplatePartials(templatePartialArray) { const /** @type {?} */ templatePartials = new Array(); for (const /** @type {?} */ arrayItem of templatePartialArray) { const /** @type {?} */ templatePartial = new TemplatePartial(); const /** @type {?} */ templatePartialAsJSON = this.parseToJson(arrayItem); templatePartial.id = templatePartialAsJSON.Attr.Id; } return templatePartials; } /** * @param {?} xmlData * @return {?} */ returnEndpoints(xmlData) { const /** @type {?} */ endPointStartToken = '<EndPoints>'; const /** @type {?} */ endPointEndToken = '</EndPoints>'; const /** @type {?} */ endPointStartTokenPosition = xmlData.indexOf(endPointStartToken); const /** @type {?} */ endPointEndTokenPosition = xmlData.indexOf(endPointEndToken); if (endPointStartTokenPosition >= 0 && endPointEndTokenPosition >= 0) { const /** @type {?} */ contentStartPosition = (endPointStartTokenPosition + endPointStartToken.length); const /** @type {?} */ endPointContent = xmlData.substring(contentStartPosition, endPointEndTokenPosition); if (endPointContent.length > 0) { const /** @type {?} */ templatePartials = this.returnEndPointContents(endPointContent, '<TemplatePartial', '</TemplatePartial>'); this.endPointXMLString = this.returnEndPointContents(endPointContent, '<EndPoint', '</EndPoint>'); return templatePartials; } } } /** * @param {?} xmlData * @return {?} */ parseToJson(xmlData) { let /** @type {?} */ jsonResult; const /** @type {?} */ parseString = require('xml2js').parseString; parseString(xmlData, { explicitRoot: false, explicitArray: false, attrkey: 'Attr' }, function (err, result) { jsonResult = result; }); return jsonResult; } /** * @param {?} metadataJSON * @return {?} */ getMetaData(metadataJSON) { const /** @type {?} */ metadata = new Metadata(); metadata.label = metadataJSON.Label; metadata.id = metadataJSON.ID; metadata.schemaVersion = metadataJSON.SchemaVersion; metadata.ruleVersion = metadataJSON.RuleVersion; const /** @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 {?} */ returnDataElement(elementType, dataElementsJSON) { const /** @type {?} */ dataElements = new Array(); let /** @type {?} */ dataElementCreationServiceInstance; for (const /** @type {?} */ dataElementCreationService of this.elememtcreationService) { if (dataElementCreationService.elementType === elementType) { dataElementCreationServiceInstance = dataElementCreationService; break; } } if (dataElementCreationServiceInstance !== undefined && dataElementsJSON !== undefined) { if (this.arrayCheckerService.isArray(dataElementsJSON)) { for (const /** @type {?} */ dataElementJSON of dataElementsJSON) { const /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementJSON); dataElements.push(dataElement); } } else { const /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementsJSON); dataElements.push(dataElement); } } return dataElements; } /** * @param {?} dataElementsJSON * @return {?} */ getDataElements(dataElementsJSON) { let /** @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 = () => [ { type: DiagramService }, { type: Array, decorators: [{ type: Inject, args: [CreationServiceInjectorToken,] }] }, { type: ArrayCheckerService }, { type: DecisionPointsCreationService } ]; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtbWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy90ZW1wbGF0ZS1tYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUcsTUFBTSxFQUFHLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFPMUUsTUFBTTs7Ozs7OztJQUtKLFlBQXFCLGNBQThCLEVBQ0gsc0JBQXdELEVBQzlGLHFCQUFtRCw2QkFBNEQ7UUFGcEcsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ0gsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFrQztRQUM5Rix3QkFBbUIsR0FBbkIsbUJBQW1CO1FBQWdDLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBK0I7aUNBTm5GLEVBQUU7NEJBRVosT0FBTyxDQUFDLFFBQVEsQ0FBQztLQUlpRjs7Ozs7SUFFOUgsV0FBVyxDQUFDLGVBQXVCO1FBQ2xDLHVCQUFNLFFBQVEsR0FBRyxJQUFJ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NEI7WUFqQi9CLG1CQUFtQjtZQUNuQiw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlICwgSW5qZWN0ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1RlbXBsYXRlfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy90ZW1wbGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tZXRhZGF0YS9tb2RlbHMvbWV0YWRhdGEtbW9kZWwnO1xyXG5pbXBvcnQgeyBEaWFncmFtIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZGlhZ3JhbS5tb2RlbCc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHtEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2V9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RlY2lzaW9uLXBvaW50cy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUnVsZXMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL21vZGVscy9ydWxlcy5tb2RlbCc7XHJcbmltcG9ydCB7IGZhaWwgfSBmcm9tICdhc3NlcnQnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBhcnRpYWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3RlbXBsYXRlLXBhcnRpYWwnO1xyXG5pbXBvcnQgeyBTZWN0aW9uSWZWYWx1ZU5vdENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW5kcG9pbnQvc2VjdGlvbi1pZi12YWx1ZS1ub3QtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3NlY3Rpb24taWYtdmFsdWUtY29uZGl0aW9uJztcclxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlTWFuYWdlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgZW5kUG9pbnRYTUxTdHJpbmc6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgc3RyaW5nUGFyc2VyOiBhbnkgPSByZXF1aXJlKCdzdHJpbmcnKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSAgZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlICxcclxuICAgIEBJbmplY3QoQ3JlYXRpb25TZXJ2aWNlSW5qZWN0b3JUb2tlbikgcHJpdmF0ZSBlbGVtZW10Y3JlYXRpb25TZXJ2aWNlOiBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2VbXSAsXHJcbiAgICBwcml2YXRlIGFycmF5Q2hlY2tlclNlcnZpY2U6IEFycmF5Q2hlY2tlclNlcnZpY2UgLCBwcml2YXRlIGRlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlOiBEZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZSkgeyB9XHJcblxyXG4gIGdldFRlbXBsYXRlKHRlbXBsYXRlQ29udGVudDogc3RyaW5nKTogVGVtcGxhdGUgIHtcclxuICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoKTtcclxuICAgbGV0IHRlbXBsYXRlQ29udGVudEFzSlNPTjogYW55O1xyXG4gICB0ZW1wbGF0ZUNvbnRlbnRBc0pTT04gPSB0aGlzLnBhcnNlVG9Kc29uKHRlbXBsYXRlQ29udGVudCk7XHJcbiAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aHJvdyAgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgdGhlIHRlbXBsYXRlJyk7XHJcbiAgIH1cclxuICAgdGVtcGxhdGUubWV0YWRhdGEgPSB0aGlzLmdldE1ldGFEYXRhKHRlbXBsYXRlQ29udGVudEFzSlNPTi5NZXRhZGF0YSk7XHJcbiAgIHRlbXBsYXRlLmRhdGFFbGVtZW50cyA9IHRoaXMuZ2V0RGF0YUVsZW1lbnRzKHRlbXBsYXRlQ29udGVudEFzSlNPTi5EYXRhRWxlbWVudHMpO1xyXG4gICBpZiAodGVtcGxhdGVDb250ZW50QXNKU09OLlJ1bGVzKSB7XHJcbiAgICB0ZW1wbGF0ZS5ydWxlcyAgPSBuZXcgUnVsZXMoKTtcclxuICAgIHRlbXBsYXRlLnJ1bGVzLmRlY2lzaW9uUG9pbnRzID0gdGhpcy5kZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWNpc2lvblBvaW50cyh0ZW1wbGF0ZUNvbnRlbnRBc0pTT04uUnVsZXMuRGVjaXNpb25Qb2ludCk7XHJcbiAgfVxyXG4gICAgdGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsID0gdGhpcy5yZXR1cm5FbmRwb2ludHModGVtcGxhdGVDb250ZW50KTtcclxuICAgIHRlbXBsYXRlLmVuZFBvaW50c1N0cmluZyA9IHRoaXMuZW5kUG9pbnRYTUxTdHJpbmc7XHJcbiAgICB0ZW1wbGF0ZS54bWxDb250ZW50ID0gdGVtcGxhdGVDb250ZW50O1xyXG5cclxuLy8gY29uc29sZS5sb2codGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsKTtcclxuLy9jb25zb2xlLmxvZyh0ZW1wbGF0ZS5lbmRQb2ludHNTdHJpbmcpO1xyXG5cclxuICAgIHJldHVybiB0ZW1wbGF0ZTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRlbXBsYXRlUGFydGlhbCh0ZW1wbGF0ZVBhcnRpYWxKU09OOiBhbnkpOiBUZW1wbGF0ZVBhcnRpYWwge1xyXG4gICAgY29uc3QgdGVtcGxhdGVQYXJ0aWFsID0gbmV3IFRlbXBsYXRlUGFydGlhbDtcclxuICAgIHRlbXBsYXRlUGFydGlhbC5pZCA9IHRlbXBsYXRlUGFydGlhbEpTT04uQXR0ci5JZDtcclxuICAgIHRlbXBsYXRlUGFydGlhbC5zZWN0aW9uSWZOb3RWYWx1ZSA9IHRlbXBsYXRlUGFydGlhbEpTT04uU2VjdGlvbklmVmFsdWVOb3Q7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWwuc2VjdGlvbklmVmFsdWVzID0gdGVtcGxhdGVQYXJ0aWFsSlNPTi5TZWN0aW9uSWZWYWx1ZTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVBhcnRpYWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldHVybkVuZFBvaW50Q29udGVudHMoY29udGVudDogc3RyaW5nLCBzdGFydFRva2VuOiBzdHJpbmcsIGVuZFRva2VuOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBjb250ZW50cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdGVtcGxhdGVTZWFyY2hJbmRleFBvc2l0aW9uID0gMDtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRTdGFydFBvc2l0aW9uID0gY29udGVudC5pbmRleE9mKHN0YXJ0VG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRFbmRQb3NpdGlvbiAgPSBjb250ZW50LmluZGV4T2YoZW5kVG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcblxyXG4gICAgICAgICBpZiAoY29udGVudFN0YXJ0UG9zaXRpb24gPj0gMCAgJiYgY29udGVudEVuZFBvc2l0aW9uID49IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBjb250ZW50RW5kUG9zaXRpb24gKyBlbmRUb2tlbi5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREYXRhID0gY29udGVudC5zdWJzdHJpbmcoY29udGVudFN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgY29udGVudHMucHVzaChjb250ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IGVuZFBvc2l0aW9uICsgMTtcclxuICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGNvbnRlbnRzO1xyXG4gIH1cclxuXHJcbnByaXZhdGUgcmV0dXJuVGVtcGxhdGVQYXJ0aWFscyh0ZW1wbGF0ZVBhcnRpYWxBcnJheTogc3RyaW5nW10pOiBUZW1wbGF0ZVBhcnRpYWxbXSB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbHMgPSBuZXcgQXJyYXk8VGVtcGxhdGVQYXJ0aWFsPigpO1xyXG4gICAgICBmb3IgKGNvbnN0IGFycmF5SXRlbSBvZiB0ZW1wbGF0ZVBhcnRpYWxBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbCA9IG5ldyBUZW1wbGF0ZVBhcnRpYWwoKTtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWxBc0pTT04gPSB0aGlzLnBhcnNlVG9Kc29uKGFycmF5SXRlbSk7XHJcbiAgICAgICAgdGVtcGxhdGVQYXJ0aWFsLmlkID0gdGVtcGxhdGVQYXJ0aWFsQXNKU09OLkF0dHIuSWQ7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGVtcGxhdGVQYXJ0aWFscztcclxufVxyXG5cclxuICBwcml2YXRlIHJldHVybkVuZHBvaW50cyh4bWxEYXRhOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBlbmRQb2ludFN0YXJ0VG9rZW4gPSAnPEVuZFBvaW50cz4nO1xyXG4gICAgY29uc3QgZW5kUG9pbnRFbmRUb2tlbiA9ICc8L0VuZFBvaW50cz4nO1xyXG5cclxuICAgIGNvbnN0IGVuZFBvaW50U3RhcnRUb2tlblBvc2l0aW9uID0geG1sRGF0YS5pbmRleE9mKGVuZFBvaW50U3RhcnRUb2tlbik7XHJcbiAgICBjb25zdCBlbmRQb2ludEVuZFRva2VuUG9zaXRpb24gPSB4bWxEYXRhLmluZGV4T2YoZW5kUG9pbnRFbmRUb2tlbik7XHJcbiAgICBpZiAoZW5kUG9pbnRTdGFydFRva2VuUG9zaXRpb24gPj0gMCAgJiYgZW5kUG9pbnRFbmRUb2tlblBvc2l0aW9uID49IDAgKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRTdGFydFBvc2l0aW9uID0gIChlbmRQb2ludFN0YXJ0VG9rZW5Qb3NpdGlvbiArIGVuZFBvaW50U3RhcnRUb2tlbi5sZW5ndGgpO1xyXG4gICAgICBjb25zdCBlbmRQb2ludENvbnRlbnQgPSB4bWxEYXRhLnN1YnN0cmluZyhjb250ZW50U3RhcnRQb3NpdGlvbiAsIGVuZFBvaW50RW5kVG9rZW5Qb3NpdGlvbik7XHJcbiAgICBpZiAoZW5kUG9pbnRDb250ZW50Lmxlbmd0aCA+IDAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbHMgPSB0aGlzLnJldHVybkVuZFBvaW50Q29udGVudHMoZW5kUG9pbnRDb250ZW50LCAnPFRlbXBsYXRlUGFydGlhbCcgLCAnPC9UZW1wbGF0ZVBhcnRpYWw+Jyk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kUG9pbnRYTUxTdHJpbmcgPSB0aGlzLnJldHVybkVuZFBvaW50Q29udGVudHMoZW5kUG9pbnRDb250ZW50LCAnPEVuZFBvaW50JyAsICc8L0VuZFBvaW50PicpO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlUGFydGlhbHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5wcml2YXRlIHBhcnNlVG9Kc29uKHhtbERhdGE6IHN0cmluZyk6IGFueSB7XHJcbiAgICBsZXQganNvblJlc3VsdDogSlNPTjtcclxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gIHJlcXVpcmUoJ3htbDJqcycpLnBhcnNlU3RyaW5nO1xyXG4gICAgcGFyc2VTdHJpbmcoeG1sRGF0YSwge2V4cGxpY2l0Um9vdCA6IGZhbHNlLCBleHBsaWNpdEFycmF5IDogZmFsc2UsIGF0dHJrZXkgOiAnQXR0cid9ICwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XHJcbiAgICAgICAganNvblJlc3VsdCAgPSByZXN1bHQ7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGpzb25SZXN1bHQ7XHJcbiB9XHJcblxyXG4gcHJpdmF0ZSBnZXRNZXRhRGF0YShtZXRhZGF0YUpTT046IGFueSk6IE1ldGFkYXRhIHtcclxuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7XHJcbiAgICBtZXRhZGF0YS5sYWJlbCA9IG1ldGFkYXRhSlNPTi5MYWJlbDtcclxuICAgIG1ldGFkYXRhLmlkID0gbWV0YWRhdGFKU09OLklEO1xyXG4gICAgbWV0YWRhdGEuc2NoZW1hVmVyc2lvbiA9IG1ldGFkYXRhSlNPTi5TY2hlbWFWZXJzaW9uO1xyXG4gICAgbWV0YWRhdGEucnVsZVZlcnNpb24gPSBtZXRhZGF0YUpTT04uUnVsZVZlcnNpb247XHJcbiAgICBjb25zdCBkaWFncmFtc0FzSlNPTiA9IG1ldGFkYXRhSlNPTi5JbmZvLkRpYWdyYW1zLkRpYWdyYW07XHJcbiAgICBtZXRhZGF0YS5kaWFncmFtcyA9IHRoaXMuZGlhZ3JhbVNlcnZpY2UucmV0dXJuRGlhZ3JhbXMoZGlhZ3JhbXNBc0pTT04pO1xyXG5cclxuICAgIG1ldGFkYXRhLmFwcHJvdmVkQnkgPSBtZXRhZGF0YUpTT04uQXBwcm92ZWRCeTtcclxuICAgIG1ldGFkYXRhLmNyZWF0ZWREYXRlID0gbWV0YWRhdGFKU09OLkNyZWF0ZWREYXRlO1xyXG4gICAgbWV0YWRhdGEubGFzdE1vZGlmaWVkRGF0ZSA9IG1ldGFkYXRhSlNPTi5MYXN0TW9kaWZpZWREYXRlO1xyXG4gICAgbWV0YWRhdGEucmV2aWV3ZWRCeSA9IG1ldGFkYXRhSlNPTi5SZXZpZXdlZEJ5O1xyXG4gICAgbWV0YWRhdGEuZGV2ZWxvcGVkQnkgPSBtZXRhZGF0YUpTT04uRGV2ZWxvcGVkQnk7XHJcbiAgICBtZXRhZGF0YS5yYWRFbGVtZW50U2V0SUQgPSBtZXRhZGF0YUpTT04uUmFkRWxlbWVudFNldElEO1xyXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gfVxyXG5cclxuIHByaXZhdGUgIHJldHVybkRhdGFFbGVtZW50IChlbGVtZW50VHlwZTogc3RyaW5nLCBkYXRhRWxlbWVudHNKU09OOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnRbXSB7XHJcbiAgICBjb25zdCAgZGF0YUVsZW1lbnRzID0gbmV3IEFycmF5PEJhc2VEYXRhRWxlbWVudD4oKTtcclxuICAgIGxldCBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlOiBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2U7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIG9mIHRoaXMuZWxlbWVtdGNyZWF0aW9uU2VydmljZSkge1xyXG4gICAgICAgICAgaWYgKGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSkge1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlID0gZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgZGF0YUVsZW1lbnRzSlNPTiAhPT0gdW5kZWZpbmVkKSAge1xyXG4gICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGRhdGFFbGVtZW50c0pTT04pKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkYXRhRWxlbWVudEpTT04gb2YgZGF0YUVsZW1lbnRzSlNPTikge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhRWxlbWVudCA9IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlSW5zdGFuY2UuY3JlYXRlRWxlbWVudChkYXRhRWxlbWVudEpTT04pO1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudHMucHVzaChkYXRhRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGRhdGFFbGVtZW50ID0gZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZS5jcmVhdGVFbGVtZW50KGRhdGFFbGVtZW50c0pTT04pO1xyXG4gICAgICAgIGRhdGFFbGVtZW50cy5wdXNoKGRhdGFFbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50cztcclxuIH1cclxuXHJcbiBwcml2YXRlIGdldERhdGFFbGVtZW50cyhkYXRhRWxlbWVudHNKU09OOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnRbXSB7XHJcbiAgIGxldCAgZGF0YUVsZW1lbnRzID0gbmV3IEFycmF5PEJhc2VEYXRhRWxlbWVudD4oKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdDaG9pY2VEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uQ2hvaWNlRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdNdWx0aUNob2ljZURhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5NdWx0aUNob2ljZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnTnVtZXJpY0RhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5OdW1lcmljRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdHbG9iYWxWYWx1ZScsIGRhdGFFbGVtZW50c0pTT04uR2xvYmFsVmFsdWUpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdDb21wdXRlZERhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5Db21wdXRlZERhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnSW50ZWdlckRhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5JbnRlZ2VyRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdEYXRlVGltZURhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5EYXRlVGltZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnRHVyYXRpb25EYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uVGltZVNwYW5EYXRhRWxlbWVudCkpO1xyXG4gICByZXR1cm4gZGF0YUVsZW1lbnRzO1xyXG4gfVxyXG59XHJcbiJdfQ==