@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
181 lines • 60 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { NgForm } from '@angular/forms';
import { AlertService, gettext, ModalService, Status } from '@c8y/ngx-components';
import { TranslateService } from '@ngx-translate/core';
import { cloneDeep, escapeRegExp, find, head, orderBy } from 'lodash-es';
import { BsModalService } from 'ngx-bootstrap/modal';
import { ConnectionInfoWithDownloadCsvComponent } from '../connection-info-with-download-csv.component';
import { ConnectionType } from '../multiple-lns-connector.model';
import { MultipleLnsConnectorService } from '../multiple-lns-connector.service';
import * as i0 from "@angular/core";
import * as i1 from "../multiple-lns-connector.service";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@ngx-translate/core";
import * as i4 from "ngx-bootstrap/modal";
import * as i5 from "@angular/common";
import * as i6 from "@angular/forms";
import * as i7 from "../no-connections-found.component";
export class LoriotMultipleLnsConnectorComponent {
constructor(connectorService, alertService, translateService, modalService, modal) {
this.connectorService = connectorService;
this.alertService = alertService;
this.translateService = translateService;
this.modalService = modalService;
this.modal = modal;
this.state = 'loadingConnection';
this.cloneDeep = cloneDeep;
this.connections = Array();
this.showPassword = false;
this.cardHeader = gettext('LORIOT connections');
this.allowedSpecialCharacters = '~!@$^(){}[]|:,<+=,.`_ -';
this.namePattern = `^[a-zA-Z0-9 ${escapeRegExp(this.allowedSpecialCharacters)}]*$`;
this.namePatternError = this.translateService.instant(gettext('Connection name can only contain letters, numbers, spaces, and the following symbols: {{ symbols }}'), {
symbols: this.allowedSpecialCharacters
});
}
async ngOnInit() {
await this.loadConnections();
}
async loadConnections() {
const res = await this.connectorService.list(ConnectionType.LORIOT);
if (res && res.status !== 200) {
const data = res.json ? await res.json() : undefined;
this.alertService.addServerFailure({ data, res });
this.state = 'loadingError';
}
else {
const list = await res.json();
this.connections = orderBy(list, ['name'], ['asc']);
await this.setModel();
}
}
async setModel(connectionObj = null) {
const resetConnection = await this.resetEditedUnsavedConnection();
this.connection = connectionObj
? connectionObj
: this.state === 'savedSuccessfully'
? this.connection
: resetConnection ?? cloneDeep(head(this.connections));
this.state = 'updateConnection';
this.showPassword = false;
this.originalConnection = this.connection ? cloneDeep(this.connection) : undefined;
this.connection.providerType = 'loriotType';
}
async resetEditedUnsavedConnection() {
if (this.state !== 'updateConnection' || !this.originalConnection) {
return;
}
const { name } = this.originalConnection;
const originalData = find(this.connections, { name });
if (originalData) {
return cloneDeep(originalData);
}
}
async addConnection() {
await this.resetEditedUnsavedConnection();
this.connection = {};
this.originalConnection = {};
this.state = 'addConnections';
this.showPassword = true;
this.connection.providerType = 'loriotType';
}
async save() {
const checkForConnectionName = this.originalConnection && this.originalConnection.name && this.originalConnection.name !== ''
? this.originalConnection.name
: this.connection.name;
const isConnectionExist = await this.connectorService.exists(ConnectionType.LORIOT, checkForConnectionName);
if (this.state === 'addConnections' && isConnectionExist) {
const msg = this.translateService.instant(gettext(`Connection with name "{{ name }}" already exists.`), { name: this.connection.name });
this.alertService.danger(msg);
}
else {
return this.saveConnection();
}
}
async deleteConnection(originalConnection) {
const { name } = originalConnection;
const msg = this.translateService.instant(gettext(`You are about to delete the connection "{{ name }}". Do you want to proceed?`), { name });
try {
await this.modal.confirm(gettext('Delete connection'), msg, Status.DANGER, {
ok: gettext('Delete'),
cancel: gettext('Cancel')
});
await this.delete(originalConnection);
}
catch (error) {
// empty catch block
}
}
changePassword() {
this.showPassword = !this.showPassword;
if (this.connectorsForm.controls.password) {
this.connectorsForm.controls.password.setValue(null);
}
}
async saveConnection() {
const res = await this.connectorService.save(this.connection, this.originalConnection?.name);
if (res && (res.status === 201 || res.status === 200)) {
this.state = 'savedSuccessfully';
this.alertService.success(gettext('Connection saved.'));
await this.loadConnections();
}
else if (res && res.status === 500) {
const data = res.json ? await res.json() : undefined;
const app = this.connectorService.getApplication('loriot-agent');
const initialState = {
messageData: data,
appData: app,
modalTitle: gettext('Failed to update the connection'),
ariaDescribedby: 'modal-body',
ariaLabelledBy: 'modal-title',
connectionName: this.connection.name
};
this.modalService.show(ConnectionInfoWithDownloadCsvComponent, { initialState });
}
else {
const data = res.json ? await res.json() : undefined;
this.alertService.addServerFailure({ data, res });
}
}
async delete(originalConnection) {
if (!originalConnection.providerType)
originalConnection.providerType = 'loriotType';
try {
const response = await this.connectorService.delete(originalConnection);
if (response.ok && response.status === 204) {
this.alertService.success(gettext('Connection deleted.'));
await this.loadConnections();
}
else if (response && response.status === 500) {
const data = response.json ? await response.json() : undefined;
const app = this.connectorService.getApplication('loriot-agent');
const initialState = {
messageData: data,
appData: app,
ariaDescribedby: 'modal-body',
ariaLabelledBy: 'modal-title',
modalTitle: gettext('Failed to delete the connection'),
connectionName: originalConnection.name
};
this.modalService.show(ConnectionInfoWithDownloadCsvComponent, { initialState });
}
else {
const data = response.json ? await response.json() : undefined;
this.alertService.addServerFailure({ data, response });
}
}
catch (error) {
// empty catch block
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotMultipleLnsConnectorComponent, deps: [{ token: i1.MultipleLnsConnectorService }, { token: i2.AlertService }, { token: i3.TranslateService }, { token: i4.BsModalService }, { token: i2.ModalService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LoriotMultipleLnsConnectorComponent, selector: "loriot-multiple-lns-connector", viewQueries: [{ propertyName: "connectorsForm", first: true, predicate: ["connectorsForm"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"state === 'loadingConnection'; else renderListAndForm\">\n <c8y-loading></c8y-loading>\n</ng-container>\n\n<c8y-title>{{ 'Connectivity' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Connectivity' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'LORIOT' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<ng-template #renderListAndForm>\n <no-connections-found\n (onAction)=\"addConnection()\"\n *ngIf=\"connections.length === 0 && state !== 'addConnections'\"\n [header]=\"cardHeader | translate\"\n ></no-connections-found>\n <div>\n <div\n class=\"card content-fullpage split-view--5-7\"\n *ngIf=\"connections.length !== 0 || state === 'addConnections'\"\n >\n <div class=\"card-header separator grid__col--fullspan\">\n <div class=\"card-title\">{{ cardHeader | translate }}</div>\n </div>\n <div class=\"inner-scroll split-view__list\">\n <div class=\"bg-gray-white flex-grow\">\n <c8y-list-group class=\"nav c8y-nav-stacked\">\n <c8y-li\n class=\"c8y-stacked-item p-0\"\n [class.active]=\"connection.name === connectionBeingEdited\"\n *ngFor=\"let connection of connections; let index = index\"\n (click)=\"setModel(cloneDeep(connection))\"\n >\n <c8y-li-icon [icon]=\"'plug'\"></c8y-li-icon>\n <span title=\"{{ connection.name }}\">\n {{ connection.name }}\n </span>\n </c8y-li>\n\n <c8y-li\n class=\"c8y-nav-stacked active\"\n *ngIf=\"state === 'addConnections'\"\n (click)=\"addConnection()\"\n >\n <c8y-li-icon [icon]=\"'plug'\"></c8y-li-icon>\n {{ 'New connection' | translate }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"card-footer separator-top\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Add connection' | translate }}\"\n [disabled]=\"state === 'addConnections'\"\n (click)=\"addConnection()\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add connection' | translate }}\n </button>\n </div>\n </div>\n\n <!-- 'split-view__detail--selected' condition needs to be fixed. this is needed so that both columns are visible in tablet format -->\n\n <div\n class=\"inner-scroll split-view__detail\"\n [class]=\"{ 'split-view__detail--selected': connection }\"\n >\n <div class=\"card-header separator visible-sm visible-xs fit-w sticky-top\">\n <button\n class=\"btn btn-clean text-primary\"\n title=\"{{ 'Back' | translate }}\"\n (click)=\"resetEditedUnsavedConnection()\"\n >\n <i [c8yIcon]=\"'chevron-left'\"></i>\n <span>{{ 'Back' | translate }}</span>\n </button>\n </div>\n <form\n class=\"d-contents\"\n #connectorsForm=\"ngForm\"\n >\n <div class=\"flex-grow\">\n <div class=\"card-block large-padding\">\n <c8y-form-group>\n <label for=\"name\">\n {{ 'Name' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"name\"\n name=\"name\"\n type=\"text\"\n required\n [placeholder]=\"'e.g. LORIOT connection' | translate\"\n [(ngModel)]=\"connection.name\"\n [pattern]=\"namePattern\"\n />\n <c8y-messages>\n <c8y-message\n name=\"pattern\"\n [text]=\"namePatternError\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"description\">\n {{ 'Description' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"description\"\n name=\"description\"\n type=\"text\"\n [placeholder]=\"\n 'e.g. This connection has a built-in functionality to\u2026' | translate\n \"\n [(ngModel)]=\"connection.description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"baseUrl\">\n {{ 'URL' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"baseUrl\"\n name=\"baseUrl\"\n type=\"text\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}' | translate : { example: 'https://ap3.loriot.io' }\n \"\n [(ngModel)]=\"connection.baseUrl\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label for=\"username\">\n {{ 'Username' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"username\"\n placeholder=\"{{ 'e.g. joe`LOCALIZE`' | translate }}\"\n name=\"username\"\n type=\"text\"\n required\n [(ngModel)]=\"connection.username\"\n />\n </c8y-form-group>\n <c8y-form-group *ngIf=\"showPassword\">\n <label for=\"password\">\n {{ 'Password' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"password\"\n placeholder=\"{{ 'e.g. my_password' | translate }}\"\n name=\"password\"\n type=\"password\"\n required\n [(ngModel)]=\"connection.password\"\n />\n </c8y-form-group>\n\n <button\n class=\"btn btn-default\"\n name=\"changePassword\"\n type=\"button\"\n *ngIf=\"state === 'updateConnection'\"\n (click)=\"changePassword()\"\n >\n <span\n title=\"{{ 'Change password' | translate }}\"\n *ngIf=\"!showPassword\"\n >\n {{ 'Change password' | translate }}\n </span>\n <span\n title=\"{{ 'Cancel password change' | translate }}\"\n *ngIf=\"showPassword\"\n >\n {{ 'Cancel password change' | translate }}\n </span>\n </button>\n </div>\n </div>\n\n <div class=\"card-footer separator-top\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"setModel()\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-danger\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"loriot-multiple-lns-connector.component--delete-connectivity\"\n *ngIf=\"state === 'updateConnection'\"\n (click)=\"deleteConnection(originalConnection)\"\n translate\n >\n Delete\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n [disabled]=\"!this.connectorsForm.form.valid || this.connectorsForm.form.pristine\"\n (click)=\"save()\"\n data-cy=\"loriot-multiple-lns-connector.component--button-save\"\n translate\n >\n Save\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i7.NoConnectionsFoundComponent, selector: "no-connections-found", inputs: ["header"], outputs: ["onAction"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotMultipleLnsConnectorComponent, decorators: [{
type: Component,
args: [{ selector: 'loriot-multiple-lns-connector', template: "<ng-container *ngIf=\"state === 'loadingConnection'; else renderListAndForm\">\n <c8y-loading></c8y-loading>\n</ng-container>\n\n<c8y-title>{{ 'Connectivity' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Connectivity' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'LORIOT' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<ng-template #renderListAndForm>\n <no-connections-found\n (onAction)=\"addConnection()\"\n *ngIf=\"connections.length === 0 && state !== 'addConnections'\"\n [header]=\"cardHeader | translate\"\n ></no-connections-found>\n <div>\n <div\n class=\"card content-fullpage split-view--5-7\"\n *ngIf=\"connections.length !== 0 || state === 'addConnections'\"\n >\n <div class=\"card-header separator grid__col--fullspan\">\n <div class=\"card-title\">{{ cardHeader | translate }}</div>\n </div>\n <div class=\"inner-scroll split-view__list\">\n <div class=\"bg-gray-white flex-grow\">\n <c8y-list-group class=\"nav c8y-nav-stacked\">\n <c8y-li\n class=\"c8y-stacked-item p-0\"\n [class.active]=\"connection.name === connectionBeingEdited\"\n *ngFor=\"let connection of connections; let index = index\"\n (click)=\"setModel(cloneDeep(connection))\"\n >\n <c8y-li-icon [icon]=\"'plug'\"></c8y-li-icon>\n <span title=\"{{ connection.name }}\">\n {{ connection.name }}\n </span>\n </c8y-li>\n\n <c8y-li\n class=\"c8y-nav-stacked active\"\n *ngIf=\"state === 'addConnections'\"\n (click)=\"addConnection()\"\n >\n <c8y-li-icon [icon]=\"'plug'\"></c8y-li-icon>\n {{ 'New connection' | translate }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"card-footer separator-top\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Add connection' | translate }}\"\n [disabled]=\"state === 'addConnections'\"\n (click)=\"addConnection()\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add connection' | translate }}\n </button>\n </div>\n </div>\n\n <!-- 'split-view__detail--selected' condition needs to be fixed. this is needed so that both columns are visible in tablet format -->\n\n <div\n class=\"inner-scroll split-view__detail\"\n [class]=\"{ 'split-view__detail--selected': connection }\"\n >\n <div class=\"card-header separator visible-sm visible-xs fit-w sticky-top\">\n <button\n class=\"btn btn-clean text-primary\"\n title=\"{{ 'Back' | translate }}\"\n (click)=\"resetEditedUnsavedConnection()\"\n >\n <i [c8yIcon]=\"'chevron-left'\"></i>\n <span>{{ 'Back' | translate }}</span>\n </button>\n </div>\n <form\n class=\"d-contents\"\n #connectorsForm=\"ngForm\"\n >\n <div class=\"flex-grow\">\n <div class=\"card-block large-padding\">\n <c8y-form-group>\n <label for=\"name\">\n {{ 'Name' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"name\"\n name=\"name\"\n type=\"text\"\n required\n [placeholder]=\"'e.g. LORIOT connection' | translate\"\n [(ngModel)]=\"connection.name\"\n [pattern]=\"namePattern\"\n />\n <c8y-messages>\n <c8y-message\n name=\"pattern\"\n [text]=\"namePatternError\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"description\">\n {{ 'Description' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"description\"\n name=\"description\"\n type=\"text\"\n [placeholder]=\"\n 'e.g. This connection has a built-in functionality to\u2026' | translate\n \"\n [(ngModel)]=\"connection.description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"baseUrl\">\n {{ 'URL' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"baseUrl\"\n name=\"baseUrl\"\n type=\"text\"\n required\n [placeholder]=\"\n 'e.g. {{ example }}' | translate : { example: 'https://ap3.loriot.io' }\n \"\n [(ngModel)]=\"connection.baseUrl\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label for=\"username\">\n {{ 'Username' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"username\"\n placeholder=\"{{ 'e.g. joe`LOCALIZE`' | translate }}\"\n name=\"username\"\n type=\"text\"\n required\n [(ngModel)]=\"connection.username\"\n />\n </c8y-form-group>\n <c8y-form-group *ngIf=\"showPassword\">\n <label for=\"password\">\n {{ 'Password' | translate }}\n </label>\n <input\n class=\"form-control\"\n id=\"password\"\n placeholder=\"{{ 'e.g. my_password' | translate }}\"\n name=\"password\"\n type=\"password\"\n required\n [(ngModel)]=\"connection.password\"\n />\n </c8y-form-group>\n\n <button\n class=\"btn btn-default\"\n name=\"changePassword\"\n type=\"button\"\n *ngIf=\"state === 'updateConnection'\"\n (click)=\"changePassword()\"\n >\n <span\n title=\"{{ 'Change password' | translate }}\"\n *ngIf=\"!showPassword\"\n >\n {{ 'Change password' | translate }}\n </span>\n <span\n title=\"{{ 'Cancel password change' | translate }}\"\n *ngIf=\"showPassword\"\n >\n {{ 'Cancel password change' | translate }}\n </span>\n </button>\n </div>\n </div>\n\n <div class=\"card-footer separator-top\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"setModel()\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-danger\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"loriot-multiple-lns-connector.component--delete-connectivity\"\n *ngIf=\"state === 'updateConnection'\"\n (click)=\"deleteConnection(originalConnection)\"\n translate\n >\n Delete\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n [disabled]=\"!this.connectorsForm.form.valid || this.connectorsForm.form.pristine\"\n (click)=\"save()\"\n data-cy=\"loriot-multiple-lns-connector.component--button-save\"\n translate\n >\n Save\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: i1.MultipleLnsConnectorService }, { type: i2.AlertService }, { type: i3.TranslateService }, { type: i4.BsModalService }, { type: i2.ModalService }], propDecorators: { connectorsForm: [{
type: ViewChild,
args: ['connectorsForm', { static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9yaW90LW11bHRpcGxlLWxucy1jb25uZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvdG9jb2wtbHB3YW4vbXVsdGlwbGUtbG5zLWNvbm5lY3RvcnMvbG9yaW90L2xvcmlvdC1tdWx0aXBsZS1sbnMtY29ubmVjdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb3RvY29sLWxwd2FuL211bHRpcGxlLWxucy1jb25uZWN0b3JzL2xvcmlvdC9sb3Jpb3QtbXVsdGlwbGUtbG5zLWNvbm5lY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RyxPQUFPLEVBQUUsY0FBYyxFQUFnQyxNQUFNLGlDQUFpQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7Ozs7QUFNaEYsTUFBTSxPQUFPLG1DQUFtQztJQW1COUMsWUFDVSxnQkFBNkMsRUFDN0MsWUFBMEIsRUFDMUIsZ0JBQWtDLEVBQ2xDLFlBQTRCLEVBQzVCLEtBQW1CO1FB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bkIsV0FBVyxFQUFFLElBQUk7b0JBQ2pCLE9BQU8sRUFBRSxHQUFHO29CQUNaLGVBQWUsRUFBRSxZQUFZO29CQUM3QixjQUFjLEVBQUUsYUFBYTtvQkFDN0IsVUFBVSxFQUFFLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQztvQkFDdEQsY0FBYyxFQUFFLGtCQUFrQixDQUFDLElBQUk7aUJBQ3hDLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2Ysb0JBQW9CO1FBQ3RCLENBQUM7SUFDSCxDQUFDOytHQS9LVSxtQ0FBbUM7bUdBQW5DLG1DQUFtQyx1TENkaEQsNjJRQStPQTs7NEZEak9hLG1DQUFtQztrQkFKL0MsU0FBUzsrQkFDRSwrQkFBK0I7a05BU08sY0FBYztzQkFBN0QsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIGdldHRleHQsIE1vZGFsU2VydmljZSwgU3RhdHVzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGVzY2FwZVJlZ0V4cCwgZmluZCwgaGVhZCwgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkluZm9XaXRoRG93bmxvYWRDc3ZDb21wb25lbnQgfSBmcm9tICcuLi9jb25uZWN0aW9uLWluZm8td2l0aC1kb3dubG9hZC1jc3YuY29tcG9uZW50JztcbmltcG9ydCB7IENvbm5lY3Rpb25UeXBlLCBMb3Jpb3RDb25uZWN0aW9uLCBMcHdhblN0YXRlIH0gZnJvbSAnLi4vbXVsdGlwbGUtbG5zLWNvbm5lY3Rvci5tb2RlbCc7XG5pbXBvcnQgeyBNdWx0aXBsZUxuc0Nvbm5lY3RvclNlcnZpY2UgfSBmcm9tICcuLi9tdWx0aXBsZS1sbnMtY29ubmVjdG9yLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsb3Jpb3QtbXVsdGlwbGUtbG5zLWNvbm5lY3RvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb3Jpb3QtbXVsdGlwbGUtbG5zLWNvbm5lY3Rvci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTG9yaW90TXVsdGlwbGVMbnNDb25uZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBzdGF0ZTogTHB3YW5TdGF0ZSA9ICdsb2FkaW5nQ29ubmVjdGlvbic7XG4gIGNsb25lRGVlcCA9IGNsb25lRGVlcDtcbiAgY29ubmVjdGlvbjogTG9yaW90Q29ubmVjdGlvbjtcbiAgY29ubmVjdGlvbnMgPSBBcnJheTxMb3Jpb3RDb25uZWN0aW9uPigpO1xuICBzaG93UGFzc3dvcmQgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnY29ubmVjdG9yc0Zvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgY29ubmVjdG9yc0Zvcm06IE5nRm9ybTtcbiAgY2FyZEhlYWRlciA9IGdldHRleHQoJ0xPUklPVCBjb25uZWN0aW9ucycpO1xuICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnMgPSAnfiFAJF4oKXt9W118Oiw8Kz0sLmBfIC0nO1xuICBuYW1lUGF0dGVybiA9IGBeW2EtekEtWjAtOSAke2VzY2FwZVJlZ0V4cCh0aGlzLmFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVycyl9XSokYDtcbiAgbmFtZVBhdHRlcm5FcnJvciA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgIGdldHRleHQoXG4gICAgICAnQ29ubmVjdGlvbiBuYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgc3BhY2VzLCBhbmQgdGhlIGZvbGxvd2luZyBzeW1ib2xzOiB7eyBzeW1ib2xzIH19J1xuICAgICksXG4gICAge1xuICAgICAgc3ltYm9sczogdGhpcy5hbGxvd2VkU3BlY2lhbENoYXJhY3RlcnNcbiAgICB9XG4gICk7XG4gIG9yaWdpbmFsQ29ubmVjdGlvbjogTG9yaW90Q29ubmVjdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25uZWN0b3JTZXJ2aWNlOiBNdWx0aXBsZUxuc0Nvbm5lY3RvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkQ29ubmVjdGlvbnMoKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRDb25uZWN0aW9ucygpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbm5lY3RvclNlcnZpY2UubGlzdChDb25uZWN0aW9uVHlwZS5MT1JJT1QpO1xuICAgIGlmIChyZXMgJiYgcmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzLmpzb24gPyBhd2FpdCByZXMuanNvbigpIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZSh7IGRhdGEsIHJlcyB9KTtcbiAgICAgIHRoaXMuc3RhdGUgPSAnbG9hZGluZ0Vycm9yJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGlzdCA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zID0gb3JkZXJCeShsaXN0LCBbJ25hbWUnXSwgWydhc2MnXSk7XG4gICAgICBhd2FpdCB0aGlzLnNldE1vZGVsKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2V0TW9kZWwoY29ubmVjdGlvbk9iaiA9IG51bGwpIHtcbiAgICBjb25zdCByZXNldENvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLnJlc2V0RWRpdGVkVW5zYXZlZENvbm5lY3Rpb24oKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uT2JqXG4gICAgICA/IGNvbm5lY3Rpb25PYmpcbiAgICAgIDogdGhpcy5zdGF0ZSA9PT0gJ3NhdmVkU3VjY2Vzc2Z1bGx5J1xuICAgICAgICA/IHRoaXMuY29ubmVjdGlvblxuICAgICAgICA6IHJlc2V0Q29ubmVjdGlvbiA/PyBjbG9uZURlZXAoaGVhZCh0aGlzLmNvbm5lY3Rpb25zKSk7XG4gICAgdGhpcy5zdGF0ZSA9ICd1cGRhdGVDb25uZWN0aW9uJztcbiAgICB0aGlzLnNob3dQYXNzd29yZCA9IGZhbHNlO1xuICAgIHRoaXMub3JpZ2luYWxDb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uID8gY2xvbmVEZWVwKHRoaXMuY29ubmVjdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uLnByb3ZpZGVyVHlwZSA9ICdsb3Jpb3RUeXBlJztcbiAgfVxuXG4gIGFzeW5jIHJlc2V0RWRpdGVkVW5zYXZlZENvbm5lY3Rpb24oKTogUHJvbWlzZTxMb3Jpb3RDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09ICd1cGRhdGVDb25uZWN0aW9uJyB8fCAhdGhpcy5vcmlnaW5hbENvbm5lY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IG5hbWUgfSA9IHRoaXMub3JpZ2luYWxDb25uZWN0aW9uO1xuICAgIGNvbnN0IG9yaWdpbmFsRGF0YSA9IGZpbmQodGhpcy5jb25uZWN0aW9ucywgeyBuYW1lIH0pO1xuICAgIGlmIChvcmlnaW5hbERhdGEpIHtcbiAgICAgIHJldHVybiBjbG9uZURlZXAob3JpZ2luYWxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRDb25uZWN0aW9uKCkge1xuICAgIGF3YWl0IHRoaXMucmVzZXRFZGl0ZWRVbnNhdmVkQ29ubmVjdGlvbigpO1xuICAgIHRoaXMuY29ubmVjdGlvbiA9IHt9IGFzIExvcmlvdENvbm5lY3Rpb247XG4gICAgdGhpcy5vcmlnaW5hbENvbm5lY3Rpb24gPSB7fSBhcyBMb3Jpb3RDb25uZWN0aW9uO1xuICAgIHRoaXMuc3RhdGUgPSAnYWRkQ29ubmVjdGlvbnMnO1xuICAgIHRoaXMuc2hvd1Bhc3N3b3JkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbm5lY3Rpb24ucHJvdmlkZXJUeXBlID0gJ2xvcmlvdFR5cGUnO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICBjb25zdCBjaGVja0ZvckNvbm5lY3Rpb25OYW1lID1cbiAgICAgIHRoaXMub3JpZ2luYWxDb25uZWN0aW9uICYmIHRoaXMub3JpZ2luYWxDb25uZWN0aW9uLm5hbWUgJiYgdGhpcy5vcmlnaW5hbENvbm5lY3Rpb24ubmFtZSAhPT0gJydcbiAgICAgICAgPyB0aGlzLm9yaWdpbmFsQ29ubmVjdGlvbi5uYW1lXG4gICAgICAgIDogdGhpcy5jb25uZWN0aW9uLm5hbWU7XG4gICAgY29uc3QgaXNDb25uZWN0aW9uRXhpc3QgPSBhd2FpdCB0aGlzLmNvbm5lY3RvclNlcnZpY2UuZXhpc3RzKFxuICAgICAgQ29ubmVjdGlvblR5cGUuTE9SSU9ULFxuICAgICAgY2hlY2tGb3JDb25uZWN0aW9uTmFtZVxuICAgICk7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdhZGRDb25uZWN0aW9ucycgJiYgaXNDb25uZWN0aW9uRXhpc3QpIHtcbiAgICAgIGNvbnN0IG1zZyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICBnZXR0ZXh0KGBDb25uZWN0aW9uIHdpdGggbmFtZSBcInt7IG5hbWUgfX1cIiBhbHJlYWR5IGV4aXN0cy5gKSxcbiAgICAgICAgeyBuYW1lOiB0aGlzLmNvbm5lY3Rpb24ubmFtZSB9XG4gICAgICApO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKG1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnNhdmVDb25uZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQ29ubmVjdGlvbihvcmlnaW5hbENvbm5lY3Rpb24pIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IG9yaWdpbmFsQ29ubmVjdGlvbjtcbiAgICBjb25zdCBtc2cgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgIGdldHRleHQoYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIHRoZSBjb25uZWN0aW9uIFwie3sgbmFtZSB9fVwiLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP2ApLFxuICAgICAgeyBuYW1lIH1cbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWwuY29uZmlybShnZXR0ZXh0KCdEZWxldGUgY29ubmVjdGlvbicpLCBtc2csIFN0YXR1cy5EQU5HRVIsIHtcbiAgICAgICAgb2s6IGdldHRleHQoJ0RlbGV0ZScpLFxuICAgICAgICBjYW5jZWw6IGdldHRleHQoJ0NhbmNlbCcpXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhpcy5kZWxldGUob3JpZ2luYWxDb25uZWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZW1wdHkgY2F0Y2ggYmxvY2tcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VQYXNzd29yZCgpIHtcbiAgICB0aGlzLnNob3dQYXNzd29yZCA9ICF0aGlzLnNob3dQYXNzd29yZDtcbiAgICBpZiAodGhpcy5jb25uZWN0b3JzRm9ybS5jb250cm9scy5wYXNzd29yZCkge1xuICAgICAgdGhpcy5jb25uZWN0b3JzRm9ybS5jb250cm9scy5wYXNzd29yZC5zZXRWYWx1ZShudWxsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY29ubmVjdG9yU2VydmljZS5zYXZlKHRoaXMuY29ubmVjdGlvbiwgdGhpcy5vcmlnaW5hbENvbm5lY3Rpb24/Lm5hbWUpO1xuICAgIGlmIChyZXMgJiYgKHJlcy5zdGF0dXMgPT09IDIwMSB8fCByZXMuc3RhdHVzID09PSAyMDApKSB7XG4gICAgICB0aGlzLnN0YXRlID0gJ3NhdmVkU3VjY2Vzc2Z1bGx5JztcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ29ubmVjdGlvbiBzYXZlZC4nKSk7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRDb25uZWN0aW9ucygpO1xuICAgIH0gZWxzZSBpZiAocmVzICYmIHJlcy5zdGF0dXMgPT09IDUwMCkge1xuICAgICAgY29uc3QgZGF0YSA9IHJlcy5qc29uID8gYXdhaXQgcmVzLmpzb24oKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuY29ubmVjdG9yU2VydmljZS5nZXRBcHBsaWNhdGlvbignbG9yaW90LWFnZW50Jyk7XG4gICAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgIG1lc3NhZ2VEYXRhOiBkYXRhLFxuICAgICAgICBhcHBEYXRhOiBhcHAsXG4gICAgICAgIG1vZGFsVGl0bGU6IGdldHRleHQoJ0ZhaWxlZCB0byB1cGRhdGUgdGhlIGNvbm5lY3Rpb24nKSxcbiAgICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnLFxuICAgICAgICBjb25uZWN0aW9uTmFtZTogdGhpcy5jb25uZWN0aW9uLm5hbWVcbiAgICAgIH07XG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KENvbm5lY3Rpb25JbmZvV2l0aERvd25sb2FkQ3N2Q29tcG9uZW50LCB7IGluaXRpYWxTdGF0ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IHJlcy5qc29uID8gYXdhaXQgcmVzLmpzb24oKSA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoeyBkYXRhLCByZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGUob3JpZ2luYWxDb25uZWN0aW9uKSB7XG4gICAgaWYgKCFvcmlnaW5hbENvbm5lY3Rpb24ucHJvdmlkZXJUeXBlKSBvcmlnaW5hbENvbm5lY3Rpb24ucHJvdmlkZXJUeXBlID0gJ2xvcmlvdFR5cGUnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yU2VydmljZS5kZWxldGUob3JpZ2luYWxDb25uZWN0aW9uKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ29ubmVjdGlvbiBkZWxldGVkLicpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ29ubmVjdGlvbnMoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmpzb24gPyBhd2FpdCByZXNwb25zZS5qc29uKCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFwcCA9IHRoaXMuY29ubmVjdG9yU2VydmljZS5nZXRBcHBsaWNhdGlvbignbG9yaW90LWFnZW50Jyk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgICAgICBtZXNzYWdlRGF0YTogZGF0YSxcbiAgICAgICAgICBhcHBEYXRhOiBhcHAsXG4gICAgICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICAgICAgbW9kYWxUaXRsZTogZ2V0dGV4dCgnRmFpbGVkIHRvIGRlbGV0ZSB0aGUgY29ubmVjdGlvbicpLFxuICAgICAgICAgIGNvbm5lY3Rpb25OYW1lOiBvcmlnaW5hbENvbm5lY3Rpb24ubmFtZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KENvbm5lY3Rpb25JbmZvV2l0aERvd25sb2FkQ3N2Q29tcG9uZW50LCB7IGluaXRpYWxTdGF0ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5qc29uID8gYXdhaXQgcmVzcG9uc2UuanNvbigpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKHsgZGF0YSwgcmVzcG9uc2UgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVtcHR5IGNhdGNoIGJsb2NrXG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwic3RhdGUgPT09ICdsb2FkaW5nQ29ubmVjdGlvbic7IGVsc2UgcmVuZGVyTGlzdEFuZEZvcm1cIj5cbiAgPGM4eS1sb2FkaW5nPjwvYzh5LWxvYWRpbmc+XG48L25nLWNvbnRhaW5lcj5cblxuPGM4eS10aXRsZT57eyAnQ29ubmVjdGl2aXR5JyB8IHRyYW5zbGF0ZSB9fTwvYzh5LXRpdGxlPlxuXG48Yzh5LWJyZWFkY3J1bWI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiJ2NvZydcIlxuICAgIFtsYWJlbF09XCInU2V0dGluZ3MnIHwgdHJhbnNsYXRlXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInY29nJ1wiXG4gICAgW2xhYmVsXT1cIidDb25uZWN0aXZpdHknIHwgdHJhbnNsYXRlXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInY29nJ1wiXG4gICAgW2xhYmVsXT1cIidMT1JJT1QnIHwgdHJhbnNsYXRlXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxuZy10ZW1wbGF0ZSAjcmVuZGVyTGlzdEFuZEZvcm0+XG4gIDxuby1jb25uZWN0aW9ucy1mb3VuZFxuICAgIChvbkFjdGlvbik9XCJhZGRDb25uZWN0aW9uKClcIlxuICAgICpuZ0lmPVwiY29ubmVjdGlvbnMubGVuZ3RoID09PSAwICYmIHN0YXRlICE9PSAnYWRkQ29ubmVjdGlvbnMnXCJcbiAgICBbaGVhZGVyXT1cImNhcmRIZWFkZXIgfCB0cmFuc2xhdGVcIlxuICA+PC9uby1jb25uZWN0aW9ucy1mb3VuZD5cbiAgPGRpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNhcmQgY29udGVudC1mdWxscGFnZSBzcGxpdC12aWV3LS01LTdcIlxuICAgICAgKm5nSWY9XCJjb25uZWN0aW9ucy5sZW5ndGggIT09IDAgfHwgc3RhdGUgPT09ICdhZGRDb25uZWN0aW9ucydcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBzZXBhcmF0b3IgZ3JpZF9fY29sLS1mdWxsc3BhblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IGNhcmRIZWFkZXIgfCB0cmFuc2xhdGUgfX08L2Rpd