Repository URL to install this package:
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ConfirmationDialogComponent } from '../../../components/ConfirmationDialog/confirmation-dialog-component';
import { Component, ViewChild, Input, ElementRef, Renderer } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { SettingsService, ConfigurationsService } from '@wa-motif-open-api/configuration-service';
import { ConfigurationRow } from '../data/model';
import { ComboBoxComponent } from '@progress/kendo-angular-dropdowns';
import * as FileSaver from 'file-saver';
import { WCEditService } from 'web-console-ui-kit';
import { GridComponent } from '@progress/kendo-angular-grid';
import { process } from '@progress/kendo-data-query';
import { map } from 'rxjs/operators/map';
import { FormBuilder } from '@angular/forms';
import { forkJoin } from 'rxjs/observable/forkJoin';
import { faFileImport, faDownload } from '@fortawesome/free-solid-svg-icons';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { NewConfigurationParamDialogComponent } from './dialog/new-configuration-param-dialog';
import { WCSubscriptionHandler } from '../../../components/Commons/wc-subscription-handler';
import * as _ from 'lodash';
import { dataTypesInfo } from './shared/shared';
import { MotifACLService } from 'web-console-motif-acl';
/** @type {?} */
var LOG_TAG = '[ConfigurationSection]';
var ConfigurationSectionComponent = /** @class */ (function () {
function ConfigurationSectionComponent(logger, motifACLService, settingsService, configurationService, editService, formBuilder, renderer, notificationCenter, elem) {
this.logger = logger;
this.motifACLService = motifACLService;
this.settingsService = settingsService;
this.configurationService = configurationService;
this.editService = editService;
this.formBuilder = formBuilder;
this.renderer = renderer;
this.notificationCenter = notificationCenter;
this.elem = elem;
this.faFileImport = faFileImport;
this.faDownload = faDownload;
this.typesInfo = dataTypesInfo;
this.gridState = {
sort: []
};
this.changes = {};
this.dropDownBooleanValues = [
'true',
'false'
];
// Data binding
this.loading = false;
// Buttons
this.canSave = false;
this.canRefresh = false;
this.canAddProperty = false;
// the combobox selection
this._editServiceConfig = { idField: 'name', dirtyField: 'dirty', isNewField: 'isNew' };
this._subHandler = new WCSubscriptionHandler();
this.editService.init();
this.logger.debug(LOG_TAG, 'Opening...');
}
/**
* Angular ngOnInit
*/
/**
* Angular ngOnInit
* @return {?}
*/
ConfigurationSectionComponent.prototype.ngOnInit = /**
* Angular ngOnInit
* @return {?}
*/
function () {
var _this = this;
this.logger.debug(LOG_TAG, 'Initializing...');
this.view = this.editService.pipe(map((/**
* @param {?} data
* @return {?}
*/
function (data) { return process(data, _this.gridState); })));
};
/**
* @return {?}
*/
ConfigurationSectionComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'ngOnDestroy ');
this.freeMem();
};
/**
* @return {?}
*/
ConfigurationSectionComponent.prototype.freeMem = /**
* @return {?}
*/
function () {
this.view = null;
this.editDataItem = null;
this._selectedService = null;
this._editServiceConfig = null;
this._subHandler.unsubscribe();
this._subHandler = null;
};
/**
* Triggered by the grid component
* @param state
*/
/**
* Triggered by the grid component
* @param {?} state
* @return {?}
*/
ConfigurationSectionComponent.prototype.onStateChange = /**
* Triggered by the grid component
* @param {?} state
* @return {?}
*/
function (state) {
this.gridState = state;
this.logger.debug(LOG_TAG, 'onStateChange: ', state);
};
/**
* Reload the list of parameters for a given service
* @param service
*/
/**
* Reload the list of parameters for a given service
* @private
* @param {?} service
* @return {?}
*/
ConfigurationSectionComponent.prototype.reloadConfigurationParamsForService = /**
* Reload the list of parameters for a given service
* @private
* @param {?} service
* @return {?}
*/
function (service) {
var _this = this;
this.logger.debug(LOG_TAG, 'Reloading paramters for service:', service);
if (service) {
this.loading = true;
this._subHandler.add(this.settingsService.getSettings(service.name).subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.logger.debug(LOG_TAG, 'reloadConfigurationParamsForService done: ', data);
_.forEach(data, (/**
* @param {?} item
* @return {?}
*/
function (item) {
switch (item.type) {
case 'java.lang.Short':
case 'java.lang.Integer':
case 'java.lang.Long':
case 'java.lang.Double':
case 'java.lang.Float':
item.value = Number(item.value);
break;
default:
break;
}
}));
_this.editService.cancelChanges();
_this.editService.read(data, _this._editServiceConfig);
_this.loading = false;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'reloadConfigurationParamsForService error: ', error);
_this.loading = false;
_this.notificationCenter.post({
name: 'LoadConfigurationError',
title: 'Load Configuration',
message: 'Error loading configuration settings:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
}
else {
this.editService.read([], this._editServiceConfig);
}
this.setOptions(true, true, true);
};
Object.defineProperty(ConfigurationSectionComponent.prototype, "selectedService", {
get: /**
* @return {?}
*/
function () {
return this._selectedService;
},
/**
* User selection from Combobox
*/
set: /**
* User selection from Combobox
* @param {?} service
* @return {?}
*/
function (service) {
this._selectedService = service;
this.reloadConfigurationParams();
if (service) {
this.setOptions(true, true, true);
}
else {
this.setOptions(false, false, false);
}
},
enumerable: true,
configurable: true
});
/**
* Reload current configuration for the current selected service
*/
/**
* Reload current configuration for the current selected service
* @private
* @return {?}
*/
ConfigurationSectionComponent.prototype.reloadConfigurationParams = /**
* Reload current configuration for the current selected service
* @private
* @return {?}
*/
function () {
return this.reloadConfigurationParamsForService(this._selectedService);
};
/**
* User selection on click
* triggered by the grid
* @param param0
*/
/**
* User selection on click
* triggered by the grid
* @param {?} __0
* @return {?}
*/
ConfigurationSectionComponent.prototype.cellClickHandler = /**
* User selection on click
* triggered by the grid
* @param {?} __0
* @return {?}
*/
function (_a) {
var sender = _a.sender, rowIndex = _a.rowIndex, columnIndex = _a.columnIndex, dataItem = _a.dataItem, isEdited = _a.isEdited;
if (!isEdited) {
sender.editCell(rowIndex, columnIndex, this.createFormGroupForEdit(dataItem));
}
};
/**
* triggered by the grid
*/
/**
* triggered by the grid
* @param {?} args
* @return {?}
*/
ConfigurationSectionComponent.prototype.cellCloseHandler = /**
* triggered by the grid
* @param {?} args
* @return {?}
*/
function (args) {
var formGroup = args.formGroup, dataItem = args.dataItem;
if (!formGroup.valid) {
// prevent closing the edited cell if there are invalid values.
args.preventDefault();
}
else if (formGroup.dirty) {
this.editService.assignValues(dataItem, formGroup.value);
this.editService.update(dataItem);
}
};
/**
* Prepare edit form for inline editing
*/
/**
* Prepare edit form for inline editing
* @param {?} dataItem
* @return {?}
*/
ConfigurationSectionComponent.prototype.createFormGroupForEdit = /**
* Prepare edit form for inline editing
* @param {?} dataItem
* @return {?}
*/
function (dataItem) {
this.logger.debug(LOG_TAG, 'createFormGroupForEdit:', dataItem.value);
return this.formBuilder.group({
'value': dataItem.value
});
};
/**
* Export current configuration
*/
/**
* Export current configuration
* @private
* @return {?}
*/
ConfigurationSectionComponent.prototype.exportConfigurationFile = /**
* Export current configuration
* @private
* @return {?}
*/
function () {
var _this = this;
this._subHandler.add(this.configurationService.downloadXml().subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.logger.debug(LOG_TAG, 'Export done:', data);
/** @type {?} */
var fileName = 'motif_configuration_' + new Date().getTime() + '.xml';
FileSaver.saveAs(data, fileName);
_this.logger.debug(LOG_TAG, 'Configuration saved: ', fileName);
_this.notificationCenter.post({
name: 'ConfigurationExportSuccess',
title: 'Configuration Export',
message: 'The configuration has been exported successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Export error:', error);
_this.notificationCenter.post({
name: 'ConfigurationExportError',
title: 'Export Configuration',
message: 'Error exporting configuration:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* Event emitted by the editor form
*/
/**
* Event emitted by the editor form
* @return {?}
*/
ConfigurationSectionComponent.prototype.onEditCancel = /**
* Event emitted by the editor form
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'On Edit Cancelled');
this.editDataItem = undefined;
};
/**
* Button event
*/
/**
* Button event
* @return {?}
*/
ConfigurationSectionComponent.prototype.onRefreshClicked = /**
* Button event
* @return {?}
*/
function () {
if (this.editService.hasChanges()) {
this.confirmationDialog.open('Pending Changes',
// tslint:disable-next-line:max-line-length
'Attention, in the configuration there are unsaved changes. Proceeding with the refresh these changes will be lost. Do you want to continue?', { 'action': 'refresh' });
}
else {
this.reloadConfigurationParams();
}
};
/**
* Button event
*/
/**
* Button event
* @return {?}
*/
ConfigurationSectionComponent.prototype.onSaveClicked = /**
* Button event
* @return {?}
*/
function () {
var _this = this;
this.logger.debug(LOG_TAG, 'Save clicked');
this._subHandler.add(this.saveAllChanges().subscribe((/**
* @param {?} responses
* @return {?}
*/
function (responses) {
_this.reloadConfigurationParams();
_this.logger.debug(LOG_TAG, 'Settings saved successfully: ', responses);
_this.notificationCenter.post({
name: 'SettingsSaveSuccess',
title: 'Settings Save',
message: 'The configuration settings have been saved correctly',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.debug(LOG_TAG, 'Error saving settings: ', error);
_this.notificationCenter.post({
name: 'SettingsSaveError',
title: 'Configuration Save',
message: 'Error saving configuration settings:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* Save all pending chenges remotely
*/
/**
* Save all pending chenges remotely
* @private
* @return {?}
*/
ConfigurationSectionComponent.prototype.saveAllChanges = /**
* Save all pending chenges remotely
* @private
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'Saving all changes...');
/** @type {?} */
var itemsToAdd = this.editService.createdItems;
/** @type {?} */
var itemsToUpdate = this.editService.updatedItems;
/** @type {?} */
var itemsToRemove = this.editService.deletedItems;
/** @type {?} */
var responses = [];
/** @type {?} */
var i = 0;
// Add new
for (i = 0; i < itemsToAdd.length; i++) {
/** @type {?} */
var settingCreate = {
name: itemsToAdd[i].name,
crypted: itemsToAdd[i].crypted,
dynamic: itemsToAdd[i].dynamic,
type: itemsToAdd[i].type,
value: itemsToAdd[i].value
};
/** @type {?} */
var response = this.settingsService.createSetting(this.selectedService.name, settingCreate);
responses.push(response);
}
// Update existing
for (i = 0; i < itemsToUpdate.length; i++) {
/** @type {?} */
var settingName = itemsToUpdate[i].name;
/** @type {?} */
var settingUpdate = {
crypted: itemsToUpdate[i].crypted,
dynamic: itemsToUpdate[i].dynamic,
type: itemsToUpdate[i].type,
value: itemsToUpdate[i].value
};
/** @type {?} */
var response = this.settingsService.updateSetting(this.selectedService.name, settingName, settingUpdate);
responses.push(response);
}
// Delete existing
for (i = 0; i < itemsToRemove.length; i++) {
/** @type {?} */
var settingName = itemsToRemove[i].name;
/** @type {?} */
var response = this.settingsService.deleteSetting(this.selectedService.name, settingName);
responses.push(response);
}
this.logger.debug(LOG_TAG, 'Waiting for all changes commit.');
return forkJoin(responses);
};
/**
* Button Event
*/
/**
* Button Event
* @return {?}
*/
ConfigurationSectionComponent.prototype.onDiscardClicked = /**
* Button Event
* @return {?}
*/
function () {
if (this.editService.hasChanges()) {
this.confirmationDialog.open('Pending Changes',
// tslint:disable-next-line:max-line-length
'Attention, in the configuration there are unsaved changes. If you proceed all these changes will be lost.\n\nDo you want to continue?', { 'action': 'discardChanges' });
}
else {
this.reloadConfigurationParams();
}
};
/**
* Button event
*/
/**
* Button event
* @return {?}
*/
ConfigurationSectionComponent.prototype.onExportClicked = /**
* Button event
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'Export clicked');
this.exportConfigurationFile();
};
/**
* Button event
*/
/**
* Button event
* @return {?}
*/
ConfigurationSectionComponent.prototype.onImportClicked = /**
* Button event
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'Import clicked:', this.xmlFileImportEl);
// trigger mouse click
/** @type {?} */
var event = new MouseEvent('click', { bubbles: true });
this.renderer.invokeElementMethod(this.xmlFileImportEl.nativeElement, 'dispatchEvent', [event]);
};
/**
* Button event
*/
/**
* Button event
* @return {?}
*/
ConfigurationSectionComponent.prototype.onAddPropertyClicked = /**
* Button event
* @return {?}
*/
function () {
// display new item dialog
this.propertyEditorDialog.show();
};
/**
* Event emitted by the confirmation dialog
* @param userData
*/
/**
* Event emitted by the confirmation dialog
* @param {?} userData
* @return {?}
*/
ConfigurationSectionComponent.prototype.onConfirmationCancel = /**
* Event emitted by the confirmation dialog
* @param {?} userData
* @return {?}
*/
function (userData) {
this.logger.debug(LOG_TAG, 'onConfirmationCancel for:', userData);
};
/**
* Event emitted by the confirmation dialog
* @param userData
*/
/**
* Event emitted by the confirmation dialog
* @param {?} userData
* @return {?}
*/
ConfigurationSectionComponent.prototype.onConfirmationOK = /**
* Event emitted by the confirmation dialog
* @param {?} userData
* @return {?}
*/
function (userData) {
this.logger.debug(LOG_TAG, 'onConfirmationOK for:', userData);
if (userData && userData.action === 'refresh') {
this.reloadConfigurationParams();
}
if (userData && userData.action === 'discardChanges') {
this.editService.cancelChanges();
}
};
/**
* Triggered by the new Property Editor Dialog
* @param event
*/
/**
* Triggered by the new Property Editor Dialog
* @param {?} newConfigurationRow
* @return {?}
*/
ConfigurationSectionComponent.prototype.onEditCommit = /**
* Triggered by the new Property Editor Dialog
* @param {?} newConfigurationRow
* @return {?}
*/
function (newConfigurationRow) {
this.logger.debug(LOG_TAG, 'onEditCommit new row:', newConfigurationRow);
this.editService.create(newConfigurationRow);
};
/**
* Enable or disable buttons
*/
/**
* Enable or disable buttons
* @private
* @param {?} canSave
* @param {?} canRefresh
* @param {?} canAddProperty
* @return {?}
*/
ConfigurationSectionComponent.prototype.setOptions = /**
* Enable or disable buttons
* @private
* @param {?} canSave
* @param {?} canRefresh
* @param {?} canAddProperty
* @return {?}
*/
function (canSave, canRefresh, canAddProperty) {
var _this = this;
this.canRefresh = canRefresh;
this._subHandler.add(forkJoin(this.motifACLService.can('com.vipera.osgi.core.config.service.api.rest.CfgApi:UPDATE:updateSetting'), this.motifACLService.can('com.vipera.osgi.core.config.service.api.rest.CfgApi:CREATE:createSetting'))
.subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
_this.canSave = canSave && canDoIt[0];
_this.canAddProperty = canAddProperty && canDoIt[1];
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'cannot retrieve permissions: ', error);
})));
};
/**
* Triggered by the grid delete button
* @param dataItem
*/
/**
* Triggered by the grid delete button
* @param {?} dataItem
* @return {?}
*/
ConfigurationSectionComponent.prototype.onDeleteOKPressed = /**
* Triggered by the grid delete button
* @param {?} dataItem
* @return {?}
*/
function (dataItem) {
this.logger.debug(LOG_TAG, 'onDeleteOKPressed for item: ', dataItem);
this.editService.remove(dataItem);
};
/**
* Triggered by the input tag
* @param event
*/
/**
* Triggered by the input tag
* @param {?} event
* @return {?}
*/
ConfigurationSectionComponent.prototype.onUploadFileSelected = /**
* Triggered by the input tag
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
/** @type {?} */
var reader = new FileReader();
if (event.target.files && event.target.files.length > 0) {
/** @type {?} */
var file = event.target.files[0];
reader.onloadend = (/**
* @return {?}
*/
function () {
_this.uploadConfiguration(reader.result);
});
reader.onerror = (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'onUploadFileSelected error: ', error);
_this.notificationCenter.post({
name: 'ReadingConfigurationError',
title: 'Configuration Upload',
message: 'Error reading configuration file:',
type: NotificationType.Error,
error: error,
closable: true
});
});
reader.readAsText(file);
}
};
/**
* Upload the blob file to server
* @param blob
*/
/**
* Upload the blob file to server
* @param {?} blob
* @return {?}
*/
ConfigurationSectionComponent.prototype.uploadConfiguration = /**
* Upload the blob file to server
* @param {?} blob
* @return {?}
*/
function (blob) {
var _this = this;
this.notificationCenter.post({
name: 'ConfigurationUpload',
title: 'Configuration Upload',
message: 'Uploading configuration...',
type: NotificationType.Info
});
this._subHandler.add(this.configurationService.uploadXml(blob, false).subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.logger.info(LOG_TAG, 'Import xml done:', data);
_this.notificationCenter.post({
name: 'ConfigurationUploadSuccess',
title: 'Configuration Upload',
message: 'The configuration has been successfully uloaded.',
type: NotificationType.Success
});
_this.reloadConfigurationParams();
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Import xml configuration error:', error);
_this.notificationCenter.post({
name: 'ConfigurationUploadError',
title: 'Configuration Upload',
message: 'Error uploading configuration:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @param {?} dialogResult
* @return {?}
*/
ConfigurationSectionComponent.prototype.onAddNewPropertyConfirmed = /**
* @param {?} dialogResult
* @return {?}
*/
function (dialogResult) {
/** @type {?} */
var newConfigurationRow = new ConfigurationRow();
newConfigurationRow.name = dialogResult.name;
newConfigurationRow.crypted = dialogResult.encrypted;
newConfigurationRow.isNew = true;
newConfigurationRow.dynamic = dialogResult.dynamic;
newConfigurationRow.type = dialogResult.type;
newConfigurationRow.value = dialogResult.value;
this.onEditCommit(newConfigurationRow);
};
ConfigurationSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'wa-configuration-section',
template: "<wc-loading-overlay [visible]='loading'></wc-loading-overlay>\n\n<wc-dashboard-header [title]=\"'Configuration'\"></wc-dashboard-header>\n\n<wc-confirmation-dialog (cancel)=\"onConfirmationCancel($event)\" (confirm)=\"onConfirmationOK($event)\"></wc-confirmation-dialog>\n\n<input type=\"file\" id=\"xmlFileImport\" name=\"xmlFileImport\" accept=\"application/xml\" (input)=\"onUploadFileSelected($event)\" #xmlFileImport>\n\n<div class=\"row spread\">\n\n <div class=\"flex-toolbar\" style=\"display:flex;align-items: center;\">\n <div style=\"margin-right:10px;width:60%;max-width: 400px;min-width: 250px;\">\n <label>Service</label>\n <wc-services-selector-combobox [(ngModel)]=\"selectedService\"></wc-services-selector-combobox>\n </div>\n \n <div>\n <label> </label>\n <kendo-buttongroup look=\"flat\">\n <button kendoButton [toggleable]=\"false\" [icon]=\"'save'\" (click)=\"onSaveClicked()\" [disabled]=\"!editService.hasChanges() || !canSave\">Save</button>\n <button kendoButton [toggleable]=\"false\" [icon]=\"'track-changes-reject'\" (click)=\"onDiscardClicked()\" [disabled]=\"!editService.hasChanges()\">Discard Changes</button>\n <button kendoButton [toggleable]=\"false\" [icon]=\"'filter-add-expression'\" (click)=\"onAddPropertyClicked()\" [disabled]=\"!canAddProperty\">Add Property</button>\n </kendo-buttongroup>\n </div>\n </div>\n\n <div class=\"flex-cmd\">\n <kendo-buttongroup look=\"flat\">\n <button kendoButton \n motif-acl=\"com.vipera.osgi.core.config.service.api.rest.CfgApi:READ:downloadXml\"\n [toggleable]=\"false\" (click)=\"onExportClicked()\"><fa-icon [icon]=\"faDownload\"></fa-icon>Export</button>\n <button kendoButton \n motif-acl=\"com.vipera.osgi.core.config.service.api.rest.CfgApi:UPDATE:uploadXml\"\n kendofileselect tyle=\"file\" [toggleable]=\"false\" (click)=\"onImportClicked()\"><fa-icon [icon]=\"faFileImport\"></fa-icon>Import</button>\n <button kendoButton [toggleable]=\"false\" [icon]=\"'refresh'\" (click)=\"onRefreshClicked()\" [disabled]=\"!canRefresh\">Refresh</button>\n </kendo-buttongroup>\n </div>\n\n</div>\n\n<div class=\"row fill\">\n\n <kendo-grid #datagrid [data]=\"view | async\" \n (cellClick)=\"cellClickHandler($event)\"\n (cellClose)=\"cellCloseHandler($event)\"\n (dataStateChange)=\"onStateChange($event)\"\n (cellClose)=\"cellCloseHandler($event)\"\n [navigable]=\"true\"> \n\n <kendo-grid-column\n field=\"name\" title=\"Name\" width=\"360\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <label class=\"k-icon grid-cell-dirty grid-cell-dirty-{{dataItem.dirty}}\"></label>\n {{dataItem.name}}\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"value\" title=\"Value\" >\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <input *ngIf=\"dataItem.type==='java.lang.String'\" class=\"k-textbox\" [formControl]=\"formGroup.get('value')\">\n <kendo-numerictextbox *ngIf=\"dataItem.type==='java.lang.Short' || dataItem.type==='java.lang.Integer' || \n dataItem.type==='java.lang.Long' || dataItem.type==='java.lang.Float' || dataItem.type==='java.lang.Double'\" \n [format]=\"typesInfo[dataItem.type].format\" \n [decimals]=\"typesInfo[dataItem.type].decimals\" \n [value]=\"dataItem.value\" \n [formControl]=\"formGroup.get('value')\"></kendo-numerictextbox>\n <kendo-dropdownlist *ngIf=\"dataItem.type==='java.lang.Boolean'\" \n [data]=\"dropDownBooleanValues\"\n [formControl]=\"formGroup.get('value')\"></kendo-dropdownlist>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"type\" title=\"Type\" width=\"150\">\n </kendo-grid-column>\n <kendo-grid-column\n media=\"(min-width: 80px)\"\n title=\"Dynamic\" width=\"80\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <label class=\"k-icon grid-cell-checkbox grid-cell-checkbox-{{dataItem.dynamic}}\"></label>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column\n media=\"(min-width: 80px)\"\n title=\"Crypted\" width=\"80\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <label class=\"k-icon grid-cell-checkbox grid-cell-checkbox-{{dataItem.crypted}}\"></label>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column title=\"\" width=\"150\" minResizableWidth=\"140\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <wc-grid-editor-command\n motif-acl=\"com.vipera.osgi.core.config.service.api.rest.CfgApi:DELETE:deleteSetting\"\n motif-acl-hidden=\"true\"\n [alignMode]=\"'end'\"\n [hasConfirmation]=\"true\"\n [confirmationTitle]=\"'Delete ?'\"\n [rowIndex]=\"rowIndex\" \n [columnIndex]=\"columnIndex\" \n [column]=\"column\" \n [commandIcon]=\"'wa-ico-no'\"\n [dataItem]=\"dataItem\"\n (commandConfirm)=\"onDeleteOKPressed(dataItem)\" \n >\n </wc-grid-editor-command>\n </ng-template>\n </kendo-grid-column>\n\n </kendo-grid>\n\n <wa-configuration-section-new-config-param-dialog #newPropertyDialog (confirm)=\"onAddNewPropertyConfirmed($event)\"></wa-configuration-section-new-config-param-dialog>\n\n\n</div>\n",
styles: [":host{display:flex;flex:1;flex-direction:column}:host ::ng-deep .grid-btn-editor.wc-table-delete-command{justify-content:center}"]
}] }
];
/** @nocollapse */
ConfigurationSectionComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: MotifACLService },
{ type: SettingsService },
{ type: ConfigurationsService },
{ type: WCEditService },
{ type: FormBuilder },
{ type: Renderer },
{ type: WCNotificationCenter },
{ type: ElementRef }
]; };
ConfigurationSectionComponent.propDecorators = {
confirmationDialog: [{ type: ViewChild, args: [ConfirmationDialogComponent,] }],
servicesComboBox: [{ type: ViewChild, args: [ComboBoxComponent,] }],
grid: [{ type: ViewChild, args: ['datagrid',] }],
propertyEditorDialog: [{ type: ViewChild, args: ['newPropertyDialog',] }],
xmlFileImportEl: [{ type: ViewChild, args: ['xmlFileImport',] }],
selectedService: [{ type: Input }]
};
ConfigurationSectionComponent = tslib_1.__decorate([
PluginView('Configuration', {
iconName: 'wa-ico-configuration',
userData: {
acl: {
permissions: ["com.vipera.osgi.core.config.service.api.rest.CfgApi:READ:getServices",
"com.vipera.osgi.core.config.service.api.rest.CfgApi:READ:getSettings"]
}
}
}),
tslib_1.__metadata("design:paramtypes", [NGXLogger,
MotifACLService,
SettingsService,
ConfigurationsService,
WCEditService,
FormBuilder,
Renderer,
WCNotificationCenter,
ElementRef])
], ConfigurationSectionComponent);
return ConfigurationSectionComponent;
}());
export { ConfigurationSectionComponent };
if (false) {
/** @type {?} */
ConfigurationSectionComponent.prototype.faFileImport;
/** @type {?} */
ConfigurationSectionComponent.prototype.faDownload;
/** @type {?} */
ConfigurationSectionComponent.prototype.typesInfo;
/** @type {?} */
ConfigurationSectionComponent.prototype.view;
/** @type {?} */
ConfigurationSectionComponent.prototype.gridState;
/** @type {?} */
ConfigurationSectionComponent.prototype.changes;
/** @type {?} */
ConfigurationSectionComponent.prototype.dropDownBooleanValues;
/** @type {?} */
ConfigurationSectionComponent.prototype.loading;
/** @type {?} */
ConfigurationSectionComponent.prototype.editDataItem;
/** @type {?} */
ConfigurationSectionComponent.prototype.confirmationDialog;
/** @type {?} */
ConfigurationSectionComponent.prototype.servicesComboBox;
/** @type {?} */
ConfigurationSectionComponent.prototype.grid;
/** @type {?} */
ConfigurationSectionComponent.prototype.propertyEditorDialog;
/** @type {?} */
ConfigurationSectionComponent.prototype.xmlFileImportEl;
/** @type {?} */
ConfigurationSectionComponent.prototype.canSave;
/** @type {?} */
ConfigurationSectionComponent.prototype.canRefresh;
/** @type {?} */
ConfigurationSectionComponent.prototype.canAddProperty;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype._selectedService;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype._editServiceConfig;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype._subHandler;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.logger;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.motifACLService;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.settingsService;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.configurationService;
/** @type {?} */
ConfigurationSectionComponent.prototype.editService;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.formBuilder;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.notificationCenter;
/**
* @type {?}
* @private
*/
ConfigurationSectionComponent.prototype.elem;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1zZWN0aW9uLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vdGlmLXdlYi1hZG1pbi1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlY3Rpb25zL0NvbmZpZ3VyYXRpb24vY29tcG9uZW50cy9jb25maWd1cmF0aW9uLXNlY3Rpb24tY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDbkgsT0FBTyxFQUFFLFNBQVMsRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoSSxPQUFPLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQThCLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLGFBQWEsRUFBa0IsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQVMsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVB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SUFHeEQsZ0RBQXVCOztJQUN2QixtREFBMEI7O0lBQzFCLHVEQUE4Qjs7Ozs7SUFHOUIseURBQXVDOzs7OztJQUN2QywyREFBdUg7Ozs7O0lBQ3ZILG9EQUF5RTs7Ozs7SUFFN0QsK0NBQXlCOzs7OztJQUNqQyx3REFBd0M7Ozs7O0lBQ3hDLHdEQUF3Qzs7Ozs7SUFDeEMsNkRBQW1EOztJQUNuRCxvREFBaUM7Ozs7O0lBQ2pDLG9EQUFnQzs7Ozs7SUFDaEMsaURBQTBCOzs7OztJQUMxQiwyREFBZ0Q7Ozs7O0lBQ2hELDZDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvQ29uZmlybWF0aW9uRGlhbG9nL2NvbmZpcm1hdGlvbi1kaWFsb2ctY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgSW5wdXQsIEVsZW1lbnRSZWYsIFJlbmRlcmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbHVnaW5WaWV3IH0gZnJvbSAnd2ViLWNvbnNvbGUtY29yZSc7XG5pbXBvcnQgeyBOR1hMb2dnZXJ9IGZyb20gJ3dlYi1jb25zb2xlLWNvcmUnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlLCBDb25maWd1cmF0aW9uc1NlcnZpY2UsIFNldHRpbmdVcGRhdGUsIFNldHRpbmdDcmVhdGUgfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvY29uZmlndXJhdGlvbi1zZXJ2aWNlJztcbmltcG9ydCB7IE1vdGlmU2VydmljZSwgQ29uZmlndXJhdGlvblJvdyB9IGZyb20gJy4uL2RhdGEvbW9kZWwnO1xuaW1wb3J0IHsgQ29tYm9Cb3hDb21wb25lbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnMnO1xuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgV0NFZGl0U2VydmljZSwgV0NFZGl0U2VydmljZUNvbmZpZ3VyYXRpb24gfSBmcm9tICd3ZWItY29uc29sZS11aS1raXQnO1xuaW1wb3J0IHsgR3JpZENvbXBvbmVudCwgR3JpZERhdGFSZXN1bHQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcbmltcG9ydCB7IFN0YXRlLCBwcm9jZXNzIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWRhdGEtcXVlcnknO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMvbWFwJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmltcG9ydCB7IGZvcmtKb2luIH0gZnJvbSAncnhqcy9vYnNlcnZhYmxlL2ZvcmtKb2luJztcbmltcG9ydCB7IGZhRmlsZUltcG9ydCwgZmFEb3dubG9hZCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBXQ05vdGlmaWNhdGlvbkNlbnRlciwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJ3dlYi1jb25zb2xlLXVpLWtpdCc7XG5pbXBvcnQgeyBOZXdDb25maWd1cmF0aW9uUGFyYW1EaWFsb2dDb21wb25lbnQsIE5ld1BhcmFtRGlhbG9nUmVzdWx0IH0gZnJvbSAnLi9kaWFsb2cvbmV3LWNvbmZpZ3VyYXRpb24tcGFyYW0tZGlhbG9nJztcbmltcG9ydCB7IFdDU3Vic2NyaXB0aW9uSGFuZGxlciB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvQ29tbW9ucy93Yy1zdWJzY3JpcHRpb24taGFuZGxlcic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBkYXRhVHlwZXNJbmZvIH0gZnJvbSAnLi9zaGFyZWQvc2hhcmVkJztcbmltcG9ydCB7IE1vdGlmQUNMU2VydmljZSB9IGZyb20gJ3dlYi1jb25zb2xlLW1vdGlmLWFjbCc7XG5cbmNvbnN0IExPR19UQUcgPSAnW0NvbmZpZ3VyYXRpb25TZWN0aW9uXSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnd2EtY29uZmlndXJhdGlvbi1zZWN0aW9uJyxcbiAgICBzdHlsZVVybHM6IFsgJy4vY29uZmlndXJhdGlvbi1zZWN0aW9uLmNvbXBvbmVudC5zY3NzJyBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb25maWd1cmF0aW9uLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwnXG4gIH0pXG4gIEBQbHVnaW5WaWV3KCdDb25maWd1cmF0aW9uJywge1xuICAgIGljb25OYW1lOiAnd2EtaWNvLWNvbmZpZ3VyYXRpb24nLFxuICAgIHVzZXJEYXRhOiB7XG4gICAgICAgIGFjbDoge1xuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFtcImNvbS52aXBlcmEub3NnaS5jb3JlLmNvbmZpZy5zZXJ2aWNlLmFwaS5yZXN0LkNmZ0FwaTpSRUFEOmdldFNlcnZpY2VzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb20udmlwZXJhLm9zZ2kuY29yZS5jb25maWcuc2VydmljZS5hcGkucmVzdC5DZmdBcGk6UkVBRDpnZXRTZXR0aW5nc1wiXVxuICAgICAgICB9XG4gICAgfVxuICB9KVxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25TZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgZmFGaWxlSW1wb3J0ID0gZmFGaWxlSW1wb3J0O1xuICAgIGZhRG93bmxvYWQgPSBmYURvd25sb2FkO1xuICAgIHR5cGVzSW5mbyA9IGRhdGFUeXBlc0luZm87XG5cbiAgICBwdWJsaWMgdmlldzogT2JzZXJ2YWJsZTxHcmlkRGF0YVJlc3VsdD47XG4gICAgcHVibGljIGdyaWRTdGF0ZTogU3RhdGUgPSB7XG4gICAgICAgIHNvcnQ6IFtdXG4gICAgfTtcbiAgICBwdWJsaWMgY2hhbmdlczogYW55ID0ge307XG5cbiAgICBwdWJsaWMgZHJvcERvd25Cb29sZWFuVmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgICAgICAndHJ1ZScsXG4gICAgICAgICdmYWxzZSdcbiAgICBdO1xuXG4gICAgLy8gRGF0YSBiaW5kaW5nXG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZWRpdERhdGFJdGVtOiBDb25maWd1cmF0aW9uUm93O1xuXG4gICAgQFZpZXdDaGlsZChDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQpIGNvbmZpcm1hdGlvbkRpYWxvZzogQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoQ29tYm9Cb3hDb21wb25lbnQpIHNlcnZpY2VzQ29tYm9Cb3g6IENvbWJvQm94Q29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2RhdGFncmlkJykgZ3JpZDogR3JpZENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCduZXdQcm9wZXJ0eURpYWxvZycpIHByb3BlcnR5RWRpdG9yRGlhbG9nOiBOZXdDb25maWd1cmF0aW9uUGFyYW1EaWFsb2dDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgneG1sRmlsZUltcG9ydCcpIHhtbEZpbGVJbXBvcnRFbDogRWxlbWVudFJlZjtcblxuICAgIC8vIEJ1dHRvbnNcbiAgICBwdWJsaWMgY2FuU2F2ZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBjYW5SZWZyZXNoID0gZmFsc2U7XG4gICAgcHVibGljIGNhbkFkZFByb3BlcnR5ID0gZmFsc2U7XG5cbiAgICAvLyBpbnRlcm5hbFxuICAgIHByaXZhdGUgX3NlbGVjdGVkU2VydmljZTogTW90aWZTZXJ2aWNlOyAvLyB0aGUgY29tYm9ib3ggc2VsZWN0aW9uXG4gICAgcHJpdmF0ZSBfZWRpdFNlcnZpY2VDb25maWc6IFdDRWRpdFNlcnZpY2VDb25maWd1cmF0aW9uID0geyBpZEZpZWxkOiAnbmFtZScgLCBkaXJ0eUZpZWxkOiAnZGlydHknLCBpc05ld0ZpZWxkOiAnaXNOZXcnfTtcbiAgICBwcml2YXRlIF9zdWJIYW5kbGVyOiBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgPSBuZXcgV0NTdWJzY3JpcHRpb25IYW5kbGVyKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgICAgICBwcml2YXRlIG1vdGlmQUNMU2VydmljZTogTW90aWZBQ0xTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBlZGl0U2VydmljZTogV0NFZGl0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyLFxuICAgICAgICBwcml2YXRlIG5vdGlmaWNhdGlvbkNlbnRlcjogV0NOb3RpZmljYXRpb25DZW50ZXIsXG4gICAgICAgIHByaXZhdGUgZWxlbTogRWxlbWVudFJlZikge1xuICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS5pbml0KCk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ09wZW5pbmcuLi4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbmd1bGFyIG5nT25Jbml0XG4gICAgICovXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnSW5pdGlhbGl6aW5nLi4uJyk7XG4gICAgICAgIHRoaXMudmlldyA9IHRoaXMuZWRpdFNlcnZpY2UucGlwZShtYXAoZGF0YSA9PiBwcm9jZXNzKGRhdGEsIHRoaXMuZ3JpZFN0YXRlKSkpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ25nT25EZXN0cm95ICcpO1xuICAgICAgICB0aGlzLmZyZWVNZW0oKTtcbiAgICB9XG5cbiAgICBmcmVlTWVtKCkge1xuICAgICAgICB0aGlzLnZpZXcgPSBudWxsO1xuICAgICAgICB0aGlzLmVkaXREYXRhSXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU2VydmljZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2VkaXRTZXJ2aWNlQ29uZmlnID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlci51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYnkgdGhlIGdyaWQgY29tcG9uZW50XG4gICAgICogQHBhcmFtIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIG9uU3RhdGVDaGFuZ2Uoc3RhdGU6IFN0YXRlKSB7XG4gICAgICAgIHRoaXMuZ3JpZFN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25TdGF0ZUNoYW5nZTogJywgc3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gc2VydmljZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVsb2FkQ29uZmlndXJhdGlvblBhcmFtc0ZvclNlcnZpY2Uoc2VydmljZTogTW90aWZTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdSZWxvYWRpbmcgcGFyYW10ZXJzIGZvciBzZXJ2aWNlOicsIHNlcnZpY2UpO1xuICAgICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuc2V0dGluZ3NTZXJ2aWNlLmdldFNldHRpbmdzKHNlcnZpY2UubmFtZSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdyZWxvYWRDb25maWd1cmF0aW9uUGFyYW1zRm9yU2VydmljZSBkb25lOiAnLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goZGF0YSwgaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdqYXZhLmxhbmcuU2hvcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnamF2YS5sYW5nLkludGVnZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnamF2YS5sYW5nLkxvbmcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnamF2YS5sYW5nLkRvdWJsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdqYXZhLmxhbmcuRmxvYXQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSBOdW1iZXIoaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS5jYW5jZWxDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS5yZWFkKGRhdGEsIHRoaXMuX2VkaXRTZXJ2aWNlQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcgLCAncmVsb2FkQ29uZmlndXJhdGlvblBhcmFtc0ZvclNlcnZpY2UgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnTG9hZENvbmZpZ3VyYXRpb25FcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnTG9hZCBDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGxvYWRpbmcgY29uZmlndXJhdGlvbiBzZXR0aW5nczonLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdFNlcnZpY2UucmVhZChbXSwgdGhpcy5fZWRpdFNlcnZpY2VDb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyh0cnVlLCB0cnVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VyIHNlbGVjdGlvbiBmcm9tIENvbWJvYm94XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkU2VydmljZShzZXJ2aWNlOiBNb3RpZlNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uUGFyYW1zKCk7XG4gICAgICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLnNldE9wdGlvbnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldE9wdGlvbnMoZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkU2VydmljZSgpOiBNb3RpZlNlcnZpY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZCBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IHNlbGVjdGVkIHNlcnZpY2VcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbG9hZENvbmZpZ3VyYXRpb25QYXJhbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb25QYXJhbXNGb3JTZXJ2aWNlKHRoaXMuX3NlbGVjdGVkU2VydmljZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlciBzZWxlY3Rpb24gb24gY2xpY2tcbiAgICAgKiB0cmlnZ2VyZWQgYnkgdGhlIGdyaWRcbiAgICAgKiBAcGFyYW0gcGFyYW0wXG4gICAgICovXG4gICAgcHVibGljIGNlbGxDbGlja0hhbmRsZXIoeyBzZW5kZXIsIHJvd0luZGV4LCBjb2x1bW5JbmRleCwgZGF0YUl0ZW0sIGlzRWRpdGVkIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0VkaXRlZCkge1xuICAgICAgICAgICAgc2VuZGVyLmVkaXRDZWxsKHJvd0luZGV4LCBjb2x1bW5JbmRleCwgdGhpcy5jcmVhdGVGb3JtR3JvdXBGb3JFZGl0KGRhdGFJdGVtKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0cmlnZ2VyZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2VsbENsb3NlSGFuZGxlcihhcmdzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgeyBmb3JtR3JvdXAsIGRhdGFJdGVtIH0gPSBhcmdzO1xuICAgICAgICBpZiAoIWZvcm1Hcm91cC52YWxpZCkge1xuICAgICAgICAgICAgIC8vIHByZXZlbnQgY2xvc2luZyB0aGUgZWRpdGVkIGNlbGwgaWYgdGhlcmUgYXJlIGludmFsaWQgdmFsdWVzLlxuICAgICAgICAgICAgYXJncy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1Hcm91cC5kaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS5hc3NpZ25WYWx1ZXMoZGF0YUl0ZW0sIGZvcm1Hcm91cC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRTZXJ2aWNlLnVwZGF0ZShkYXRhSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIGVkaXQgZm9ybSBmb3IgaW5saW5lIGVkaXRpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRm9ybUdyb3VwRm9yRWRpdChkYXRhSXRlbTogQ29uZmlndXJhdGlvblJvdyk6IEZvcm1Hcm91cCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdjcmVhdGVGb3JtR3JvdXBGb3JFZGl0OicsIGRhdGFJdGVtLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgJ3ZhbHVlJzogZGF0YUl0ZW0udmFsdWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3J0IGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHByaXZhdGUgZXhwb3J0Q29uZmlndXJhdGlvbkZpbGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZG93bmxvYWRYbWwoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnRXhwb3J0IGRvbmU6JywgZGF0YSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gJ21vdGlmX2NvbmZpZ3VyYXRpb25fJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgJy54bWwnO1xuICAgICAgICAgICAgRmlsZVNhdmVyLnNhdmVBcyhkYXRhLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ0NvbmZpZ3VyYXRpb24gc2F2ZWQ6ICcsIGZpbGVOYW1lKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyYXRpb25FeHBvcnRTdWNjZXNzJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NvbmZpZ3VyYXRpb24gRXhwb3J0JyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gZXhwb3J0ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRyAsICdFeHBvcnQgZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29uZmlndXJhdGlvbkV4cG9ydEVycm9yJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0V4cG9ydCBDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgZXhwb3J0aW5nIGNvbmZpZ3VyYXRpb246JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBlbWl0dGVkIGJ5IHRoZSBlZGl0b3IgZm9ybVxuICAgICAqL1xuICAgIG9uRWRpdENhbmNlbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdPbiBFZGl0IENhbmNlbGxlZCcpO1xuICAgICAgICB0aGlzLmVkaXREYXRhSXRlbSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdXR0b24gZXZlbnRcbiAgICAgKi9cbiAgICBvblJlZnJlc2hDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5lZGl0U2VydmljZS5oYXNDaGFuZ2VzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybWF0aW9uRGlhbG9nLm9wZW4oJ1BlbmRpbmcgQ2hhbmdlcycsXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgICdBdHRlbnRpb24sIGluIHRoZSBjb25maWd1cmF0aW9uIHRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMuIFByb2NlZWRpbmcgd2l0aCB0aGUgcmVmcmVzaCB0aGVzZSBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gRG8geW91IHdhbnQgdG8gY29udGludWU/JyxcbiAgICAgICAgICAgICAgICB7ICdhY3Rpb24nIDogJ3JlZnJlc2gnIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uUGFyYW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdXR0b24gZXZlbnRcbiAgICAgKi9cbiAgICBvblNhdmVDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ1NhdmUgY2xpY2tlZCcpO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLnNhdmVBbGxDaGFuZ2VzKCkuc3Vic2NyaWJlKChyZXNwb25zZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvblBhcmFtcygpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ1NldHRpbmdzIHNhdmVkIHN1Y2Nlc3NmdWxseTogJywgcmVzcG9uc2VzKTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NldHRpbmdzU2F2ZVN1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnU2V0dGluZ3MgU2F2ZScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGhhdmUgYmVlbiBzYXZlZCBjb3JyZWN0bHknLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ0Vycm9yIHNhdmluZyBzZXR0aW5nczogJywgZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2V0dGluZ3NTYXZlRXJyb3InLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdGlvbiBTYXZlJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3Igc2F2aW5nIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3M6JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmUgYWxsIHBlbmRpbmcgY2hlbmdlcyByZW1vdGVseVxuICAgICAqL1xuICAgIHByaXZhdGUgc2F2ZUFsbENoYW5nZXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnU2F2aW5nIGFsbCBjaGFuZ2VzLi4uJyk7XG5cbiAgICAgICAgY29uc3QgaXRlbXNUb0FkZCA9IHRoaXMuZWRpdFNlcnZpY2UuY3JlYXRlZEl0ZW1zO1xuICAgICAgICBjb25zdCBpdGVtc1RvVXBkYXRlID0gdGhpcy5lZGl0U2VydmljZS51cGRhdGVkSXRlbXM7XG4gICAgICAgIGNvbnN0IGl0ZW1zVG9SZW1vdmUgPSB0aGlzLmVkaXRTZXJ2aWNlLmRlbGV0ZWRJdGVtcztcblxuICAgICAgICBjb25zdCByZXNwb25zZXMgPSBbXTtcblxuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gQWRkIG5ld1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNUb0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ0NyZWF0ZTogU2V0dGluZ0NyZWF0ZSA9IHtcbiAgICAgICAgICAgICAgICBuYW1lIDogaXRlbXNUb0FkZFtpXS5uYW1lLFxuICAgICAgICAgICAgICAgIGNyeXB0ZWQgOiBpdGVtc1RvQWRkW2ldLmNyeXB0ZWQsXG4gICAgICAgICAgICAgICAgZHluYW1pYyA6IGl0ZW1zVG9BZGRbaV0uZHluYW1pYyxcbiAgICAgICAgICAgICAgICB0eXBlIDogaXRlbXNUb0FkZFtpXS50eXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlIDogaXRlbXNUb0FkZFtpXS52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5zZXR0aW5nc1NlcnZpY2UuY3JlYXRlU2V0dGluZyh0aGlzLnNlbGVjdGVkU2VydmljZS5uYW1lLCBzZXR0aW5nQ3JlYXRlKTtcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ05hbWUgPSBpdGVtc1RvVXBkYXRlW2ldLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nVXBkYXRlOiBTZXR0aW5nVXBkYXRlID0ge1xuICAgICAgICAgICAgICAgIGNyeXB0ZWQgOiBpdGVtc1RvVXBkYXRlW2ldLmNyeXB0ZWQsXG4gICAgICAgICAgICAgICAgZHluYW1pYyA6IGl0ZW1zVG9VcGRhdGVbaV0uZHluYW1pYyxcbiAgICAgICAgICAgICAgICB0eXBlIDogaXRlbXNUb1VwZGF0ZVtpXS50eXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlIDogaXRlbXNUb1VwZGF0ZVtpXS52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5zZXR0aW5nc1NlcnZpY2UudXBkYXRlU2V0dGluZyh0aGlzLnNlbGVjdGVkU2VydmljZS5uYW1lLCBzZXR0aW5nTmFtZSwgc2V0dGluZ1VwZGF0ZSk7XG4gICAgICAgICAgICByZXNwb25zZXMucHVzaChyZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWxldGUgZXhpc3RpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zVG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdOYW1lID0gaXRlbXNUb1JlbW92ZVtpXS5uYW1lO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnNldHRpbmdzU2VydmljZS5kZWxldGVTZXR0aW5nKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLm5hbWUsIHNldHRpbmdOYW1lKTtcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdXYWl0aW5nIGZvciBhbGwgY2hhbmdlcyBjb21taXQuJyk7XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihyZXNwb25zZXMpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQnV0dG9uIEV2ZW50XG4gICAgICovXG4gICAgb25EaXNjYXJkQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZWRpdFNlcnZpY2UuaGFzQ2hhbmdlcygpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZy5vcGVuKCdQZW5kaW5nIENoYW5nZXMnLFxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAnQXR0ZW50aW9uLCBpbiB0aGUgY29uZmlndXJhdGlvbiB0aGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzLiBJZiB5b3UgcHJvY2VlZCBhbGwgdGhlc2UgY2hhbmdlcyB3aWxsIGJlIGxvc3QuXFxuXFxuRG8geW91IHdhbnQgdG8gY29udGludWU/JyxcbiAgICAgICAgICAgICAgICB7ICdhY3Rpb24nIDogJ2Rpc2NhcmRDaGFuZ2VzJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvblBhcmFtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnV0dG9uIGV2ZW50XG4gICAgICovXG4gICAgb25FeHBvcnRDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ0V4cG9ydCBjbGlja2VkJyk7XG4gICAgICAgIHRoaXMuZXhwb3J0Q29uZmlndXJhdGlvbkZpbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdXR0b24gZXZlbnRcbiAgICAgKi9cbiAgICBvbkltcG9ydENsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnSW1wb3J0IGNsaWNrZWQ6JywgdGhpcy54bWxGaWxlSW1wb3J0RWwpO1xuICAgICAgICAvLyB0cmlnZ2VyIG1vdXNlIGNsaWNrXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJywge2J1YmJsZXM6IHRydWV9KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKFxuICAgICAgICB0aGlzLnhtbEZpbGVJbXBvcnRFbC5uYXRpdmVFbGVtZW50LCAnZGlzcGF0Y2hFdmVudCcsIFtldmVudF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1dHRvbiBldmVudFxuICAgICAqL1xuICAgIG9uQWRkUHJvcGVydHlDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICAvLyBkaXNwbGF5IG5ldyBpdGVtIGRpYWxvZ1xuICAgICAgICB0aGlzLnByb3BlcnR5RWRpdG9yRGlhbG9nLnNob3coKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBlbWl0dGVkIGJ5IHRoZSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICogQHBhcmFtIHVzZXJEYXRhXG4gICAgICovXG4gICAgb25Db25maXJtYXRpb25DYW5jZWwodXNlckRhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdvbkNvbmZpcm1hdGlvbkNhbmNlbCBmb3I6JywgdXNlckRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgYnkgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2dcbiAgICAgKiBAcGFyYW0gdXNlckRhdGFcbiAgICAgKi9cbiAgICBvbkNvbmZpcm1hdGlvbk9LKHVzZXJEYXRhKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25Db25maXJtYXRpb25PSyBmb3I6JywgdXNlckRhdGEpO1xuXG4gICAgICAgIGlmICh1c2VyRGF0YSAmJiB1c2VyRGF0YS5hY3Rpb24gPT09ICdyZWZyZXNoJykge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uUGFyYW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJEYXRhICYmIHVzZXJEYXRhLmFjdGlvbiA9PT0gJ2Rpc2NhcmRDaGFuZ2VzJykge1xuICAgICAgICAgICAgdGhpcy5lZGl0U2VydmljZS5jYW5jZWxDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYnkgdGhlIG5ldyBQcm9wZXJ0eSBFZGl0b3IgRGlhbG9nXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICovXG4gICAgb25FZGl0Q29tbWl0KG5ld0NvbmZpZ3VyYXRpb25Sb3c6IENvbmZpZ3VyYXRpb25Sb3cpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdvbkVkaXRDb21taXQgbmV3IHJvdzonLCBuZXdDb25maWd1cmF0aW9uUm93KTtcbiAgICAgICAgdGhpcy5lZGl0U2VydmljZS5jcmVhdGUobmV3Q29uZmlndXJhdGlvblJvdyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIG9yIGRpc2FibGUgYnV0dG9uc1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0T3B0aW9ucyhjYW5TYXZlOiBib29sZWFuLCBjYW5SZWZyZXNoOiBib29sZWFuLCBjYW5BZGRQcm9wZXJ0eTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmNhblJlZnJlc2ggPSBjYW5SZWZyZXNoO1xuXG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKGZvcmtKb2luKHRoaXMubW90aWZBQ0xTZXJ2aWNlLmNhbignY29tLnZpcGVyYS5vc2dpLmNvcmUuY29uZmlnLnNlcnZpY2UuYXBpLnJlc3QuQ2ZnQXBpOlVQREFURTp1cGRhdGVTZXR0aW5nJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdGlmQUNMU2VydmljZS5jYW4oJ2NvbS52aXBlcmEub3NnaS5jb3JlLmNvbmZpZy5zZXJ2aWNlLmFwaS5yZXN0LkNmZ0FwaTpDUkVBVEU6Y3JlYXRlU2V0dGluZycpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2FuRG9JdDogQXJyYXk8Ym9vbGVhbj4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FuU2F2ZSA9IGNhblNhdmUgJiYgY2FuRG9JdFswXTtcbiAgICAgICAgICAgIHRoaXMuY2FuQWRkUHJvcGVydHkgPSBjYW5BZGRQcm9wZXJ0eSAmJiBjYW5Eb0l0WzFdO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHICwgJ2Nhbm5vdCByZXRyaWV2ZSBwZXJtaXNzaW9uczogJywgZXJyb3IpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJ5IHRoZSBncmlkIGRlbGV0ZSBidXR0b25cbiAgICAgKiBAcGFyYW0gZGF0YUl0ZW1cbiAgICAgKi9cbiAgICBvbkRlbGV0ZU9LUHJlc3NlZChkYXRhSXRlbTogQ29uZmlndXJhdGlvblJvdyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ29uRGVsZXRlT0tQcmVzc2VkIGZvciBpdGVtOiAnLCBkYXRhSXRlbSk7XG4gICAgICAgIHRoaXMuZWRpdFNlcnZpY2UucmVtb3ZlKGRhdGFJdGVtKTtcbiAgICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJ5IHRoZSBpbnB1dCB0YWdcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBvblVwbG9hZEZpbGVTZWxlY3RlZChldmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwbG9hZENvbmZpZ3VyYXRpb24ocmVhZGVyLnJlc3VsdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRyAsICdvblVwbG9hZEZpbGVTZWxlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUmVhZGluZ0NvbmZpZ3VyYXRpb25FcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9uIFVwbG9hZCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiBmaWxlOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCB0aGUgYmxvYiBmaWxlIHRvIHNlcnZlclxuICAgICAqIEBwYXJhbSBibG9iXG4gICAgICovXG4gICAgdXBsb2FkQ29uZmlndXJhdGlvbihibG9iKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyYXRpb25VcGxvYWQnLFxuICAgICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9uIFVwbG9hZCcsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVXBsb2FkaW5nIGNvbmZpZ3VyYXRpb24uLi4nLFxuICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5JbmZvXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UudXBsb2FkWG1sKGJsb2IsIGZhbHNlKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oTE9HX1RBRyAsICdJbXBvcnQgeG1sIGRvbmU6JywgZGF0YSk7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmF0aW9uVXBsb2FkU3VjY2VzcycsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0aW9uIFVwbG9hZCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bG9hZGVkLicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb25QYXJhbXMoKTtcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdJbXBvcnQgeG1sIGNvbmZpZ3VyYXRpb24gZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29uZmlndXJhdGlvblVwbG9hZEVycm9yJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NvbmZpZ3VyYXRpb24gVXBsb2FkJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgdXBsb2FkaW5nIGNvbmZpZ3VyYXRpb246JyxcbiAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9uQWRkTmV3UHJvcGVydHlDb25maXJtZWQoZGlhbG9nUmVzdWx0OiBOZXdQYXJhbURpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjb25zdCBuZXdDb25maWd1cmF0aW9uUm93ID0gbmV3IENvbmZpZ3VyYXRpb25Sb3coKTtcbiAgICAgICAgbmV3Q29uZmlndXJhdGlvblJvdy5uYW1lID0gZGlhbG9nUmVzdWx0Lm5hbWU7XG4gICAgICAgIG5ld0NvbmZpZ3VyYXRpb25Sb3cuY3J5cHRlZCA9IGRpYWxvZ1Jlc3VsdC5lbmNyeXB0ZWQ7XG4gICAgICAgIG5ld0NvbmZpZ3VyYXRpb25Sb3cuaXNOZXcgPSB0cnVlO1xuICAgICAgICBuZXdDb25maWd1cmF0aW9uUm93LmR5bmFtaWMgPSBkaWFsb2dSZXN1bHQuZHluYW1pYztcbiAgICAgICAgbmV3Q29uZmlndXJhdGlvblJvdy50eXBlID0gZGlhbG9nUmVzdWx0LnR5cGU7XG4gICAgICAgIG5ld0NvbmZpZ3VyYXRpb25Sb3cudmFsdWUgPSBkaWFsb2dSZXN1bHQudmFsdWU7XG4gICAgICAgIHRoaXMub25FZGl0Q29tbWl0KG5ld0NvbmZpZ3VyYXRpb25Sb3cpO1xuICAgIH1cbn1cbiJdfQ==