UNPKG

@digitalascetic/ngx-pica

Version:

Angular (LTS) module to resize images files in browser

161 lines 21.5 kB
import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { NgxPicaErrorType } from './ngx-pica-error.interface'; import { switchMap } from 'rxjs/operators'; import imageCompression from 'browser-image-compression'; import * as i0 from "@angular/core"; export class NgxPicaService { MAX_STEPS = 20; resizeImages(files, width, height, useWebWorker) { const resizedImage = new Subject(); const totalFiles = files.length; if (totalFiles > 0) { const nextFile = new Subject(); let index = 0; const subscription = nextFile .pipe(switchMap((file) => this.resizeImage(file, width, height, useWebWorker))) .subscribe({ next: imageResized => { index++; resizedImage.next(imageResized); if (index < totalFiles) { nextFile.next(files[index]); } else { resizedImage.complete(); subscription.unsubscribe(); } }, error: (err) => { const ngxPicaError = { file: files[index], err: err }; resizedImage.error(ngxPicaError); } }); nextFile.next(files[index]); } else { const ngxPicaError = { err: NgxPicaErrorType.NO_FILES_RECEIVED }; resizedImage.error(ngxPicaError); resizedImage.complete(); } return resizedImage.asObservable(); } resizeImage(file, width, height, useWebWorker = true) { const resizedImage = new Subject(); const maxWidthOrHeight = width > height ? height : width; imageCompression.getExifOrientation(file) .then(orientation => { imageCompression(file, { maxWidthOrHeight: maxWidthOrHeight, exifOrientation: orientation, useWebWorker: useWebWorker, maxIteration: this.MAX_STEPS }).then(resizedFile => { resizedImage.next(resizedFile); resizedImage.complete(); }).catch(err => resizedImage.error({ err: NgxPicaErrorType.READ_ERROR, file: file, original_error: err })); }) .catch(err => { imageCompression(file, { maxWidthOrHeight: maxWidthOrHeight, maxIteration: this.MAX_STEPS }).then(resizedFile => { resizedImage.next(resizedFile); resizedImage.complete(); }).catch(err => resizedImage.error({ err: NgxPicaErrorType.READ_ERROR, file: file, original_error: err })); }); return resizedImage.asObservable(); } compressImages(files, sizeInMB, useWebWorker) { const compressedImage = new Subject(); const totalFiles = files.length; if (totalFiles > 0) { const nextFile = new Subject(); let index = 0; const subscription = nextFile .pipe(switchMap((file) => this.compressImage(file, sizeInMB, useWebWorker))) .subscribe({ next: imageCompressed => { index++; compressedImage.next(imageCompressed); if (index < totalFiles) { nextFile.next(files[index]); } else { compressedImage.complete(); subscription.unsubscribe(); } }, error: err => { const ngxPicaError = { file: files[index], err: err }; compressedImage.error(ngxPicaError); } }); nextFile.next(files[index]); } else { const ngxPicaError = { err: NgxPicaErrorType.NO_FILES_RECEIVED }; compressedImage.error(ngxPicaError); compressedImage.complete(); } return compressedImage.asObservable(); } compressImage(file, sizeInMB, useWebWorker = true) { const compressedImage = new Subject(); if (this.bytesToMB(file.size) <= sizeInMB) { setTimeout(() => { compressedImage.next(file); compressedImage.complete(); }); } else { imageCompression.getExifOrientation(file) .then(orientation => { imageCompression(file, { maxSizeMB: sizeInMB, useWebWorker: useWebWorker, exifOrientation: orientation, alwaysKeepResolution: true, maxIteration: this.MAX_STEPS }) .then(compressedFile => { compressedImage.next(compressedFile); compressedImage.complete(); }) .catch(err => compressedImage.error({ err: NgxPicaErrorType.READ_ERROR, file: file, original_error: err })); }) .catch(err => { imageCompression(file, { maxSizeMB: sizeInMB, alwaysKeepResolution: true, maxIteration: this.MAX_STEPS }) .then(compressedFile => { compressedImage.next(compressedFile); compressedImage.complete(); }) .catch(err2 => compressedImage.error({ err: NgxPicaErrorType.READ_ERROR, file: file, original_error: err2 })); }); } return compressedImage.asObservable(); } bytesToMB(bytes) { return bytes / 1048576; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgxPicaService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgxPicaService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: NgxPicaService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBpY2Euc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RpZ2l0YWxhc2NldGljL25neC1waWNhL3NyYy9saWIvbmd4LXBpY2Euc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQTJCLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBd0IsZ0JBQWdCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxnQkFBZ0IsTUFBTSwyQkFBMkIsQ0FBQzs7QUFHekQsTUFBTSxPQUFPLGNBQWM7SUFDakIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUVoQixZQUFZLENBQUMsS0FBYSxFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsWUFBc0I7UUFDdEYsTUFBTSxZQUFZLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUV4QyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixNQUFNLFFBQVEsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM5QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFFZCxNQUFNLFlBQVksR0FBaUIsUUFBUTtpQkFDeEMsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLElBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUMvRTtpQkFDQSxTQUFTLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFO29CQUNuQixLQUFLLEVBQUUsQ0FBQztvQkFDUixZQUFZLENB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QWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUMsQ0FBQztZQUU5RyxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLGdCQUFnQixDQUFDLElBQUksRUFBRTtvQkFDckIsU0FBUyxFQUFFLFFBQVE7b0JBQ25CLG9CQUFvQixFQUFFLElBQUk7b0JBQzFCLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDN0IsQ0FBQztxQkFDQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ3JCLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ3JDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQztZQUNoSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQWE7UUFDN0IsT0FBTyxLQUFLLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7dUdBOUtVLGNBQWM7MkdBQWQsY0FBYzs7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge05neFBpY2FFcnJvckludGVyZmFjZSwgTmd4UGljYUVycm9yVHlwZX0gZnJvbSAnLi9uZ3gtcGljYS1lcnJvci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBpbWFnZUNvbXByZXNzaW9uIGZyb20gJ2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmd4UGljYVNlcnZpY2Uge1xuICBwcml2YXRlIE1BWF9TVEVQUyA9IDIwO1xuXG4gIHB1YmxpYyByZXNpemVJbWFnZXMoZmlsZXM6IEZpbGVbXSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHVzZVdlYldvcmtlcj86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEZpbGU+IHtcbiAgICBjb25zdCByZXNpemVkSW1hZ2U6IFN1YmplY3Q8RmlsZT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IHRvdGFsRmlsZXM6IG51bWJlciA9IGZpbGVzLmxlbmd0aDtcblxuICAgIGlmICh0b3RhbEZpbGVzID4gMCkge1xuICAgICAgY29uc3QgbmV4dEZpbGU6IFN1YmplY3Q8RmlsZT4gPSBuZXcgU3ViamVjdCgpO1xuICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXh0RmlsZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKGZpbGU6IEZpbGUpID0+IHRoaXMucmVzaXplSW1hZ2UoZmlsZSwgd2lkdGgsIGhlaWdodCwgdXNlV2ViV29ya2VyKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiBpbWFnZVJlc2l6ZWQgPT4ge1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIHJlc2l6ZWRJbWFnZS5uZXh0KGltYWdlUmVzaXplZCk7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRvdGFsRmlsZXMpIHtcbiAgICAgICAgICAgICAgbmV4dEZpbGUubmV4dChmaWxlc1tpbmRleF0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNpemVkSW1hZ2UuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbmd4UGljYUVycm9yOiBOZ3hQaWNhRXJyb3JJbnRlcmZhY2UgPSB7XG4gICAgICAgICAgICAgIGZpbGU6IGZpbGVzW2luZGV4XSxcbiAgICAgICAgICAgICAgZXJyOiBlcnJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJlc2l6ZWRJbWFnZS5lcnJvcihuZ3hQaWNhRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIG5leHRGaWxlLm5leHQoZmlsZXNbaW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbmd4UGljYUVycm9yOiBOZ3hQaWNhRXJyb3JJbnRlcmZhY2UgPSB7XG4gICAgICAgIGVycjogTmd4UGljYUVycm9yVHlwZS5OT19GSUxFU19SRUNFSVZFRFxuICAgICAgfTtcblxuICAgICAgcmVzaXplZEltYWdlLmVycm9yKG5neFBpY2FFcnJvcik7XG4gICAgICByZXNpemVkSW1hZ2UuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzaXplZEltYWdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZUltYWdlKGZpbGU6IEZpbGUsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB1c2VXZWJXb3JrZXI6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxGaWxlPiB7XG4gICAgY29uc3QgcmVzaXplZEltYWdlOiBTdWJqZWN0PEZpbGU+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGNvbnN0IG1heFdpZHRoT3JIZWlnaHQgPSB3aWR0aCA+IGhlaWdodCA/IGhlaWdodCA6IHdpZHRoO1xuXG4gICAgaW1hZ2VDb21wcmVzc2lvbi5nZXRFeGlmT3JpZW50YXRpb24oZmlsZSlcbiAgICAgIC50aGVuKG9yaWVudGF0aW9uID0+IHtcbiAgICAgICAgaW1hZ2VDb21wcmVzc2lvbihmaWxlLCB7XG4gICAgICAgICAgbWF4V2lkdGhPckhlaWdodDogbWF4V2lkdGhPckhlaWdodCxcbiAgICAgICAgICBleGlmT3JpZW50YXRpb246IG9yaWVudGF0aW9uLFxuICAgICAgICAgIHVzZVdlYldvcmtlcjogdXNlV2ViV29ya2VyLFxuICAgICAgICAgIG1heEl0ZXJhdGlvbjogdGhpcy5NQVhfU1RFUFNcbiAgICAgICAgfSkudGhlbihyZXNpemVkRmlsZSA9PiB7XG4gICAgICAgICAgcmVzaXplZEltYWdlLm5leHQocmVzaXplZEZpbGUpO1xuICAgICAgICAgIHJlc2l6ZWRJbWFnZS5jb21wbGV0ZSgpO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVzaXplZEltYWdlLmVycm9yKHtlcnI6IE5neFBpY2FFcnJvclR5cGUuUkVBRF9FUlJPUiwgZmlsZTogZmlsZSwgb3JpZ2luYWxfZXJyb3I6IGVycn0pKTtcblxuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpbWFnZUNvbXByZXNzaW9uKGZpbGUsIHtcbiAgICAgICAgICBtYXhXaWR0aE9ySGVpZ2h0OiBtYXhXaWR0aE9ySGVpZ2h0LFxuICAgICAgICAgIG1heEl0ZXJhdGlvbjogdGhpcy5NQVhfU1RFUFNcbiAgICAgICAgfSkudGhlbihyZXNpemVkRmlsZSA9PiB7XG4gICAgICAgICAgcmVzaXplZEltYWdlLm5leHQocmVzaXplZEZpbGUpO1xuICAgICAgICAgIHJlc2l6ZWRJbWFnZS5jb21wbGV0ZSgpO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVzaXplZEltYWdlLmVycm9yKHtlcnI6IE5neFBpY2FFcnJvclR5cGUuUkVBRF9FUlJPUiwgZmlsZTogZmlsZSwgb3JpZ2luYWxfZXJyb3I6IGVycn0pKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc2l6ZWRJbWFnZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjb21wcmVzc0ltYWdlcyhmaWxlczogRmlsZVtdLCBzaXplSW5NQjogbnVtYmVyLCB1c2VXZWJXb3JrZXI/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxGaWxlPiB7XG4gICAgY29uc3QgY29tcHJlc3NlZEltYWdlOiBTdWJqZWN0PEZpbGU+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCB0b3RhbEZpbGVzOiBudW1iZXIgPSBmaWxlcy5sZW5ndGg7XG5cbiAgICBpZiAodG90YWxGaWxlcyA+IDApIHtcbiAgICAgIGNvbnN0IG5leHRGaWxlOiBTdWJqZWN0PEZpbGU+ID0gbmV3IFN1YmplY3QoKTtcbiAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV4dEZpbGVcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChmaWxlOiBGaWxlKSA9PiB0aGlzLmNvbXByZXNzSW1hZ2UoZmlsZSwgc2l6ZUluTUIsIHVzZVdlYldvcmtlcikpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogaW1hZ2VDb21wcmVzc2VkID0+IHtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBjb21wcmVzc2VkSW1hZ2UubmV4dChpbWFnZUNvbXByZXNzZWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggPCB0b3RhbEZpbGVzKSB7XG4gICAgICAgICAgICAgIG5leHRGaWxlLm5leHQoZmlsZXNbaW5kZXhdKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29tcHJlc3NlZEltYWdlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZ3hQaWNhRXJyb3I6IE5neFBpY2FFcnJvckludGVyZmFjZSA9IHtcbiAgICAgICAgICAgICAgZmlsZTogZmlsZXNbaW5kZXhdLFxuICAgICAgICAgICAgICBlcnI6IGVyclxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29tcHJlc3NlZEltYWdlLmVycm9yKG5neFBpY2FFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgbmV4dEZpbGUubmV4dChmaWxlc1tpbmRleF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZ3hQaWNhRXJyb3I6IE5neFBpY2FFcnJvckludGVyZmFjZSA9IHtcbiAgICAgICAgZXJyOiBOZ3hQaWNhRXJyb3JUeXBlLk5PX0ZJTEVTX1JFQ0VJVkVEXG4gICAgICB9O1xuXG4gICAgICBjb21wcmVzc2VkSW1hZ2UuZXJyb3Iobmd4UGljYUVycm9yKTtcbiAgICAgIGNvbXByZXNzZWRJbWFnZS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wcmVzc2VkSW1hZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgY29tcHJlc3NJbWFnZShmaWxlOiBGaWxlLCBzaXplSW5NQjogbnVtYmVyLCB1c2VXZWJXb3JrZXI6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxGaWxlPiB7XG4gICAgY29uc3QgY29tcHJlc3NlZEltYWdlOiBTdWJqZWN0PEZpbGU+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGlmICh0aGlzLmJ5dGVzVG9NQihmaWxlLnNpemUpIDw9IHNpemVJbk1CKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29tcHJlc3NlZEltYWdlLm5leHQoZmlsZSk7XG4gICAgICAgIGNvbXByZXNzZWRJbWFnZS5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlQ29tcHJlc3Npb24uZ2V0RXhpZk9yaWVudGF0aW9uKGZpbGUpXG4gICAgICAgIC50aGVuKG9yaWVudGF0aW9uID0+IHtcbiAgICAgICAgICBpbWFnZUNvbXByZXNzaW9uKGZpbGUsIHtcbiAgICAgICAgICAgIG1heFNpemVNQjogc2l6ZUluTUIsXG4gICAgICAgICAgICB1c2VXZWJXb3JrZXI6IHVzZVdlYldvcmtlcixcbiAgICAgICAgICAgIGV4aWZPcmllbnRhdGlvbjogb3JpZW50YXRpb24sXG4gICAgICAgICAgICBhbHdheXNLZWVwUmVzb2x1dGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIG1heEl0ZXJhdGlvbjogdGhpcy5NQVhfU1RFUFNcbiAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oY29tcHJlc3NlZEZpbGUgPT4ge1xuICAgICAgICAgICAgICBjb21wcmVzc2VkSW1hZ2UubmV4dChjb21wcmVzc2VkRmlsZSk7XG4gICAgICAgICAgICAgIGNvbXByZXNzZWRJbWFnZS5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gY29tcHJlc3NlZEltYWdlLmVycm9yKHtlcnI6IE5neFBpY2FFcnJvclR5cGUuUkVBRF9FUlJPUiwgZmlsZTogZmlsZSwgb3JpZ2luYWxfZXJyb3I6IGVycn0pKTtcblxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBpbWFnZUNvbXByZXNzaW9uKGZpbGUsIHtcbiAgICAgICAgICAgIG1heFNpemVNQjogc2l6ZUluTUIsXG4gICAgICAgICAgICBhbHdheXNLZWVwUmVzb2x1dGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIG1heEl0ZXJhdGlvbjogdGhpcy5NQVhfU1RFUFNcbiAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oY29tcHJlc3NlZEZpbGUgPT4ge1xuICAgICAgICAgICAgICBjb21wcmVzc2VkSW1hZ2UubmV4dChjb21wcmVzc2VkRmlsZSk7XG4gICAgICAgICAgICAgIGNvbXByZXNzZWRJbWFnZS5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIyID0+IGNvbXByZXNzZWRJbWFnZS5lcnJvcih7ZXJyOiBOZ3hQaWNhRXJyb3JUeXBlLlJFQURfRVJST1IsIGZpbGU6IGZpbGUsIG9yaWdpbmFsX2Vycm9yOiBlcnIyfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHJlc3NlZEltYWdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBieXRlc1RvTUIoYnl0ZXM6IG51bWJlcikge1xuICAgIHJldHVybiBieXRlcyAvIDEwNDg1NzY7XG4gIH1cbn1cbiJdfQ==