@alfresco/adf-content-services
Version:
Alfresco ADF content services
176 lines • 22.7 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 { TranslationService } from '@alfresco/adf-core';
import { FileModel } from '../../../common/models/file.model';
import { UploadService } from '../../../common/services/upload.service';
import { DestroyRef, Directive, EventEmitter, inject, Input, NgZone, Output } from '@angular/core';
import { UploadFilesEvent } from '../upload-files.event';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import * as i0 from "@angular/core";
// eslint-disable-next-line @angular-eslint/directive-class-suffix
export class UploadBase {
constructor() {
this.uploadService = inject(UploadService);
this.translationService = inject(TranslationService);
this.ngZone = inject(NgZone);
/**
* The ID of the root. Use the nodeId for
* Content Services or the taskId/processId for Process Services.
*/
this.rootFolderId = '-root-';
/** Toggles component disabled state (if there is no node permission checking). */
this.disabled = false;
/** Filter for accepted file types. */
this.acceptedFilesType = '*';
/** Toggles versioning. */
this.versioning = false;
/** majorVersion boolean field to true to indicate a major version should be created. */
this.majorVersion = false;
/** Custom node type for uploaded file */
this.nodeType = 'cm:content';
/** Emitted when the file is uploaded successfully. */
this.success = new EventEmitter();
/** Emitted when an error occurs. */
this.error = new EventEmitter();
/** Emitted when the upload begins. */
this.beginUpload = new EventEmitter();
/** Emitted when dropping a file over another file to update the version. */
this.updateFileVersion = new EventEmitter();
this.destroyRef = inject(DestroyRef);
}
ngOnInit() {
this.uploadService.fileUploadError
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(error => this.error.emit(error));
}
/**
* Upload a list of file in the specified path
*
* @param files files to upload
*/
uploadFiles(files) {
const filteredFiles = files.map((file) => this.createFileModel(file, this.rootFolderId, ((file).webkitRelativePath || '').replace(/\/[^/]*$/, '')));
this.uploadQueue(filteredFiles);
}
uploadFilesInfo(files) {
const filteredFiles = files.map((fileInfo) => this.createFileModel(fileInfo.file, this.rootFolderId, fileInfo.relativeFolder));
this.uploadQueue(filteredFiles);
}
uploadQueue(files) {
const filteredFiles = files.filter(this.isFileAcceptable.bind(this)).filter(this.isFileSizeAcceptable.bind(this));
this.ngZone.run(() => {
const event = new UploadFilesEvent([...filteredFiles], this.uploadService, this.success, this.error);
this.beginUpload.emit(event);
if (!event.defaultPrevented) {
if (filteredFiles.length > 0) {
this.uploadService.addToQueue(...filteredFiles);
this.uploadService.uploadFilesInTheQueue(this.success, this.error);
}
}
});
}
/**
* Checks if the given file is allowed by the extension filters
*
* @param file FileModel
* @returns `true` if file is acceptable, otherwise `false`
*/
isFileAcceptable(file) {
if (this.acceptedFilesType === '*') {
return true;
}
const allowedExtensions = this.acceptedFilesType.split(',').map((ext) => ext.trim().replace(/^\./, ''));
return allowedExtensions.indexOf(file.extension) !== -1;
}
/**
* Creates FileModel from File
*
* @param file file instance
* @param parentId parent id
* @param path upload path
* @param id model id
* @returns file model
*/
createFileModel(file, parentId, path, id) {
return new FileModel(file, {
comment: this.comment,
majorVersion: this.majorVersion,
newVersion: this.versioning,
parentId,
path,
nodeType: this.nodeType
}, id);
}
isFileSizeAllowed(file) {
let isFileSizeAllowed = true;
if (this.isMaxFileSizeDefined()) {
isFileSizeAllowed = this.isFileSizeCorrect(file);
}
return isFileSizeAllowed;
}
isMaxFileSizeDefined() {
return this.maxFilesSize !== undefined && this.maxFilesSize !== null;
}
isFileSizeCorrect(file) {
return this.maxFilesSize >= 0 && file.size <= this.maxFilesSize;
}
/**
* Checks if the given file is an acceptable size
*
* @param file FileModel
* @returns `true` if file size is acceptable, otherwise `false`
*/
isFileSizeAcceptable(file) {
let acceptableSize = true;
if (!this.isFileSizeAllowed(file)) {
acceptableSize = false;
const message = this.translationService.instant('FILE_UPLOAD.MESSAGES.EXCEED_MAX_FILE_SIZE', { fileName: file.name });
this.error.emit(message);
}
return acceptableSize;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: UploadBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: UploadBase, inputs: { maxFilesSize: "maxFilesSize", rootFolderId: "rootFolderId", disabled: "disabled", acceptedFilesType: "acceptedFilesType", versioning: "versioning", majorVersion: "majorVersion", comment: "comment", nodeType: "nodeType" }, outputs: { success: "success", error: "error", beginUpload: "beginUpload", updateFileVersion: "updateFileVersion" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: UploadBase, decorators: [{
type: Directive
}], propDecorators: { maxFilesSize: [{
type: Input
}], rootFolderId: [{
type: Input
}], disabled: [{
type: Input
}], acceptedFilesType: [{
type: Input
}], versioning: [{
type: Input
}], majorVersion: [{
type: Input
}], comment: [{
type: Input
}], nodeType: [{
type: Input
}], success: [{
type: Output
}], error: [{
type: Output
}], beginUpload: [{
type: Output
}], updateFileVersion: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3VwbG9hZC9jb21wb25lbnRzL2Jhc2UtdXBsb2FkL3VwbG9hZC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBWSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFHaEUsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBZ0IsVUFBVTtJQUZoQztRQUdjLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLHVCQUFrQixHQUF1QixNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNwRSxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBU2xDOzs7V0FHRztRQUVILGlCQUFZLEdBQVcsUUFBUSxDQUFDO1FBRWhDLGtGQUFrRjtRQUVsRixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLHNDQUFzQztRQUV0QyxzQkFBaUIsR0FBVyxHQUFHLENBQUM7UUFFaEMsMEJBQTBCO1FBRTFCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFNUIsd0ZBQXdGO1FBRXhGLGlCQUFZLEdBQVksS0FBSyxDQUFD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QUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLG9CQUFvQixDQUFDLElBQWU7UUFDeEMsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBRXZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFdEgsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7OEdBbkxpQixVQUFVO2tHQUFWLFVBQVU7OzJGQUFWLFVBQVU7a0JBRi9CLFNBQVM7OEJBWU4sWUFBWTtzQkFEWCxLQUFLO2dCQVFOLFlBQVk7c0JBRFgsS0FBSztnQkFLTixRQUFRO3NCQURQLEtBQUs7Z0JBS04saUJBQWlCO3NCQURoQixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsS0FBSztnQkFLTixZQUFZO3NCQURYLEtBQUs7Z0JBS04sT0FBTztzQkFETixLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFLTixPQUFPO3NCQUROLE1BQU07Z0JBS1AsS0FBSztzQkFESixNQUFNO2dCQUtQLFdBQVc7c0JBRFYsTUFBTTtnQkFLUCxpQkFBaUI7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpbGVJbmZvLCBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZEVycm9yRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXZlbnRzL2ZpbGUuZXZlbnQnO1xuaW1wb3J0IHsgRmlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL21vZGVscy9maWxlLm1vZGVsJztcbmltcG9ydCB7IFVwbG9hZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vc2VydmljZXMvdXBsb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVwbG9hZEZpbGVzRXZlbnQgfSBmcm9tICcuLi91cGxvYWQtZmlsZXMuZXZlbnQnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVwbG9hZEJhc2UgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByb3RlY3RlZCB1cGxvYWRTZXJ2aWNlID0gaW5qZWN0KFVwbG9hZFNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSA9IGluamVjdChUcmFuc2xhdGlvblNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBsaW1pdCBvbiB0aGUgbWF4aW11bSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlIHRvIGJlIHVwbG9hZGVkLlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4RmlsZXNTaXplOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJvb3QuIFVzZSB0aGUgbm9kZUlkIGZvclxuICAgICAqIENvbnRlbnQgU2VydmljZXMgb3IgdGhlIHRhc2tJZC9wcm9jZXNzSWQgZm9yIFByb2Nlc3MgU2VydmljZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByb290Rm9sZGVySWQ6IHN0cmluZyA9ICctcm9vdC0nO1xuXG4gICAgLyoqIFRvZ2dsZXMgY29tcG9uZW50IGRpc2FibGVkIHN0YXRlIChpZiB0aGVyZSBpcyBubyBub2RlIHBlcm1pc3Npb24gY2hlY2tpbmcpLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBGaWx0ZXIgZm9yIGFjY2VwdGVkIGZpbGUgdHlwZXMuICovXG4gICAgQElucHV0KClcbiAgICBhY2NlcHRlZEZpbGVzVHlwZTogc3RyaW5nID0gJyonO1xuXG4gICAgLyoqIFRvZ2dsZXMgdmVyc2lvbmluZy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHZlcnNpb25pbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBtYWpvclZlcnNpb24gYm9vbGVhbiBmaWVsZCB0byB0cnVlIHRvIGluZGljYXRlIGEgbWFqb3IgdmVyc2lvbiBzaG91bGQgYmUgY3JlYXRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIG1ham9yVmVyc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZW4geW91IG92ZXJ3cml0ZSBleGlzdGluZyBjb250ZW50LCB5b3UgY2FuIHVzZSB0aGUgY29tbWVudCBmaWVsZCB0byBhZGQgYSB2ZXJzaW9uIGNvbW1lbnQgdGhhdCBhcHBlYXJzIGluIHRoZSB2ZXJzaW9uIGhpc3RvcnkgKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbW1lbnQ6IHN0cmluZztcblxuICAgIC8qKiBDdXN0b20gbm9kZSB0eXBlIGZvciB1cGxvYWRlZCBmaWxlICovXG4gICAgQElucHV0KClcbiAgICBub2RlVHlwZTogc3RyaW5nID0gJ2NtOmNvbnRlbnQnO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZmlsZSBpcyB1cGxvYWRlZCBzdWNjZXNzZnVsbHkuICovXG4gICAgQE91dHB1dCgpXG4gICAgc3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlVXBsb2FkRXJyb3JFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVwbG9hZCBiZWdpbnMuICovXG4gICAgQE91dHB1dCgpXG4gICAgYmVnaW5VcGxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPFVwbG9hZEZpbGVzRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGRyb3BwaW5nIGEgZmlsZSBvdmVyIGFub3RoZXIgZmlsZSB0byB1cGRhdGUgdGhlIHZlcnNpb24uICovXG4gICAgQE91dHB1dCgpXG4gICAgdXBkYXRlRmlsZVZlcnNpb24gPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5maWxlVXBsb2FkRXJyb3JcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlcnJvciA9PiB0aGlzLmVycm9yLmVtaXQoZXJyb3IpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgYSBsaXN0IG9mIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBwYXRoXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZXMgZmlsZXMgdG8gdXBsb2FkXG4gICAgICovXG4gICAgdXBsb2FkRmlsZXMoZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEZpbGVzOiBGaWxlTW9kZWxbXSA9IGZpbGVzLm1hcDxGaWxlTW9kZWw+KChmaWxlOiBGaWxlKSA9PlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVGaWxlTW9kZWwoZmlsZSwgdGhpcy5yb290Rm9sZGVySWQsICgoZmlsZSkud2Via2l0UmVsYXRpdmVQYXRoIHx8ICcnKS5yZXBsYWNlKC9cXC9bXi9dKiQvLCAnJykpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy51cGxvYWRRdWV1ZShmaWx0ZXJlZEZpbGVzKTtcbiAgICB9XG5cbiAgICB1cGxvYWRGaWxlc0luZm8oZmlsZXM6IEZpbGVJbmZvW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRGaWxlczogRmlsZU1vZGVsW10gPSBmaWxlcy5tYXA8RmlsZU1vZGVsPigoZmlsZUluZm86IEZpbGVJbmZvKSA9PlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVGaWxlTW9kZWwoZmlsZUluZm8uZmlsZSwgdGhpcy5yb290Rm9sZGVySWQsIGZpbGVJbmZvLnJlbGF0aXZlRm9sZGVyKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMudXBsb2FkUXVldWUoZmlsdGVyZWRGaWxlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGxvYWRRdWV1ZShmaWxlczogRmlsZU1vZGVsW10pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcih0aGlzLmlzRmlsZUFjY2VwdGFibGUuYmluZCh0aGlzKSkuZmlsdGVyKHRoaXMuaXNGaWxlU2l6ZUFjY2VwdGFibGUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFVwbG9hZEZpbGVzRXZlbnQoWy4uLmZpbHRlcmVkRmlsZXNdLCB0aGlzLnVwbG9hZFNlcnZpY2UsIHRoaXMuc3VjY2VzcywgdGhpcy5lcnJvcik7XG4gICAgICAgICAgICB0aGlzLmJlZ2luVXBsb2FkLmVtaXQoZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5hZGRUb1F1ZXVlKC4uLmZpbHRlcmVkRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UudXBsb2FkRmlsZXNJblRoZVF1ZXVlKHRoaXMuc3VjY2VzcywgdGhpcy5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYWxsb3dlZCBieSB0aGUgZXh0ZW5zaW9uIGZpbHRlcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlIEZpbGVNb2RlbFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBmaWxlIGlzIGFjY2VwdGFibGUsIG90aGVyd2lzZSBgZmFsc2VgXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzRmlsZUFjY2VwdGFibGUoZmlsZTogRmlsZU1vZGVsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmFjY2VwdGVkRmlsZXNUeXBlID09PSAnKicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSB0aGlzLmFjY2VwdGVkRmlsZXNUeXBlLnNwbGl0KCcsJykubWFwKChleHQpID0+IGV4dC50cmltKCkucmVwbGFjZSgvXlxcLi8sICcnKSk7XG5cbiAgICAgICAgcmV0dXJuIGFsbG93ZWRFeHRlbnNpb25zLmluZGV4T2YoZmlsZS5leHRlbnNpb24pICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIEZpbGVNb2RlbCBmcm9tIEZpbGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlIGZpbGUgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gcGFyZW50SWQgcGFyZW50IGlkXG4gICAgICogQHBhcmFtIHBhdGggdXBsb2FkIHBhdGhcbiAgICAgKiBAcGFyYW0gaWQgbW9kZWwgaWRcbiAgICAgKiBAcmV0dXJucyBmaWxlIG1vZGVsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUZpbGVNb2RlbChmaWxlOiBGaWxlLCBwYXJlbnRJZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGlkPzogc3RyaW5nKTogRmlsZU1vZGVsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWxlTW9kZWwoXG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudCxcbiAgICAgICAgICAgICAgICBtYWpvclZlcnNpb246IHRoaXMubWFqb3JWZXJzaW9uLFxuICAgICAgICAgICAgICAgIG5ld1ZlcnNpb246IHRoaXMudmVyc2lvbmluZyxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIG5vZGVUeXBlOiB0aGlzLm5vZGVUeXBlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNGaWxlU2l6ZUFsbG93ZWQoZmlsZTogRmlsZU1vZGVsKSB7XG4gICAgICAgIGxldCBpc0ZpbGVTaXplQWxsb3dlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmlzTWF4RmlsZVNpemVEZWZpbmVkKCkpIHtcbiAgICAgICAgICAgIGlzRmlsZVNpemVBbGxvd2VkID0gdGhpcy5pc0ZpbGVTaXplQ29ycmVjdChmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0ZpbGVTaXplQWxsb3dlZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNNYXhGaWxlU2l6ZURlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heEZpbGVzU2l6ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubWF4RmlsZXNTaXplICE9PSBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0ZpbGVTaXplQ29ycmVjdChmaWxlOiBGaWxlTW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4RmlsZXNTaXplID49IDAgJiYgZmlsZS5zaXplIDw9IHRoaXMubWF4RmlsZXNTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhbiBhY2NlcHRhYmxlIHNpemVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlIEZpbGVNb2RlbFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBmaWxlIHNpemUgaXMgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRmlsZVNpemVBY2NlcHRhYmxlKGZpbGU6IEZpbGVNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgYWNjZXB0YWJsZVNpemUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0ZpbGVTaXplQWxsb3dlZChmaWxlKSkge1xuICAgICAgICAgICAgYWNjZXB0YWJsZVNpemUgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmluc3RhbnQoJ0ZJTEVfVVBMT0FELk1FU1NBR0VTLkVYQ0VFRF9NQVhfRklMRV9TSVpFJywgeyBmaWxlTmFtZTogZmlsZS5uYW1lIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmVycm9yLmVtaXQobWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjZXB0YWJsZVNpemU7XG4gICAgfVxufVxuIl19