silence-aware-recorder
Version:
Audio control with silence detection.
5 lines (4 loc) • 17.6 kB
JavaScript
var o=class{silenceDetectionEnabled;timeSlice;audioContext;mediaStreamSource;analyser;mediaRecorder;silenceTimeout;silenceThreshold;silenceDuration;minDecibels;onVolumeChange;onDataAvailable;isSilence;hasSoundStarted;deviceId;isRecording;stopRecorderOnSilence;animationFrameId;constructor({onVolumeChange:e,onDataAvailable:i,silenceDuration:t=2500,silentThreshold:r=-50,minDecibels:a=-100,deviceId:s="default",timeSlice:l=250,silenceDetectionEnabled:d=!0,stopRecorderOnSilence:c=!1}){this.silenceDetectionEnabled=d,this.stopRecorderOnSilence=c,this.timeSlice=l,this.audioContext=null,this.mediaStreamSource=null,this.analyser=null,this.mediaRecorder=null,this.silenceTimeout=null,this.silenceThreshold=r,this.silenceDuration=t,this.minDecibels=a,this.onVolumeChange=e,this.onDataAvailable=i,this.isSilence=!1,this.hasSoundStarted=!1,this.deviceId=s,this.isRecording=!1,this.animationFrameId=null;}async startRecording(){if(!this.isRecording)try{let e=await this.getAudioStream();this.setupAudioContext(e),this.setupMediaRecorder(e),this.isRecording=!0,this.checkForSilence();}catch(e){console.error("Error getting audio stream:",e);}}async getAudioStream(){let e={audio:this.deviceId?{deviceId:{exact:this.deviceId}}:!0,video:!1};return navigator.mediaDevices.getUserMedia(e)}setupAudioContext(e){this.audioContext=new AudioContext,this.mediaStreamSource=this.audioContext.createMediaStreamSource(e),this.analyser=this.audioContext.createAnalyser(),this.analyser.minDecibels=this.minDecibels,this.mediaStreamSource.connect(this.analyser);}setupMediaRecorder(e){this.mediaRecorder=new MediaRecorder(e),this.mediaRecorder.ondataavailable=i=>{var t;i.data.size>0&&!this.isSilence&&((t=this.onDataAvailable)==null||t.call(this,i.data));},this.mediaRecorder.start(this.timeSlice);}async getAvailableDevices(){return navigator.mediaDevices.enumerateDevices()}setDevice(e){this.deviceId!==e&&(this.deviceId=e,this.mediaRecorder&&this.mediaRecorder.state==="recording"&&this.stopRecording());}stopRecording(){this.isRecording&&(this.mediaRecorder&&this.hasSoundStarted&&this.mediaRecorder.state==="recording"?(this.mediaRecorder.requestData(),setTimeout(()=>{this.cleanUp();},100)):this.cleanUp(),this.silenceTimeout&&(clearTimeout(this.silenceTimeout),this.silenceTimeout=null));}cleanUp(){var e,i,t,r,a;((e=this.mediaRecorder)==null?void 0:e.state)==="recording"&&((i=this.mediaRecorder)==null||i.stop(),cancelAnimationFrame(this.animationFrameId)),(r=(t=this.mediaRecorder)==null?void 0:t.stream)==null||r.getTracks().forEach(s=>s.stop()),(a=this.audioContext)==null||a.close(),this.hasSoundStarted=!1,this.isRecording=!1;}checkForSilence(){var r;if(!this.mediaRecorder)throw new Error("MediaRecorder is not available");if(!this.analyser)throw new Error("Analyser is not available");let e=this.analyser.fftSize,i=new Float32Array(e||0);this.analyser.getFloatTimeDomainData(i);let t=this.computeVolume(i);(r=this.onVolumeChange)==null||r.call(this,t),this.silenceDetectionEnabled&&(t<this.silenceThreshold?this.silenceTimeout||(this.silenceTimeout=setTimeout(()=>{var a;this.stopRecorderOnSilence&&((a=this.mediaRecorder)==null||a.stop()),this.isSilence=!0,this.silenceTimeout=null;},this.silenceDuration)):(this.silenceTimeout&&(clearTimeout(this.silenceTimeout),this.silenceTimeout=null),this.isSilence&&(this.stopRecorderOnSilence&&this.mediaRecorder.start(this.timeSlice),this.isSilence=!1),this.hasSoundStarted||(this.hasSoundStarted=!0))),this.animationFrameId=requestAnimationFrame(()=>this.checkForSilence());}computeVolume(e){let i=e.reduce((a,s)=>a+s*s,0),t=Math.sqrt(i/e.length);return 20*Math.log10(t)}},n=o;var v=n;
export { v as default };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvU2lsZW5jZUF3YXJlUmVjb3JkZXIudHMiLCIuLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbIlNpbGVuY2VBd2FyZVJlY29yZGVyIiwib25Wb2x1bWVDaGFuZ2UiLCJvbkRhdGFBdmFpbGFibGUiLCJzaWxlbmNlRHVyYXRpb24iLCJzaWxlbnRUaHJlc2hvbGQiLCJtaW5EZWNpYmVscyIsImRldmljZUlkIiwidGltZVNsaWNlIiwic2lsZW5jZURldGVjdGlvbkVuYWJsZWQiLCJzdG9wUmVjb3JkZXJPblNpbGVuY2UiLCJzdHJlYW0iLCJlcnIiLCJjb25zdHJhaW50cyIsImV2ZW50IiwiX2EiLCJfYiIsIl9jIiwiX2QiLCJfZSIsInRyYWNrIiwiYnVmZmVyTGVuZ3RoIiwiYW1wbGl0dWRlQXJyYXkiLCJ2b2x1bWUiLCJ2YWx1ZXMiLCJzdW0iLCJ2YWx1ZSIsImF2ZXJhZ2UiLCJTaWxlbmNlQXdhcmVSZWNvcmRlcl9kZWZhdWx0IiwibGliX2RlZmF1bHQiXSwibWFwcGluZ3MiOiJBQW1CQSxJQUFNQSxFQUFOLEtBQTJCLENBQ1Isd0JBRUEsVUFFVCxhQUVBLGtCQUVBLFNBRUEsY0FFQSxlQUVTLGlCQUVBLGdCQUVBLFlBRUEsZUFFQSxnQkFFVCxVQUVBLGdCQUVELFNBRUEsWUFFVSxzQkFFVCxpQkFFUixZQUFZLENBQ1YsZUFBQUMsRUFDQSxnQkFBQUMsRUFDQSxnQkFBQUMsRUFBa0IsS0FDbEIsZ0JBQUFDLEVBQWtCLElBQ2xCLFlBQUFDLEVBQWMsS0FDZCxTQUFBQyxFQUFXLFVBQ1gsVUFBQUMsRUFBWSxJQUNaLHdCQUFBQyxFQUEwQixHQUMxQixzQkFBQUMsRUFBd0IsRUFDMUIsRUFBZ0MsQ0FDOUIsS0FBSyx3QkFBMEJELEVBQy9CLEtBQUssc0JBQXdCQyxFQUM3QixLQUFLLFVBQVlGLEVBQ2pCLEtBQUssYUFBZSxLQUNwQixLQUFLLGtCQUFvQixLQUN6QixLQUFLLFNBQVcsS0FDaEIsS0FBSyxjQUFnQixLQUNyQixL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RCxLQUFLLFNBQVMsdUJBQXVCQyxDQUFjLEVBRW5ELElBQU1DLEVBQVMsS0FBSyxjQUFjRCxDQUFjLEdBRWhEUCxFQUFBLEtBQUssaUJBQUwsTUFBQUEsRUFBQSxVQUFzQlEsR0FFbEIsS0FBSywwQkFDSEEsRUFBUyxLQUFLLGlCQUNYLEtBQUssaUJBQ1IsS0FBSyxlQUFpQixXQUFXLElBQU0sQ0F0TWpELElBQUFSLEVBdU1nQixLQUFLLHlCQUNQQSxFQUFBLEtBQUssZ0JBQUwsTUFBQUEsRUFBb0IsUUFFdEIsS0FBSyxVQUFZLEdBQ2pCLEtBQUssZUFBaUIsSUFDeEIsRUFBRyxLQUFLLGVBQWUsSUFHckIsS0FBSyxpQkFDUCxhQUFhLEtBQUssY0FBYyxFQUNoQyxLQUFLLGVBQWlCLE1BRXBCLEtBQUssWUFDSCxLQUFLLHVCQUNQLEtBQUssY0FBYyxNQUFNLEtBQUssU0FBUyxFQUV6QyxLQUFLLFVBQVksSUFFZCxLQUFLLGtCQUNSLEtBQUssZ0JBQWtCLE1BSzdCLEtBQUssaUJBQW1CLHNCQUFzQixJQUFNLEtBQUssZ0JBQWdCLENBQUMsQ0FDNUUsQ0FFUSxjQUFjTyxFQUFzQyxDQUMxRCxJQUFNRSxFQUFTRixFQUFlLE9BQU8sQ0FBQ0csRUFBS0MsSUFBVUQsRUFBTUMsRUFBUUEsRUFBTyxDQUFDLEVBQ3JFQyxFQUFVLEtBQUssS0FBS0gsRUFBU0YsRUFBZSxNQUFNLEVBRXhELE1BRGUsSUFBSyxLQUFLLE1BQU1LLENBQU8sQ0FFeEMsQ0FDRixFQUVPQyxFQUFRM0IsRUN4T2YsSUFBTzRCLEVBQVFEIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgT25Wb2x1bWVDaGFuZ2UgPSAodm9sdW1lOiBudW1iZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBPbkRhdGFBdmFpbGFibGUgPSAoZGF0YTogQmxvYikgPT4gdm9pZCB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGludGVyZmFjZSBTaWxlbmNlQXdhcmVSZWNvcmRlck9wdGlvbnMge1xuICBkZXZpY2VJZD86IHN0cmluZztcbiAgbWluRGVjaWJlbHM/OiBudW1iZXI7XG4gIG9uRGF0YUF2YWlsYWJsZT86IE9uRGF0YUF2YWlsYWJsZTtcbiAgb25Wb2x1bWVDaGFuZ2U/OiBPblZvbHVtZUNoYW5nZTtcblxuICBzZXREZXZpY2VJZD86IChkZXZpY2VJZDogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbmNlRGV0ZWN0aW9uRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgc2lsZW5jZUR1cmF0aW9uPzogbnVtYmVyO1xuXG4gIHNpbGVudFRocmVzaG9sZD86IG51bWJlcjtcbiAgc3RvcFJlY29yZGVyT25TaWxlbmNlPzogYm9vbGVhbjtcbiAgdGltZVNsaWNlPzogbnVtYmVyO1xufVxuXG5jbGFzcyBTaWxlbmNlQXdhcmVSZWNvcmRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lsZW5jZURldGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lU2xpY2U6IG51bWJlcjtcblxuICBwcml2YXRlIGF1ZGlvQ29udGV4dDogQXVkaW9Db250ZXh0IHwgbnVsbDtcblxuICBwcml2YXRlIG1lZGlhU3RyZWFtU291cmNlOiBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSB8IG51bGw7XG5cbiAgcHJpdmF0ZSBhbmFseXNlcjogQW5hbHlzZXJOb2RlIHwgbnVsbDtcblxuICBwcml2YXRlIG1lZGlhUmVjb3JkZXI6IE1lZGlhUmVjb3JkZXIgfCBudWxsO1xuXG4gIHByaXZhdGUgc2lsZW5jZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNpbGVuY2VUaHJlc2hvbGQ6IG51bWJlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNpbGVuY2VEdXJhdGlvbjogbnVtYmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWluRGVjaWJlbHM6IG51bWJlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uVm9sdW1lQ2hhbmdlPzogT25Wb2x1bWVDaGFuZ2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkRhdGFBdmFpbGFibGU/OiBPbkRhdGFBdmFpbGFibGU7XG5cbiAgcHJpdmF0ZSBpc1NpbGVuY2U6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBoYXNTb3VuZFN0YXJ0ZWQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGRldmljZUlkOiBzdHJpbmcgfCBudWxsO1xuXG4gIHB1YmxpYyBpc1JlY29yZGluZzogYm9vbGVhbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3BSZWNvcmRlck9uU2lsZW5jZTogYm9vbGVhbjtcblxuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ6IG51bWJlciB8IG51bGw7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIG9uVm9sdW1lQ2hhbmdlLFxuICAgIG9uRGF0YUF2YWlsYWJsZSxcbiAgICBzaWxlbmNlRHVyYXRpb24gPSAyNTAwLFxuICAgIHNpbGVudFRocmVzaG9sZCA9IC01MCxcbiAgICBtaW5EZWNpYmVscyA9IC0xMDAsXG4gICAgZGV2aWNlSWQgPSAnZGVmYXVsdCcsXG4gICAgdGltZVNsaWNlID0gMjUwLFxuICAgIHNpbGVuY2VEZXRlY3Rpb25FbmFibGVkID0gdHJ1ZSxcbiAgICBzdG9wUmVjb3JkZXJPblNpbGVuY2UgPSBmYWxzZSxcbiAgfTogU2lsZW5jZUF3YXJlUmVjb3JkZXJPcHRpb25zKSB7XG4gICAgdGhpcy5zaWxlbmNlRGV0ZWN0aW9uRW5hYmxlZCA9IHNpbGVuY2VEZXRlY3Rpb25FbmFibGVkO1xuICAgIHRoaXMuc3RvcFJlY29yZGVyT25TaWxlbmNlID0gc3RvcFJlY29yZGVyT25TaWxlbmNlO1xuICAgIHRoaXMudGltZVNsaWNlID0gdGltZVNsaWNlO1xuICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLm1lZGlhU3RyZWFtU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmFuYWx5c2VyID0gbnVsbDtcbiAgICB0aGlzLm1lZGlhUmVjb3JkZXIgPSBudWxsO1xuICAgIHRoaXMuc2lsZW5jZVRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuc2lsZW5jZVRocmVzaG9sZCA9IHNpbGVudFRocmVzaG9sZDtcbiAgICB0aGlzLnNpbGVuY2VEdXJhdGlvbiA9IHNpbGVuY2VEdXJhdGlvbjtcbiAgICB0aGlzLm1pbkRlY2liZWxzID0gbWluRGVjaWJlbHM7XG4gICAgdGhpcy5vblZvbHVtZUNoYW5nZSA9IG9uVm9sdW1lQ2hhbmdlO1xuICAgIHRoaXMub25EYXRhQXZhaWxhYmxlID0gb25EYXRhQXZhaWxhYmxlO1xuICAgIHRoaXMuaXNTaWxlbmNlID0gZmFsc2U7XG4gICAgdGhpcy5oYXNTb3VuZFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRldmljZUlkID0gZGV2aWNlSWQ7XG4gICAgdGhpcy5pc1JlY29yZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gIH1cblxuICBhc3luYyBzdGFydFJlY29yZGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB0aGlzLmdldEF1ZGlvU3RyZWFtKCk7XG4gICAgICB0aGlzLnNldHVwQXVkaW9Db250ZXh0KHN0cmVhbSk7XG4gICAgICB0aGlzLnNldHVwTWVkaWFSZWNvcmRlcihzdHJlYW0pO1xuICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmNoZWNrRm9yU2lsZW5jZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyBhdWRpbyBzdHJlYW06JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEF1ZGlvU3RyZWFtKCk6IFByb21pc2U8TWVkaWFTdHJlYW0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBjb25zdCBjb25zdHJhaW50czogTWVkaWFTdHJlYW1Db25zdHJhaW50cyA9IHtcbiAgICAgIGF1ZGlvOiB0aGlzLmRldmljZUlkID8geyBkZXZpY2VJZDogeyBleGFjdDogdGhpcy5kZXZpY2VJZCB9IH0gOiB0cnVlLFxuICAgICAgdmlkZW86IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoY29uc3RyYWludHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEF1ZGlvQ29udGV4dChzdHJlYW06IE1lZGlhU3RyZWFtKTogdm9pZCB7XG4gICAgdGhpcy5hdWRpb0NvbnRleHQgPSBuZXcgQXVkaW9Db250ZXh0KCk7XG4gICAgdGhpcy5tZWRpYVN0cmVhbVNvdXJjZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHN0cmVhbSk7XG4gICAgdGhpcy5hbmFseXNlciA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG4gICAgdGhpcy5hbmFseXNlci5taW5EZWNpYmVscyA9IHRoaXMubWluRGVjaWJlbHM7XG4gICAgdGhpcy5tZWRpYVN0cmVhbVNvdXJjZS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cE1lZGlhUmVjb3JkZXIoc3RyZWFtOiBNZWRpYVN0cmVhbSk6IHZvaWQge1xuICAgIHRoaXMubWVkaWFSZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKHN0cmVhbSk7XG5cbiAgICB0aGlzLm1lZGlhUmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuZGF0YS5zaXplID4gMCAmJiAhdGhpcy5pc1NpbGVuY2UpIHtcbiAgICAgICAgdGhpcy5vbkRhdGFBdmFpbGFibGU/LihldmVudC5kYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5tZWRpYVJlY29yZGVyLnN0YXJ0KHRoaXMudGltZVNsaWNlKTtcbiAgfVxuXG4gIGFzeW5jIGdldEF2YWlsYWJsZURldmljZXMoKTogUHJvbWlzZTxNZWRpYURldmljZUluZm9bXT4ge1xuICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKTtcbiAgfVxuXG4gIHNldERldmljZShkZXZpY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGV2aWNlSWQgIT09IGRldmljZUlkKSB7XG4gICAgICB0aGlzLmRldmljZUlkID0gZGV2aWNlSWQ7XG4gICAgICBpZiAodGhpcy5tZWRpYVJlY29yZGVyICYmIHRoaXMubWVkaWFSZWNvcmRlci5zdGF0ZSA9PT0gJ3JlY29yZGluZycpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJlY29yZGluZyBpcyBydW5uaW5nLCBzdG9wIGl0IGJlZm9yZSBzd2l0Y2hpbmcgZGV2aWNlc1xuICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdG9wUmVjb3JkaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JlY29yZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lZGlhUmVjb3JkZXIgJiYgdGhpcy5oYXNTb3VuZFN0YXJ0ZWQgJiYgdGhpcy5tZWRpYVJlY29yZGVyLnN0YXRlID09PSAncmVjb3JkaW5nJykge1xuICAgICAgdGhpcy5tZWRpYVJlY29yZGVyLnJlcXVlc3REYXRhKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICB9LCAxMDApOyAvLyBhZGp1c3QgdGhpcyBkZWxheSBhcyBuZWNlc3NhcnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2lsZW5jZVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNpbGVuY2VUaW1lb3V0KTtcbiAgICAgIHRoaXMuc2lsZW5jZVRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5VcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZWRpYVJlY29yZGVyPy5zdGF0ZSA9PT0gJ3JlY29yZGluZycpIHtcbiAgICAgIHRoaXMubWVkaWFSZWNvcmRlcj8uc3RvcCgpO1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25GcmFtZUlkISk7XG4gICAgfVxuICAgIHRoaXMubWVkaWFSZWNvcmRlcj8uc3RyZWFtPy5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgICB0aGlzLmF1ZGlvQ29udGV4dD8uY2xvc2UoKTtcbiAgICB0aGlzLmhhc1NvdW5kU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JTaWxlbmNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZWRpYVJlY29yZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lZGlhUmVjb3JkZXIgaXMgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hbmFseXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbmFseXNlciBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5hbmFseXNlci5mZnRTaXplO1xuICAgIGNvbnN0IGFtcGxpdHVkZUFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShidWZmZXJMZW5ndGggfHwgMCk7XG4gICAgdGhpcy5hbmFseXNlci5nZXRGbG9hdFRpbWVEb21haW5EYXRhKGFtcGxpdHVkZUFycmF5KTtcblxuICAgIGNvbnN0IHZvbHVtZSA9IHRoaXMuY29tcHV0ZVZvbHVtZShhbXBsaXR1ZGVBcnJheSk7XG5cbiAgICB0aGlzLm9uVm9sdW1lQ2hhbmdlPy4odm9sdW1lKTtcblxuICAgIGlmICh0aGlzLnNpbGVuY2VEZXRlY3Rpb25FbmFibGVkKSB7XG4gICAgICBpZiAodm9sdW1lIDwgdGhpcy5zaWxlbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIGlmICghdGhpcy5zaWxlbmNlVGltZW91dCkge1xuICAgICAgICAgIHRoaXMuc2lsZW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BSZWNvcmRlck9uU2lsZW5jZSkge1xuICAgICAgICAgICAgICB0aGlzLm1lZGlhUmVjb3JkZXI/LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNTaWxlbmNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2lsZW5jZVRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIH0sIHRoaXMuc2lsZW5jZUR1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuc2lsZW5jZVRpbWVvdXQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zaWxlbmNlVGltZW91dCk7XG4gICAgICAgICAgdGhpcy5zaWxlbmNlVGltZW91dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTaWxlbmNlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RvcFJlY29yZGVyT25TaWxlbmNlKSB7XG4gICAgICAgICAgICB0aGlzLm1lZGlhUmVjb3JkZXIuc3RhcnQodGhpcy50aW1lU2xpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzU2lsZW5jZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5oYXNTb3VuZFN0YXJ0ZWQpIHtcbiAgICAgICAgICB0aGlzLmhhc1NvdW5kU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5jaGVja0ZvclNpbGVuY2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVWb2x1bWUoYW1wbGl0dWRlQXJyYXk6IEZsb2F0MzJBcnJheSk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVzID0gYW1wbGl0dWRlQXJyYXkucmVkdWNlKChzdW0sIHZhbHVlKSA9PiBzdW0gKyB2YWx1ZSAqIHZhbHVlLCAwKTtcbiAgICBjb25zdCBhdmVyYWdlID0gTWF0aC5zcXJ0KHZhbHVlcyAvIGFtcGxpdHVkZUFycmF5Lmxlbmd0aCk7IC8vIGNhbGN1bGF0ZSBybXNcbiAgICBjb25zdCB2b2x1bWUgPSAyMCAqIE1hdGgubG9nMTAoYXZlcmFnZSk7IC8vIGNvbnZlcnQgdG8gZEJcbiAgICByZXR1cm4gdm9sdW1lO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpbGVuY2VBd2FyZVJlY29yZGVyO1xuIiwiaW1wb3J0IFNpbGVuY2VBd2FyZVJlY29yZGVyIGZyb20gJy4vU2lsZW5jZUF3YXJlUmVjb3JkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBTaWxlbmNlQXdhcmVSZWNvcmRlcjtcbiJdfQ==