@alfresco/adf-content-services
Version:
Alfresco ADF content services
116 lines • 26.8 kB
JavaScript
/*!
* @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, Inject, Optional, ViewEncapsulation } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
import { differenceInSeconds } from 'date-fns';
import { NodesApi } from '@alfresco/js-api';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatDatetimepickerModule } from '@mat-datetimepicker/core';
import { MatInputModule } from '@angular/material/input';
import { MatButtonModule } from '@angular/material/button';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/material/dialog";
import * as i3 from "../../services/alfresco-api.service";
import * as i4 from "@angular/common";
import * as i5 from "@ngx-translate/core";
import * as i6 from "@angular/material/checkbox";
import * as i7 from "@angular/material/form-field";
import * as i8 from "@mat-datetimepicker/core";
import * as i9 from "@angular/material/input";
import * as i10 from "@angular/material/button";
export class NodeLockDialogComponent {
get nodesApi() {
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApi.getInstance());
return this._nodesApi;
}
constructor(formBuilder, dialog, alfrescoApi, data) {
this.formBuilder = formBuilder;
this.dialog = dialog;
this.alfrescoApi = alfrescoApi;
this.data = data;
this.node = null;
}
ngOnInit() {
const { node } = this.data;
this.nodeName = node.name;
const isTimeLock = !!node.properties['cm:expiryDate'];
const time = isTimeLock ? new Date(node.properties['cm:expiryDate']) : new Date();
this.form = this.formBuilder.group({
isLocked: !!node.properties['cm:lockType'] || node.isLocked,
allowOwner: node.properties['cm:lockType'] === 'WRITE_LOCK',
isTimeLock,
time
});
}
get lockTimeInSeconds() {
if (this.form.value.isTimeLock) {
return differenceInSeconds(new Date(this.form.value.time), Date.now());
}
return 0;
}
get nodeBodyLock() {
return {
timeToExpire: this.lockTimeInSeconds,
type: this.form.value.allowOwner ? 'ALLOW_OWNER_CHANGES' : 'FULL',
lifetime: 'PERSISTENT'
};
}
toggleLock() {
const { data: { node } } = this;
if (this.form.value.isLocked) {
return this.nodesApi.lockNode(node.id, this.nodeBodyLock);
}
return this.nodesApi.unlockNode(node.id);
}
submit() {
this.toggleLock()
.then((node) => {
this.data.node.isLocked = this.form.value.isLocked;
this.data.node.properties = node.entry.properties;
this.dialog.close(node.entry);
})
.catch((error) => this.data.onError(error));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeLockDialogComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.MatDialogRef }, { token: i3.AlfrescoApiService }, { token: MAT_DIALOG_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: NodeLockDialogComponent, isStandalone: true, selector: "adf-node-lock", ngImport: i0, template: "<h2 mat-dialog-title>\n {{ 'CORE.FILE_DIALOG.FILE_LOCK' | translate }}\n</h2>\n\n<mat-dialog-content>\n <br />\n <form [formGroup]=\"form\" (submit)=\"submit()\">\n <mat-checkbox data-automation-id=\"adf-lock-node-checkbox\" class=\"adf-lock-file-name\" [title]=\"nodeName\" [formControlName]=\"'isLocked'\" ngDefaultControl>\n {{ 'CORE.FILE_DIALOG.FILE_LOCK_CHECKBOX' | translate }} <strong>\"{{ nodeName }}\"</strong>\n </mat-checkbox>\n\n <br />\n\n <div *ngIf=\"form.value?.isLocked\">\n <mat-checkbox class=\"adf-lock-file-name\" [formControlName]=\"'allowOwner'\" ngDefaultControl>\n {{ 'CORE.FILE_DIALOG.ALLOW_OTHERS_CHECKBOX' | translate }}\n </mat-checkbox>\n\n <br />\n\n <mat-checkbox class=\"adf-lock-file-name\" [formControlName]=\"'isTimeLock'\" ngDefaultControl>\n {{ 'CORE.FILE_DIALOG.TIME_LOCK_CHECKBOX' | translate }}\n </mat-checkbox>\n\n <br />\n\n <mat-form-field *ngIf=\"form.value?.isTimeLock\">\n <mat-datetimepicker-toggle [for]=\"datetimePicker\" matSuffix />\n <mat-datetimepicker #datetimePicker type=\"datetime\" [openOnFocus]=\"true\" [timeInterval]=\"1\" />\n <input matInput [formControlName]=\"'time'\" [matDatetimepicker]=\"datetimePicker\" required autocomplete=\"false\">\n </mat-form-field>\n </div>\n </form>\n <br />\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"adf-dialog-buttons\">\n <span class=\"adf-fill-remaining-space\"></span>\n\n <button mat-button mat-dialog-close data-automation-id=\"lock-dialog-btn-cancel\">\n {{ 'CORE.FILE_DIALOG.CANCEL_BUTTON.LABEL' | translate }}\n </button>\n\n <button class=\"adf-dialog-action-button\" mat-button (click)=\"submit()\">\n {{ 'CORE.FILE_DIALOG.SAVE_BUTTON.LABEL' | translate }}\n </button>\n</mat-dialog-actions>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatDatetimepickerModule }, { kind: "component", type: i8.MatDatetimepickerComponent, selector: "mat-datetimepicker", inputs: ["multiYearSelector", "twelvehour", "startView", "mode", "timeInterval", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "preventSameDateTimeSelection", "panelClass", "startAt", "openOnFocus", "type", "touchUi", "disabled"], outputs: ["selectedChanged", "opened", "closed", "viewChanged"], exportAs: ["matDatetimepicker"] }, { kind: "component", type: i8.MatDatetimepickerToggleComponent, selector: "mat-datetimepicker-toggle", inputs: ["for", "disabled"], exportAs: ["matDatetimepickerToggle"] }, { kind: "directive", type: i8.MatDatetimepickerInputDirective, selector: "input[matDatetimepicker]", inputs: ["matDatetimepicker", "matDatepickerFilter", "value", "min", "max", "disabled"], outputs: ["dateChange", "dateInput"], exportAs: ["matDatepickerInput"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i9.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: "ngmodule", type: MatButtonModule }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeLockDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-node-lock', standalone: true, imports: [
CommonModule,
TranslateModule,
MatDialogModule,
ReactiveFormsModule,
MatCheckboxModule,
MatFormFieldModule,
MatDatetimepickerModule,
MatInputModule,
MatButtonModule
], encapsulation: ViewEncapsulation.None, template: "<h2 mat-dialog-title>\n {{ 'CORE.FILE_DIALOG.FILE_LOCK' | translate }}\n</h2>\n\n<mat-dialog-content>\n <br />\n <form [formGroup]=\"form\" (submit)=\"submit()\">\n <mat-checkbox data-automation-id=\"adf-lock-node-checkbox\" class=\"adf-lock-file-name\" [title]=\"nodeName\" [formControlName]=\"'isLocked'\" ngDefaultControl>\n {{ 'CORE.FILE_DIALOG.FILE_LOCK_CHECKBOX' | translate }} <strong>\"{{ nodeName }}\"</strong>\n </mat-checkbox>\n\n <br />\n\n <div *ngIf=\"form.value?.isLocked\">\n <mat-checkbox class=\"adf-lock-file-name\" [formControlName]=\"'allowOwner'\" ngDefaultControl>\n {{ 'CORE.FILE_DIALOG.ALLOW_OTHERS_CHECKBOX' | translate }}\n </mat-checkbox>\n\n <br />\n\n <mat-checkbox class=\"adf-lock-file-name\" [formControlName]=\"'isTimeLock'\" ngDefaultControl>\n {{ 'CORE.FILE_DIALOG.TIME_LOCK_CHECKBOX' | translate }}\n </mat-checkbox>\n\n <br />\n\n <mat-form-field *ngIf=\"form.value?.isTimeLock\">\n <mat-datetimepicker-toggle [for]=\"datetimePicker\" matSuffix />\n <mat-datetimepicker #datetimePicker type=\"datetime\" [openOnFocus]=\"true\" [timeInterval]=\"1\" />\n <input matInput [formControlName]=\"'time'\" [matDatetimepicker]=\"datetimePicker\" required autocomplete=\"false\">\n </mat-form-field>\n </div>\n </form>\n <br />\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"adf-dialog-buttons\">\n <span class=\"adf-fill-remaining-space\"></span>\n\n <button mat-button mat-dialog-close data-automation-id=\"lock-dialog-btn-cancel\">\n {{ 'CORE.FILE_DIALOG.CANCEL_BUTTON.LABEL' | translate }}\n </button>\n\n <button class=\"adf-dialog-action-button\" mat-button (click)=\"submit()\">\n {{ 'CORE.FILE_DIALOG.SAVE_BUTTON.LABEL' | translate }}\n </button>\n</mat-dialog-actions>\n" }]
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.MatDialogRef }, { type: i3.AlfrescoApiService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [MAT_DIALOG_DATA]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2NrLmRpYWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZGlhbG9ncy9ub2RlLWxvY2svbm9kZS1sb2NrLmRpYWxvZy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZGlhbG9ncy9ub2RlLWxvY2svbm9kZS1sb2NrLmRpYWxvZy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9DLE9BQU8sRUFBaUMsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFB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SSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQzs4R0F2RVEsdUJBQXVCLGtIQWdCcEIsZUFBZTtrR0FoQmxCLHVCQUF1Qix5RUNoRHBDLGs3REErQ0EsMkNEWlEsWUFBWSxrSUFDWixlQUFlLDJGQUNmLGVBQWUsK25CQUNmLG1CQUFtQix5cUNBQ25CLGlCQUFpQiw2V0FDakIsa0JBQWtCLDBXQUNsQix1QkFBdUIsZzZCQUN2QixjQUFjLDBXQUNkLGVBQWU7OzJGQUtWLHVCQUF1QjtrQkFqQm5DLFNBQVM7K0JBQ0ksZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQix1QkFBdUI7d0JBQ3ZCLGNBQWM7d0JBQ2QsZUFBZTtxQkFDbEIsaUJBRWMsaUJBQWlCLENBQUMsSUFBSTs7MEJBaUJoQyxRQUFROzswQkFDUixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQsIE9wdGlvbmFsLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5TZWNvbmRzIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgTm9kZUJvZHlMb2NrLCBOb2RlLCBOb2RlRW50cnksIE5vZGVzQXBpIH0gZnJvbSAnQGFsZnJlc2NvL2pzLWFwaSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0RGF0ZXRpbWVwaWNrZXJNb2R1bGUgfSBmcm9tICdAbWF0LWRhdGV0aW1lcGlja2VyL2NvcmUnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgQWxmcmVzY29BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWxmcmVzY28tYXBpLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1ub2RlLWxvY2snLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgTWF0RGlhbG9nTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXREYXRldGltZXBpY2tlck1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZVxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL25vZGUtbG9jay5kaWFsb2cuaHRtbCcsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlTG9ja0RpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgICBub2RlOiBOb2RlID0gbnVsbDtcbiAgICBub2RlTmFtZTogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBfbm9kZXNBcGk6IE5vZGVzQXBpO1xuICAgIGdldCBub2Rlc0FwaSgpOiBOb2Rlc0FwaSB7XG4gICAgICAgIHRoaXMuX25vZGVzQXBpID0gdGhpcy5fbm9kZXNBcGkgPz8gbmV3IE5vZGVzQXBpKHRoaXMuYWxmcmVzY29BcGkuZ2V0SW5zdGFuY2UoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub2Rlc0FwaTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgICAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2dSZWY8Tm9kZUxvY2tEaWFsb2dDb21wb25lbnQ+LFxuICAgICAgICBwcml2YXRlIGFsZnJlc2NvQXBpOiBBbGZyZXNjb0FwaVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKVxuICAgICAgICBwdWJsaWMgZGF0YTogYW55XG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHsgbm9kZSB9ID0gdGhpcy5kYXRhO1xuICAgICAgICB0aGlzLm5vZGVOYW1lID0gbm9kZS5uYW1lO1xuXG4gICAgICAgIGNvbnN0IGlzVGltZUxvY2sgPSAhIW5vZGUucHJvcGVydGllc1snY206ZXhwaXJ5RGF0ZSddO1xuICAgICAgICBjb25zdCB0aW1lID0gaXNUaW1lTG9jayA/IG5ldyBEYXRlKG5vZGUucHJvcGVydGllc1snY206ZXhwaXJ5RGF0ZSddKSA6IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBpc0xvY2tlZDogISFub2RlLnByb3BlcnRpZXNbJ2NtOmxvY2tUeXBlJ10gfHwgbm9kZS5pc0xvY2tlZCxcbiAgICAgICAgICAgIGFsbG93T3duZXI6IG5vZGUucHJvcGVydGllc1snY206bG9ja1R5cGUnXSA9PT0gJ1dSSVRFX0xPQ0snLFxuICAgICAgICAgICAgaXNUaW1lTG9jayxcbiAgICAgICAgICAgIHRpbWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbG9ja1RpbWVJblNlY29uZHMoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybS52YWx1ZS5pc1RpbWVMb2NrKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlmZmVyZW5jZUluU2Vjb25kcyhuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUudGltZSksIERhdGUubm93KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbm9kZUJvZHlMb2NrKCk6IE5vZGVCb2R5TG9jayB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aW1lVG9FeHBpcmU6IHRoaXMubG9ja1RpbWVJblNlY29uZHMsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLmZvcm0udmFsdWUuYWxsb3dPd25lciA/ICdBTExPV19PV05FUl9DSEFOR0VTJyA6ICdGVUxMJyxcbiAgICAgICAgICAgIGxpZmV0aW1lOiAnUEVSU0lTVEVOVCdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUxvY2soKTogUHJvbWlzZTxOb2RlRW50cnk+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZGF0YTogeyBub2RlIH1cbiAgICAgICAgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybS52YWx1ZS5pc0xvY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNBcGkubG9ja05vZGUobm9kZS5pZCwgdGhpcy5ub2RlQm9keUxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNBcGkudW5sb2NrTm9kZShub2RlLmlkKTtcbiAgICB9XG5cbiAgICBzdWJtaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlTG9jaygpXG4gICAgICAgICAgICAudGhlbigobm9kZTogTm9kZUVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5vZGUuaXNMb2NrZWQgPSB0aGlzLmZvcm0udmFsdWUuaXNMb2NrZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5vZGUucHJvcGVydGllcyA9IG5vZGUuZW50cnkucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5jbG9zZShub2RlLmVudHJ5KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBhbnkpID0+IHRoaXMuZGF0YS5vbkVycm9yKGVycm9yKSk7XG4gICAgfVxufVxuIiwiPGgyIG1hdC1kaWFsb2ctdGl0bGU+XG4gICAge3sgJ0NPUkUuRklMRV9ESUFMT0cuRklMRV9MT0NLJyB8IHRyYW5zbGF0ZSB9fVxuPC9oMj5cblxuPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8YnIgLz5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgICAgIDxtYXQtY2hlY2tib3ggIGRhdGEtYXV0b21hdGlvbi1pZD1cImFkZi1sb2NrLW5vZGUtY2hlY2tib3hcIiBjbGFzcz1cImFkZi1sb2NrLWZpbGUtbmFtZVwiIFt0aXRsZV09XCJub2RlTmFtZVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2lzTG9ja2VkJ1wiIG5nRGVmYXVsdENvbnRyb2w+XG4gICAgICAgICAgICB7eyAnQ09SRS5GSUxFX0RJQUxPRy5GSUxFX0xPQ0tfQ0hFQ0tCT1gnIHwgdHJhbnNsYXRlIH19IDxzdHJvbmc+XCJ7eyBub2RlTmFtZSB9fVwiPC9zdHJvbmc+XG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxuXG4gICAgICAgIDxiciAvPlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtLnZhbHVlPy5pc0xvY2tlZFwiPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cImFkZi1sb2NrLWZpbGUtbmFtZVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2FsbG93T3duZXInXCIgbmdEZWZhdWx0Q29udHJvbD5cbiAgICAgICAgICAgICAgICB7eyAnQ09SRS5GSUxFX0RJQUxPRy5BTExPV19PVEhFUlNfQ0hFQ0tCT1gnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cblxuICAgICAgICAgICAgPGJyIC8+XG5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XCJhZGYtbG9jay1maWxlLW5hbWVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIidpc1RpbWVMb2NrJ1wiIG5nRGVmYXVsdENvbnRyb2w+XG4gICAgICAgICAgICAgICAge3sgJ0NPUkUuRklMRV9ESUFMT0cuVElNRV9MT0NLX0NIRUNLQk9YJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG5cbiAgICAgICAgICAgIDxiciAvPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmb3JtLnZhbHVlPy5pc1RpbWVMb2NrXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1kYXRldGltZXBpY2tlci10b2dnbGUgW2Zvcl09XCJkYXRldGltZVBpY2tlclwiIG1hdFN1ZmZpeCAvPlxuICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXRpbWVwaWNrZXIgI2RhdGV0aW1lUGlja2VyIHR5cGU9XCJkYXRldGltZVwiIFtvcGVuT25Gb2N1c109XCJ0cnVlXCIgW3RpbWVJbnRlcnZhbF09XCIxXCIgLz5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCIndGltZSdcIiBbbWF0RGF0ZXRpbWVwaWNrZXJdPVwiZGF0ZXRpbWVQaWNrZXJcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJmYWxzZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICAgIDxiciAvPlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgY2xhc3M9XCJhZGYtZGlhbG9nLWJ1dHRvbnNcIj5cbiAgICA8c3BhbiBjbGFzcz1cImFkZi1maWxsLXJlbWFpbmluZy1zcGFjZVwiPjwvc3Bhbj5cblxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGRhdGEtYXV0b21hdGlvbi1pZD1cImxvY2stZGlhbG9nLWJ0bi1jYW5jZWxcIj5cbiAgICAgICAge3sgJ0NPUkUuRklMRV9ESUFMT0cuQ0FOQ0VMX0JVVFRPTi5MQUJFTCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b24gY2xhc3M9XCJhZGYtZGlhbG9nLWFjdGlvbi1idXR0b25cIiBtYXQtYnV0dG9uIChjbGljayk9XCJzdWJtaXQoKVwiPlxuICAgICAgICB7eyAnQ09SRS5GSUxFX0RJQUxPRy5TQVZFX0JVVFRPTi5MQUJFTCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19