UNPKG

ontimize-web-ngx

Version:
246 lines 30.5 kB
import { Codes } from '../../../util/codes'; export class OFileUploader { constructor(service, entity) { this.service = service; this.files = []; this.isUploading = false; this.progress = 0; this.nextIndex = 0; this.splitUpload = true; this.entity = entity; } addFile(fileItem) { this.files.push(fileItem); this.progress = this._getTotalProgress(); } clear() { this.cancel(); while (this.files.length) { this.files[0].remove(); } this.progress = 0; } removeFile(value) { const index = this.getIndexOfItem(value); const item = this.files[index]; if (item) { if (item.isUploading) { item.cancel(); } this.files.splice(index, 1); this.progress = this._getTotalProgress(); } } upload() { this.files.forEach((item) => { if (item.pendingUpload) { item.prepareToUpload(); } }); if (this.splitUpload) { this.files.forEach((item) => { if (item.pendingUpload) { this.uploadItem(item); } }); } else { this.uploadItems(this.files); } } uploadItem(item) { item.prepareToUpload(); if (this.isUploading || item.isUploading) { return; } this.isUploading = true; item.isUploading = true; this._onBeforeUploadItem(item); if (this.service === undefined) { console.warn('No service configured! aborting upload'); return; } if (this._uploadSuscription) { this._uploadSuscription.unsubscribe(); } const self = this; this._uploadSuscription = item._uploadSuscription = this.service.upload([item], this.entity, this.data).subscribe(resp => { if (resp.loaded && resp.total) { const progress = Math.round(resp.loaded * 100 / resp.total); self._onProgressItem(item, progress); } else if (resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE) { self._onSuccessItem(item, resp); } else { console.error('uploadItem error'); self._onErrorItem(item, 'Unknow error'); } }, err => self._onErrorItem(item, err), () => self._onCompleteItem(item)); } uploadItems(items) { if (this.isUploading || items.some(item => item.isUploading)) { return; } this.isUploading = true; this._onBeforeUploadAll(); if (this.service === undefined) { console.warn('No service configured! aborting upload'); return; } if (this._uploadSuscription) { this._uploadSuscription.unsubscribe(); } const self = this; this._uploadSuscription = this.service.upload(items, this.entity, this.data).subscribe(resp => { if (resp.loaded && resp.total) { const progress = Math.round(resp.loaded * 100 / resp.total); self._onProgressAll(progress); } else if (resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE) { self._onSuccessAll(resp); } else { console.error('uploadItems error'); } }, err => self._onErrorAll(err), () => self._onCompleteAll()); } cancel() { if (this.splitUpload) { this.files.forEach(item => item.cancel()); } else { if (this._uploadSuscription) { this._uploadSuscription.unsubscribe(); } this._onCancelAll(); this._onCompleteAll(); } } cancelItem(value) { const index = this.getIndexOfItem(value); const item = this.files[index]; if (item && item.isUploading && this.splitUpload) { item._uploadSuscription.unsubscribe(); } this._onCancelItem(item); this._onCompleteItem(item); } getNotUploadedItems() { return this.files.filter((item) => !item.isUploaded); } getIndexOfItem(value) { return typeof value === 'number' ? value : this.files.indexOf(value); } onBeforeUploadItem(fileItem) { return { fileItem }; } onBeforeUploadAll() { return {}; } onProgressItem(fileItem, progress) { return { fileItem, progress }; } onProgressAll(progress) { return { progress }; } onCancelItem(fileItem) { return { fileItem }; } onCancelAll() { return {}; } onSuccessItem(fileItem, response) { return { fileItem, response }; } onSuccessAll(response) { return { response }; } onErrorItem(fileItem, error) { return { fileItem, error }; } onErrorAll(error) { return { error }; } onCompleteItem(fileItem) { return { fileItem }; } onCompleteAll() { return void 0; } _onBeforeUploadItem(item) { item._onBeforeUpload(); this.onBeforeUploadItem(item); } _onBeforeUploadAll() { this.files.forEach(item => item._onBeforeUpload(false)); this.onBeforeUploadAll(); } _onProgressItem(item, progress) { const total = this._getTotalProgress(progress); this.progress = total; item._onProgress(progress); this.onProgressItem(item, progress); this.onProgressAll(total); } _onProgressAll(progress) { const total = this._getTotalProgress(progress); this.progress = total; this.onProgressAll(total); } _onSuccessItem(item, response) { item._onSuccess(response); this.onSuccessItem(item, response); } _onSuccessAll(response) { this.files.forEach(item => item._onSuccess(response, false)); this.onSuccessAll(response); } _onErrorItem(item, error) { item._onError(error); this.onErrorItem(item, error); } _onErrorAll(error) { this.files.forEach(item => item._onError(error, false)); this.onErrorAll(error); } _onCancelItem(item) { item._onCancel(); this.onCancelItem(item); } _onCancelAll() { this.files.forEach(item => item._onCancel(false)); this.onCancelAll(); } _onCompleteItem(item) { item._onComplete(); this.onCompleteItem(item); const nextItem = this._getReadyItems()[0]; this.isUploading = false; if (nextItem) { nextItem.upload(); return; } this.onCompleteAll(); this.progress = this._getTotalProgress(); } _onCompleteAll() { this.files.forEach(item => item._onComplete(false)); this.isUploading = false; this.onCompleteAll(); this.progress = this._getTotalProgress(); } _getReadyItems() { return this.files .filter((item) => (item.isReady && !item.isUploading)) .sort((item1, item2) => item1.index - item2.index); } _getTotalProgress(value = 0) { const notUploaded = this.getNotUploadedItems().length; const uploaded = notUploaded ? this.files.length - notUploaded : this.files.length; const ratio = this.splitUpload ? 100 / this.files.length : 100; const current = value * ratio / 100; return Math.round(uploaded * ratio + current); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1maWxlLXVwbG9hZGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvZmlsZS1pbnB1dC9vLWZpbGUtdXBsb2FkZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzVDLE1BQU0sT0FBTyxhQUFhO0lBWXhCLFlBQ1ksT0FBcUIsRUFDL0IsTUFBYztRQURKLFlBQU8sR0FBUCxPQUFPLENBQWM7UUFWMUIsVUFBSyxHQUFnQixFQUFFLENBQUM7UUFDeEIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBU2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxPQUFPLENBQUMsUUFBbUI7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBS0QsS0FBSztRQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN4QjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFNRCxVQUFVLENBQUMsS0FBVTtRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFD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LENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElGaWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZmlsZS1zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgT0ZpbGVJdGVtIH0gZnJvbSAnLi9vLWZpbGUtaXRlbS5jbGFzcyc7XG5cbmV4cG9ydCBjbGFzcyBPRmlsZVVwbG9hZGVyIHtcblxuICBwdWJsaWMgZW50aXR5OiBzdHJpbmc7XG4gIHB1YmxpYyBmaWxlczogT0ZpbGVJdGVtW10gPSBbXTtcbiAgcHVibGljIGlzVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBwcm9ncmVzczogbnVtYmVyID0gMDtcbiAgcHVibGljIG5leHRJbmRleDogbnVtYmVyID0gMDtcbiAgcHVibGljIHNwbGl0VXBsb2FkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGRhdGE6IG9iamVjdDtcblxuICBwcm90ZWN0ZWQgX3VwbG9hZFN1c2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNlcnZpY2U6IElGaWxlU2VydmljZSxcbiAgICBlbnRpdHk6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGZpbGVJdGVtOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUl0ZW0pO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyB0aGUgdXBsb2FkIG9mIGFsbCBmaWxlcyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZmlsZSBsaXN0LlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwoKTtcbiAgICB3aGlsZSAodGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsZXNbMF0ucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBmaWxlIGZyb20gdGhlIGZpbGUgbGlzdCwgaXQgY2FuY2VscyB1cGxvYWQgaWYgbmVlZGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpbGUgdG8gcmVtb3ZlXG4gICAqL1xuICByZW1vdmVGaWxlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXhPZkl0ZW0odmFsdWUpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZpbGVzW2luZGV4XTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgaWYgKGl0ZW0uaXNVcGxvYWRpbmcpIHtcbiAgICAgICAgaXRlbS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goKGl0ZW06IE9GaWxlSXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0ucGVuZGluZ1VwbG9hZCkge1xuICAgICAgICBpdGVtLnByZXBhcmVUb1VwbG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNwbGl0VXBsb2FkKSB7XG4gICAgICB0aGlzLmZpbGVzLmZvckVhY2goKGl0ZW06IE9GaWxlSXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5wZW5kaW5nVXBsb2FkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRJdGVtKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGxvYWRJdGVtcyh0aGlzLmZpbGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyBhIHNpbmdsZSBmaWxlIG9uIGEgc2luZ2xlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBpdGVtIHRoZSBmaWxlIHRvIHVwbG9hZFxuICAgKi9cbiAgcHVibGljIHVwbG9hZEl0ZW0oaXRlbTogT0ZpbGVJdGVtKTogdm9pZCB7XG4gICAgaXRlbS5wcmVwYXJlVG9VcGxvYWQoKTtcbiAgICBpZiAodGhpcy5pc1VwbG9hZGluZyB8fCBpdGVtLmlzVXBsb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNVcGxvYWRpbmcgPSB0cnVlO1xuICAgIGl0ZW0uaXNVcGxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5fb25CZWZvcmVVcGxvYWRJdGVtKGl0ZW0pO1xuXG4gICAgaWYgKHRoaXMuc2VydmljZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIHNlcnZpY2UgY29uZmlndXJlZCEgYWJvcnRpbmcgdXBsb2FkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl91cGxvYWRTdXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fdXBsb2FkU3VzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLl91cGxvYWRTdXNjcmlwdGlvbiA9IGl0ZW0uX3VwbG9hZFN1c2NyaXB0aW9uID0gdGhpcy5zZXJ2aWNlLnVwbG9hZChbaXRlbV0sIHRoaXMuZW50aXR5LCB0aGlzLmRhdGEpLnN1YnNjcmliZShcbiAgICAgIHJlc3AgPT4ge1xuICAgICAgICBpZiAocmVzcC5sb2FkZWQgJiYgcmVzcC50b3RhbCkge1xuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5yb3VuZChyZXNwLmxvYWRlZCAqIDEwMCAvIHJlc3AudG90YWwpO1xuICAgICAgICAgIHNlbGYuX29uUHJvZ3Jlc3NJdGVtKGl0ZW0sIHByb2dyZXNzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwLmNvZGUgPT09IENvZGVzLk9OVElNSVpFX1NVQ0NFU1NGVUxfQ09ERSkge1xuICAgICAgICAgIHNlbGYuX29uU3VjY2Vzc0l0ZW0oaXRlbSwgcmVzcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndXBsb2FkSXRlbSBlcnJvcicpO1xuICAgICAgICAgIHNlbGYuX29uRXJyb3JJdGVtKGl0ZW0sICdVbmtub3cgZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVyciA9PiBzZWxmLl9vbkVycm9ySXRlbShpdGVtLCBlcnIpLFxuICAgICAgKCkgPT4gc2VsZi5fb25Db21wbGV0ZUl0ZW0oaXRlbSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBhIHNldCBvZiBmaWxlcyBvbiBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0gaXRlbXMgdGhlIGFycmF5IG9mIGZpbGVzIHRvIHVwbG9hZFxuICAgKi9cbiAgcHVibGljIHVwbG9hZEl0ZW1zKGl0ZW1zOiBPRmlsZUl0ZW1bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nIHx8IGl0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLmlzVXBsb2FkaW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVXBsb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuX29uQmVmb3JlVXBsb2FkQWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gc2VydmljZSBjb25maWd1cmVkISBhYm9ydGluZyB1cGxvYWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VwbG9hZFN1c2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl91cGxvYWRTdXNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3VwbG9hZFN1c2NyaXB0aW9uID0gdGhpcy5zZXJ2aWNlLnVwbG9hZChpdGVtcywgdGhpcy5lbnRpdHksIHRoaXMuZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgaWYgKHJlc3AubG9hZGVkICYmIHJlc3AudG90YWwpIHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKHJlc3AubG9hZGVkICogMTAwIC8gcmVzcC50b3RhbCk7XG4gICAgICAgIHNlbGYuX29uUHJvZ3Jlc3NBbGwocHJvZ3Jlc3MpO1xuICAgICAgfSBlbHNlIGlmIChyZXNwLmNvZGUgPT09IENvZGVzLk9OVElNSVpFX1NVQ0NFU1NGVUxfQ09ERSkge1xuICAgICAgICBzZWxmLl9vblN1Y2Nlc3NBbGwocmVzcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1cGxvYWRJdGVtcyBlcnJvcicpO1xuICAgICAgfVxuICAgIH0sXG4gICAgICBlcnIgPT4gc2VsZi5fb25FcnJvckFsbChlcnIpLFxuICAgICAgKCkgPT4gc2VsZi5fb25Db21wbGV0ZUFsbCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB1cGxvYWQgb2YgYWxsIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zcGxpdFVwbG9hZCkge1xuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5jYW5jZWwoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl91cGxvYWRTdXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLl91cGxvYWRTdXNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fb25DYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMuX29uQ29tcGxldGVBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyB0aGUgdGhlIGZpbGUgdXBsb2FkLlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpbGUgdG8gY2FuY2VsIGl0cyB1cGxvYWRcbiAgICovXG4gIHB1YmxpYyBjYW5jZWxJdGVtKHZhbHVlOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXhPZkl0ZW0odmFsdWUpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZpbGVzW2luZGV4XTtcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmlzVXBsb2FkaW5nICYmIHRoaXMuc3BsaXRVcGxvYWQpIHtcbiAgICAgIGl0ZW0uX3VwbG9hZFN1c2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuX29uQ2FuY2VsSXRlbShpdGVtKTtcbiAgICB0aGlzLl9vbkNvbXBsZXRlSXRlbShpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROb3RVcGxvYWRlZEl0ZW1zKCk6IE9GaWxlSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5maWxlcy5maWx0ZXIoKGl0ZW06IE9GaWxlSXRlbSkgPT4gIWl0ZW0uaXNVcGxvYWRlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SW5kZXhPZkl0ZW0odmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHRoaXMuZmlsZXMuaW5kZXhPZih2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25CZWZvcmVVcGxvYWRJdGVtKGZpbGVJdGVtOiBPRmlsZUl0ZW0pOiBhbnkge1xuICAgIHJldHVybiB7IGZpbGVJdGVtIH07XG4gIH1cblxuICBwdWJsaWMgb25CZWZvcmVVcGxvYWRBbGwoKTogYW55IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwdWJsaWMgb25Qcm9ncmVzc0l0ZW0oZmlsZUl0ZW06IE9GaWxlSXRlbSwgcHJvZ3Jlc3M6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHsgZmlsZUl0ZW0sIHByb2dyZXNzIH07XG4gIH1cblxuICBwdWJsaWMgb25Qcm9ncmVzc0FsbChwcm9ncmVzczogYW55KTogYW55IHtcbiAgICByZXR1cm4geyBwcm9ncmVzcyB9O1xuICB9XG5cbiAgcHVibGljIG9uQ2FuY2VsSXRlbShmaWxlSXRlbTogT0ZpbGVJdGVtKTogYW55IHtcbiAgICByZXR1cm4geyBmaWxlSXRlbSB9O1xuICB9XG5cbiAgcHVibGljIG9uQ2FuY2VsQWxsKCk6IGFueSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIG9uU3VjY2Vzc0l0ZW0oZmlsZUl0ZW06IE9GaWxlSXRlbSwgcmVzcG9uc2U6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHsgZmlsZUl0ZW0sIHJlc3BvbnNlIH07XG4gIH1cblxuICBwdWJsaWMgb25TdWNjZXNzQWxsKHJlc3BvbnNlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB7IHJlc3BvbnNlIH07XG4gIH1cblxuICBwdWJsaWMgb25FcnJvckl0ZW0oZmlsZUl0ZW06IE9GaWxlSXRlbSwgZXJyb3I6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHsgZmlsZUl0ZW0sIGVycm9yIH07XG4gIH1cblxuICBwdWJsaWMgb25FcnJvckFsbChlcnJvcjogYW55KTogYW55IHtcbiAgICByZXR1cm4geyBlcnJvciB9O1xuICB9XG5cbiAgcHVibGljIG9uQ29tcGxldGVJdGVtKGZpbGVJdGVtOiBPRmlsZUl0ZW0pOiBhbnkge1xuICAgIHJldHVybiB7IGZpbGVJdGVtIH07XG4gIH1cblxuICBwdWJsaWMgb25Db21wbGV0ZUFsbCgpOiBhbnkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uQmVmb3JlVXBsb2FkSXRlbShpdGVtOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpdGVtLl9vbkJlZm9yZVVwbG9hZCgpO1xuICAgIHRoaXMub25CZWZvcmVVcGxvYWRJdGVtKGl0ZW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vbkJlZm9yZVVwbG9hZEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goaXRlbSA9PiBpdGVtLl9vbkJlZm9yZVVwbG9hZChmYWxzZSkpO1xuICAgIHRoaXMub25CZWZvcmVVcGxvYWRBbGwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25Qcm9ncmVzc0l0ZW0oaXRlbTogT0ZpbGVJdGVtLCBwcm9ncmVzczogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKHByb2dyZXNzKTtcbiAgICB0aGlzLnByb2dyZXNzID0gdG90YWw7XG4gICAgaXRlbS5fb25Qcm9ncmVzcyhwcm9ncmVzcyk7XG4gICAgdGhpcy5vblByb2dyZXNzSXRlbShpdGVtLCBwcm9ncmVzcyk7XG4gICAgdGhpcy5vblByb2dyZXNzQWxsKHRvdGFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25Qcm9ncmVzc0FsbChwcm9ncmVzczogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKHByb2dyZXNzKTtcbiAgICB0aGlzLnByb2dyZXNzID0gdG90YWw7XG4gICAgdGhpcy5vblByb2dyZXNzQWxsKHRvdGFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25TdWNjZXNzSXRlbShpdGVtOiBPRmlsZUl0ZW0sIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpdGVtLl9vblN1Y2Nlc3MocmVzcG9uc2UpO1xuICAgIHRoaXMub25TdWNjZXNzSXRlbShpdGVtLCByZXNwb25zZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uU3VjY2Vzc0FsbChyZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5maWxlcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5fb25TdWNjZXNzKHJlc3BvbnNlLCBmYWxzZSkpO1xuICAgIHRoaXMub25TdWNjZXNzQWxsKHJlc3BvbnNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25FcnJvckl0ZW0oaXRlbTogT0ZpbGVJdGVtLCBlcnJvcjogYW55KTogdm9pZCB7XG4gICAgaXRlbS5fb25FcnJvcihlcnJvcik7XG4gICAgdGhpcy5vbkVycm9ySXRlbShpdGVtLCBlcnJvcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uRXJyb3JBbGwoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZmlsZXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uX29uRXJyb3IoZXJyb3IsIGZhbHNlKSk7XG4gICAgdGhpcy5vbkVycm9yQWxsKGVycm9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25DYW5jZWxJdGVtKGl0ZW06IE9GaWxlSXRlbSk6IHZvaWQge1xuICAgIGl0ZW0uX29uQ2FuY2VsKCk7XG4gICAgdGhpcy5vbkNhbmNlbEl0ZW0oaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uQ2FuY2VsQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uX29uQ2FuY2VsKGZhbHNlKSk7XG4gICAgdGhpcy5vbkNhbmNlbEFsbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vbkNvbXBsZXRlSXRlbShpdGVtOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpdGVtLl9vbkNvbXBsZXRlKCk7XG4gICAgdGhpcy5vbkNvbXBsZXRlSXRlbShpdGVtKTtcbiAgICBjb25zdCBuZXh0SXRlbSA9IHRoaXMuX2dldFJlYWR5SXRlbXMoKVswXTtcbiAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgaWYgKG5leHRJdGVtKSB7XG4gICAgICBuZXh0SXRlbS51cGxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vbkNvbXBsZXRlQWxsKCk7XG4gICAgdGhpcy5wcm9ncmVzcyA9IHRoaXMuX2dldFRvdGFsUHJvZ3Jlc3MoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25Db21wbGV0ZUFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goaXRlbSA9PiBpdGVtLl9vbkNvbXBsZXRlKGZhbHNlKSk7XG4gICAgdGhpcy5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMub25Db21wbGV0ZUFsbCgpO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2dldFJlYWR5SXRlbXMoKTogT0ZpbGVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmZpbGVzXG4gICAgICAuZmlsdGVyKChpdGVtOiBPRmlsZUl0ZW0pID0+IChpdGVtLmlzUmVhZHkgJiYgIWl0ZW0uaXNVcGxvYWRpbmcpKVxuICAgICAgLnNvcnQoKGl0ZW0xOiBPRmlsZUl0ZW0sIGl0ZW0yOiBPRmlsZUl0ZW0pID0+IGl0ZW0xLmluZGV4IC0gaXRlbTIuaW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9nZXRUb3RhbFByb2dyZXNzKHZhbHVlOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbiAgICBjb25zdCBub3RVcGxvYWRlZCA9IHRoaXMuZ2V0Tm90VXBsb2FkZWRJdGVtcygpLmxlbmd0aDtcbiAgICBjb25zdCB1cGxvYWRlZCA9IG5vdFVwbG9hZGVkID8gdGhpcy5maWxlcy5sZW5ndGggLSBub3RVcGxvYWRlZCA6IHRoaXMuZmlsZXMubGVuZ3RoO1xuICAgIGNvbnN0IHJhdGlvID0gdGhpcy5zcGxpdFVwbG9hZCA/IDEwMCAvIHRoaXMuZmlsZXMubGVuZ3RoIDogMTAwO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB2YWx1ZSAqIHJhdGlvIC8gMTAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHVwbG9hZGVkICogcmF0aW8gKyBjdXJyZW50KTtcbiAgfVxuXG59XG4iXX0=