UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

83 lines 19.6 kB
import { Component, Inject } from '@angular/core'; import { UserListService } from '@netgrif/components-core'; import { FormControl } from '@angular/forms'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "@angular/common"; import * as i3 from "../../side-menu/content-components/user-assign/user-assign-list/user-assign-list.component"; import * as i4 from "@ngbracket/ngx-layout"; import * as i5 from "@angular/material/button"; import * as i6 from "@angular/material/icon"; import * as i7 from "@angular/material/input"; import * as i8 from "@angular/material/form-field"; import * as i9 from "@angular/forms"; import * as i10 from "@ngx-translate/core"; export class UserAssignDialogComponent { _dialogRef; _data; /** * Form control for user search value. */ searchUserControl = new FormControl(); /** * Data about preselected user send from [UserFieldComponent]{@link AbstractUserFieldComponent}. */ injectedData; /** * Value of the current selected user. */ _currentUser; /** * Inject and set data send from [UserFieldComponent]{@link AbstractUserFieldComponent} if the user is preselected. * @param _sideMenuControl Contains [Roles]{@link ProcessRole} and [UserValue]{@link UserValue}. */ constructor(_dialogRef, _data) { this._dialogRef = _dialogRef; this._data = _data; if (this._data) { this.injectedData = this._data; } } /** * The user that is initially selected, or `undefined` if none is */ get initiallySelectedUser() { return this.injectedData ? this.injectedData.value : undefined; } get roles() { return this.injectedData ? this.injectedData.roles : []; } get negativeRoles() { return this.injectedData ? this.injectedData.negativeRoles : []; } /** * On select user from users assign list publish side menu with selected user as data and message about selection. * @param user Select current user as [UserValue]{@link UserValue} */ userWasSelected(user) { this._currentUser = user; } /** * On assign button close side menu with selected user as data and message about confirm. */ assign() { if (this._currentUser !== undefined) { this._dialogRef.close({ opened: false, message: 'Selected user was confirmed', data: this._currentUser }); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UserAssignDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: UserAssignDialogComponent, selector: "nc-user-assign-dialog", providers: [UserListService], ngImport: i0, template: "<div class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{ 'side-menu.user.assign' | translate }}\n</div>\n<div mat-dialog-content fxLayoutAlign=\"start stretch\" class=\"height-fix\">\n <div class=\"user-assign-container side-menu-root\" fxFlex fxLayout=\"column\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <input matInput placeholder=\"{{ 'side-menu.user.choose' | translate }}\"\n [formControl]=\"searchUserControl\">\n <button mat-stroked-button *ngIf=\"searchUserControl.value\" matSuffix mat-icon-button\n (click)=\"searchUserControl.setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <nc-user-assign-list fxFlex class=\"height-100\"\n [searchUserControl]=\"searchUserControl\"\n [roles]=\"roles\"\n [negativeRoles]=\"negativeRoles\"\n [initiallySelectedUser]=\"initiallySelectedUser\"\n (userSelected)=\"userWasSelected($event)\">\n </nc-user-assign-list>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"primary\"\n (click)=\"assign()\">{{ 'tasks.view.assign' | translate | uppercase }}</button>\n </div>\n </div>\n</div>\n", styles: [".user-assign-container{padding:16px;position:relative;height:100%}.user-assign-search{width:100%}.prefix-icon{font-size:18px;color:#64748b}.height-100{height:100%}.height-fix{height:calc(100% - 44px)}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.UserAssignListComponent, selector: "nc-user-assign-list" }, { kind: "directive", type: i4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.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: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UserAssignDialogComponent, decorators: [{ type: Component, args: [{ selector: 'nc-user-assign-dialog', providers: [UserListService], template: "<div class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{ 'side-menu.user.assign' | translate }}\n</div>\n<div mat-dialog-content fxLayoutAlign=\"start stretch\" class=\"height-fix\">\n <div class=\"user-assign-container side-menu-root\" fxFlex fxLayout=\"column\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <input matInput placeholder=\"{{ 'side-menu.user.choose' | translate }}\"\n [formControl]=\"searchUserControl\">\n <button mat-stroked-button *ngIf=\"searchUserControl.value\" matSuffix mat-icon-button\n (click)=\"searchUserControl.setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <nc-user-assign-list fxFlex class=\"height-100\"\n [searchUserControl]=\"searchUserControl\"\n [roles]=\"roles\"\n [negativeRoles]=\"negativeRoles\"\n [initiallySelectedUser]=\"initiallySelectedUser\"\n (userSelected)=\"userWasSelected($event)\">\n </nc-user-assign-list>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"primary\"\n (click)=\"assign()\">{{ 'tasks.view.assign' | translate | uppercase }}</button>\n </div>\n </div>\n</div>\n", styles: [".user-assign-container{padding:16px;position:relative;height:100%}.user-assign-search{width:100%}.prefix-icon{font-size:18px;color:#64748b}.height-100{height:100%}.height-fix{height:calc(100% - 44px)}\n"] }] }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1hc3NpZ24tZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy91c2VyLWFzc2lnbi1kaWFsb2cvdXNlci1hc3NpZ24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy91c2VyLWFzc2lnbi1kaWFsb2cvdXNlci1hc3NpZ24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFFbUIsZUFBZSxFQUV4QyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsZUFBZSxFQUFlLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQVF2RSxNQUFNLE9BQU8seUJBQXlCO0lBb0JaO0lBQ3lCO0lBcEIvQzs7T0FFRztJQUNJLGlCQUFpQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFN0M7O09BRUc7SUFDSSxZQUFZLENBQXVCO0lBRTFDOztPQUVHO0lBQ08sWUFBWSxDQUFZO0lBRWxDOzs7T0FHRztJQUNILFlBQXNCLFVBQW1ELEVBQzFCLEtBQTJCO1FBRHBELGVBQVUsR0FBVixVQUFVLENBQXlDO1FBQzFCLFVBQUssR0FBTCxLQUFLLENBQXNCO1FBQ3RFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQTZCLENBQUM7U0FDMUQ7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLHFCQUFxQjtRQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGVBQWUsQ0FBQyxJQUFlO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU07UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUNsQixNQUFNLEVBQUUsS0FBSztnQkFDYixPQUFPLEVBQUUsNkJBQTZCO2dCQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVk7YUFDMUIsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO3dHQTdEUSx5QkFBeUIsOENBcUJkLGVBQWU7NEZBckIxQix5QkFBeUIsZ0RBRnZCLENBQUMsZUFBZSxDQUFDLDBCQ2JoQyx5c0RBK0JBOzs0RkRoQmEseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNJLHVCQUF1QixhQUd0QixDQUFDLGVBQWUsQ0FBQzs7MEJBdUJmLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBQcm9jZXNzUm9sZSxcbiAgICBVc2VyTGlzdEluamVjdGVkRGF0YSwgVXNlckxpc3RTZXJ2aWNlLFxuICAgIFVzZXJWYWx1ZVxufSBmcm9tICdAbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUnO1xuaW1wb3J0IHtGb3JtQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYy11c2VyLWFzc2lnbi1kaWFsb2cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi91c2VyLWFzc2lnbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VzZXItYXNzaWduLWRpYWxvZy5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1VzZXJMaXN0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgVXNlckFzc2lnbkRpYWxvZ0NvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogRm9ybSBjb250cm9sIGZvciB1c2VyIHNlYXJjaCB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VhcmNoVXNlckNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcblxuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgcHJlc2VsZWN0ZWQgdXNlciBzZW5kIGZyb20gW1VzZXJGaWVsZENvbXBvbmVudF17QGxpbmsgQWJzdHJhY3RVc2VyRmllbGRDb21wb25lbnR9LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbmplY3RlZERhdGE6IFVzZXJMaXN0SW5qZWN0ZWREYXRhO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgdXNlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2N1cnJlbnRVc2VyOiBVc2VyVmFsdWU7XG5cbiAgICAvKipcbiAgICAgKiBJbmplY3QgYW5kIHNldCBkYXRhIHNlbmQgZnJvbSBbVXNlckZpZWxkQ29tcG9uZW50XXtAbGluayBBYnN0cmFjdFVzZXJGaWVsZENvbXBvbmVudH0gaWYgdGhlIHVzZXIgaXMgcHJlc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIF9zaWRlTWVudUNvbnRyb2wgQ29udGFpbnMgW1JvbGVzXXtAbGluayBQcm9jZXNzUm9sZX0gYW5kIFtVc2VyVmFsdWVde0BsaW5rIFVzZXJWYWx1ZX0uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxVc2VyQXNzaWduRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHJvdGVjdGVkIF9kYXRhOiBVc2VyTGlzdEluamVjdGVkRGF0YSkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pbmplY3RlZERhdGEgPSB0aGlzLl9kYXRhIGFzIFVzZXJMaXN0SW5qZWN0ZWREYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdGhhdCBpcyBpbml0aWFsbHkgc2VsZWN0ZWQsIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUgaXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxseVNlbGVjdGVkVXNlcigpOiBVc2VyVmFsdWUgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RlZERhdGEgPyB0aGlzLmluamVjdGVkRGF0YS52YWx1ZSBhcyBVc2VyVmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb2xlcygpOiBBcnJheTxzdHJpbmc+IHwgQXJyYXk8UHJvY2Vzc1JvbGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0ZWREYXRhID8gdGhpcy5pbmplY3RlZERhdGEucm9sZXMgOiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5lZ2F0aXZlUm9sZXMoKTogQXJyYXk8c3RyaW5nPiB8IEFycmF5PFByb2Nlc3NSb2xlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdGVkRGF0YSA/IHRoaXMuaW5qZWN0ZWREYXRhLm5lZ2F0aXZlUm9sZXMgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBzZWxlY3QgdXNlciBmcm9tIHVzZXJzIGFzc2lnbiBsaXN0IHB1Ymxpc2ggc2lkZSBtZW51IHdpdGggc2VsZWN0ZWQgdXNlciBhcyBkYXRhIGFuZCBtZXNzYWdlIGFib3V0IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gdXNlciBTZWxlY3QgY3VycmVudCB1c2VyIGFzIFtVc2VyVmFsdWVde0BsaW5rIFVzZXJWYWx1ZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlcldhc1NlbGVjdGVkKHVzZXI6IFVzZXJWYWx1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50VXNlciA9IHVzZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gYXNzaWduIGJ1dHRvbiBjbG9zZSBzaWRlIG1lbnUgd2l0aCBzZWxlY3RlZCB1c2VyIGFzIGRhdGEgYW5kIG1lc3NhZ2UgYWJvdXQgY29uZmlybS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzaWduKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFVzZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHtcbiAgICAgICAgICAgICAgICBvcGVuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdTZWxlY3RlZCB1c2VyIHdhcyBjb25maXJtZWQnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuX2N1cnJlbnRVc2VyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwiY2VudGVyIG5vbmVcIj5cbiAgICB7eyAnc2lkZS1tZW51LnVzZXIuYXNzaWduJyB8IHRyYW5zbGF0ZSAgfX1cbjwvZGl2PlxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0cmV0Y2hcIiBjbGFzcz1cImhlaWdodC1maXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1hc3NpZ24tY29udGFpbmVyIHNpZGUtbWVudS1yb290XCIgZnhGbGV4IGZ4TGF5b3V0PVwiY29sdW1uXCI+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgY2xhc3M9XCJuZXRncmlmLWlucHV0IG5ldGdyaWYtaW5wdXQtZml4XCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwXCIgY2xhc3M9XCJ1c2VyLWFzc2lnbi1zZWFyY2hcIiBjb2xvcj1cInByaW1hcnlcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRQcmVmaXggY2xhc3M9XCJwcmVmaXgtaWNvblwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwie3sgJ3NpZGUtbWVudS51c2VyLmNob29zZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoVXNlckNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAqbmdJZj1cInNlYXJjaFVzZXJDb250cm9sLnZhbHVlXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaFVzZXJDb250cm9sLnNldFZhbHVlKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5jLXVzZXItYXNzaWduLWxpc3QgZnhGbGV4IGNsYXNzPVwiaGVpZ2h0LTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hVc2VyQ29udHJvbF09XCJzZWFyY2hVc2VyQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlc109XCJyb2xlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZWdhdGl2ZVJvbGVzXT1cIm5lZ2F0aXZlUm9sZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5pdGlhbGx5U2VsZWN0ZWRVc2VyXT1cImluaXRpYWxseVNlbGVjdGVkVXNlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VyU2VsZWN0ZWQpPVwidXNlcldhc1NlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPC9uYy11c2VyLWFzc2lnbi1saXN0PlxuXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXNzaWduKClcIj57eyAndGFza3Mudmlldy5hc3NpZ24nIHwgdHJhbnNsYXRlIHwgdXBwZXJjYXNlIH19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=