angular-material-datatransfer-lib
Version:
A HTML5 datatransfer UI for handling upload and download of multiple simultaneous files.
370 lines • 35.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/io/uploaders/resumablejs.uploader.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import * as Resumable from 'resumablejs';
import { BaseUploader } from './base.uploader';
import { ConfigService } from '../../services/config.service';
import { LoggerService } from '../../services/logger.service';
import { GuidUtil } from '../../utils/guid.util';
import { CryptoService } from '../../services/crypto.service';
import { TransferStatus } from '../../enums/transfer-status.enum';
import { DatatransferItem } from '../../models/datatransfer-item.model';
import { SizeContainer } from '../../models/size-container.model';
import { DecimalByteUnit } from '../../enums/decimal-byte-unit.enum';
import { ProgressContainer } from '../../models/progress-container.model';
import { TransferType } from '../../enums/transfer-type.enum';
export class ResumableJsUploader extends BaseUploader {
/**
* @param {?} logger
* @param {?} guidUtil
* @param {?} cryptoService
*/
constructor(logger, guidUtil, cryptoService) {
super(logger, guidUtil, cryptoService);
this.logger = logger;
this.guidUtil = guidUtil;
this.cryptoService = cryptoService;
this.r = undefined;
this.preprocessFileFn = undefined;
this.preprocessChunkFn = undefined;
this.initResumable();
}
/**
* @private
* @return {?}
*/
initResumable() {
/**
* @param {?} file
* @param {?} event
* @return {?}
*/
function generateId(file, event) {
/** @type {?} */
const that = (/** @type {?} */ (this));
return that.generateUniqueIdentifier();
}
/**
* @param {?} resumableChunk
* @return {?}
*/
function preprocessChunkInlineFn(resumableChunk) {
/** @type {?} */
const that = (/** @type {?} */ (this));
if (typeof that.preprocessChunkFn === 'function') {
that.preprocessChunkFn(resumableChunk);
}
else {
resumableChunk.preprocessFinished();
}
}
/**
* @param {?} resumableFile
* @return {?}
*/
function preprocessFileInlineFn(resumableFile) {
/** @type {?} */
const that = (/** @type {?} */ (this));
if (typeof that.preprocessFileFn === 'function') {
that.changeItemStatus(resumableFile.internalItem, TransferStatus.Preprocessing);
that.preprocessFileFn(resumableFile);
}
else {
if (ConfigService.settings.core.preprocessHashEnabled && ConfigService.settings.core.preprocessHashChecked) {
that.changeItemStatus(resumableFile.internalItem, TransferStatus.Preprocessing);
/** @type {?} */
const continueCallback = (/**
* @return {?}
*/
function () {
resumableFile.preprocessFinished();
});
/** @type {?} */
const cancelCallback = (/**
* @return {?}
*/
function () {
resumableFile.cancel();
that.changeItemStatus(resumableFile.internalItem, TransferStatus.Finished, resumableFile.internalItem.message);
that.r.uploadNextChunk();
});
that.preprocessHash(resumableFile.internalItem, resumableFile.file, continueCallback, cancelCallback);
}
else {
resumableFile.preprocessFinished();
}
}
}
ConfigService.settings.resumablejs.generateUniqueIdentifier = generateId.bind(this);
if (typeof ConfigService.settings.resumablejs.preprocess === 'function') {
// clones the function with '{}' acting as it's new 'this' parameter
this.preprocessChunkFn = ConfigService.settings.resumablejs.preprocess.bind({});
}
ConfigService.settings.resumablejs.preprocess = preprocessChunkInlineFn.bind(this);
if (typeof ConfigService.settings.resumablejs.preprocessFile === 'function') {
// clones the function with '{}' acting as it's new 'this' parameter
this.preprocessFileFn = ConfigService.settings.resumablejs.preprocessFile.bind({});
}
ConfigService.settings.resumablejs.preprocessFile = preprocessFileInlineFn.bind(this);
// @ts-ignore: ignore type checking
this.r = new Resumable(ConfigService.settings.resumablejs);
this.r.on('fileAdded', (/**
* @param {?} file
* @param {?} event
* @return {?}
*/
function (file, event) {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('fileAdded', file);
/** @type {?} */
const newItem = new DatatransferItem({
id: file.uniqueIdentifier,
name: file.fileName,
path: file.relativePath.substr(0, file.relativePath.length - file.fileName.length),
sizeContainer: new SizeContainer({ decimalByteUnit: DecimalByteUnit.Byte, decimalByteUnitSize: file.size }),
progressContainer: new ProgressContainer(file.size),
transferType: TransferType.Upload,
status: TransferStatus.Ready,
externalItem: file
});
file.internalItem = newItem;
that.addItem(newItem);
}).bind(this));
this.r.on('fileProgress', (/**
* @param {?} file
* @param {?} message
* @return {?}
*/
function (file, message) {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('fileProgress', file.progress());
that.changeItemStatus(file.internalItem, TransferStatus.Uploading);
that.updateItemProgress(file.internalItem, file.progress());
that.updateOverallProgress(that.transferType, that.r.progress());
}).bind(this));
this.r.on('fileSuccess', (/**
* @param {?} file
* @param {?} message
* @return {?}
*/
function (file, message) {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('fileSuccess', file);
that.changeItemStatus(file.internalItem, TransferStatus.Finished, message);
}).bind(this));
this.r.on('fileError', (/**
* @param {?} file
* @param {?} message
* @return {?}
*/
function (file, message) {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('fileError', file, message);
that.changeItemStatus(file.internalItem, TransferStatus.Failed, message);
}).bind(this));
this.r.on('uploadStart', (/**
* @return {?}
*/
function () {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('uploadStart', that.r);
that._isWorking = true;
that.updateZone();
that.updateOverallProgress(that.transferType, that.r.progress());
that.updateOverallSize(that.r.getSize());
}).bind(this));
this.r.on('chunkingComplete', (/**
* @return {?}
*/
function () {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('chunkingComplete');
}).bind(this));
this.r.on('pause', (/**
* @return {?}
*/
function () {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('pause');
that._isWorking = false;
that.updateZone();
}).bind(this));
this.r.on('cancel', (/**
* @return {?}
*/
function () {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('cancel');
that._isWorking = false;
that.updateZone();
}).bind(this));
this.r.on('complete', (/**
* @return {?}
*/
function () {
/** @type {?} */
const that = (/** @type {?} */ (this));
// that.logger.log('complete', that.r);
that._isWorking = false;
that.updateZone();
}).bind(this));
}
/**
* @param {?} element
* @param {?} isDirectory
* @return {?}
*/
assignBrowse(element, isDirectory) {
this.r.assignBrowse(element, isDirectory);
}
/**
* @param {?} element
* @return {?}
*/
assignDrop(element) {
this.r.assignDrop(element);
}
/**
* @param {?} oldPath
* @param {?} newPath
* @return {?}
*/
editPath(oldPath, newPath) {
super.editPath(oldPath, newPath);
this.r.files.forEach((/**
* @param {?} file
* @param {?} index
* @return {?}
*/
(file, index) => {
/** @type {?} */
const internalItem = (/** @type {?} */ (file.internalItem));
if (internalItem.status === TransferStatus.Ready && internalItem.path === oldPath) {
file.relativePath = newPath + file.fileName;
internalItem.path = newPath;
}
}));
}
/**
* @param {?} item
* @param {?} name
* @return {?}
*/
editFilename(item, name) {
super.editFilename(item, name);
item.externalItem.fileName = name;
item.externalItem.relativePath = item.path + name;
item.name = name;
}
/**
* @return {?}
*/
startAll() {
this.r.upload();
}
/**
* @return {?}
*/
pauseAll() {
// reset preprocessState
this.r.files.forEach((/**
* @param {?} file
* @param {?} index
* @return {?}
*/
(file, index) => {
if (file.preprocessState === 1) {
file.preprocessState = 0;
}
}));
this.r.pause();
}
/**
* @return {?}
*/
removeAll() {
/** @type {?} */
const tempFiles = this.r.files.slice();
tempFiles.forEach((/**
* @param {?} file
* @param {?} index
* @return {?}
*/
(file, index) => {
/** @type {?} */
const that = (/** @type {?} */ (this));
that.r.removeFile(file);
}));
this._isWorking = false;
}
/**
* @param {?} item
* @return {?}
*/
removeItem(item) {
this.r.removeFile(item.externalItem);
if (this.r.files.length <= 0) {
this._isWorking = false;
}
}
/**
* @param {?} item
* @return {?}
*/
retryItem(item) {
item.externalItem.retry();
}
}
ResumableJsUploader.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ResumableJsUploader.ctorParameters = () => [
{ type: LoggerService },
{ type: GuidUtil },
{ type: CryptoService }
];
if (false) {
/**
* @type {?}
* @private
*/
ResumableJsUploader.prototype.r;
/**
* @type {?}
* @private
*/
ResumableJsUploader.prototype.preprocessFileFn;
/**
* @type {?}
* @private
*/
ResumableJsUploader.prototype.preprocessChunkFn;
/**
* @type {?}
* @protected
*/
ResumableJsUploader.prototype.logger;
/**
* @type {?}
* @protected
*/
ResumableJsUploader.prototype.guidUtil;
/**
* @type {?}
* @protected
*/
ResumableJsUploader.prototype.cryptoService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1hYmxlanMudXBsb2FkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW1hdGVyaWFsLWRhdGF0cmFuc2Zlci1saWIvIiwic291cmNlcyI6WyJsaWIvaW8vdXBsb2FkZXJzL3Jlc3VtYWJsZWpzLnVwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0sc0NBQXNDLENBQUM7QUFDM0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHOUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFlBQVk7Ozs7OztJQU1qRCxZQUFzQixNQUFxQixFQUNyQixRQUFrQixFQUNsQixhQUE0QjtRQUM5QyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUhyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JC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LFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQzs7Ozs7SUFFTSxVQUFVLENBQUMsSUFBdUI7UUFDckMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztTQUMzQjtJQUNMLENBQUM7Ozs7O0lBRU0sU0FBUyxDQUFDLElBQXVCO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQzs7O1lBaE1KLFVBQVU7Ozs7WUFWRixhQUFhO1lBQ2IsUUFBUTtZQUNSLGFBQWE7Ozs7Ozs7SUFXbEIsZ0NBQTJDOzs7OztJQUMzQywrQ0FBcUM7Ozs7O0lBQ3JDLGdEQUFzQzs7Ozs7SUFFMUIscUNBQStCOzs7OztJQUMvQix1Q0FBNEI7Ozs7O0lBQzVCLDRDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgUmVzdW1hYmxlIGZyb20gJ3Jlc3VtYWJsZWpzJztcclxuaW1wb3J0IHsgQmFzZVVwbG9hZGVyIH0gZnJvbSAnLi9iYXNlLnVwbG9hZGVyJztcclxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3VpZFV0aWwgfSBmcm9tICcuLi8uLi91dGlscy9ndWlkLnV0aWwnO1xyXG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY3J5cHRvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2ZlclN0YXR1cyB9IGZyb20gJy4uLy4uL2VudW1zL3RyYW5zZmVyLXN0YXR1cy5lbnVtJztcclxuaW1wb3J0IHsgRGF0YXRyYW5zZmVySXRlbSwgSURhdGF0cmFuc2Zlckl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0YXRyYW5zZmVyLWl0ZW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBTaXplQ29udGFpbmVyIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NpemUtY29udGFpbmVyLm1vZGVsJztcclxuaW1wb3J0IHsgRGVjaW1hbEJ5dGVVbml0IH0gZnJvbSAnLi4vLi4vZW51bXMvZGVjaW1hbC1ieXRlLXVuaXQuZW51bSc7XHJcbmltcG9ydCB7IFByb2dyZXNzQ29udGFpbmVyIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Byb2dyZXNzLWNvbnRhaW5lci5tb2RlbCc7XHJcbmltcG9ydCB7IFRyYW5zZmVyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3RyYW5zZmVyLXR5cGUuZW51bSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBSZXN1bWFibGVKc1VwbG9hZGVyIGV4dGVuZHMgQmFzZVVwbG9hZGVyIHtcclxuXHJcbiAgICBwcml2YXRlIHI6IFJlc3VtYWJsZS5SZXN1bWFibGUgPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIHByZXByb2Nlc3NGaWxlRm4gPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIHByZXByb2Nlc3NDaHVua0ZuID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBsb2dnZXI6IExvZ2dlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZ3VpZFV0aWw6IEd1aWRVdGlsLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UpIHtcclxuICAgICAgICBzdXBlcihsb2dnZXIsIGd1aWRVdGlsLCBjcnlwdG9TZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmluaXRSZXN1bWFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRSZXN1bWFibGUoKTogdm9pZCB7XHJcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVJZChmaWxlLCBldmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhhdC5nZW5lcmF0ZVVuaXF1ZUlkZW50aWZpZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NDaHVua0lubGluZUZuKHJlc3VtYWJsZUNodW5rKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhhdC5wcmVwcm9jZXNzQ2h1bmtGbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhhdC5wcmVwcm9jZXNzQ2h1bmtGbihyZXN1bWFibGVDaHVuayk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bWFibGVDaHVuay5wcmVwcm9jZXNzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcHJlcHJvY2Vzc0ZpbGVJbmxpbmVGbihyZXN1bWFibGVGaWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhhdC5wcmVwcm9jZXNzRmlsZUZuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMocmVzdW1hYmxlRmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLlByZXByb2Nlc3NpbmcpO1xyXG4gICAgICAgICAgICAgICAgdGhhdC5wcmVwcm9jZXNzRmlsZUZuKHJlc3VtYWJsZUZpbGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MuY29yZS5wcmVwcm9jZXNzSGFzaEVuYWJsZWQgJiYgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5jb3JlLnByZXByb2Nlc3NIYXNoQ2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuY2hhbmdlSXRlbVN0YXR1cyhyZXN1bWFibGVGaWxlLmludGVybmFsSXRlbSwgVHJhbnNmZXJTdGF0dXMuUHJlcHJvY2Vzc2luZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGludWVDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bWFibGVGaWxlLnByZXByb2Nlc3NGaW5pc2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuY2VsQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1hYmxlRmlsZS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5jaGFuZ2VJdGVtU3RhdHVzKHJlc3VtYWJsZUZpbGUuaW50ZXJuYWxJdGVtLCBUcmFuc2ZlclN0YXR1cy5GaW5pc2hlZCwgcmVzdW1hYmxlRmlsZS5pbnRlcm5hbEl0ZW0ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuci51cGxvYWROZXh0Q2h1bmsoKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQucHJlcHJvY2Vzc0hhc2gocmVzdW1hYmxlRmlsZS5pbnRlcm5hbEl0ZW0sIHJlc3VtYWJsZUZpbGUuZmlsZSwgY29udGludWVDYWxsYmFjaywgY2FuY2VsQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bWFibGVGaWxlLnByZXByb2Nlc3NGaW5pc2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLmdlbmVyYXRlVW5pcXVlSWRlbnRpZmllciA9IGdlbmVyYXRlSWQuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgLy8gY2xvbmVzIHRoZSBmdW5jdGlvbiB3aXRoICd7fScgYWN0aW5nIGFzIGl0J3MgbmV3ICd0aGlzJyBwYXJhbWV0ZXJcclxuICAgICAgICAgICAgdGhpcy5wcmVwcm9jZXNzQ2h1bmtGbiA9IENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MucmVzdW1hYmxlanMucHJlcHJvY2Vzcy5iaW5kKHt9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcy5wcmVwcm9jZXNzID0gcHJlcHJvY2Vzc0NodW5rSW5saW5lRm4uYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3NGaWxlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIC8vIGNsb25lcyB0aGUgZnVuY3Rpb24gd2l0aCAne30nIGFjdGluZyBhcyBpdCdzIG5ldyAndGhpcycgcGFyYW1ldGVyXHJcbiAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc0ZpbGVGbiA9IENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MucmVzdW1hYmxlanMucHJlcHJvY2Vzc0ZpbGUuYmluZCh7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MucmVzdW1hYmxlanMucHJlcHJvY2Vzc0ZpbGUgPSBwcmVwcm9jZXNzRmlsZUlubGluZUZuLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGlnbm9yZSB0eXBlIGNoZWNraW5nXHJcbiAgICAgICAgdGhpcy5yID0gbmV3IFJlc3VtYWJsZShDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzKTtcclxuXHJcbiAgICAgICAgdGhpcy5yLm9uKCdmaWxlQWRkZWQnLCBmdW5jdGlvbihmaWxlLCBldmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2ZpbGVBZGRlZCcsIGZpbGUpO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdJdGVtID0gbmV3IERhdGF0cmFuc2Zlckl0ZW0oe1xyXG4gICAgICAgICAgICAgICAgaWQ6IGZpbGUudW5pcXVlSWRlbnRpZmllcixcclxuICAgICAgICAgICAgICAgIG5hbWU6IGZpbGUuZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLnJlbGF0aXZlUGF0aC5zdWJzdHIoMCwgZmlsZS5yZWxhdGl2ZVBhdGgubGVuZ3RoIC0gZmlsZS5maWxlTmFtZS5sZW5ndGgpLFxyXG4gICAgICAgICAgICAgICAgc2l6ZUNvbnRhaW5lcjogbmV3IFNpemVDb250YWluZXIoeyBkZWNpbWFsQnl0ZVVuaXQ6IERlY2ltYWxCeXRlVW5pdC5CeXRlLCBkZWNpbWFsQnl0ZVVuaXRTaXplOiBmaWxlLnNpemUgfSksXHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0NvbnRhaW5lcjogbmV3IFByb2dyZXNzQ29udGFpbmVyKGZpbGUuc2l6ZSksXHJcbiAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGU6IFRyYW5zZmVyVHlwZS5VcGxvYWQsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFRyYW5zZmVyU3RhdHVzLlJlYWR5LFxyXG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxJdGVtOiBmaWxlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBmaWxlLmludGVybmFsSXRlbSA9IG5ld0l0ZW07XHJcbiAgICAgICAgICAgIHRoYXQuYWRkSXRlbShuZXdJdGVtKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbignZmlsZVByb2dyZXNzJywgZnVuY3Rpb24oZmlsZSwgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2ZpbGVQcm9ncmVzcycsIGZpbGUucHJvZ3Jlc3MoKSk7XHJcbiAgICAgICAgICAgIHRoYXQuY2hhbmdlSXRlbVN0YXR1cyhmaWxlLmludGVybmFsSXRlbSwgVHJhbnNmZXJTdGF0dXMuVXBsb2FkaW5nKTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVJdGVtUHJvZ3Jlc3MoZmlsZS5pbnRlcm5hbEl0ZW0sIGZpbGUucHJvZ3Jlc3MoKSk7XHJcbiAgICAgICAgICAgIHRoYXQudXBkYXRlT3ZlcmFsbFByb2dyZXNzKHRoYXQudHJhbnNmZXJUeXBlLCB0aGF0LnIucHJvZ3Jlc3MoKSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ2ZpbGVTdWNjZXNzJywgZnVuY3Rpb24oZmlsZSwgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2ZpbGVTdWNjZXNzJywgZmlsZSk7XHJcbiAgICAgICAgICAgIHRoYXQuY2hhbmdlSXRlbVN0YXR1cyhmaWxlLmludGVybmFsSXRlbSwgVHJhbnNmZXJTdGF0dXMuRmluaXNoZWQsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5yLm9uKCdmaWxlRXJyb3InLCBmdW5jdGlvbihmaWxlLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIC8vIHRoYXQubG9nZ2VyLmxvZygnZmlsZUVycm9yJywgZmlsZSwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoYXQuY2hhbmdlSXRlbVN0YXR1cyhmaWxlLmludGVybmFsSXRlbSwgVHJhbnNmZXJTdGF0dXMuRmFpbGVkLCBtZXNzYWdlKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbigndXBsb2FkU3RhcnQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCd1cGxvYWRTdGFydCcsIHRoYXQucik7XHJcbiAgICAgICAgICAgIHRoYXQuX2lzV29ya2luZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoYXQudXBkYXRlWm9uZSgpO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZU92ZXJhbGxQcm9ncmVzcyh0aGF0LnRyYW5zZmVyVHlwZSwgdGhhdC5yLnByb2dyZXNzKCkpO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZU92ZXJhbGxTaXplKHRoYXQuci5nZXRTaXplKCkpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5yLm9uKCdjaHVua2luZ0NvbXBsZXRlJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIC8vIHRoYXQubG9nZ2VyLmxvZygnY2h1bmtpbmdDb21wbGV0ZScpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5yLm9uKCdwYXVzZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ3BhdXNlJyk7XHJcbiAgICAgICAgICAgIHRoYXQuX2lzV29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZVpvbmUoKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbignY2FuY2VsJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIC8vIHRoYXQubG9nZ2VyLmxvZygnY2FuY2VsJyk7XHJcbiAgICAgICAgICAgIHRoYXQuX2lzV29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZVpvbmUoKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbignY29tcGxldGUnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdjb21wbGV0ZScsIHRoYXQucik7XHJcbiAgICAgICAgICAgIHRoYXQuX2lzV29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZVpvbmUoKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3NpZ25Ccm93c2UoZWxlbWVudCwgaXNEaXJlY3RvcnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnIuYXNzaWduQnJvd3NlKGVsZW1lbnQsIGlzRGlyZWN0b3J5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXNzaWduRHJvcChlbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yLmFzc2lnbkRyb3AoZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVkaXRQYXRoKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuZWRpdFBhdGgob2xkUGF0aCwgbmV3UGF0aCk7XHJcbiAgICAgICAgdGhpcy5yLmZpbGVzLmZvckVhY2goKGZpbGU6IGFueSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxJdGVtID0gZmlsZS5pbnRlcm5hbEl0ZW0gYXMgSURhdGF0cmFuc2Zlckl0ZW07XHJcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbEl0ZW0uc3RhdHVzID09PSBUcmFuc2ZlclN0YXR1cy5SZWFkeSAmJiBpbnRlcm5hbEl0ZW0ucGF0aCA9PT0gb2xkUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgZmlsZS5yZWxhdGl2ZVBhdGggPSBuZXdQYXRoICsgZmlsZS5maWxlTmFtZTtcclxuICAgICAgICAgICAgICAgIGludGVybmFsSXRlbS5wYXRoID0gbmV3UGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlZGl0RmlsZW5hbWUoaXRlbTogSURhdGF0cmFuc2Zlckl0ZW0sIG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmVkaXRGaWxlbmFtZShpdGVtLCBuYW1lKTtcclxuICAgICAgICBpdGVtLmV4dGVybmFsSXRlbS5maWxlTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgaXRlbS5leHRlcm5hbEl0ZW0ucmVsYXRpdmVQYXRoID0gaXRlbS5wYXRoICsgbmFtZTtcclxuICAgICAgICBpdGVtLm5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydEFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnIudXBsb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhdXNlQWxsKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHJlc2V0IHByZXByb2Nlc3NTdGF0ZVxyXG4gICAgICAgIHRoaXMuci5maWxlcy5mb3JFYWNoKChmaWxlOiBhbnksIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWxlLnByZXByb2Nlc3NTdGF0ZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgZmlsZS5wcmVwcm9jZXNzU3RhdGUgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yLnBhdXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUFsbCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0ZW1wRmlsZXMgPSB0aGlzLnIuZmlsZXMuc2xpY2UoKTtcclxuICAgICAgICB0ZW1wRmlsZXMuZm9yRWFjaCgoZmlsZTogYW55LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICB0aGF0LnIucmVtb3ZlRmlsZShmaWxlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShpdGVtOiBJRGF0YXRyYW5zZmVySXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuci5yZW1vdmVGaWxlKGl0ZW0uZXh0ZXJuYWxJdGVtKTtcclxuICAgICAgICBpZiAodGhpcy5yLmZpbGVzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzV29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmV0cnlJdGVtKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaXRlbS5leHRlcm5hbEl0ZW0ucmV0cnkoKTtcclxuICAgIH1cclxufVxyXG4iXX0=