UNPKG

angular-material-datatransfer-lib

Version:

A HTML5 datatransfer UI for handling upload and download of multiple simultaneous files.

411 lines 37.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/io/uploaders/resumablejs.uploader.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; 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'; var ResumableJsUploader = /** @class */ (function (_super) { tslib_1.__extends(ResumableJsUploader, _super); function ResumableJsUploader(logger, guidUtil, cryptoService) { var _this = _super.call(this, logger, guidUtil, cryptoService) || this; _this.logger = logger; _this.guidUtil = guidUtil; _this.cryptoService = cryptoService; _this.r = undefined; _this.preprocessFileFn = undefined; _this.preprocessChunkFn = undefined; _this.initResumable(); return _this; } /** * @private * @return {?} */ ResumableJsUploader.prototype.initResumable = /** * @private * @return {?} */ function () { /** * @param {?} file * @param {?} event * @return {?} */ function generateId(file, event) { /** @type {?} */ var that = (/** @type {?} */ (this)); return that.generateUniqueIdentifier(); } /** * @param {?} resumableChunk * @return {?} */ function preprocessChunkInlineFn(resumableChunk) { /** @type {?} */ var that = (/** @type {?} */ (this)); if (typeof that.preprocessChunkFn === 'function') { that.preprocessChunkFn(resumableChunk); } else { resumableChunk.preprocessFinished(); } } /** * @param {?} resumableFile * @return {?} */ function preprocessFileInlineFn(resumableFile) { /** @type {?} */ var 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 {?} */ var continueCallback = (/** * @return {?} */ function () { resumableFile.preprocessFinished(); }); /** @type {?} */ var 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 {?} */ var that = (/** @type {?} */ (this)); // that.logger.log('fileAdded', file); /** @type {?} */ var 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 {?} */ var 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 {?} */ var 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 {?} */ var 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 {?} */ var 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 {?} */ var that = (/** @type {?} */ (this)); // that.logger.log('chunkingComplete'); }).bind(this)); this.r.on('pause', (/** * @return {?} */ function () { /** @type {?} */ var that = (/** @type {?} */ (this)); // that.logger.log('pause'); that._isWorking = false; that.updateZone(); }).bind(this)); this.r.on('cancel', (/** * @return {?} */ function () { /** @type {?} */ var that = (/** @type {?} */ (this)); // that.logger.log('cancel'); that._isWorking = false; that.updateZone(); }).bind(this)); this.r.on('complete', (/** * @return {?} */ function () { /** @type {?} */ var that = (/** @type {?} */ (this)); // that.logger.log('complete', that.r); that._isWorking = false; that.updateZone(); }).bind(this)); }; /** * @param {?} element * @param {?} isDirectory * @return {?} */ ResumableJsUploader.prototype.assignBrowse = /** * @param {?} element * @param {?} isDirectory * @return {?} */ function (element, isDirectory) { this.r.assignBrowse(element, isDirectory); }; /** * @param {?} element * @return {?} */ ResumableJsUploader.prototype.assignDrop = /** * @param {?} element * @return {?} */ function (element) { this.r.assignDrop(element); }; /** * @param {?} oldPath * @param {?} newPath * @return {?} */ ResumableJsUploader.prototype.editPath = /** * @param {?} oldPath * @param {?} newPath * @return {?} */ function (oldPath, newPath) { _super.prototype.editPath.call(this, oldPath, newPath); this.r.files.forEach((/** * @param {?} file * @param {?} index * @return {?} */ function (file, index) { /** @type {?} */ var 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 {?} */ ResumableJsUploader.prototype.editFilename = /** * @param {?} item * @param {?} name * @return {?} */ function (item, name) { _super.prototype.editFilename.call(this, item, name); item.externalItem.fileName = name; item.externalItem.relativePath = item.path + name; item.name = name; }; /** * @return {?} */ ResumableJsUploader.prototype.startAll = /** * @return {?} */ function () { this.r.upload(); }; /** * @return {?} */ ResumableJsUploader.prototype.pauseAll = /** * @return {?} */ function () { // reset preprocessState this.r.files.forEach((/** * @param {?} file * @param {?} index * @return {?} */ function (file, index) { if (file.preprocessState === 1) { file.preprocessState = 0; } })); this.r.pause(); }; /** * @return {?} */ ResumableJsUploader.prototype.removeAll = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var tempFiles = this.r.files.slice(); tempFiles.forEach((/** * @param {?} file * @param {?} index * @return {?} */ function (file, index) { /** @type {?} */ var that = (/** @type {?} */ (_this)); that.r.removeFile(file); })); this._isWorking = false; }; /** * @param {?} item * @return {?} */ ResumableJsUploader.prototype.removeItem = /** * @param {?} item * @return {?} */ function (item) { this.r.removeFile(item.externalItem); if (this.r.files.length <= 0) { this._isWorking = false; } }; /** * @param {?} item * @return {?} */ ResumableJsUploader.prototype.retryItem = /** * @param {?} item * @return {?} */ function (item) { item.externalItem.retry(); }; ResumableJsUploader.decorators = [ { type: Injectable } ]; /** @nocollapse */ ResumableJsUploader.ctorParameters = function () { return [ { type: LoggerService }, { type: GuidUtil }, { type: CryptoService } ]; }; return ResumableJsUploader; }(BaseUploader)); export { ResumableJsUploader }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1hYmxlanMudXBsb2FkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW1hdGVyaWFsLWRhdGF0cmFuc2Zlci1saWIvIiwic291cmNlcyI6WyJsaWIvaW8vdXBsb2FkZXJzL3Jlc3VtYWJsZWpzLnVwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFxQixNQUFNLHNDQUFzQyxDQUFDO0FBQzNGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTlEO0lBQ3lDLCtDQUFZO0lBTWpELDZCQUFzQixNQUFxQixFQUNyQixRQUFrQixFQUNsQixhQUE0QjtRQUZsRCxZQUdJLGtCQUFNLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLFNBRXpDO1FBTHFCLFlBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsY0FBUSxHQUFSLFFBQVEs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QUM7UUFDNUIsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDOzs7OztJQUVNLHdDQUFVOzs7O0lBQWpCLFVBQWtCLElBQXVCO1FBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDTCxDQUFDOzs7OztJQUVNLHVDQUFTOzs7O0lBQWhCLFVBQWlCLElBQXVCO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQzs7Z0JBaE1KLFVBQVU7Ozs7Z0JBVkYsYUFBYTtnQkFDYixRQUFRO2dCQUNSLGFBQWE7O0lBeU10QiwwQkFBQztDQUFBLEFBak1ELENBQ3lDLFlBQVksR0FnTXBEO1NBaE1ZLG1CQUFtQjs7Ozs7O0lBRTVCLGdDQUEyQzs7Ozs7SUFDM0MsK0NBQXFDOzs7OztJQUNyQyxnREFBc0M7Ozs7O0lBRTFCLHFDQUErQjs7Ozs7SUFDL0IsdUNBQTRCOzs7OztJQUM1Qiw0Q0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIFJlc3VtYWJsZSBmcm9tICdyZXN1bWFibGVqcyc7XHJcbmltcG9ydCB7IEJhc2VVcGxvYWRlciB9IGZyb20gJy4vYmFzZS51cGxvYWRlcic7XHJcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEd1aWRVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ3VpZC51dGlsJztcclxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NyeXB0by5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNmZXJTdGF0dXMgfSBmcm9tICcuLi8uLi9lbnVtcy90cmFuc2Zlci1zdGF0dXMuZW51bSc7XHJcbmltcG9ydCB7IERhdGF0cmFuc2Zlckl0ZW0sIElEYXRhdHJhbnNmZXJJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGF0cmFuc2Zlci1pdGVtLm1vZGVsJztcclxuaW1wb3J0IHsgU2l6ZUNvbnRhaW5lciB9IGZyb20gJy4uLy4uL21vZGVscy9zaXplLWNvbnRhaW5lci5tb2RlbCc7XHJcbmltcG9ydCB7IERlY2ltYWxCeXRlVW5pdCB9IGZyb20gJy4uLy4uL2VudW1zL2RlY2ltYWwtYnl0ZS11bml0LmVudW0nO1xyXG5pbXBvcnQgeyBQcm9ncmVzc0NvbnRhaW5lciB9IGZyb20gJy4uLy4uL21vZGVscy9wcm9ncmVzcy1jb250YWluZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBUcmFuc2ZlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy90cmFuc2Zlci10eXBlLmVudW0nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUmVzdW1hYmxlSnNVcGxvYWRlciBleHRlbmRzIEJhc2VVcGxvYWRlciB7XHJcblxyXG4gICAgcHJpdmF0ZSByOiBSZXN1bWFibGUuUmVzdW1hYmxlID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBwcmVwcm9jZXNzRmlsZUZuID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBwcmVwcm9jZXNzQ2h1bmtGbiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGd1aWRVdGlsOiBHdWlkVXRpbCxcclxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIobG9nZ2VyLCBndWlkVXRpbCwgY3J5cHRvU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5pbml0UmVzdW1hYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UmVzdW1hYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlSWQoZmlsZSwgZXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoYXQuZ2VuZXJhdGVVbmlxdWVJZGVudGlmaWVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBwcmVwcm9jZXNzQ2h1bmtJbmxpbmVGbihyZXN1bWFibGVDaHVuaykge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoYXQucHJlcHJvY2Vzc0NodW5rRm4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoYXQucHJlcHJvY2Vzc0NodW5rRm4ocmVzdW1hYmxlQ2h1bmspO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdW1hYmxlQ2h1bmsucHJlcHJvY2Vzc0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NGaWxlSW5saW5lRm4ocmVzdW1hYmxlRmlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoYXQucHJlcHJvY2Vzc0ZpbGVGbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhhdC5jaGFuZ2VJdGVtU3RhdHVzKHJlc3VtYWJsZUZpbGUuaW50ZXJuYWxJdGVtLCBUcmFuc2ZlclN0YXR1cy5QcmVwcm9jZXNzaW5nKTtcclxuICAgICAgICAgICAgICAgIHRoYXQucHJlcHJvY2Vzc0ZpbGVGbihyZXN1bWFibGVGaWxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChDb25maWdTZXJ2aWNlLnNldHRpbmdzLmNvcmUucHJlcHJvY2Vzc0hhc2hFbmFibGVkICYmIENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MuY29yZS5wcmVwcm9jZXNzSGFzaENoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMocmVzdW1hYmxlRmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLlByZXByb2Nlc3NpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRpbnVlQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1hYmxlRmlsZS5wcmVwcm9jZXNzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtYWJsZUZpbGUuY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuY2hhbmdlSXRlbVN0YXR1cyhyZXN1bWFibGVGaWxlLmludGVybmFsSXRlbSwgVHJhbnNmZXJTdGF0dXMuRmluaXNoZWQsIHJlc3VtYWJsZUZpbGUuaW50ZXJuYWxJdGVtLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnIudXBsb2FkTmV4dENodW5rKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LnByZXByb2Nlc3NIYXNoKHJlc3VtYWJsZUZpbGUuaW50ZXJuYWxJdGVtLCByZXN1bWFibGVGaWxlLmZpbGUsIGNvbnRpbnVlQ2FsbGJhY2ssIGNhbmNlbENhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1hYmxlRmlsZS5wcmVwcm9jZXNzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcy5nZW5lcmF0ZVVuaXF1ZUlkZW50aWZpZXIgPSBnZW5lcmF0ZUlkLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcy5wcmVwcm9jZXNzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIC8vIGNsb25lcyB0aGUgZnVuY3Rpb24gd2l0aCAne30nIGFjdGluZyBhcyBpdCdzIG5ldyAndGhpcycgcGFyYW1ldGVyXHJcbiAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc0NodW5rRm4gPSBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3MuYmluZCh7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MucmVzdW1hYmxlanMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NDaHVua0lubGluZUZuLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcy5wcmVwcm9jZXNzRmlsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAvLyBjbG9uZXMgdGhlIGZ1bmN0aW9uIHdpdGggJ3t9JyBhY3RpbmcgYXMgaXQncyBuZXcgJ3RoaXMnIHBhcmFtZXRlclxyXG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NGaWxlRm4gPSBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3NGaWxlLmJpbmQoe30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3NGaWxlID0gcHJlcHJvY2Vzc0ZpbGVJbmxpbmVGbi5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICAvLyBAdHMtaWdub3JlOiBpZ25vcmUgdHlwZSBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMuciA9IG5ldyBSZXN1bWFibGUoQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcyk7XHJcblxyXG4gICAgICAgIHRoaXMuci5vbignZmlsZUFkZGVkJywgZnVuY3Rpb24oZmlsZSwgZXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdmaWxlQWRkZWQnLCBmaWxlKTtcclxuICAgICAgICAgICAgY29uc3QgbmV3SXRlbSA9IG5ldyBEYXRhdHJhbnNmZXJJdGVtKHtcclxuICAgICAgICAgICAgICAgIGlkOiBmaWxlLnVuaXF1ZUlkZW50aWZpZXIsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLmZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogZmlsZS5yZWxhdGl2ZVBhdGguc3Vic3RyKDAsIGZpbGUucmVsYXRpdmVQYXRoLmxlbmd0aCAtIGZpbGUuZmlsZU5hbWUubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHNpemVDb250YWluZXI6IG5ldyBTaXplQ29udGFpbmVyKHsgZGVjaW1hbEJ5dGVVbml0OiBEZWNpbWFsQnl0ZVVuaXQuQnl0ZSwgZGVjaW1hbEJ5dGVVbml0U2l6ZTogZmlsZS5zaXplIH0pLFxyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NDb250YWluZXI6IG5ldyBQcm9ncmVzc0NvbnRhaW5lcihmaWxlLnNpemUpLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlOiBUcmFuc2ZlclR5cGUuVXBsb2FkLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBUcmFuc2ZlclN0YXR1cy5SZWFkeSxcclxuICAgICAgICAgICAgICAgIGV4dGVybmFsSXRlbTogZmlsZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZmlsZS5pbnRlcm5hbEl0ZW0gPSBuZXdJdGVtO1xyXG4gICAgICAgICAgICB0aGF0LmFkZEl0ZW0obmV3SXRlbSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ2ZpbGVQcm9ncmVzcycsIGZ1bmN0aW9uKGZpbGUsIG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdmaWxlUHJvZ3Jlc3MnLCBmaWxlLnByb2dyZXNzKCkpO1xyXG4gICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMoZmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLlVwbG9hZGluZyk7XHJcbiAgICAgICAgICAgIHRoYXQudXBkYXRlSXRlbVByb2dyZXNzKGZpbGUuaW50ZXJuYWxJdGVtLCBmaWxlLnByb2dyZXNzKCkpO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZU92ZXJhbGxQcm9ncmVzcyh0aGF0LnRyYW5zZmVyVHlwZSwgdGhhdC5yLnByb2dyZXNzKCkpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5yLm9uKCdmaWxlU3VjY2VzcycsIGZ1bmN0aW9uKGZpbGUsIG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdmaWxlU3VjY2VzcycsIGZpbGUpO1xyXG4gICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMoZmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLkZpbmlzaGVkLCBtZXNzYWdlKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbignZmlsZUVycm9yJywgZnVuY3Rpb24oZmlsZSwgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2ZpbGVFcnJvcicsIGZpbGUsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMoZmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLkZhaWxlZCwgbWVzc2FnZSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ3VwbG9hZFN0YXJ0JywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIC8vIHRoYXQubG9nZ2VyLmxvZygndXBsb2FkU3RhcnQnLCB0aGF0LnIpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZVpvbmUoKTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVPdmVyYWxsUHJvZ3Jlc3ModGhhdC50cmFuc2ZlclR5cGUsIHRoYXQuci5wcm9ncmVzcygpKTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVPdmVyYWxsU2l6ZSh0aGF0LnIuZ2V0U2l6ZSgpKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbignY2h1bmtpbmdDb21wbGV0ZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2NodW5raW5nQ29tcGxldGUnKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbigncGF1c2UnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdwYXVzZScpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVab25lKCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ2NhbmNlbCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2NhbmNlbCcpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVab25lKCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ2NvbXBsZXRlJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIC8vIHRoYXQubG9nZ2VyLmxvZygnY29tcGxldGUnLCB0aGF0LnIpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVab25lKCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXNzaWduQnJvd3NlKGVsZW1lbnQsIGlzRGlyZWN0b3J5KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yLmFzc2lnbkJyb3dzZShlbGVtZW50LCBpc0RpcmVjdG9yeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzc2lnbkRyb3AoZWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuci5hc3NpZ25Ecm9wKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlZGl0UGF0aChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmVkaXRQYXRoKG9sZFBhdGgsIG5ld1BhdGgpO1xyXG4gICAgICAgIHRoaXMuci5maWxlcy5mb3JFYWNoKChmaWxlOiBhbnksIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGludGVybmFsSXRlbSA9IGZpbGUuaW50ZXJuYWxJdGVtIGFzIElEYXRhdHJhbnNmZXJJdGVtO1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxJdGVtLnN0YXR1cyA9PT0gVHJhbnNmZXJTdGF0dXMuUmVhZHkgJiYgaW50ZXJuYWxJdGVtLnBhdGggPT09IG9sZFBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGZpbGUucmVsYXRpdmVQYXRoID0gbmV3UGF0aCArIGZpbGUuZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEl0ZW0ucGF0aCA9IG5ld1BhdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZWRpdEZpbGVuYW1lKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5lZGl0RmlsZW5hbWUoaXRlbSwgbmFtZSk7XHJcbiAgICAgICAgaXRlbS5leHRlcm5hbEl0ZW0uZmlsZU5hbWUgPSBuYW1lO1xyXG4gICAgICAgIGl0ZW0uZXh0ZXJuYWxJdGVtLnJlbGF0aXZlUGF0aCA9IGl0ZW0ucGF0aCArIG5hbWU7XHJcbiAgICAgICAgaXRlbS5uYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yLnVwbG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwYXVzZUFsbCgpOiB2b2lkIHtcclxuICAgICAgICAvLyByZXNldCBwcmVwcm9jZXNzU3RhdGVcclxuICAgICAgICB0aGlzLnIuZmlsZXMuZm9yRWFjaCgoZmlsZTogYW55LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsZS5wcmVwcm9jZXNzU3RhdGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGZpbGUucHJlcHJvY2Vzc1N0YXRlID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuci5wYXVzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGVtcEZpbGVzID0gdGhpcy5yLmZpbGVzLnNsaWNlKCk7XHJcbiAgICAgICAgdGVtcEZpbGVzLmZvckVhY2goKGZpbGU6IGFueSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgdGhhdC5yLnJlbW92ZUZpbGUoZmlsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5faXNXb3JraW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUl0ZW0oaXRlbTogSURhdGF0cmFuc2Zlckl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnIucmVtb3ZlRmlsZShpdGVtLmV4dGVybmFsSXRlbSk7XHJcbiAgICAgICAgaWYgKHRoaXMuci5maWxlcy5sZW5ndGggPD0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJldHJ5SXRlbShpdGVtOiBJRGF0YXRyYW5zZmVySXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGl0ZW0uZXh0ZXJuYWxJdGVtLnJldHJ5KCk7XHJcbiAgICB9XHJcbn1cclxuIl19