speechrecorderng 3.10.13 → 3.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/speechrecorderng.mjs +204 -201
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/responsive_component.d.ts +1 -1
- package/package.json +13 -15
- package/esm2022/lib/action/action.mjs +0 -73
- package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
- package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
- package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2022/lib/audio/audio_display.mjs +0 -118
- package/esm2022/lib/audio/audio_player.mjs +0 -238
- package/esm2022/lib/audio/capture/capture.mjs +0 -855
- package/esm2022/lib/audio/context.mjs +0 -79
- package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
- package/esm2022/lib/audio/format.mjs +0 -20
- package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
- package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
- package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2022/lib/audio/io/stream.mjs +0 -59
- package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2022/lib/audio/persistor.mjs +0 -81
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
- package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
- package/esm2022/lib/audio/playback/player.mjs +0 -402
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
- package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
- package/esm2022/lib/audio/ui/common.mjs +0 -19
- package/esm2022/lib/audio/ui/container.mjs +0 -414
- package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2022/lib/db/inddb.mjs +0 -120
- package/esm2022/lib/dsp/utils.mjs +0 -48
- package/esm2022/lib/environment/environment.defaults.mjs +0 -9
- package/esm2022/lib/io/BinaryReader.mjs +0 -93
- package/esm2022/lib/io/BinaryWriter.mjs +0 -80
- package/esm2022/lib/io/stream.mjs +0 -259
- package/esm2022/lib/math/2d/geometry.mjs +0 -28
- package/esm2022/lib/math/complex.mjs +0 -58
- package/esm2022/lib/math/dft.mjs +0 -196
- package/esm2022/lib/media/utils.mjs +0 -14
- package/esm2022/lib/net/uploader.mjs +0 -367
- package/esm2022/lib/recorder_component.mjs +0 -65
- package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
- package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2022/lib/speechrecorder/recording.mjs +0 -124
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
- package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
- package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
- package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
- package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
- package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
- package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
- package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2022/lib/speechrecorderng.component.mjs +0 -392
- package/esm2022/lib/speechrecorderng.module.mjs +0 -97
- package/esm2022/lib/spr.config.mjs +0 -27
- package/esm2022/lib/spr.module.version.mjs +0 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
- package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
- package/esm2022/lib/ui/message_dialog.mjs +0 -51
- package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2022/lib/ui/responsive_component.mjs +0 -24
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
- package/esm2022/lib/utils/ua-parser.mjs +0 -190
- package/esm2022/lib/utils/utils.mjs +0 -132
- package/esm2022/lib/utils/wake_lock.mjs +0 -114
- package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
- package/esm2022/public-api.mjs +0 -35
- package/esm2022/speechrecorderng.mjs +0 -5
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
export class AudioContextProvider {
|
|
2
|
-
static { this._audioContext = null; }
|
|
3
|
-
static { this._offlineAudioContext = null; }
|
|
4
|
-
static audioContextInstance() {
|
|
5
|
-
if (!this._audioContext) {
|
|
6
|
-
let debugFail = false;
|
|
7
|
-
if (!window.AudioContext || typeof window.AudioContext !== 'function' || debugFail) {
|
|
8
|
-
this._audioContext = null;
|
|
9
|
-
throw new Error('Browser does not support Web Audio API!');
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
console.debug("Get new audio context...");
|
|
13
|
-
this._audioContext = new window.AudioContext();
|
|
14
|
-
console.debug("Created new audio context.");
|
|
15
|
-
this._audioContext.addEventListener('statechange', () => {
|
|
16
|
-
console.debug("Audio context state changed: " + this._audioContext?.state);
|
|
17
|
-
});
|
|
18
|
-
console.debug("Created new audio context with state: " + this._audioContext?.state);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return this._audioContext;
|
|
22
|
-
}
|
|
23
|
-
// public static audioContextInstanceRunning(audioContext?:AudioContext):Promise<AudioContext>{
|
|
24
|
-
//
|
|
25
|
-
// return new Promise<AudioContext>((resolve,reject)=>{
|
|
26
|
-
// let aCtx=audioContext?audioContext:AudioContextProvider.audioContextInstance();
|
|
27
|
-
// if(aCtx) {
|
|
28
|
-
// if(aCtx.state==='closed') {
|
|
29
|
-
// reject(new Error('Audio context already closed.'));
|
|
30
|
-
// }else if(aCtx.state==='running') {
|
|
31
|
-
// resolve(aCtx);
|
|
32
|
-
// }else{
|
|
33
|
-
// aCtx.resume().then(() => {
|
|
34
|
-
// if(aCtx) {
|
|
35
|
-
// resolve(aCtx);
|
|
36
|
-
// }else{
|
|
37
|
-
// reject(new Error('Could not get audio context'));
|
|
38
|
-
// }
|
|
39
|
-
// }).catch(() => {
|
|
40
|
-
// reject(new Error('Could not resume audio context'));
|
|
41
|
-
// })
|
|
42
|
-
// }
|
|
43
|
-
// }else{
|
|
44
|
-
// reject(new Error('Could not get audio context from browser'));
|
|
45
|
-
// }
|
|
46
|
-
// });
|
|
47
|
-
// }
|
|
48
|
-
// public static decodeAudioData(data:ArrayBuffer,audioContext?:AudioContext):Promise<AudioBuffer>{
|
|
49
|
-
// return new Promise<AudioBuffer>((resolve,reject)=>{
|
|
50
|
-
// // decodeAudioData requires an audio context in running state
|
|
51
|
-
// AudioContextProvider.audioContextInstanceRunning(audioContext).then(
|
|
52
|
-
// (aCtx)=>{
|
|
53
|
-
// // Do not use Promise version, which does not work with Safari 13
|
|
54
|
-
// aCtx.decodeAudioData(data,decodedData => {
|
|
55
|
-
// resolve(decodedData);
|
|
56
|
-
// },(reason) => {
|
|
57
|
-
// reject(reason);
|
|
58
|
-
// });
|
|
59
|
-
// }
|
|
60
|
-
// ).catch((reason)=>{
|
|
61
|
-
// reject(reason);
|
|
62
|
-
// })
|
|
63
|
-
// })
|
|
64
|
-
// }
|
|
65
|
-
static decodeAudioData(data) {
|
|
66
|
-
return new Promise((resolve, reject) => {
|
|
67
|
-
if (!this._offlineAudioContext) {
|
|
68
|
-
this._offlineAudioContext = new OfflineAudioContext(1, 44100, 44100);
|
|
69
|
-
}
|
|
70
|
-
// Do not use Promise version, which does not work with Safari 13
|
|
71
|
-
this._offlineAudioContext.decodeAudioData(data, decodedData => {
|
|
72
|
-
resolve(decodedData);
|
|
73
|
-
}, (reason) => {
|
|
74
|
-
reject(reason);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE1BQU0sT0FBTyxvQkFBb0I7YUFFaEIsa0JBQWEsR0FBb0IsSUFBSSxDQUFDO2FBQ3RDLHlCQUFvQixHQUEwQixJQUFJLENBQUM7SUFFM0QsTUFBTSxDQUFDLG9CQUFvQjtRQUVoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxPQUFPLE1BQU0sQ0FBQyxZQUFZLEtBQUssVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNuRixJQUFJLENBQUMsYUFBYSxHQUFDLElBQUksQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1lBQzdELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxhQUFhLEdBQUUsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO29CQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzNFLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEdBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLEVBQUU7SUFDRiwyREFBMkQ7SUFDM0Qsd0ZBQXdGO0lBQ3hGLG1CQUFtQjtJQUNuQixzQ0FBc0M7SUFDdEMsZ0VBQWdFO0lBQ2hFLDZDQUE2QztJQUM3QywyQkFBMkI7SUFDM0IsaUJBQWlCO0lBQ2pCLHVDQUF1QztJQUN2Qyx5QkFBeUI7SUFDekIsK0JBQStCO0lBQy9CLHFCQUFxQjtJQUNyQixrRUFBa0U7SUFDbEUsZ0JBQWdCO0lBQ2hCLDZCQUE2QjtJQUM3QixtRUFBbUU7SUFDbkUsZUFBZTtJQUNmLFlBQVk7SUFDWixlQUFlO0lBQ2YseUVBQXlFO0lBQ3pFLFVBQVU7SUFDVixRQUFRO0lBQ1IsSUFBSTtJQUVKLG1HQUFtRztJQUNuRyx3REFBd0Q7SUFDeEQsb0VBQW9FO0lBQ3BFLDJFQUEyRTtJQUMzRSxrQkFBa0I7SUFDbEIsNEVBQTRFO0lBQzVFLHFEQUFxRDtJQUNyRCxrQ0FBa0M7SUFDbEMsMEJBQTBCO0lBQzFCLDRCQUE0QjtJQUM1QixjQUFjO0lBQ2QsVUFBVTtJQUNWLDBCQUEwQjtJQUMxQix3QkFBd0I7SUFDeEIsU0FBUztJQUNULE9BQU87SUFDUCxJQUFJO0lBR0csTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFnQjtRQUMxQyxPQUFPLElBQUksT0FBTyxDQUFjLENBQUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ2hELElBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksbUJBQW1CLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQ0MsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUMzRCxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ1gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUNGLENBQUE7SUFFTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NvbnRleHRQcm92aWRlclxyXG57XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2F1ZGlvQ29udGV4dDpBdWRpb0NvbnRleHR8IG51bGw9bnVsbDtcclxuICBwcml2YXRlIHN0YXRpYyBfb2ZmbGluZUF1ZGlvQ29udGV4dDpPZmZsaW5lQXVkaW9Db250ZXh0fG51bGw9bnVsbDtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBhdWRpb0NvbnRleHRJbnN0YW5jZSgpOkF1ZGlvQ29udGV4dHxudWxsXHJcbiAge1xyXG4gICAgaWYgKCF0aGlzLl9hdWRpb0NvbnRleHQpIHtcclxuICAgICAgbGV0IGRlYnVnRmFpbCA9IGZhbHNlO1xyXG4gICAgICBpZiAoIXdpbmRvdy5BdWRpb0NvbnRleHQgfHwgdHlwZW9mIHdpbmRvdy5BdWRpb0NvbnRleHQgIT09ICdmdW5jdGlvbicgfHwgZGVidWdGYWlsKSB7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9Db250ZXh0PW51bGw7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViIEF1ZGlvIEFQSSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiR2V0IG5ldyBhdWRpbyBjb250ZXh0Li4uXCIpO1xyXG4gICAgICAgIHRoaXMuX2F1ZGlvQ29udGV4dD0gbmV3IHdpbmRvdy5BdWRpb0NvbnRleHQoKTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiQ3JlYXRlZCBuZXcgYXVkaW8gY29udGV4dC5cIik7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9Db250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRlY2hhbmdlJywgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGNvbnRleHQgc3RhdGUgY2hhbmdlZDogXCIrdGhpcy5fYXVkaW9Db250ZXh0Py5zdGF0ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkNyZWF0ZWQgbmV3IGF1ZGlvIGNvbnRleHQgd2l0aCBzdGF0ZTogXCIrdGhpcy5fYXVkaW9Db250ZXh0Py5zdGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIGF1ZGlvQ29udGV4dEluc3RhbmNlUnVubmluZyhhdWRpb0NvbnRleHQ/OkF1ZGlvQ29udGV4dCk6UHJvbWlzZTxBdWRpb0NvbnRleHQ+e1xyXG4gIC8vXHJcbiAgLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZTxBdWRpb0NvbnRleHQ+KChyZXNvbHZlLHJlamVjdCk9PntcclxuICAvLyAgICAgICBsZXQgYUN0eD1hdWRpb0NvbnRleHQ/YXVkaW9Db250ZXh0OkF1ZGlvQ29udGV4dFByb3ZpZGVyLmF1ZGlvQ29udGV4dEluc3RhbmNlKCk7XHJcbiAgLy8gICAgICAgaWYoYUN0eCkge1xyXG4gIC8vICAgICAgICAgaWYoYUN0eC5zdGF0ZT09PSdjbG9zZWQnKSB7XHJcbiAgLy8gICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0F1ZGlvIGNvbnRleHQgYWxyZWFkeSBjbG9zZWQuJykpO1xyXG4gIC8vICAgICAgICAgfWVsc2UgaWYoYUN0eC5zdGF0ZT09PSdydW5uaW5nJykge1xyXG4gIC8vICAgICAgICAgICByZXNvbHZlKGFDdHgpO1xyXG4gIC8vICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgIGFDdHgucmVzdW1lKCkudGhlbigoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYoYUN0eCkge1xyXG4gIC8vICAgICAgICAgICAgICAgcmVzb2x2ZShhQ3R4KTtcclxuICAvLyAgICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgYXVkaW8gY29udGV4dCcpKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAvLyAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgcmVzdW1lIGF1ZGlvIGNvbnRleHQnKSk7XHJcbiAgLy8gICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IGF1ZGlvIGNvbnRleHQgZnJvbSBicm93c2VyJykpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHVibGljIHN0YXRpYyBkZWNvZGVBdWRpb0RhdGEoZGF0YTpBcnJheUJ1ZmZlcixhdWRpb0NvbnRleHQ/OkF1ZGlvQ29udGV4dCk6UHJvbWlzZTxBdWRpb0J1ZmZlcj57XHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2U8QXVkaW9CdWZmZXI+KChyZXNvbHZlLHJlamVjdCk9PntcclxuICAvLyAgICAgLy8gZGVjb2RlQXVkaW9EYXRhIHJlcXVpcmVzIGFuIGF1ZGlvIGNvbnRleHQgaW4gcnVubmluZyBzdGF0ZVxyXG4gIC8vICAgICBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZVJ1bm5pbmcoYXVkaW9Db250ZXh0KS50aGVuKFxyXG4gIC8vICAgICAgIChhQ3R4KT0+e1xyXG4gIC8vICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAvLyAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKGRhdGEsZGVjb2RlZERhdGEgPT4ge1xyXG4gIC8vICAgICAgICAgICByZXNvbHZlKGRlY29kZWREYXRhKTtcclxuICAvLyAgICAgICAgIH0sKHJlYXNvbikgPT4ge1xyXG4gIC8vICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgKS5jYXRjaCgocmVhc29uKT0+e1xyXG4gIC8vICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgfSlcclxuICAvLyB9XHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGRlY29kZUF1ZGlvRGF0YShkYXRhOkFycmF5QnVmZmVyKTpQcm9taXNlPEF1ZGlvQnVmZmVyPntcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEF1ZGlvQnVmZmVyPigocmVzb2x2ZSxyZWplY3QpPT57XHJcbiAgICAgICAgaWYoIXRoaXMuX29mZmxpbmVBdWRpb0NvbnRleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fb2ZmbGluZUF1ZGlvQ29udGV4dCA9IG5ldyBPZmZsaW5lQXVkaW9Db250ZXh0KDEsIDQ0MTAwLCA0NDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAgICAgICAgIHRoaXMuX29mZmxpbmVBdWRpb0NvbnRleHQuZGVjb2RlQXVkaW9EYXRhKGRhdGEsZGVjb2RlZERhdGEgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKGRlY29kZWREYXRhKTtcclxuICAgICAgICAgIH0sKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG5cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|