UNPKG

@alfresco/adf-content-services

Version:
103 lines 31.2 kB
/*! * @license * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { Node } from '@alfresco/js-api'; import { CommonModule } from '@angular/common'; import { DataColumnComponent, DataColumnListComponent, DataTableComponent, DateColumnHeaderComponent, EmptyContentComponent, NoContentTemplateDirective } from '@alfresco/adf-core'; import { TranslateModule } from '@ngx-translate/core'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { UserIconColumnComponent } from '../user-icon-column/user-icon-column.component'; import { UserNameColumnComponent } from '../user-name-column/user-name-column.component'; import { NodePathColumnComponent } from '../node-path-column/node-path-column.component'; import { UserRoleColumnComponent } from '../user-role-column/user-role-column.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@ngx-translate/core"; import * as i3 from "@angular/material/button"; import * as i4 from "@angular/material/icon"; export class PermissionContainerComponent { constructor() { this.permissions = []; this.isReadOnly = false; this.showLocation = false; this.selectionMode = 'multiple'; // none|single|multiple /** Emitted when the permission is updated. */ this.update = new EventEmitter(); this.updateAll = new EventEmitter(); /** Emitted when the permission is updated. */ this.delete = new EventEmitter(); /** Emitted when an error occurs. */ this.error = new EventEmitter(); } ngOnChanges() { this.bulkSelectionRole = ''; } updateRole(role, permission) { this.update.emit({ role, permission }); } bulkRoleUpdate(role) { this.updateAll.emit(role); } removePermission(event, permissionRow) { event.stopPropagation(); this.delete.emit(permissionRow); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PermissionContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: PermissionContainerComponent, isStandalone: true, selector: "adf-permission-container", inputs: { node: "node", permissions: "permissions", roles: "roles", isReadOnly: "isReadOnly", showLocation: "showLocation", selectionMode: "selectionMode" }, outputs: { update: "update", updateAll: "updateAll", delete: "delete", error: "error" }, usesOnChanges: true, ngImport: i0, template: "<adf-datatable class=\"adf-datatable-permission\"\n id=\"adf-permission-display-container\"\n [rows]=\"permissions\"\n [stickyHeader]=\"true\"\n [selectionMode]=\"selectionMode\">\n\n <data-columns>\n <data-column class=\"adf-datatable-cell--image adf-authority-icon-column\" key=\"$thumbunail\" [sortable]=\"false\">\n <ng-template let-context>\n <adf-user-icon-column [context]=\"context\" />\n </ng-template>\n </data-column>\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-5 adf-authorityId-column\"\n [title]=\"'PERMISSION_MANAGER.COLUMN.NAME' | translate:{count:permissions.length}\"\n key=\"authorityId\">\n <ng-template let-context>\n <adf-user-name-column [context]=\"context\" />\n </ng-template>\n </data-column>d\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-5 adf-authorityId-column\"\n title=\"PERMISSION_MANAGER.COLUMN.LOCATION\"\n key=\"location\"\n *ngIf=\"node && showLocation\">\n <ng-template>\n <adf-node-path-column [node]=\"node\" />\n </ng-template>\n </data-column>\n\n <data-column\n class=\"adf-ellipsis-cell adf-expand-cell-4\"\n title=\"PERMISSION_MANAGER.PERMISSION_DISPLAY.ROLE\"\n key=\"name\"\n [sortable]=\"false\">\n <ng-template let-entry=\"$implicit\">\n <adf-user-role-column [readonly]=\"entry.row.obj.readonly || isReadOnly\"\n [placeholder]=\"entry.data.getValue(entry.row, entry.col)\"\n [value]=\"entry.data.getValue(entry.row, entry.col)\"\n [roles]=\"roles\"\n id=\"adf-select-role-permission\"\n (roleChanged)=\"updateRole($event, entry.row.obj)\" />\n </ng-template>\n\n <adf-data-column-header *ngIf=\"!isReadOnly\">\n <ng-template>\n <adf-user-role-column class=\"adf-permission-role-column-header\"\n placeholder=\"PERMISSION_MANAGER.COLUMN.BULK-ROLE\"\n [roles]=\"roles\"\n [value]=\"bulkSelectionRole\"\n id=\"adf-bulk-select-role-permission\"\n (roleChanged)=\"bulkRoleUpdate($event)\" />\n </ng-template>\n </adf-data-column-header>\n </data-column>\n\n <data-column class=\"adf-datatable-cell adf-delete-permission-column\" key=\"\" *ngIf=\"!isReadOnly\" [sortable]=\"false\">\n <ng-template let-entry=\"$implicit\">\n <button mat-icon-button\n [disabled]=\"entry.row.obj.readonly\"\n (click)=\"removePermission($event, entry.row.obj)\"\n (keydown.enter)=\"removePermission($event, entry.row.obj)\"\n [attr.data-automation-id]=\"'adf-delete-permission-button-' + entry.row.obj.authorityId\"\n [attr.aria-label]=\"'PERMISSION_MANAGER.ACTION.DELETE' | translate\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n </ng-template>\n </data-column>\n </data-columns>\n\n <adf-no-content-template>\n <ng-template>\n <adf-empty-content\n id=\"adf-no-permissions-template\"\n icon=\"supervisor_account\"\n [title]=\"'PERMISSION_MANAGER.MESSAGE.EMPTY-PERMISSION' | translate\"\n [subtitle]=\"'PERMISSION_MANAGER.MESSAGE.EMPTY-SUBTITLE' | translate\" />\n </ng-template>\n </adf-no-content-template>\n\n</adf-datatable>\n", styles: [".adf-datatable-permission{display:flex;min-width:450px;width:100%}.adf-datatable-permission.adf-datatable{overflow:hidden}.adf-datatable-permission.adf-datatable .adf-datatable-row .adf-permission-role-column-header{position:relative}.adf-datatable-permission.adf-datatable .adf-delete-permission-column{min-width:80px}.adf-datatable-permission.adf-datatable .adf-delete-permission-column .adf-cell-value{width:80px;padding-right:10px;place-content:flex-end}.adf-datatable-permission.adf-datatable .adf-authorityId-column{flex:40%}.adf-datatable-permission.adf-datatable .adf-authority-icon-column{min-width:40px}.adf-datatable-permission.adf-datatable .adf-authority-icon-column .adf-datatable-cell-container{padding:0}.adf-datatable-permission.adf-datatable .adf-datatable-selected>svg{width:40px;height:40px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DataTableComponent, selector: "adf-datatable", inputs: ["data", "rows", "sorting", "columns", "selectionMode", "multiselect", "mainTableAction", "actions", "showMainDatatableActions", "showProvidedActions", "actionsPosition", "actionsVisibleOnHover", "fallbackThumbnail", "contextMenu", "rowStyle", "rowStyleClass", "showHeader", "stickyHeader", "loading", "noPermission", "rowMenuCacheEnabled", "resolverFn", "allowFiltering", "isResizingEnabled", "blurOnResize", "displayCheckboxesOnHover", "enableDragRows"], outputs: ["rowClick", "rowDblClick", "showRowContextMenu", "showRowActionsMenu", "executeRowAction", "columnOrderChanged", "columnsWidthChanged", "selectedItemsCountChanged", "dragDropped"] }, { kind: "component", type: DataColumnListComponent, selector: "data-columns" }, { kind: "component", type: DataColumnComponent, selector: "data-column", inputs: ["id", "key", "customData", "type", "format", "sortable", "draggable", "resizable", "isHidden", "title", "subtitle", "formatTooltip", "sr-title", "class", "copyContent", "editable", "focus", "sortingKey", "order", "currencyConfig", "decimalConfig", "dateConfig"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: DateColumnHeaderComponent, selector: "adf-data-column-header" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NoContentTemplateDirective, selector: "adf-no-content-template, no-content-template" }, { kind: "component", type: EmptyContentComponent, selector: "adf-empty-content", inputs: ["icon", "title", "subtitle"] }, { kind: "component", type: UserIconColumnComponent, selector: "adf-user-icon-column", inputs: ["context", "node", "selected"] }, { kind: "component", type: UserNameColumnComponent, selector: "adf-user-name-column", inputs: ["context", "node"] }, { kind: "component", type: NodePathColumnComponent, selector: "adf-node-path-column", inputs: ["node"] }, { kind: "component", type: UserRoleColumnComponent, selector: "adf-user-role-column", inputs: ["roles", "value", "readonly", "placeholder"], outputs: ["roleChanged"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PermissionContainerComponent, decorators: [{ type: Component, args: [{ selector: 'adf-permission-container', standalone: true, imports: [ CommonModule, DataTableComponent, DataColumnListComponent, DataColumnComponent, TranslateModule, DateColumnHeaderComponent, MatButtonModule, MatIconModule, NoContentTemplateDirective, EmptyContentComponent, UserIconColumnComponent, UserNameColumnComponent, NodePathColumnComponent, UserRoleColumnComponent ], encapsulation: ViewEncapsulation.None, template: "<adf-datatable class=\"adf-datatable-permission\"\n id=\"adf-permission-display-container\"\n [rows]=\"permissions\"\n [stickyHeader]=\"true\"\n [selectionMode]=\"selectionMode\">\n\n <data-columns>\n <data-column class=\"adf-datatable-cell--image adf-authority-icon-column\" key=\"$thumbunail\" [sortable]=\"false\">\n <ng-template let-context>\n <adf-user-icon-column [context]=\"context\" />\n </ng-template>\n </data-column>\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-5 adf-authorityId-column\"\n [title]=\"'PERMISSION_MANAGER.COLUMN.NAME' | translate:{count:permissions.length}\"\n key=\"authorityId\">\n <ng-template let-context>\n <adf-user-name-column [context]=\"context\" />\n </ng-template>\n </data-column>d\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-5 adf-authorityId-column\"\n title=\"PERMISSION_MANAGER.COLUMN.LOCATION\"\n key=\"location\"\n *ngIf=\"node && showLocation\">\n <ng-template>\n <adf-node-path-column [node]=\"node\" />\n </ng-template>\n </data-column>\n\n <data-column\n class=\"adf-ellipsis-cell adf-expand-cell-4\"\n title=\"PERMISSION_MANAGER.PERMISSION_DISPLAY.ROLE\"\n key=\"name\"\n [sortable]=\"false\">\n <ng-template let-entry=\"$implicit\">\n <adf-user-role-column [readonly]=\"entry.row.obj.readonly || isReadOnly\"\n [placeholder]=\"entry.data.getValue(entry.row, entry.col)\"\n [value]=\"entry.data.getValue(entry.row, entry.col)\"\n [roles]=\"roles\"\n id=\"adf-select-role-permission\"\n (roleChanged)=\"updateRole($event, entry.row.obj)\" />\n </ng-template>\n\n <adf-data-column-header *ngIf=\"!isReadOnly\">\n <ng-template>\n <adf-user-role-column class=\"adf-permission-role-column-header\"\n placeholder=\"PERMISSION_MANAGER.COLUMN.BULK-ROLE\"\n [roles]=\"roles\"\n [value]=\"bulkSelectionRole\"\n id=\"adf-bulk-select-role-permission\"\n (roleChanged)=\"bulkRoleUpdate($event)\" />\n </ng-template>\n </adf-data-column-header>\n </data-column>\n\n <data-column class=\"adf-datatable-cell adf-delete-permission-column\" key=\"\" *ngIf=\"!isReadOnly\" [sortable]=\"false\">\n <ng-template let-entry=\"$implicit\">\n <button mat-icon-button\n [disabled]=\"entry.row.obj.readonly\"\n (click)=\"removePermission($event, entry.row.obj)\"\n (keydown.enter)=\"removePermission($event, entry.row.obj)\"\n [attr.data-automation-id]=\"'adf-delete-permission-button-' + entry.row.obj.authorityId\"\n [attr.aria-label]=\"'PERMISSION_MANAGER.ACTION.DELETE' | translate\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n </ng-template>\n </data-column>\n </data-columns>\n\n <adf-no-content-template>\n <ng-template>\n <adf-empty-content\n id=\"adf-no-permissions-template\"\n icon=\"supervisor_account\"\n [title]=\"'PERMISSION_MANAGER.MESSAGE.EMPTY-PERMISSION' | translate\"\n [subtitle]=\"'PERMISSION_MANAGER.MESSAGE.EMPTY-SUBTITLE' | translate\" />\n </ng-template>\n </adf-no-content-template>\n\n</adf-datatable>\n", styles: [".adf-datatable-permission{display:flex;min-width:450px;width:100%}.adf-datatable-permission.adf-datatable{overflow:hidden}.adf-datatable-permission.adf-datatable .adf-datatable-row .adf-permission-role-column-header{position:relative}.adf-datatable-permission.adf-datatable .adf-delete-permission-column{min-width:80px}.adf-datatable-permission.adf-datatable .adf-delete-permission-column .adf-cell-value{width:80px;padding-right:10px;place-content:flex-end}.adf-datatable-permission.adf-datatable .adf-authorityId-column{flex:40%}.adf-datatable-permission.adf-datatable .adf-authority-icon-column{min-width:40px}.adf-datatable-permission.adf-datatable .adf-authority-icon-column .adf-datatable-cell-container{padding:0}.adf-datatable-permission.adf-datatable .adf-datatable-selected>svg{width:40px;height:40px}\n"] }] }], propDecorators: { node: [{ type: Input, args: [{ required: true }] }], permissions: [{ type: Input }], roles: [{ type: Input }], isReadOnly: [{ type: Input }], showLocation: [{ type: Input }], selectionMode: [{ type: Input }], update: [{ type: Output }], updateAll: [{ type: Output }], delete: [{ type: Output }], error: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9wZXJtaXNzaW9uLW1hbmFnZXIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNvbnRhaW5lci9wZXJtaXNzaW9uLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3Blcm1pc3Npb24tbWFuYWdlci9jb21wb25lbnRzL3Blcm1pc3Npb24tY29udGFpbmVyL3Blcm1pc3Npb24tY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUNyQiwwQkFBMEIsRUFDN0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7O0FBeUJ6RixNQUFNLE9BQU8sNEJBQTRCO0lBdkJ6QztRQTRCSSxnQkFBVyxHQUE2QixFQUFFLENBQUM7UUFNM0MsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUduQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUdyQixrQkFBYSxHQUFHLFVBQVUsQ0FBQyxDQUFDLHVCQUF1QjtRQUVuRCw4Q0FBOEM7UUFFOUMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUF3RCxDQUFDO1FBR2xGLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXZDLDhDQUE4QztRQUU5QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFFcEQsb0NBQW9DO1FBRXBDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0tBb0JuQztJQWhCRyxXQUFXO1FBQ1AsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVksRUFBRSxVQUFrQztRQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBWSxFQUFFLGFBQXFDO1FBQ2hFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwQyxDQUFDOzhHQW5EUSw0QkFBNEI7a0dBQTVCLDRCQUE0QixnV0M3RHpDLHk5SEFpRkEsczJCRHZDUSxZQUFZLG1JQUNaLGtCQUFrQiwwc0JBQ2xCLHVCQUF1Qix5REFDdkIsbUJBQW1CLHVVQUNuQixlQUFlLDRGQUNmLHlCQUF5QixrRUFDekIsZUFBZSwySUFDZixhQUFhLG9MQUNiLDBCQUEwQix5RkFDMUIscUJBQXFCLHFHQUNyQix1QkFBdUIsMEdBQ3ZCLHVCQUF1Qiw4RkFDdkIsdUJBQXVCLG1GQUN2Qix1QkFBdUI7OzJGQU1sQiw0QkFBNEI7a0JBdkJ4QyxTQUFTOytCQUNJLDBCQUEwQixjQUN4QixJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixrQkFBa0I7d0JBQ2xCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLHlCQUF5Qjt3QkFDekIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLDBCQUEwQjt3QkFDMUIscUJBQXFCO3dCQUNyQix1QkFBdUI7d0JBQ3ZCLHVCQUF1Qjt3QkFDdkIsdUJBQXVCO3dCQUN2Qix1QkFBdUI7cUJBQzFCLGlCQUdjLGlCQUFpQixDQUFDLElBQUk7OEJBSXJDLElBQUk7c0JBREgsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBSXpCLFdBQVc7c0JBRFYsS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFlBQVk7c0JBRFgsS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBS04sTUFBTTtzQkFETCxNQUFNO2dCQUlQLFNBQVM7c0JBRFIsTUFBTTtnQkFLUCxNQUFNO3NCQURMLE1BQU07Z0JBS1AsS0FBSztzQkFESixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgUGVybWlzc2lvbkRpc3BsYXlNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9wZXJtaXNzaW9uLm1vZGVsJztcbmltcG9ydCB7IFJvbGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9yb2xlLm1vZGVsJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIERhdGFDb2x1bW5Db21wb25lbnQsXG4gICAgRGF0YUNvbHVtbkxpc3RDb21wb25lbnQsXG4gICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIERhdGVDb2x1bW5IZWFkZXJDb21wb25lbnQsXG4gICAgRW1wdHlDb250ZW50Q29tcG9uZW50LFxuICAgIE5vQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlXG59IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBVc2VySWNvbkNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL3VzZXItaWNvbi1jb2x1bW4vdXNlci1pY29uLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXNlck5hbWVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi91c2VyLW5hbWUtY29sdW1uL3VzZXItbmFtZS1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVQYXRoQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vbm9kZS1wYXRoLWNvbHVtbi9ub2RlLXBhdGgtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVc2VyUm9sZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL3VzZXItcm9sZS1jb2x1bW4vdXNlci1yb2xlLWNvbHVtbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1wZXJtaXNzaW9uLWNvbnRhaW5lcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgICAgICBEYXRhQ29sdW1uTGlzdENvbXBvbmVudCxcbiAgICAgICAgRGF0YUNvbHVtbkNvbXBvbmVudCxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBEYXRlQ29sdW1uSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE5vQ29udGVudFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICBFbXB0eUNvbnRlbnRDb21wb25lbnQsXG4gICAgICAgIFVzZXJJY29uQ29sdW1uQ29tcG9uZW50LFxuICAgICAgICBVc2VyTmFtZUNvbHVtbkNvbXBvbmVudCxcbiAgICAgICAgTm9kZVBhdGhDb2x1bW5Db21wb25lbnQsXG4gICAgICAgIFVzZXJSb2xlQ29sdW1uQ29tcG9uZW50XG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcGVybWlzc2lvbi1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Blcm1pc3Npb24tY29udGFpbmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uQ29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAgIG5vZGU6IE5vZGU7XG5cbiAgICBASW5wdXQoKVxuICAgIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uRGlzcGxheU1vZGVsW10gPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcm9sZXMhOiBSb2xlTW9kZWxbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgaXNSZWFkT25seSA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBzaG93TG9jYXRpb24gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSc7IC8vIG5vbmV8c2luZ2xlfG11bHRpcGxlXG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwZXJtaXNzaW9uIGlzIHVwZGF0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJvbGU6IHN0cmluZzsgcGVybWlzc2lvbjogUGVybWlzc2lvbkRpc3BsYXlNb2RlbCB9PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgdXBkYXRlQWxsID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwZXJtaXNzaW9uIGlzIHVwZGF0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxQZXJtaXNzaW9uRGlzcGxheU1vZGVsPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMuICovXG4gICAgQE91dHB1dCgpXG4gICAgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIGJ1bGtTZWxlY3Rpb25Sb2xlOiBzdHJpbmc7XG5cbiAgICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWxrU2VsZWN0aW9uUm9sZSA9ICcnO1xuICAgIH1cblxuICAgIHVwZGF0ZVJvbGUocm9sZTogc3RyaW5nLCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uRGlzcGxheU1vZGVsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlLmVtaXQoeyByb2xlLCBwZXJtaXNzaW9uIH0pO1xuICAgIH1cblxuICAgIGJ1bGtSb2xlVXBkYXRlKHJvbGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbC5lbWl0KHJvbGUpO1xuICAgIH1cblxuICAgIHJlbW92ZVBlcm1pc3Npb24oZXZlbnQ6IEV2ZW50LCBwZXJtaXNzaW9uUm93OiBQZXJtaXNzaW9uRGlzcGxheU1vZGVsKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmRlbGV0ZS5lbWl0KHBlcm1pc3Npb25Sb3cpO1xuICAgIH1cbn1cbiIsIjxhZGYtZGF0YXRhYmxlIGNsYXNzPVwiYWRmLWRhdGF0YWJsZS1wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgIGlkPVwiYWRmLXBlcm1pc3Npb24tZGlzcGxheS1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgW3Jvd3NdPVwicGVybWlzc2lvbnNcIlxuICAgICAgICAgICAgICAgW3N0aWNreUhlYWRlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIj5cblxuICAgIDxkYXRhLWNvbHVtbnM+XG4gICAgICAgIDxkYXRhLWNvbHVtbiBjbGFzcz1cImFkZi1kYXRhdGFibGUtY2VsbC0taW1hZ2UgYWRmLWF1dGhvcml0eS1pY29uLWNvbHVtblwiIGtleT1cIiR0aHVtYnVuYWlsXCIgW3NvcnRhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWNvbnRleHQ+XG4gICAgICAgICAgICAgICAgPGFkZi11c2VyLWljb24tY29sdW1uIFtjb250ZXh0XT1cImNvbnRleHRcIiAvPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kYXRhLWNvbHVtbj5cblxuICAgICAgICA8ZGF0YS1jb2x1bW4gY2xhc3M9XCJhZGYtZWxsaXBzaXMtY2VsbCBhZGYtZXhwYW5kLWNlbGwtNSBhZGYtYXV0aG9yaXR5SWQtY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUEVSTUlTU0lPTl9NQU5BR0VSLkNPTFVNTi5OQU1FJyB8IHRyYW5zbGF0ZTp7Y291bnQ6cGVybWlzc2lvbnMubGVuZ3RofVwiXG4gICAgICAgICAgICAgICAgICAgICBrZXk9XCJhdXRob3JpdHlJZFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1jb250ZXh0PlxuICAgICAgICAgICAgICAgIDxhZGYtdXNlci1uYW1lLWNvbHVtbiBbY29udGV4dF09XCJjb250ZXh0XCIgLz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGF0YS1jb2x1bW4+ZFxuXG4gICAgICAgIDxkYXRhLWNvbHVtbiBjbGFzcz1cImFkZi1lbGxpcHNpcy1jZWxsIGFkZi1leHBhbmQtY2VsbC01IGFkZi1hdXRob3JpdHlJZC1jb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJQRVJNSVNTSU9OX01BTkFHRVIuQ09MVU1OLkxPQ0FUSU9OXCJcbiAgICAgICAgICAgICAgICAgICAgIGtleT1cImxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibm9kZSAmJiBzaG93TG9jYXRpb25cIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8YWRmLW5vZGUtcGF0aC1jb2x1bW4gW25vZGVdPVwibm9kZVwiIC8+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2RhdGEtY29sdW1uPlxuXG4gICAgICAgIDxkYXRhLWNvbHVtblxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtZWxsaXBzaXMtY2VsbCBhZGYtZXhwYW5kLWNlbGwtNFwiXG4gICAgICAgICAgICB0aXRsZT1cIlBFUk1JU1NJT05fTUFOQUdFUi5QRVJNSVNTSU9OX0RJU1BMQVkuUk9MRVwiXG4gICAgICAgICAgICBrZXk9XCJuYW1lXCJcbiAgICAgICAgICAgIFtzb3J0YWJsZV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1lbnRyeT1cIiRpbXBsaWNpdFwiPlxuICAgICAgICAgICAgICAgIDxhZGYtdXNlci1yb2xlLWNvbHVtbiBbcmVhZG9ubHldPVwiZW50cnkucm93Lm9iai5yZWFkb25seSB8fCBpc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVudHJ5LmRhdGEuZ2V0VmFsdWUoZW50cnkucm93LCBlbnRyeS5jb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImVudHJ5LmRhdGEuZ2V0VmFsdWUoZW50cnkucm93LCBlbnRyeS5jb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGVzXT1cInJvbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZGYtc2VsZWN0LXJvbGUtcGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb2xlQ2hhbmdlZCk9XCJ1cGRhdGVSb2xlKCRldmVudCwgZW50cnkucm93Lm9iailcIiAvPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgPGFkZi1kYXRhLWNvbHVtbi1oZWFkZXIgKm5nSWY9XCIhaXNSZWFkT25seVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGFkZi11c2VyLXJvbGUtY29sdW1uIGNsYXNzPVwiYWRmLXBlcm1pc3Npb24tcm9sZS1jb2x1bW4taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUEVSTUlTU0lPTl9NQU5BR0VSLkNPTFVNTi5CVUxLLVJPTEVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGVzXT1cInJvbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJidWxrU2VsZWN0aW9uUm9sZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFkZi1idWxrLXNlbGVjdC1yb2xlLXBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvbGVDaGFuZ2VkKT1cImJ1bGtSb2xlVXBkYXRlKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2FkZi1kYXRhLWNvbHVtbi1oZWFkZXI+XG4gICAgICAgIDwvZGF0YS1jb2x1bW4+XG5cbiAgICAgICAgPGRhdGEtY29sdW1uIGNsYXNzPVwiYWRmLWRhdGF0YWJsZS1jZWxsIGFkZi1kZWxldGUtcGVybWlzc2lvbi1jb2x1bW5cIiBrZXk9XCJcIiAqbmdJZj1cIiFpc1JlYWRPbmx5XCIgW3NvcnRhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWVudHJ5PVwiJGltcGxpY2l0XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlbnRyeS5yb3cub2JqLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVQZXJtaXNzaW9uKCRldmVudCwgZW50cnkucm93Lm9iailcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlUGVybWlzc2lvbigkZXZlbnQsIGVudHJ5LnJvdy5vYmopXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWRlbGV0ZS1wZXJtaXNzaW9uLWJ1dHRvbi0nICsgZW50cnkucm93Lm9iai5hdXRob3JpdHlJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidQRVJNSVNTSU9OX01BTkFHRVIuQUNUSU9OLkRFTEVURScgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGF0YS1jb2x1bW4+XG4gICAgPC9kYXRhLWNvbHVtbnM+XG5cbiAgICA8YWRmLW5vLWNvbnRlbnQtdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxhZGYtZW1wdHktY29udGVudFxuICAgICAgICAgICAgICAgIGlkPVwiYWRmLW5vLXBlcm1pc3Npb25zLXRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBpY29uPVwic3VwZXJ2aXNvcl9hY2NvdW50XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1BFUk1JU1NJT05fTUFOQUdFUi5NRVNTQUdFLkVNUFRZLVBFUk1JU1NJT04nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbc3VidGl0bGVdPVwiJ1BFUk1JU1NJT05fTUFOQUdFUi5NRVNTQUdFLkVNUFRZLVNVQlRJVExFJyB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9hZGYtbm8tY29udGVudC10ZW1wbGF0ZT5cblxuPC9hZGYtZGF0YXRhYmxlPlxuIl19