UNPKG

@boldreports/angular-reporting-components

Version:

The Bold Reports by Syncfuion components for Angular contains ReportViewer and ReportDesigner reporting components for enterprise web development

380 lines 57.9 kB
import { EventEmitter, Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export { ContentChild, Type, forwardRef } from '@angular/core'; export let currentTemplateElement; let firstVal = {}; /** Internal Helpers */ export class Utils { static IterateAndGetChanges(obj) { if (ej.isNullOrUndefined(obj.tags) || obj.tags.length === 0) { return null; } let res = {}; for (let i = 0, tags = obj.tags; i < tags.length; i++) { let tag = tags[i], tagElement = obj['tag_' + tag.replace(/\./g, '_')]; if (!ej.isNullOrUndefined(tagElement) && tagElement.hasChanges) { res[tag] = tagElement.getChangesAndReset(); } } return res; } } Utils.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Utils, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); Utils.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Utils }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Utils, decorators: [{ type: Injectable }] }); // tslint:disable-next-line:max-line-length export class BoldReportComponents { // tslint:disable-next-line:max-line-length constructor(controlName, el, cdRef, tags, ejIterableDiffers, _ejKeyValueDiffers) { this.controlName = controlName; this.el = el; this.cdRef = cdRef; this.tags = tags; this.ejIterableDiffers = ejIterableDiffers; this._ejKeyValueDiffers = _ejKeyValueDiffers; this.model = {}; this.outputs = []; this.inputs = []; this.twoways = []; // this.__shadow = this.dom.getShadowRoot(this.el.nativeElement); this.firstCheck = true; this.ejIterable = this.ejIterableDiffers.find([]).create(null); this.ejKeyValueDif = _ejKeyValueDiffers.find([]).create(); } static bindAndRaiseEvent(instance, model, event) { if (!event.startsWith('model.')) { // && instance[event]['observers'].length > 1) { let originalEvt = event.startsWith('bold') ? event.substr(4) : event; model[originalEvt] = function (params) { instance[event + '_output']['emit'](params); }; } } createTwoways(twoways) { if (!twoways) { return; } let model = this.model; for (let i = 0; i < twoways.length; i++) { let element = twoways[i].replace(/\_/g, '.'); ej.createObject(element + 'Change', this[twoways[i] + '_twoChange'], model); ej.createObject(element, this.addTwoways(element), model); } } addTwoways(prop) { let model = this.model, value = firstVal; // , originalProp = prop.replace(/-/g, '.'); return function (newVal, isApp) { if (value === firstVal) { value = ej.getObject(prop + '_two', model); if (value === undefined) { value = ej.getObject(prop, this === undefined || this.defaults === undefined ? {} : this.defaults); } } if (newVal === undefined) { return value; } if (value === newVal) { return; } value = newVal; if (!isApp) { ej.createObject(prop + '_two', newVal, model); ej.getObject(prop + 'Change', model).emit(newVal); } }; } ngOnInit() { for (let key in this) { if (key.indexOf('_input') != -1) this.inputs.push(key); if (key.indexOf('_output') != -1) this.outputs.push(key); if (key.indexOf('_two') != -1 && key.indexOf('_twoChange') == -1) this.twoways.push(key.replace('_two', '')); } if (ej.isNullOrUndefined(this['options'])) { this.createTwoways(this.twoways); } } ngAfterContentInit() { this.firstCheck = false; let model = this.model, events = this.outputs; if (events) { for (let i = 0; i < events.length; i++) { let event = events[i].replace('_output', ''); BoldReportComponents.bindAndRaiseEvent(this, model, event); } } if (ej.isNullOrUndefined(this['options'])) { for (let i = 0; i < this.tags.length; i++) { let element = this.tags[i], item = this['tag_' + element.replace(/\./g, '_')]; if (!ej.isNullOrUndefined(item)) { ej.createObject(element, item.getList(), this.model); } } for (let i = 0; i < this.inputs.length; i++) { let property = this.inputs[i]; let modelProperty = this.inputs[i].replace('_input', ''); if (this[property] != null) { if (modelProperty.indexOf('_') == -1) { if (this.model[modelProperty]) { $.extend(true, this.model[modelProperty], this[property]); } else { this.model[modelProperty] = this[property]; } } else if (modelProperty.indexOf('_two') == -1) { let tempObj = {}; let key = modelProperty.replace(/\_/g, '.'); ej.createObject(key, this[property], tempObj); let rootProp = key.split('.')[0]; if (this.model[rootProp] == undefined) this.model[rootProp] = {}; $.extend(true, this.model[rootProp], tempObj[rootProp]); } } } for (let i = 0; i < this.twoways.length; i++) { let twoway = this.twoways[i]; let twowayProperty = twoway + '_two'; if (this[twowayProperty] != null) { if (twoway.indexOf('_') == -1) { this.model[twowayProperty] = this[twowayProperty]; } else { let tempObj = {}; let key = twoway.replace(/\_/g, '.') + '_two'; ej.createObject(key, this[twowayProperty], tempObj); let rootProp = twowayProperty.split('_')[0]; $.extend(true, this.model[rootProp], tempObj[rootProp]); } } } } else this.model = jQuery.extend(this.model, this['options']); } ngDoCheck() { if (ej.isNullOrUndefined(this['options'])) { this.twoways.forEach(element => { if (this[element + '_two'] instanceof Array) { let changes = this.ejIterable.diff(this[element + '_two']); if (changes) { let ngChanges = {}; if (this.widget != undefined) { ngChanges = this.getTwowayChanges(changes.collection, ngChanges, element.replace(/\_/g, '.')); ej.createObject(element.replace(/\_/g, '.') + '.two', changes.collection, ngChanges); this.widget['setModel'](ngChanges, $.isPlainObject(ngChanges)); } } } }); } else { let changes = this.ejKeyValueDif.diff(this['options']); if (changes) { if (this.widget != undefined) { var ngchanges = {}; changes.forEachChangedItem((changedprop) => { ej.createObject(changedprop.key, changedprop.currentValue, ngchanges); }); this.widget['setModel'](ngchanges, $.isPlainObject(ngchanges)); } } } } ngAfterViewInit() { let nativeElement = this.isEditor ? $(this.el.nativeElement.children) : $(this.el.nativeElement); let controlName = this.lowerCaseFirstLetter(this.controlName); this.widget = $(nativeElement)[controlName](this.model)[controlName]('instance'); } lowerCaseFirstLetter(string) { return string[0].toLowerCase() + string.slice(1); } ngOnChanges(changes) { if (this.firstCheck) { return; } let ngChanges = {}; if (ej.isNullOrUndefined(this['options'])) { for (let key in changes) { let element = changes[key]; if (element.previousValue === element.currentValue) { break; } key = key.replace('_input', '').replace(/\_/g, '.'); if (key.endsWith('.two')) { let oKey = key.replace('.two', ''); ngChanges = this.getTwowayChanges(element.currentValue, ngChanges, oKey); } ej.createObject(key, element.currentValue, ngChanges); } this.widget['setModel'](ngChanges, $.isPlainObject(ngChanges)); } } getTwowayChanges(value, ngChanges, prop) { let valFn = ej.getObject(prop, this.widget['model']); valFn(value, true); ej.createObject(prop, valFn, ngChanges); return ngChanges; } ngAfterContentChecked() { // TODO: ChangeDetection Third/Multi level let changes = Utils.IterateAndGetChanges(this); for (let key in changes) { if (changes.hasOwnProperty(key)) { let element = changes[key]; this.widget['_' + key](element); } } } ngOnDestroy() { this.widget['destroy'](); } } BoldReportComponents.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: BoldReportComponents, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable }); BoldReportComponents.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: BoldReportComponents }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: BoldReportComponents, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Array }, { type: i0.IterableDiffers }, { type: i0.KeyValueDiffers }]; } }); export class ComplexTagElement { // tags: Array<string>; constructor(tags) { this.tags = tags; this.valueChange = new EventEmitter(); this.complexes = []; this.hasChanges = false; this.firstChange = true; Object.defineProperty(this, 'parent', { enumerable: false, writable: true, value: null }); currentTemplateElement = this; } ngOnInit() { this.firstChange = false; for (let key in this) { if (key.indexOf('_') != -1 && key.indexOf('tag_') == -1) this.complexes.push(key); } for (let i = 0; i < this.complexes.length; i++) { let property = this.complexes[i]; if (property.indexOf('_') != -1) { let tempObj = {}; let key = property.replace(/\_/g, '.'); ej.createObject(key, this[property], tempObj); let rootProp = key.split('.')[0]; if (this[rootProp] == undefined) this[rootProp] = {}; $.extend(true, this[rootProp], tempObj[rootProp]); } } } ensureCleanObject() { let tags = this.tags; for (let i = 0; i < tags.length; i++) { let element = tags[i], tagElement = this['tag_' + element.replace(/\./g, '_')]; if (i === 0 && this[element]) { return; } if (ej.isNullOrUndefined(tagElement)) { continue; } ej.createObject(element, tagElement.getList(), this); } } ngOnChanges(changes) { if (this.firstChange) { return; } this.recentChanges = changes; this.hasChanges = true; } getChangesAndReset() { if (this.hasChanges === false) { return; } let changes = this.recentChanges || {}; let contentChanges = Utils.IterateAndGetChanges(this); if (!$.isEmptyObject(contentChanges)) { for (let key in contentChanges) { if (contentChanges.hasOwnProperty(key)) { let element = contentChanges[key]; // this.el.nativeElement. if (!ej.isNullOrUndefined(this.parent.widget['_' + this.property.replace(/\./g, '_') + '_' + key])) this.parent.widget['_' + this.property.replace(/\./g, '_') + '_' + key](element); } } } this.hasChanges = false; return changes; } ngAfterContentChecked() { let tags = this.tags; for (let i = 0, len = tags.length; i < len; i++) { let element = tags[i], tagElement = this['tag_' + element.replace(/\./g, '_')]; if (tagElement && tagElement.hasChanges) { this.hasChanges = true; } } } } ComplexTagElement.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ComplexTagElement, deps: [{ token: Array }], target: i0.ɵɵFactoryTarget.Injectable }); ComplexTagElement.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ComplexTagElement }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ComplexTagElement, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: Array }]; } }); export class ArrayTagElement { constructor(propertyName) { this.propertyName = propertyName; this.hasChanges = false; } // TODO: Need to consider dynamic child change ngAfterContentInit() { let index = 0; this.list = this.children.map((child) => { child.index = index++; child.property = this.propertyName; return child; }); } getList() { let list = this.list; for (let i = 0; i < list.length; i++) { list[i].ensureCleanObject(); } return list; } getChangesAndReset() { this.hasChanges = false; return this.recentChanges; } ngAfterContentChecked() { let changes = {}, res = changes[this.propertyName] = [], childChange; for (let i = 0, list = this.list; i < list.length; i++) { let child = list[i]; if (child.hasChanges) { childChange = child.getChangesAndReset(); if (!ej.isNullOrUndefined(childChange)) { res.push({ index: child.index, change: childChange }); } } } if (res.length > 0) { this.recentChanges = res; this.hasChanges = true; } } } ArrayTagElement.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ArrayTagElement, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable }); ArrayTagElement.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ArrayTagElement }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ArrayTagElement, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxZQUFZLEVBRXlFLFVBQVUsRUFFbEcsTUFBTSxlQUFlLENBQUM7O0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRCxNQUFNLENBQUMsSUFBSSxzQkFBMkIsQ0FBQztBQWlCdkMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBR2xCLHVCQUF1QjtBQUN2QixNQUFNLE9BQU8sS0FBSztJQUNkLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFlO1FBQ3ZDLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFTLEdBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUM5QztTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7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Q0FBQztJQUNoQixDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxxQkFBcUI7UUFDakIsSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBOEIsT0FBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBZ0IsQ0FBQztRQUV0RyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUNsQixXQUFXLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ3BDLEdBQUcsQ0FBQyxJQUFJLENBQWU7d0JBQ25CLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSzt3QkFDbEIsTUFBTSxFQUFFLFdBQVc7cUJBQ3RCLENBQUMsQ0FBQztpQkFDTjthQUNKO1NBQ0o7UUFFRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQzs7NEdBckRRLGVBQWU7Z0hBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEV2ZW50RW1pdHRlciwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBTaW1wbGVDaGFuZ2UsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZiwgSXRlcmFibGVEaWZmZXJzLCBLZXlWYWx1ZURpZmZlcnMsIE9uSW5pdCxcclxuICAgIERvQ2hlY2ssIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25EZXN0cm95LCBJbmplY3RhYmxlXHJcblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IHsgQ29udGVudENoaWxkLCBUeXBlLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgbGV0IGN1cnJlbnRUZW1wbGF0ZUVsZW1lbnQ6IGFueTtcclxuXHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGFyZW50VGFnIHtcclxuICAgIHRhZ3M6IEFycmF5PGFueT47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNoaWxkQ2hhbmdlIHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICBjaGFuZ2U6IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbmdlU2V0IHtcclxuICAgIFtrZXk6IHN0cmluZ106IEFycmF5PElDaGlsZENoYW5nZT47XHJcbn1cclxuXHJcbmxldCBmaXJzdFZhbCA9IHt9O1xyXG5cclxuQEluamVjdGFibGUoKVxyXG4vKiogSW50ZXJuYWwgSGVscGVycyAqL1xyXG5leHBvcnQgY2xhc3MgVXRpbHMge1xyXG4gICAgc3RhdGljIEl0ZXJhdGVBbmRHZXRDaGFuZ2VzKG9iajogSVBhcmVudFRhZyk6IElDaGFuZ2VTZXQge1xyXG4gICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZChvYmoudGFncykgfHwgb2JqLnRhZ3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzOiBJQ2hhbmdlU2V0ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHRhZ3MgPSBvYmoudGFnczsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRhZyA9IHRhZ3NbaV0sIHRhZ0VsZW1lbnQgPSAoPGFueT5vYmopWyd0YWdfJyArIHRhZy5yZXBsYWNlKC9cXC4vZywgJ18nKV07XHJcbiAgICAgICAgICAgIGlmICghZWouaXNOdWxsT3JVbmRlZmluZWQodGFnRWxlbWVudCkgJiYgdGFnRWxlbWVudC5oYXNDaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICByZXNbdGFnXSA9IHRhZ0VsZW1lbnQuZ2V0Q2hhbmdlc0FuZFJlc2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG5leHBvcnQgY2xhc3MgQm9sZFJlcG9ydENvbXBvbmVudHM8VywgVD4gaW1wbGVtZW50cyBJUGFyZW50VGFnLCBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIERvQ2hlY2ssIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25EZXN0cm95IHtcclxuICAgIHB1YmxpYyBtb2RlbDogVCA9IDxUPnt9O1xyXG4gICAgcHVibGljIHdpZGdldDogVztcclxuICAgIHByb3RlY3RlZCBvdXRwdXRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBwcm90ZWN0ZWQgaW5wdXRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBwcm90ZWN0ZWQgdHdvd2F5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgcHJvdGVjdGVkIGNvbXBsZXhQcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgcHJvdGVjdGVkIGlzRWRpdG9yOiBib29sZWFuO1xyXG5cclxuICAgIHByaXZhdGUgZmlyc3RDaGVjazogYm9vbGVhbjtcclxuICAgIGVqSXRlcmFibGU6IGFueTtcclxuICAgIGVqS2V5VmFsdWVEaWY6IGFueTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBiaW5kQW5kUmFpc2VFdmVudChpbnN0YW5jZTogYW55LCBtb2RlbDogYW55LCBldmVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFldmVudC5zdGFydHNXaXRoKCdtb2RlbC4nKSkgey8vICYmIGluc3RhbmNlW2V2ZW50XVsnb2JzZXJ2ZXJzJ10ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxFdnQgPSBldmVudC5zdGFydHNXaXRoKCdib2xkJykgPyBldmVudC5zdWJzdHIoNCkgOiBldmVudDtcclxuICAgICAgICAgICAgbW9kZWxbb3JpZ2luYWxFdnRdID0gZnVuY3Rpb24gKHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtldmVudCArICdfb3V0cHV0J11bJ2VtaXQnXShwYXJhbXMpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjb250cm9sTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgZWw6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyB0YWdzOiBBcnJheTxzdHJpbmc+LCBwcml2YXRlIGVqSXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsIHByaXZhdGUgX2VqS2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMpIHtcclxuICAgICAgICAvLyAgICAgICAgdGhpcy5fX3NoYWRvdyA9IHRoaXMuZG9tLmdldFNoYWRvd1Jvb3QodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICB0aGlzLmZpcnN0Q2hlY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZWpJdGVyYWJsZSA9IHRoaXMuZWpJdGVyYWJsZURpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZWpLZXlWYWx1ZURpZiA9IF9laktleVZhbHVlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlVHdvd2F5cyh0d293YXlzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgaWYgKCF0d293YXlzKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGxldCBtb2RlbCA9IHRoaXMubW9kZWw7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0d293YXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdHdvd2F5c1tpXS5yZXBsYWNlKC9cXF8vZywgJy4nKTtcclxuICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGVsZW1lbnQgKyAnQ2hhbmdlJywgKDxhbnk+dGhpcylbdHdvd2F5c1tpXSArICdfdHdvQ2hhbmdlJ10sIG1vZGVsKTtcclxuICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGVsZW1lbnQsIHRoaXMuYWRkVHdvd2F5cyhlbGVtZW50KSwgbW9kZWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkVHdvd2F5cyhwcm9wOiBzdHJpbmcpOiBGdW5jdGlvbiB7XHJcbiAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5tb2RlbCwgdmFsdWUgPSBmaXJzdFZhbDsgLy8gLCBvcmlnaW5hbFByb3AgPSBwcm9wLnJlcGxhY2UoLy0vZywgJy4nKTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5ld1ZhbDogYW55LCBpc0FwcDogYm9vbGVhbikge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IGZpcnN0VmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVqLmdldE9iamVjdChwcm9wICsgJ190d28nLCBtb2RlbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWouZ2V0T2JqZWN0KHByb3AsIHRoaXMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRlZmF1bHRzID09PSB1bmRlZmluZWQgPyB7fSA6IHRoaXMuZGVmYXVsdHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChuZXdWYWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbmV3VmFsKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbDtcclxuICAgICAgICAgICAgaWYgKCFpc0FwcCkge1xyXG4gICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KHByb3AgKyAnX3R3bycsIG5ld1ZhbCwgbW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgZWouZ2V0T2JqZWN0KHByb3AgKyAnQ2hhbmdlJywgbW9kZWwpLmVtaXQobmV3VmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcykge1xyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19pbnB1dCcpICE9IC0xKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dHMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19vdXRwdXQnKSAhPSAtMSlcclxuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0cy5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX3R3bycpICE9IC0xICYmIGtleS5pbmRleE9mKCdfdHdvQ2hhbmdlJykgPT0gLTEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnR3b3dheXMucHVzaChrZXkucmVwbGFjZSgnX3R3bycsICcnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZCgoPGFueT50aGlzKVsnb3B0aW9ucyddKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVR3b3dheXModGhpcy50d293YXlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgICAgIHRoaXMuZmlyc3RDaGVjayA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLm1vZGVsLCBldmVudHMgPSB0aGlzLm91dHB1dHM7XHJcbiAgICAgICAgaWYgKGV2ZW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50ID0gZXZlbnRzW2ldLnJlcGxhY2UoJ19vdXRwdXQnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICBCb2xkUmVwb3J0Q29tcG9uZW50cy5iaW5kQW5kUmFpc2VFdmVudCh0aGlzLCBtb2RlbCwgZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZCgoPGFueT50aGlzKVsnb3B0aW9ucyddKSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLnRhZ3NbaV0sIGl0ZW0gPSAoPGFueT50aGlzKVsndGFnXycgKyBlbGVtZW50LnJlcGxhY2UoL1xcLi9nLCAnXycpXTtcclxuICAgICAgICAgICAgICAgIGlmICghZWouaXNOdWxsT3JVbmRlZmluZWQoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlai5jcmVhdGVPYmplY3QoZWxlbWVudCwgaXRlbS5nZXRMaXN0KCksIHRoaXMubW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHkgPSB0aGlzLmlucHV0c1tpXTtcclxuICAgICAgICAgICAgICAgIGxldCBtb2RlbFByb3BlcnR5ID0gdGhpcy5pbnB1dHNbaV0ucmVwbGFjZSgnX2lucHV0JywgJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnR5XSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvcGVydHkuaW5kZXhPZignXycpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzLm1vZGVsKVttb2RlbFByb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgKDxhbnk+dGhpcy5tb2RlbClbbW9kZWxQcm9wZXJ0eV0sICg8YW55PnRoaXMpW3Byb3BlcnR5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLm1vZGVsKVttb2RlbFByb3BlcnR5XSA9ICg8YW55PnRoaXMpW3Byb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWxQcm9wZXJ0eS5pbmRleE9mKCdfdHdvJykgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBPYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gbW9kZWxQcm9wZXJ0eS5yZXBsYWNlKC9cXF8vZywgJy4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGtleSwgKDxhbnk+dGhpcylbcHJvcGVydHldLCB0ZW1wT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvb3RQcm9wID0ga2V5LnNwbGl0KCcuJylbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzLm1vZGVsKVtyb290UHJvcF0gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcy5tb2RlbClbcm9vdFByb3BdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsICg8YW55PnRoaXMubW9kZWwpW3Jvb3RQcm9wXSwgdGVtcE9ialtyb290UHJvcF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHdvd2F5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHR3b3dheSA9IHRoaXMudHdvd2F5c1tpXTtcclxuICAgICAgICAgICAgICAgIGxldCB0d293YXlQcm9wZXJ0eSA9IHR3b3dheSArICdfdHdvJztcclxuICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzKVt0d293YXlQcm9wZXJ0eV0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0d293YXkuaW5kZXhPZignXycpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMubW9kZWwpW3R3b3dheVByb3BlcnR5XSA9ICg8YW55PnRoaXMpW3R3b3dheVByb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcE9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0d293YXkucmVwbGFjZSgvXFxfL2csICcuJykgKyAnX3R3byc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChrZXksICg8YW55PnRoaXMpW3R3b3dheVByb3BlcnR5XSwgdGVtcE9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb290UHJvcCA9IHR3b3dheVByb3BlcnR5LnNwbGl0KCdfJylbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsICg8YW55PnRoaXMubW9kZWwpW3Jvb3RQcm9wXSwgdGVtcE9ialtyb290UHJvcF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBqUXVlcnkuZXh0ZW5kKHRoaXMubW9kZWwsICg8YW55PnRoaXMpWydvcHRpb25zJ10pO1xyXG5cclxuICAgIH1cclxuICAgIG5nRG9DaGVjaygpIHtcclxuICAgICAgICBpZiAoZWouaXNOdWxsT3JVbmRlZmluZWQoKDxhbnk+dGhpcylbJ29wdGlvbnMnXSkpIHtcclxuICAgICAgICAgICAgdGhpcy50d293YXlzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxhbnk+dGhpcylbZWxlbWVudCArICdfdHdvJ10gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gdGhpcy5lakl0ZXJhYmxlLmRpZmYoKDxhbnk+dGhpcylbZWxlbWVudCArICdfdHdvJ10pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZ0NoYW5nZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud2lkZ2V0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdDaGFuZ2VzID0gdGhpcy5nZXRUd293YXlDaGFuZ2VzKGNoYW5nZXMuY29sbGVjdGlvbiwgbmdDaGFuZ2VzLCBlbGVtZW50LnJlcGxhY2UoL1xcXy9nLCAnLicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChlbGVtZW50LnJlcGxhY2UoL1xcXy9nLCAnLicpICsgJy50d28nLCBjaGFuZ2VzLmNvbGxlY3Rpb24sIG5nQ2hhbmdlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLndpZGdldClbJ3NldE1vZGVsJ10obmdDaGFuZ2VzLCAkLmlzUGxhaW5PYmplY3QobmdDaGFuZ2VzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gdGhpcy5laktleVZhbHVlRGlmLmRpZmYoKDxhbnk+dGhpcylbJ29wdGlvbnMnXSk7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53aWRnZXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5nY2hhbmdlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKChjaGFuZ2VkcHJvcDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChjaGFuZ2VkcHJvcC5rZXksIGNoYW5nZWRwcm9wLmN1cnJlbnRWYWx1ZSwgbmdjaGFuZ2VzKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLndpZGdldClbJ3NldE1vZGVsJ10obmdjaGFuZ2VzLCAkLmlzUGxhaW5PYmplY3QobmdjaGFuZ2VzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLmlzRWRpdG9yID8gJCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pIDogJCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIGxldCBjb250cm9sTmFtZTogc3RyaW5nID0gdGhpcy5sb3dlckNhc2VGaXJzdExldHRlcih0aGlzLmNvbnRyb2xOYW1lKTtcclxuICAgICAgICB0aGlzLndpZGdldCA9ICgkKG5hdGl2ZUVsZW1lbnQpIGFzIGFueSlbY29udHJvbE5hbWVdKHRoaXMubW9kZWwpW2NvbnRyb2xOYW1lXSgnaW5zdGFuY2UnKTtcclxuICAgIH1cclxuXHJcbiAgICBsb3dlckNhc2VGaXJzdExldHRlcihzdHJpbmc6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBzdHJpbmdbMF0udG9Mb3dlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlyc3RDaGVjaykgeyByZXR1cm47IH1cclxuICAgICAgICBsZXQgbmdDaGFuZ2VzID0ge307XHJcbiAgICAgICAgaWYgKGVqLmlzTnVsbE9yVW5kZWZpbmVkKCg8YW55PnRoaXMpWydvcHRpb25zJ10pKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGNoYW5nZXNba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnByZXZpb3VzVmFsdWUgPT09IGVsZW1lbnQuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnX2lucHV0JywgJycpLnJlcGxhY2UoL1xcXy9nLCAnLicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgnLnR3bycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9LZXkgPSBrZXkucmVwbGFjZSgnLnR3bycsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICBuZ0NoYW5nZXMgPSB0aGlzLmdldFR3b3dheUNoYW5nZXMoZWxlbWVudC5jdXJyZW50VmFsdWUsIG5nQ2hhbmdlcywgb0tleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlai5jcmVhdGVPYmplY3Qoa2V5LCBlbGVtZW50LmN1cnJlbnRWYWx1ZSwgbmdDaGFuZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgKDxhbnk+dGhpcy53aWRnZXQpWydzZXRNb2RlbCddKG5nQ2hhbmdlcywgJC5pc1BsYWluT2JqZWN0KG5nQ2hhbmdlcykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUd293YXlDaGFuZ2VzKHZhbHVlOiBhbnksIG5nQ2hhbmdlczogYW55LCBwcm9wOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgdmFsRm4gPSBlai5nZXRPYmplY3QocHJvcCwgKDxhbnk+dGhpcy53aWRnZX