UNPKG

@schoolbelle/common

Version:

Demo library to showcase Angular packaging format

254 lines (248 loc) 25.3 kB
import { Injectable, Inject, NgModule } from '@angular/core'; import { REST_SERVER_HOST } from '@schoolbelle/common/tokens'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { GroupService } from '@schoolbelle/common/services/group'; import { SocketService } from '@schoolbelle/common/services/socket'; import { Observable, Subject } from 'rxjs'; import { forEach } from 'lodash'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class FileService { /** * @param {?} http * @param {?} groupService * @param {?} socketService * @param {?} serverHost */ constructor(http, groupService, socketService, serverHost) { this.http = http; this.groupService = groupService; this.socketService = socketService; this.serverHost = serverHost; this.uploadStatusChangeEvent = new Subject(); this.uploadStatus = new Map(); } /** * @return {?} */ get onUploadStatusChange() { return this.uploadStatusChangeEvent.asObservable(); } /** * @param {?} key * @param {?} data * @return {?} */ setUploadStatus(key, data) { this.uploadStatus.set(key, data); this.uploadStatusChangeEvent.next(this.caculatePercent()); } /** * @param {?} key * @param {?} data * @return {?} */ updateUploadStatus(key, data) { let /** @type {?} */ found = this.uploadStatus.get(key); if (found) { Object.assign(found, data); this.uploadStatusChangeEvent.next(this.caculatePercent()); } } /** * @return {?} */ caculatePercent() { let /** @type {?} */ perc = 0; this.uploadStatus.forEach((uploadState, key) => { perc += (uploadState.upload * 0.5 + (typeof uploadState.process === 'undefined' ? 1 : uploadState.process) * 0.5) / this.uploadStatus.size; }); return perc; } /** * @param {?} file * @param {?} opts * @return {?} */ getUrl(file, opts) { return this.http .post(this.serverHost + '/group/file/sign_url', { sign_for: 'upload', name: file.name, type: file.type, size: file.size, process: opts.process }, { headers: { Authorization: `Bearer ${this.groupService.token}` } }) .toPromise(); } /** * @param {?} file * @param {?=} opts * @return {?} */ upload(file, opts = { process: false }) { return new Promise((resolve, reject) => { this.getUrl(file, opts) .then((data) => { this.setUploadStatus(data.file_id, { name: file.name, size: file.size, type: file.type, upload: 0, process: opts.process ? 0 : undefined }); this.http .put(data.signedUrl, file, { reportProgress: true }) .subscribe(event => { console.log(event); // let perc = Math.round(progressEvent.loaded / progressEvent.total * 100); // let info = this.uploadStatus.get(data.file_id); // if (info) info.upload = perc; // observer.next(perc); }, reject, () => { this.updateUploadStatus(data.file_id, { upload: 100 }); if (opts.process === true) this.observeProgress(data.file_id).subscribe(null, reject, () => resolve(data.file_id)); else resolve(data.file_id); }); }) .catch(reject); }).then((sbe_file_id) => this.register(sbe_file_id)); } /** * @param {?} sbe_file_id * @return {?} */ register(sbe_file_id) { return this.http .post(this.serverHost + '/group/file/register', { file_id: sbe_file_id }, { headers: { Authorization: `Bearer ${this.groupService.token}` } }) .toPromise(); // .then(response=>response.json()); } /** * @param {?} file_id * @return {?} */ observeProgress(file_id) { return new Observable(observer => { let /** @type {?} */ uploadStatus = this.uploadStatus.get(file_id); let /** @type {?} */ process = uploadStatus ? uploadStatus.process : undefined; if (process === undefined) observer.error('no processing found'); else if (process === 100) observer.complete(); else { this.socketService.listen('f' + file_id); let /** @type {?} */ subscription = this.socketService .getObservable('f' + file_id) .subscribe(event => { let /** @type {?} */ data = event.data; if (data.match(/download \d+/)) process = Math.round(FileService.Weights.download * parseInt(data.replace(/\D/g, ''))); else if (data.match(/convert.low \d+/)) process = Math.round(FileService.Weights.download * 100 + FileService.Weights.convert * parseInt(data.replace(/\D/g, ''))); else if (data.match(/upload.low \d+/)) process = Math.round((FileService.Weights.download + FileService.Weights.convert) * 100 + FileService.Weights.upload * parseInt(data.replace(/\D/g, ''))); this.updateUploadStatus(file_id, { process: process }); if (process === 100 || data.match('job is done')) { observer.complete(); this.socketService.unlisten('f' + file_id); subscription.unsubscribe(); } else if (data.match('timeout')) { observer.error('timeout'); subscription.unsubscribe(); } else { observer.next(process); } }); } }); } /** * @param {?} letterFiles * @param {?=} process * @return {?} */ multipleUpload(letterFiles, process = true) { this.uploadStatus.clear(); if (process) this.socketService.connect(true); let /** @type {?} */ promises = []; forEach(letterFiles, (file, index) => { if (file instanceof File) { promises.push(this.upload(file, { process: process }).then((fileInfo) => { letterFiles.splice(index, 1, fileInfo); })); } }); return Promise.all(promises).then(() => /** @type {?} */ (letterFiles)); } /** * @param {?} uri * @param {?} name * @return {?} */ download(uri, name) { } } FileService.Weights = { download: 0.1, convert: 0.8, upload: 0.1 }; FileService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ FileService.ctorParameters = () => [ { type: HttpClient, }, { type: GroupService, }, { type: SocketService, }, { type: undefined, decorators: [{ type: Inject, args: [REST_SERVER_HOST,] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class FileServiceModule { /** * @return {?} */ static forRoot() { return { ngModule: FileServiceModule, providers: [FileService] }; } } FileServiceModule.decorators = [ { type: NgModule, args: [{ imports: [HttpClientModule] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { FileService, FileServiceModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29sYmVsbGUtY29tbW9uLXNlcnZpY2VzLWZpbGUuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvZmlsZS9maWxlLnNlcnZpY2UudHMiLCJuZzovL0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvZmlsZS9maWxlLXNlcnZpY2UubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUkVTVF9TRVJWRVJfSE9TVCB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vdG9rZW5zJztcblxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEdyb3VwU2VydmljZSB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvZ3JvdXAnO1xuaW1wb3J0IHsgU29ja2V0U2VydmljZSB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvc29ja2V0JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IFVwbG9hZFN0YXR1cyB9IGZyb20gJy4vdXBsb2FkLXN0YXR1cy50eXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlSW5mb0ludGVyZmFjZSB7XG4gIGZpbGVfaWQ6IG51bWJlcjtcbiAgdXJsOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBwcmlvcml0eTogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIGRvd25zYW1wbGVkOiBzdHJpbmc7XG4gIHRodW1ibmFpbDogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlsZVNlcnZpY2Uge1xuICBzdGF0aWMgV2VpZ2h0cyA9IHtcbiAgICBkb3dubG9hZDogMC4xLFxuICAgIGNvbnZlcnQ6IDAuOCxcbiAgICB1cGxvYWQ6IDAuMVxuICB9O1xuICBwcml2YXRlIHVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3QoKTtcbiAgZ2V0IG9uVXBsb2FkU3RhdHVzQ2hhbmdlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkU3RhdHVzQ2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgcHVibGljIHVwbG9hZFN0YXR1czogTWFwPG51bWJlciwgVXBsb2FkU3RhdHVzPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaHR0cDogSHR0cENsaWVudCxcbiAgICBwdWJsaWMgZ3JvdXBTZXJ2aWNlOiBHcm91cFNlcnZpY2UsXG4gICAgcHVibGljIHNvY2tldFNlcnZpY2U6IFNvY2tldFNlcnZpY2UsXG4gICAgQEluamVjdChSRVNUX1NFUlZFUl9IT1NUKSBwcml2YXRlIHNlcnZlckhvc3Q6IHN0cmluZ1xuICApIHt9XG4gIHByaXZhdGUgc2V0VXBsb2FkU3RhdHVzKGtleTogYW55LCBkYXRhOiBVcGxvYWRTdGF0dXMpIHtcbiAgICB0aGlzLnVwbG9hZFN0YXR1cy5zZXQoa2V5LCBkYXRhKTtcbiAgICB0aGlzLnVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50Lm5leHQodGhpcy5jYWN1bGF0ZVBlcmNlbnQoKSk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVVcGxvYWRTdGF0dXMoa2V5OiBhbnksIGRhdGE6IFBhcnRpYWw8VXBsb2FkU3RhdHVzPikge1xuICAgIGxldCBmb3VuZCA9IHRoaXMudXBsb2FkU3RhdHVzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihmb3VuZCwgZGF0YSk7XG4gICAgICB0aGlzLnVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50Lm5leHQodGhpcy5jYWN1bGF0ZVBlcmNlbnQoKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2FjdWxhdGVQZXJjZW50KCkge1xuICAgIGxldCBwZXJjID0gMDtcbiAgICB0aGlzLnVwbG9hZFN0YXR1cy5mb3JFYWNoKCh1cGxvYWRTdGF0ZSwga2V5KSA9PiB7XG4gICAgICBwZXJjICs9XG4gICAgICAgICh1cGxvYWRTdGF0ZS51cGxvYWQgKiAwLjUgK1xuICAgICAgICAgICh0eXBlb2YgdXBsb2FkU3RhdGUucHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgOiB1cGxvYWRTdGF0ZS5wcm9jZXNzKSAqXG4gICAgICAgICAgICAwLjUpIC9cbiAgICAgICAgdGhpcy51cGxvYWRTdGF0dXMuc2l6ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGVyYztcbiAgfVxuICBwdWJsaWMgZ2V0VXJsKGZpbGU6IEZpbGUsIG9wdHM6IHsgcHJvY2VzczogYm9vbGVhbiB9KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIHRoaXMuc2VydmVySG9zdCArICcvZ3JvdXAvZmlsZS9zaWduX3VybCcsXG4gICAgICAgIHtcbiAgICAgICAgICBzaWduX2ZvcjogJ3VwbG9hZCcsXG4gICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgcHJvY2Vzczogb3B0cy5wcm9jZXNzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmdyb3VwU2VydmljZS50b2tlbn1gIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG4gIHB1YmxpYyB1cGxvYWQoXG4gICAgZmlsZTogRmlsZSxcbiAgICBvcHRzOiB7IHByb2Nlc3M6IGJvb2xlYW4gfSA9IHsgcHJvY2VzczogZmFsc2UgfVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldFVybChmaWxlLCBvcHRzKVxuICAgICAgICAudGhlbigoZGF0YTogeyBmaWxlX2lkOiBudW1iZXI7IHNpZ25lZFVybDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICB0aGlzLnNldFVwbG9hZFN0YXR1cyhkYXRhLmZpbGVfaWQsIHtcbiAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgIHVwbG9hZDogMCxcbiAgICAgICAgICAgIHByb2Nlc3M6IG9wdHMucHJvY2VzcyA/IDAgOiB1bmRlZmluZWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wdXQoZGF0YS5zaWduZWRVcmwsIGZpbGUsIHsgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IHBlcmMgPSBNYXRoLnJvdW5kKHByb2dyZXNzRXZlbnQubG9hZGVkIC8gcHJvZ3Jlc3NFdmVudC50b3RhbCAqIDEwMCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IGluZm8gPSB0aGlzLnVwbG9hZFN0YXR1cy5nZXQoZGF0YS5maWxlX2lkKTtcbiAgICAgICAgICAgICAgICAvLyBpZiAoaW5mbykgaW5mby51cGxvYWQgPSBwZXJjO1xuICAgICAgICAgICAgICAgIC8vIG9ic2VydmVyLm5leHQocGVyYyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVXBsb2FkU3RhdHVzKGRhdGEuZmlsZV9pZCwgeyB1cGxvYWQ6IDEwMCB9KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5wcm9jZXNzID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlUHJvZ3Jlc3MoZGF0YS5maWxlX2lkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZShkYXRhLmZpbGVfaWQpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGVsc2UgcmVzb2x2ZShkYXRhLmZpbGVfaWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gocmVqZWN0KTtcbiAgICB9KS50aGVuKChzYmVfZmlsZV9pZDogbnVtYmVyKSA9PiB0aGlzLnJlZ2lzdGVyKHNiZV9maWxlX2lkKSk7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyKHNiZV9maWxlX2lkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChcbiAgICAgICAgdGhpcy5zZXJ2ZXJIb3N0ICsgJy9ncm91cC9maWxlL3JlZ2lzdGVyJyxcbiAgICAgICAgeyBmaWxlX2lkOiBzYmVfZmlsZV9pZCB9LFxuICAgICAgICB7IGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuZ3JvdXBTZXJ2aWNlLnRva2VufWAgfSB9XG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKCk7XG4gICAgLy8gLnRoZW4ocmVzcG9uc2U9PnJlc3BvbnNlLmpzb24oKSk7XG4gIH1cbiAgcHJpdmF0ZSBvYnNlcnZlUHJvZ3Jlc3MoZmlsZV9pZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCB1cGxvYWRTdGF0dXM6IFVwbG9hZFN0YXR1cyA9IHRoaXMudXBsb2FkU3RhdHVzLmdldChmaWxlX2lkKTtcbiAgICAgIGxldCBwcm9jZXNzID0gdXBsb2FkU3RhdHVzID8gdXBsb2FkU3RhdHVzLnByb2Nlc3MgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvY2VzcyA9PT0gdW5kZWZpbmVkKSBvYnNlcnZlci5lcnJvcignbm8gcHJvY2Vzc2luZyBmb3VuZCcpO1xuICAgICAgZWxzZSBpZiAocHJvY2VzcyA9PT0gMTAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0U2VydmljZS5saXN0ZW4oJ2YnICsgZmlsZV9pZCk7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnNvY2tldFNlcnZpY2VcbiAgICAgICAgICAuZ2V0T2JzZXJ2YWJsZSgnZicgKyBmaWxlX2lkKVxuICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgaWYgKGRhdGEubWF0Y2goL2Rvd25sb2FkIFxcZCsvKSlcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy5kb3dubG9hZCAqIHBhcnNlSW50KGRhdGEucmVwbGFjZSgvXFxEL2csICcnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEubWF0Y2goL2NvbnZlcnQubG93IFxcZCsvKSlcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy5kb3dubG9hZCAqIDEwMCArXG4gICAgICAgICAgICAgICAgICBGaWxlU2VydmljZS5XZWlnaHRzLmNvbnZlcnQgKlxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChkYXRhLnJlcGxhY2UoL1xcRC9nLCAnJykpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLm1hdGNoKC91cGxvYWQubG93IFxcZCsvKSlcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgKEZpbGVTZXJ2aWNlLldlaWdodHMuZG93bmxvYWQgKyBGaWxlU2VydmljZS5XZWlnaHRzLmNvbnZlcnQpICpcbiAgICAgICAgICAgICAgICAgIDEwMCArXG4gICAgICAgICAgICAgICAgICBGaWxlU2VydmljZS5XZWlnaHRzLnVwbG9hZCAqIHBhcnNlSW50KGRhdGEucmVwbGFjZSgvXFxEL2csICcnKSlcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoZmlsZV9pZCwgeyBwcm9jZXNzOiBwcm9jZXNzIH0pO1xuXG4gICAgICAgICAgICBpZiAocHJvY2VzcyA9PT0gMTAwIHx8IGRhdGEubWF0Y2goJ2pvYiBpcyBkb25lJykpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgdGhpcy5zb2NrZXRTZXJ2aWNlLnVubGlzdGVuKCdmJyArIGZpbGVfaWQpO1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tYXRjaCgndGltZW91dCcpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCd0aW1lb3V0Jyk7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChwcm9jZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgbXVsdGlwbGVVcGxvYWQoXG4gICAgbGV0dGVyRmlsZXM6IEFycmF5PEZpbGUgfCBGaWxlSW5mb0ludGVyZmFjZT4sXG4gICAgcHJvY2VzczogYm9vbGVhbiA9IHRydWVcbiAgICAvLyBsaXN0OiB7IGZpbGU6IEZpbGU7IHByaW9yaXR5OiBudW1iZXI7IHByb2Nlc3M/OiBib29sZWFuIH1bXVxuICApOiBQcm9taXNlPEZpbGVJbmZvSW50ZXJmYWNlW10+IHtcbiAgICB0aGlzLnVwbG9hZFN0YXR1cy5jbGVhcigpO1xuICAgIGlmIChwcm9jZXNzKSB0aGlzLnNvY2tldFNlcnZpY2UuY29ubmVjdCh0cnVlKTtcbiAgICBsZXQgcHJvbWlzZXMgPSBbXTtcbiAgICBmb3JFYWNoKGxldHRlckZpbGVzLCAoZmlsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgIHRoaXMudXBsb2FkKGZpbGUsIHsgcHJvY2VzczogcHJvY2VzcyB9KS50aGVuKFxuICAgICAgICAgICAgKGZpbGVJbmZvOiBGaWxlSW5mb0ludGVyZmFjZSkgPT4ge1xuICAgICAgICAgICAgICBsZXR0ZXJGaWxlcy5zcGxpY2UoaW5kZXgsIDEsIGZpbGVJbmZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IGxldHRlckZpbGVzIGFzIEZpbGVJbmZvSW50ZXJmYWNlW10pO1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkKHVyaSwgbmFtZSkge31cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEZpbGVTZXJ2aWNlIH0gZnJvbSAnLi9maWxlLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZVNlcnZpY2VNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IEZpbGVTZXJ2aWNlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbRmlsZVNlcnZpY2VdXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7O0lBb0NFLFlBQ1MsTUFDQSxjQUNBLGVBQzJCO1FBSDNCLFNBQUksR0FBSixJQUFJO1FBQ0osaUJBQVksR0FBWixZQUFZO1FBQ1osa0JBQWEsR0FBYixhQUFhO1FBQ2MsZUFBVSxHQUFWLFVBQVU7dUNBVlosSUFBSSxPQUFPLEVBQUU7NEJBSUUsSUFBSSxHQUFHLEVBQUU7S0FPdEQ7Ozs7SUFWSixJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUNwRDs7Ozs7O0lBU08sZUFBZSxDQUFDLEdBQVEsRUFBRSxJQUFrQjtRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQzs7Ozs7OztJQUVwRCxrQkFBa0IsQ0FBQyxHQUFRLEVBQUUsSUFBMkI7UUFDOUQscUJBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENB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