UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

87 lines 20.4 kB
import { Component, Inject } from '@angular/core'; import { ImpersonationUserListService, 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 "@ngbracket/ngx-layout"; import * as i4 from "@angular/material/button"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/input"; import * as i7 from "@angular/material/form-field"; import * as i8 from "@angular/forms"; import * as i9 from "../../side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component"; import * as i10 from "@ngx-translate/core"; export class AdminImpersonateDialogComponent { _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: AdminImpersonateDialogComponent, 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: AdminImpersonateDialogComponent, selector: "nc-admin-impersonate-dialog", providers: [{ provide: UserListService, useClass: ImpersonationUserListService }], ngImport: i0, template: "<div class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{ 'side-menu.impersonation.title' | 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-admin-impersonate-list fxFlex\n [searchUserControl]=\"searchUserControl\"\n [roles]=\"roles\"\n [negativeRoles]=\"negativeRoles\"\n [initiallySelectedUser]=\"initiallySelectedUser\"\n (userSelected)=\"userWasSelected($event)\">\n </nc-admin-impersonate-list>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"primary\"\n (click)=\"assign()\">{{ 'side-menu.impersonation.submit' | translate | uppercase }}</button>\n </div>\n </div>\n</div>\n", styles: [".user-assign-container{padding:16px;position:relative;height:calc(100% - 4px)}.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: "directive", type: i3.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: i3.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: i3.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: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.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: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i9.AdminImpersonateListComponent, selector: "nc-admin-impersonate-list" }, { 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: AdminImpersonateDialogComponent, decorators: [{ type: Component, args: [{ selector: 'nc-admin-impersonate-dialog', providers: [{ provide: UserListService, useClass: ImpersonationUserListService }], template: "<div class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{ 'side-menu.impersonation.title' | 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-admin-impersonate-list fxFlex\n [searchUserControl]=\"searchUserControl\"\n [roles]=\"roles\"\n [negativeRoles]=\"negativeRoles\"\n [initiallySelectedUser]=\"initiallySelectedUser\"\n (userSelected)=\"userWasSelected($event)\">\n </nc-admin-impersonate-list>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"primary\"\n (click)=\"assign()\">{{ 'side-menu.impersonation.submit' | translate | uppercase }}</button>\n </div>\n </div>\n</div>\n", styles: [".user-assign-container{padding:16px;position:relative;height:calc(100% - 4px)}.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4taW1wZXJzb25hdGUtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy9hZG1pbi1pbXBlcnNvbmF0ZS1kaWFsb2cvYWRtaW4taW1wZXJzb25hdGUtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy9hZG1pbi1pbXBlcnNvbmF0ZS1kaWFsb2cvYWRtaW4taW1wZXJzb25hdGUtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFDSCw0QkFBNEIsRUFHNUIsZUFBZSxFQUVsQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsZUFBZSxFQUFlLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQVV2RSxNQUFNLE9BQU8sK0JBQStCO0lBb0JsQjtJQUN5QjtJQXBCL0M7O09BRUc7SUFDSSxpQkFBaUIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTdDOztPQUVHO0lBQ0ksWUFBWSxDQUF1QjtJQUUxQzs7T0FFRztJQUNPLFlBQVksQ0FBWTtJQUVsQzs7O09BR0c7SUFDSCxZQUFzQixVQUF5RCxFQUNoQyxLQUEyQjtRQURwRCxlQUFVLEdBQVYsVUFBVSxDQUErQztRQUNoQyxVQUFLLEdBQUwsS0FBSyxDQUFzQjtRQUN0RSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUE2QixDQUFDO1NBQzFEO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxxQkFBcUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRixDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsSUFBZTtRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNO1FBQ1QsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDbEIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsT0FBTyxFQUFFLDZCQUE2QjtnQkFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQzFCLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzt3R0E3RFEsK0JBQStCLDhDQXFCcEIsZUFBZTs0RkFyQjFCLCtCQUErQixzREFKN0IsQ0FBQztnQkFDUixPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSw0QkFBNEI7YUFDbkUsQ0FBQywwQkNqQk4sbXZEQStCQTs7NEZEWmEsK0JBQStCO2tCQVIzQyxTQUFTOytCQUNJLDZCQUE2QixhQUc1QixDQUFDOzRCQUNSLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLDRCQUE0Qjt5QkFDbkUsQ0FBQzs7MEJBdUJXLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJbXBlcnNvbmF0aW9uVXNlckxpc3RTZXJ2aWNlLFxuICAgIFByb2Nlc3NSb2xlLFxuICAgIFVzZXJMaXN0SW5qZWN0ZWREYXRhLFxuICAgIFVzZXJMaXN0U2VydmljZSxcbiAgICBVc2VyVmFsdWVcbn0gZnJvbSAnQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmMtYWRtaW4taW1wZXJzb25hdGUtZGlhbG9nJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWRtaW4taW1wZXJzb25hdGUtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hZG1pbi1pbXBlcnNvbmF0ZS1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFt7XG4gICAgICAgIHByb3ZpZGU6IFVzZXJMaXN0U2VydmljZSwgdXNlQ2xhc3M6IEltcGVyc29uYXRpb25Vc2VyTGlzdFNlcnZpY2VcbiAgICB9XVxufSlcbmV4cG9ydCBjbGFzcyBBZG1pbkltcGVyc29uYXRlRGlhbG9nQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBGb3JtIGNvbnRyb2wgZm9yIHVzZXIgc2VhcmNoIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWFyY2hVc2VyQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuXG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBwcmVzZWxlY3RlZCB1c2VyIHNlbmQgZnJvbSBbVXNlckZpZWxkQ29tcG9uZW50XXtAbGluayBBYnN0cmFjdFVzZXJGaWVsZENvbXBvbmVudH0uXG4gICAgICovXG4gICAgcHVibGljIGluamVjdGVkRGF0YTogVXNlckxpc3RJbmplY3RlZERhdGE7XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiB0aGUgY3VycmVudCBzZWxlY3RlZCB1c2VyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY3VycmVudFVzZXI6IFVzZXJWYWx1ZTtcblxuICAgIC8qKlxuICAgICAqIEluamVjdCBhbmQgc2V0IGRhdGEgc2VuZCBmcm9tIFtVc2VyRmllbGRDb21wb25lbnRde0BsaW5rIEFic3RyYWN0VXNlckZpZWxkQ29tcG9uZW50fSBpZiB0aGUgdXNlciBpcyBwcmVzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gX3NpZGVNZW51Q29udHJvbCBDb250YWlucyBbUm9sZXNde0BsaW5rIFByb2Nlc3NSb2xlfSBhbmQgW1VzZXJWYWx1ZV17QGxpbmsgVXNlclZhbHVlfS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFkbWluSW1wZXJzb25hdGVEaWFsb2dDb21wb25lbnQ+LFxuICAgICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcm90ZWN0ZWQgX2RhdGE6IFVzZXJMaXN0SW5qZWN0ZWREYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmluamVjdGVkRGF0YSA9IHRoaXMuX2RhdGEgYXMgVXNlckxpc3RJbmplY3RlZERhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0aGF0IGlzIGluaXRpYWxseSBzZWxlY3RlZCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSBpc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5pdGlhbGx5U2VsZWN0ZWRVc2VyKCk6IFVzZXJWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdGVkRGF0YSA/IHRoaXMuaW5qZWN0ZWREYXRhLnZhbHVlIGFzIFVzZXJWYWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvbGVzKCk6IEFycmF5PHN0cmluZz4gfCBBcnJheTxQcm9jZXNzUm9sZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RlZERhdGEgPyB0aGlzLmluamVjdGVkRGF0YS5yb2xlcyA6IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmVnYXRpdmVSb2xlcygpOiBBcnJheTxzdHJpbmc+IHwgQXJyYXk8UHJvY2Vzc1JvbGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0ZWREYXRhID8gdGhpcy5pbmplY3RlZERhdGEubmVnYXRpdmVSb2xlcyA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIHNlbGVjdCB1c2VyIGZyb20gdXNlcnMgYXNzaWduIGxpc3QgcHVibGlzaCBzaWRlIG1lbnUgd2l0aCBzZWxlY3RlZCB1c2VyIGFzIGRhdGEgYW5kIG1lc3NhZ2UgYWJvdXQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB1c2VyIFNlbGVjdCBjdXJyZW50IHVzZXIgYXMgW1VzZXJWYWx1ZV17QGxpbmsgVXNlclZhbHVlfVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyV2FzU2VsZWN0ZWQodXNlcjogVXNlclZhbHVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRVc2VyID0gdXNlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBhc3NpZ24gYnV0dG9uIGNsb3NlIHNpZGUgbWVudSB3aXRoIHNlbGVjdGVkIHVzZXIgYXMgZGF0YSBhbmQgbWVzc2FnZSBhYm91dCBjb25maXJtLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NpZ24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VXNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2Uoe1xuICAgICAgICAgICAgICAgIG9wZW5lZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1NlbGVjdGVkIHVzZXIgd2FzIGNvbmZpcm1lZCcsXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5fY3VycmVudFVzZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctdGl0bGVcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgbm9uZVwiPlxuICAgIHt7ICdzaWRlLW1lbnUuaW1wZXJzb25hdGlvbi50aXRsZScgfCB0cmFuc2xhdGUgIH19XG48L2Rpdj5cbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50IGZ4TGF5b3V0QWxpZ249XCJzdGFydCBzdHJldGNoXCIgY2xhc3M9XCJoZWlnaHQtZml4XCI+XG4gICAgPGRpdiBjbGFzcz1cInVzZXItYXNzaWduLWNvbnRhaW5lciBzaWRlLW1lbnUtcm9vdFwiIGZ4RmxleCBmeExheW91dD1cImNvbHVtblwiPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGNsYXNzPVwibmV0Z3JpZi1pbnB1dCBuZXRncmlmLWlucHV0LWZpeFwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEwMFwiIGNsYXNzPVwidXNlci1hc3NpZ24tc2VhcmNoXCIgY29sb3I9XCJwcmltYXJ5XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0UHJlZml4IGNsYXNzPVwicHJlZml4LWljb25cIj5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cInt7ICdzaWRlLW1lbnUudXNlci5jaG9vc2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaFVzZXJDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKm5nSWY9XCJzZWFyY2hVc2VyQ29udHJvbC52YWx1ZVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hVc2VyQ29udHJvbC5zZXRWYWx1ZSgnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuYy1hZG1pbi1pbXBlcnNvbmF0ZS1saXN0IGZ4RmxleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoVXNlckNvbnRyb2xdPVwic2VhcmNoVXNlckNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm9sZXNdPVwicm9sZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmVnYXRpdmVSb2xlc109XCJuZWdhdGl2ZVJvbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luaXRpYWxseVNlbGVjdGVkVXNlcl09XCJpbml0aWFsbHlTZWxlY3RlZFVzZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlclNlbGVjdGVkKT1cInVzZXJXYXNTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICAgIDwvbmMtYWRtaW4taW1wZXJzb25hdGUtbGlzdD5cblxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFzc2lnbigpXCI+e3sgJ3NpZGUtbWVudS5pbXBlcnNvbmF0aW9uLnN1Ym1pdCcgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==