UNPKG

kwikid-camera

Version:
188 lines 21.4 kB
import { __awaiter, __decorate } from "tslib"; import { Injectable } from "@angular/core"; import { isNotEmptyValue, logMethod } from "kwikid-toolkit"; import * as RecordRTC from "recordrtc"; import { Subject } from "rxjs"; import { IRecordingState } from "./kwikid-camera-record.definitions"; import { getBase64FromVideoFile } from "./kwikid-camera-record.helper"; import * as i0 from "@angular/core"; export class KwikIDCameraRecordService { constructor() { this._mediaStream = new Subject(); this._blob = new Subject(); this.state = IRecordingState.NONE; this._state = new Subject(); this.isFrontCamera = false; this.videoDeviceId = null; this.startTime = 0; this.pauseTime = 0; this.resumeTime = 0; this.totalPausedTime = 0; this.totalRecordingTime = 0; this.minRecordingTimeInSeconds = null; this.maxRecordingTimeInSeconds = null; this._timerUpdate = new Subject(); } // getObservable getMediaStream() { return this._mediaStream.asObservable(); } getBlob() { return this._blob.asObservable(); } getTimerUpdate() { return this._timerUpdate.asObservable(); } getRecordingState() { return this._state.asObservable(); } setRecordingState(state) { this.state = state; this._state.next(state); } resetTimer() { clearInterval(this.timerInterval); this.startTime = 0; this.pauseTime = 0; this.resumeTime = 0; this.totalPausedTime = 0; this.totalRecordingTime = 0; this._timerUpdate.next(0); } updateTimer() { this.timerInterval = setInterval(() => { if (this.state === IRecordingState.RECORDING) { this.totalRecordingTime = Math.round((Date.now() - this.startTime - this.totalPausedTime) / 1000); if (isNotEmptyValue(this.maxRecordingTimeInSeconds) && this.totalRecordingTime > this.maxRecordingTimeInSeconds) { this.stopRecording(); } else { this._timerUpdate.next(this.totalRecordingTime); } } if (this.state === IRecordingState.NONE || this.state === IRecordingState.RECORDED) { this._timerUpdate.next(0); } }, 1000); } handleRecording() { return __awaiter(this, void 0, void 0, function* () { this.startTime = Date.now(); if (isNotEmptyValue(this.videoDeviceId)) { this.mediaStream = yield navigator.mediaDevices.getUserMedia({ audio: true, video: { deviceId: { exact: this.videoDeviceId } } }); } else { this.mediaStream = yield navigator.mediaDevices.getUserMedia({ audio: true, video: { facingMode: this.isFrontCamera ? "user" : "environment" } }); } this._mediaStream.next(this.mediaStream); this.recorder = new RecordRTC(this.mediaStream, { type: "video", disableLogs: true, mimeType: "video/webm;codecs=vp9", frameInterval: 60 }); this.recorder.startRecording(); this.setRecordingState(IRecordingState.RECORDING); }); } startRecording({ minRecordingTimeInSeconds = null, maxRecordingTimeInSeconds = null, isFrontCamera = false, videoDeviceId = null }) { this.isFrontCamera = isFrontCamera; this.videoDeviceId = videoDeviceId; this.minRecordingTimeInSeconds = minRecordingTimeInSeconds; this.maxRecordingTimeInSeconds = maxRecordingTimeInSeconds; this.handleRecording(); this.updateTimer(); } pauseRecording() { if (!this.recorder) { return; } this.pauseTime = Date.now(); this.setRecordingState(IRecordingState.PAUSED); this.recorder.pauseRecording(); } resumeRecording() { if (!this.recorder) { this.handleRecording(); } else { this.resumeTime = Date.now(); this.totalPausedTime += this.resumeTime - this.pauseTime; this.recorder.resumeRecording(); this.setRecordingState(IRecordingState.RECORDING); } } stopRecording() { if (!this.recorder) { return; } if (this.minRecordingTimeInSeconds > this.totalRecordingTime) { return; } this.recorder.stopRecording(() => __awaiter(this, void 0, void 0, function* () { this.blob = this.recorder.getBlob(); const videoBase64 = yield getBase64FromVideoFile(this.blob); this._blob.next(videoBase64); this.mediaStream.stop(); this.recorder.destroy(); this.mediaStream = null; this.recorder = null; this.setRecordingState(IRecordingState.RECORDED); this.resetTimer(); })); } downloadRecording() { RecordRTC.invokeSaveAsDialog(this.blob, `${Date.now()}.webm`); } clearRecording() { this.blob = null; this.recorder = null; this.mediaStream = null; this.setRecordingState(IRecordingState.NONE); this.resetTimer(); } } /** @nocollapse */ KwikIDCameraRecordService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ KwikIDCameraRecordService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordService, providedIn: "root" }); __decorate([ logMethod ], KwikIDCameraRecordService.prototype, "handleRecording", null); __decorate([ logMethod ], KwikIDCameraRecordService.prototype, "startRecording", null); __decorate([ logMethod ], KwikIDCameraRecordService.prototype, "pauseRecording", null); __decorate([ logMethod ], KwikIDCameraRecordService.prototype, "resumeRecording", null); __decorate([ logMethod ], KwikIDCameraRecordService.prototype, "stopRecording", null); __decorate([ logMethod ], KwikIDCameraRecordService.prototype, "downloadRecording", null); __decorate([ logMethod ], KwikIDCameraRecordService.prototype, "clearRecording", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordService, decorators: [{ type: Injectable, args: [{ providedIn: "root" }] }], propDecorators: { handleRecording: [], startRecording: [], pauseRecording: [], resumeRecording: [], stopRecording: [], downloadRecording: [], clearRecording: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3dpa2lkLWNhbWVyYS1yZWNvcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jYW1lcmEvc3JjL2xpYi9jb21wb25lbnRzL2t3aWtpZC1jYW1lcmEtcmVjb3JkL2t3aWtpZC1jYW1lcmEtcmVjb3JkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFDTCxlQUFlLEVBRWhCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBS3ZFLE1BQU0sT0FBTyx5QkFBeUI7SUFIdEM7UUFVVSxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFbEMsVUFBSyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFM0IsVUFBSyxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBRTlDLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUV4QyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0QixrQkFBYSxHQUFXLElBQUksQ0FBQztRQUk3QixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWQsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUVkLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUVwQix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFFdkIsOEJBQXlCLEdBQVcsSUFBSSxDQUFDO1FBRXpDLDhCQUF5QixHQUFXLElBQUksQ0FBQztRQUV6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QUFpQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxpQkFBaUI7UUFDZixTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUdELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDOzswSUE5TVUseUJBQXlCOzhJQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTtBQWlHbEI7SUFEQyxTQUFTO2dFQThCVDtBQUdEO0lBREMsU0FBUzsrREFjVDtBQUdEO0lBREMsU0FBUzsrREFTVDtBQUdEO0lBREMsU0FBUztnRUFXVDtBQUdEO0lBREMsU0FBUzs4REF5QlQ7QUFHRDtJQURDLFNBQVM7a0VBR1Q7QUFHRDtJQURDLFNBQVM7K0RBUVQ7NEZBOU1VLHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OEJBZ0dPLGVBQWUsTUFnQ3JCLGNBQWMsTUFnQmQsY0FBYyxNQVdkLGVBQWUsTUFhZixhQUFhLE1BMkJiLGlCQUFpQixNQUtqQixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBpc05vdEVtcHR5VmFsdWUsIGxvZ01ldGhvZCB9IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuaW1wb3J0ICogYXMgUmVjb3JkUlRDIGZyb20gXCJyZWNvcmRydGNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtcbiAgSVJlY29yZGluZ1N0YXRlLFxuICBUUmVjb3JkaW5nU3RhdGVcbn0gZnJvbSBcIi4va3dpa2lkLWNhbWVyYS1yZWNvcmQuZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IGdldEJhc2U2NEZyb21WaWRlb0ZpbGUgfSBmcm9tIFwiLi9rd2lraWQtY2FtZXJhLXJlY29yZC5oZWxwZXJcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURDYW1lcmFSZWNvcmRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBtZWRpYVN0cmVhbTogYW55O1xuXG4gIHByaXZhdGUgcmVjb3JkZXI6IGFueTtcblxuICBwcml2YXRlIGJsb2I6IGFueTtcblxuICBwcml2YXRlIF9tZWRpYVN0cmVhbSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBwcml2YXRlIF9ibG9iID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIHByaXZhdGUgc3RhdGU6IFRSZWNvcmRpbmdTdGF0ZSA9IElSZWNvcmRpbmdTdGF0ZS5OT05FO1xuXG4gIHByaXZhdGUgX3N0YXRlID0gbmV3IFN1YmplY3Q8VFJlY29yZGluZ1N0YXRlPigpO1xuXG4gIHByaXZhdGUgaXNGcm9udENhbWVyYSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgdmlkZW9EZXZpY2VJZDogc3RyaW5nID0gbnVsbDtcblxuICBwcml2YXRlIHRpbWVySW50ZXJ2YWw6IGFueTtcblxuICBwcml2YXRlIHN0YXJ0VGltZSA9IDA7XG5cbiAgcHJpdmF0ZSBwYXVzZVRpbWUgPSAwO1xuXG4gIHByaXZhdGUgcmVzdW1lVGltZSA9IDA7XG5cbiAgcHJpdmF0ZSB0b3RhbFBhdXNlZFRpbWUgPSAwO1xuXG4gIHByaXZhdGUgdG90YWxSZWNvcmRpbmdUaW1lID0gMDtcblxuICBwcml2YXRlIG1pblJlY29yZGluZ1RpbWVJblNlY29uZHM6IG51bWJlciA9IG51bGw7XG5cbiAgcHJpdmF0ZSBtYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzOiBudW1iZXIgPSBudWxsO1xuXG4gIHByaXZhdGUgX3RpbWVyVXBkYXRlID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIGdldE9ic2VydmFibGVcbiAgZ2V0TWVkaWFTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhU3RyZWFtLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0QmxvYigpIHtcbiAgICByZXR1cm4gdGhpcy5fYmxvYi5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRpbWVyVXBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lclVwZGF0ZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFJlY29yZGluZ1N0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNldFJlY29yZGluZ1N0YXRlKHN0YXRlOiBUUmVjb3JkaW5nU3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5fc3RhdGUubmV4dChzdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGltZXIoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySW50ZXJ2YWwpO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLnBhdXNlVGltZSA9IDA7XG4gICAgdGhpcy5yZXN1bWVUaW1lID0gMDtcbiAgICB0aGlzLnRvdGFsUGF1c2VkVGltZSA9IDA7XG4gICAgdGhpcy50b3RhbFJlY29yZGluZ1RpbWUgPSAwO1xuICAgIHRoaXMuX3RpbWVyVXBkYXRlLm5leHQoMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRpbWVyKCkge1xuICAgIHRoaXMudGltZXJJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBJUmVjb3JkaW5nU3RhdGUuUkVDT1JESU5HKSB7XG4gICAgICAgIHRoaXMudG90YWxSZWNvcmRpbmdUaW1lID0gTWF0aC5yb3VuZChcbiAgICAgICAgICAoRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lIC0gdGhpcy50b3RhbFBhdXNlZFRpbWUpIC8gMTAwMFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc05vdEVtcHR5VmFsdWUodGhpcy5tYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzKSAmJlxuICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRpbmdUaW1lID4gdGhpcy5tYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3RpbWVyVXBkYXRlLm5leHQodGhpcy50b3RhbFJlY29yZGluZ1RpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuc3RhdGUgPT09IElSZWNvcmRpbmdTdGF0ZS5OT05FIHx8XG4gICAgICAgIHRoaXMuc3RhdGUgPT09IElSZWNvcmRpbmdTdGF0ZS5SRUNPUkRFRFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3RpbWVyVXBkYXRlLm5leHQoMCk7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZVJlY29yZGluZygpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKHRoaXMudmlkZW9EZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMubWVkaWFTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICAgIGF1ZGlvOiB0cnVlLFxuICAgICAgICB2aWRlbzoge1xuICAgICAgICAgIGRldmljZUlkOiB7XG4gICAgICAgICAgICBleGFjdDogdGhpcy52aWRlb0RldmljZUlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZWRpYVN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgYXVkaW86IHRydWUsXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgZmFjaW5nTW9kZTogdGhpcy5pc0Zyb250Q2FtZXJhID8gXCJ1c2VyXCIgOiBcImVudmlyb25tZW50XCJcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX21lZGlhU3RyZWFtLm5leHQodGhpcy5tZWRpYVN0cmVhbSk7XG4gICAgdGhpcy5yZWNvcmRlciA9IG5ldyBSZWNvcmRSVEModGhpcy5tZWRpYVN0cmVhbSwge1xuICAgICAgdHlwZTogXCJ2aWRlb1wiLFxuICAgICAgZGlzYWJsZUxvZ3M6IHRydWUsXG4gICAgICBtaW1lVHlwZTogXCJ2aWRlby93ZWJtO2NvZGVjcz12cDlcIixcbiAgICAgIGZyYW1lSW50ZXJ2YWw6IDYwXG4gICAgfSk7XG4gICAgdGhpcy5yZWNvcmRlci5zdGFydFJlY29yZGluZygpO1xuICAgIHRoaXMuc2V0UmVjb3JkaW5nU3RhdGUoSVJlY29yZGluZ1N0YXRlLlJFQ09SRElORyk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHN0YXJ0UmVjb3JkaW5nKHtcbiAgICBtaW5SZWNvcmRpbmdUaW1lSW5TZWNvbmRzID0gbnVsbCxcbiAgICBtYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzID0gbnVsbCxcbiAgICBpc0Zyb250Q2FtZXJhID0gZmFsc2UsXG4gICAgdmlkZW9EZXZpY2VJZCA9IG51bGxcbiAgfSkge1xuICAgIHRoaXMuaXNGcm9udENhbWVyYSA9IGlzRnJvbnRDYW1lcmE7XG4gICAgdGhpcy52aWRlb0RldmljZUlkID0gdmlkZW9EZXZpY2VJZDtcbiAgICB0aGlzLm1pblJlY29yZGluZ1RpbWVJblNlY29uZHMgPSBtaW5SZWNvcmRpbmdUaW1lSW5TZWNvbmRzO1xuICAgIHRoaXMubWF4UmVjb3JkaW5nVGltZUluU2Vjb25kcyA9IG1heFJlY29yZGluZ1RpbWVJblNlY29uZHM7XG5cbiAgICB0aGlzLmhhbmRsZVJlY29yZGluZygpO1xuICAgIHRoaXMudXBkYXRlVGltZXIoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcGF1c2VSZWNvcmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnJlY29yZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGF1c2VUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIHRoaXMuc2V0UmVjb3JkaW5nU3RhdGUoSVJlY29yZGluZ1N0YXRlLlBBVVNFRCk7XG4gICAgdGhpcy5yZWNvcmRlci5wYXVzZVJlY29yZGluZygpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICByZXN1bWVSZWNvcmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnJlY29yZGVyKSB7XG4gICAgICB0aGlzLmhhbmRsZVJlY29yZGluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VtZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgdGhpcy50b3RhbFBhdXNlZFRpbWUgKz0gdGhpcy5yZXN1bWVUaW1lIC0gdGhpcy5wYXVzZVRpbWU7XG5cbiAgICAgIHRoaXMucmVjb3JkZXIucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB0aGlzLnNldFJlY29yZGluZ1N0YXRlKElSZWNvcmRpbmdTdGF0ZS5SRUNPUkRJTkcpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc3RvcFJlY29yZGluZygpIHtcbiAgICBpZiAoIXRoaXMucmVjb3JkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5SZWNvcmRpbmdUaW1lSW5TZWNvbmRzID4gdGhpcy50b3RhbFJlY29yZGluZ1RpbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29yZGVyLnN0b3BSZWNvcmRpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5ibG9iID0gdGhpcy5yZWNvcmRlci5nZXRCbG9iKCk7XG5cbiAgICAgIGNvbnN0IHZpZGVvQmFzZTY0ID0gYXdhaXQgZ2V0QmFzZTY0RnJvbVZpZGVvRmlsZSh0aGlzLmJsb2IpO1xuXG4gICAgICB0aGlzLl9ibG9iLm5leHQodmlkZW9CYXNlNjQpO1xuXG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLnN0b3AoKTtcbiAgICAgIHRoaXMucmVjb3JkZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5tZWRpYVN0cmVhbSA9IG51bGw7XG4gICAgICB0aGlzLnJlY29yZGVyID0gbnVsbDtcblxuICAgICAgdGhpcy5zZXRSZWNvcmRpbmdTdGF0ZShJUmVjb3JkaW5nU3RhdGUuUkVDT1JERUQpO1xuICAgICAgdGhpcy5yZXNldFRpbWVyKCk7XG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGRvd25sb2FkUmVjb3JkaW5nKCkge1xuICAgIFJlY29yZFJUQy5pbnZva2VTYXZlQXNEaWFsb2codGhpcy5ibG9iLCBgJHtEYXRlLm5vdygpfS53ZWJtYCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNsZWFyUmVjb3JkaW5nKCkge1xuICAgIHRoaXMuYmxvYiA9IG51bGw7XG4gICAgdGhpcy5yZWNvcmRlciA9IG51bGw7XG4gICAgdGhpcy5tZWRpYVN0cmVhbSA9IG51bGw7XG5cbiAgICB0aGlzLnNldFJlY29yZGluZ1N0YXRlKElSZWNvcmRpbmdTdGF0ZS5OT05FKTtcbiAgICB0aGlzLnJlc2V0VGltZXIoKTtcbiAgfVxufVxuIl19