speechrecorderng 3.10.13 → 3.11.0

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.
Files changed (99) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/speechrecorderng.mjs +204 -201
  3. package/fesm2022/speechrecorderng.mjs.map +1 -1
  4. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
  5. package/lib/spr.module.version.d.ts +1 -1
  6. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  7. package/lib/ui/responsive_component.d.ts +1 -1
  8. package/package.json +13 -15
  9. package/esm2022/lib/action/action.mjs +0 -73
  10. package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
  11. package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
  12. package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
  13. package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
  14. package/esm2022/lib/audio/audio_display.mjs +0 -118
  15. package/esm2022/lib/audio/audio_player.mjs +0 -238
  16. package/esm2022/lib/audio/capture/capture.mjs +0 -855
  17. package/esm2022/lib/audio/context.mjs +0 -79
  18. package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
  19. package/esm2022/lib/audio/format.mjs +0 -20
  20. package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
  21. package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
  22. package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
  23. package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
  24. package/esm2022/lib/audio/io/stream.mjs +0 -59
  25. package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
  26. package/esm2022/lib/audio/persistor.mjs +0 -81
  27. package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
  28. package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
  29. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  30. package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
  31. package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
  32. package/esm2022/lib/audio/playback/player.mjs +0 -402
  33. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  34. package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
  35. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
  36. package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
  37. package/esm2022/lib/audio/ui/common.mjs +0 -19
  38. package/esm2022/lib/audio/ui/container.mjs +0 -414
  39. package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
  40. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  41. package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
  42. package/esm2022/lib/db/inddb.mjs +0 -120
  43. package/esm2022/lib/dsp/utils.mjs +0 -48
  44. package/esm2022/lib/environment/environment.defaults.mjs +0 -9
  45. package/esm2022/lib/io/BinaryReader.mjs +0 -93
  46. package/esm2022/lib/io/BinaryWriter.mjs +0 -80
  47. package/esm2022/lib/io/stream.mjs +0 -259
  48. package/esm2022/lib/math/2d/geometry.mjs +0 -28
  49. package/esm2022/lib/math/complex.mjs +0 -58
  50. package/esm2022/lib/math/dft.mjs +0 -196
  51. package/esm2022/lib/media/utils.mjs +0 -14
  52. package/esm2022/lib/net/uploader.mjs +0 -367
  53. package/esm2022/lib/recorder_component.mjs +0 -65
  54. package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
  55. package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
  56. package/esm2022/lib/speechrecorder/recording.mjs +0 -124
  57. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
  58. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  59. package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
  60. package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
  61. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  62. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
  63. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
  64. package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
  65. package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
  66. package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
  67. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
  68. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  69. package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
  70. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
  71. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
  72. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
  73. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
  74. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
  75. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  76. package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
  77. package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
  78. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
  79. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
  80. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
  81. package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
  82. package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
  83. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  84. package/esm2022/lib/speechrecorderng.component.mjs +0 -392
  85. package/esm2022/lib/speechrecorderng.module.mjs +0 -97
  86. package/esm2022/lib/spr.config.mjs +0 -27
  87. package/esm2022/lib/spr.module.version.mjs +0 -2
  88. package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
  89. package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
  90. package/esm2022/lib/ui/message_dialog.mjs +0 -51
  91. package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
  92. package/esm2022/lib/ui/responsive_component.mjs +0 -24
  93. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
  94. package/esm2022/lib/utils/ua-parser.mjs +0 -190
  95. package/esm2022/lib/utils/utils.mjs +0 -132
  96. package/esm2022/lib/utils/wake_lock.mjs +0 -114
  97. package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
  98. package/esm2022/public-api.mjs +0 -35
  99. package/esm2022/speechrecorderng.mjs +0 -5
@@ -1,59 +0,0 @@
1
- import { Float32ArrayChunkerOutStream } from "../../io/stream";
2
- export class SequenceAudioFloat32ChunkerOutStream extends Float32ArrayChunkerOutStream {
3
- constructor(outStream, chunkDurationSeconds) {
4
- super(outStream);
5
- this.chunkDurationSeconds = chunkDurationSeconds;
6
- this.sampleRate = null;
7
- this.sequenceAudioFloat32OutStream = outStream;
8
- }
9
- setFormat(channels, sampleRate) {
10
- //console.debug("SequenceAudioFloat32ChunkerOutStream:setFormat(channels: "+channels+",sampleRate: "+sampleRate+")")
11
- this.channels = channels;
12
- this.sampleRate = sampleRate;
13
- this.chunkSize = Math.round(sampleRate * this.chunkDurationSeconds);
14
- //console.debug("SequenceAudioFloat32ChunkerOutStream: chunkSize: "+this.chunkSize);
15
- this.sequenceAudioFloat32OutStream.setFormat(channels, sampleRate);
16
- }
17
- nextStream() {
18
- this.sequenceAudioFloat32OutStream.nextStream();
19
- }
20
- }
21
- /**
22
- * Streams a SequenceAudioFloat32OutStream to multiple streams
23
- */
24
- export class SequenceAudioFloat32OutStreamMultiplier {
25
- constructor() {
26
- this._sequenceAudioFloat32OutStreams = new Array();
27
- }
28
- get sequenceAudioFloat32OutStreams() {
29
- return this._sequenceAudioFloat32OutStreams;
30
- }
31
- setFormat(channels, sampleRate) {
32
- for (let os of this._sequenceAudioFloat32OutStreams) {
33
- os.setFormat(channels, sampleRate);
34
- }
35
- }
36
- nextStream() {
37
- for (let os of this._sequenceAudioFloat32OutStreams) {
38
- os.nextStream();
39
- }
40
- }
41
- close() {
42
- for (let os of this._sequenceAudioFloat32OutStreams) {
43
- os.close();
44
- }
45
- }
46
- flush() {
47
- for (let os of this._sequenceAudioFloat32OutStreams) {
48
- os.flush();
49
- }
50
- }
51
- write(buffers) {
52
- let toWrite = buffers.length;
53
- for (let os of this._sequenceAudioFloat32OutStreams) {
54
- os.write(buffers);
55
- }
56
- return toWrite;
57
- }
58
- }
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2lvL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsNEJBQTRCLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFVcEYsTUFBTSxPQUFPLG9DQUFxQyxTQUFRLDRCQUE0QjtJQUlwRixZQUFZLFNBQXVDLEVBQVUsb0JBQTJCO1FBQ3RGLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUQwQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQU87UUFGaEYsZUFBVSxHQUFhLElBQUksQ0FBQztRQUlsQyxJQUFJLENBQUMsNkJBQTZCLEdBQUMsU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0IsRUFBQyxVQUFpQjtRQUMxQyxvSEFBb0g7UUFDcEgsSUFBSSxDQUFDLFFBQVEsR0FBQyxRQUFRLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBQyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRSxvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELFVBQVU7UUFDUixJQUFJLENBQUMsNkJBQTZCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEQsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sdUNBQXVDO0lBSWxEO1FBQ0UsSUFBSSxDQUFDLCtCQUErQixHQUFDLElBQUksS0FBSyxFQUFpQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxJQUFJLDhCQUE4QjtRQUNoQyxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQWdCLEVBQUMsVUFBaUI7UUFDMUMsS0FBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsK0JBQStCLEVBQUMsQ0FBQztZQUNoRCxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUNELFVBQVU7UUFDUixLQUFJLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxLQUFJLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILEtBQUksSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLCtCQUErQixFQUFDLENBQUM7WUFDbEQsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBNEI7UUFDaEMsSUFBSSxPQUFPLEdBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxLQUFLLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ3BELEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmxvYXQzMkFycmF5Q2h1bmtlck91dFN0cmVhbSwgRmxvYXQzMkFycmF5T3V0U3RyZWFtfSBmcm9tIFwiLi4vLi4vaW8vc3RyZWFtXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvRmxvYXQzMk91dFN0cmVhbSBleHRlbmRzIEZsb2F0MzJBcnJheU91dFN0cmVhbXtcclxuICAgIHNldEZvcm1hdChjaGFubmVsczogbnVtYmVyLHNhbXBsZVJhdGU6bnVtYmVyKTp2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIGV4dGVuZHMgQXVkaW9GbG9hdDMyT3V0U3RyZWFte1xyXG4gICAgbmV4dFN0cmVhbSgpOnZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZUF1ZGlvRmxvYXQzMkNodW5rZXJPdXRTdHJlYW0gZXh0ZW5kcyBGbG9hdDMyQXJyYXlDaHVua2VyT3V0U3RyZWFtIGltcGxlbWVudHMgU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW17XHJcblxyXG4gIHByaXZhdGUgc2FtcGxlUmF0ZTpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW06U2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW07XHJcbiAgY29uc3RydWN0b3Iob3V0U3RyZWFtOlNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtLCBwcml2YXRlIGNodW5rRHVyYXRpb25TZWNvbmRzOm51bWJlcil7XHJcbiAgICBzdXBlcihvdXRTdHJlYW0pO1xyXG4gICAgdGhpcy5zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbT1vdXRTdHJlYW07XHJcbiAgfVxyXG5cclxuICBzZXRGb3JtYXQoY2hhbm5lbHM6IG51bWJlcixzYW1wbGVSYXRlOm51bWJlcik6dm9pZHtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlcXVlbmNlQXVkaW9GbG9hdDMyQ2h1bmtlck91dFN0cmVhbTpzZXRGb3JtYXQoY2hhbm5lbHM6IFwiK2NoYW5uZWxzK1wiLHNhbXBsZVJhdGU6IFwiK3NhbXBsZVJhdGUrXCIpXCIpXHJcbiAgICB0aGlzLmNoYW5uZWxzPWNoYW5uZWxzO1xyXG4gICAgdGhpcy5zYW1wbGVSYXRlPXNhbXBsZVJhdGU7XHJcbiAgICB0aGlzLmNodW5rU2l6ZT1NYXRoLnJvdW5kKHNhbXBsZVJhdGUqdGhpcy5jaHVua0R1cmF0aW9uU2Vjb25kcyk7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJTZXF1ZW5jZUF1ZGlvRmxvYXQzMkNodW5rZXJPdXRTdHJlYW06IGNodW5rU2l6ZTogXCIrdGhpcy5jaHVua1NpemUpO1xyXG4gICAgdGhpcy5zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbS5zZXRGb3JtYXQoY2hhbm5lbHMsc2FtcGxlUmF0ZSk7XHJcbiAgfVxyXG4gIG5leHRTdHJlYW0oKTp2b2lke1xyXG4gICAgdGhpcy5zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbS5uZXh0U3RyZWFtKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogU3RyZWFtcyBhIFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIHRvIG11bHRpcGxlIHN0cmVhbXNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbU11bHRpcGxpZXIgaW1wbGVtZW50cyBTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zITpBcnJheTxTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zPW5ldyBBcnJheTxTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbT4oKTtcclxuICB9XHJcblxyXG4gIGdldCBzZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXMoKTogQXJyYXk8U2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW0+IHtcclxuICAgIHJldHVybiB0aGlzLl9zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXM7XHJcbiAgfVxyXG5cclxuICBzZXRGb3JtYXQoY2hhbm5lbHM6IG51bWJlcixzYW1wbGVSYXRlOm51bWJlcik6dm9pZHtcclxuICAgIGZvcihsZXQgb3Mgb2YgdGhpcy5fc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zKXtcclxuICAgICAgICBvcy5zZXRGb3JtYXQoY2hhbm5lbHMsc2FtcGxlUmF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5leHRTdHJlYW0oKTp2b2lke1xyXG4gICAgZm9yKGxldCBvcyBvZiB0aGlzLl9zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXMpe1xyXG4gICAgICBvcy5uZXh0U3RyZWFtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIGZvcihsZXQgb3Mgb2YgdGhpcy5fc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zKXtcclxuICAgICAgb3MuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZsdXNoKCk6IHZvaWQge1xyXG4gICAgZm9yKGxldCBvcyBvZiB0aGlzLl9zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXMpe1xyXG4gICAgICBvcy5mbHVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGUoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlciB7XHJcbiAgICBsZXQgdG9Xcml0ZTpudW1iZXI9YnVmZmVycy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IG9zIG9mIHRoaXMuX3NlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtcykge1xyXG4gICAgICAgIG9zLndyaXRlKGJ1ZmZlcnMpO1xyXG4gICAgICB9XHJcbiAgICByZXR1cm4gdG9Xcml0ZTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,293 +0,0 @@
1
- import { Observable } from "rxjs";
2
- import { BasicAudioSource } from "./audio_data_holder";
3
- import { HttpErrorResponse } from "@angular/common/http";
4
- export class NetAudioBuffer extends BasicAudioSource {
5
- get orgFetchChunkFrameLen() {
6
- return this._orgFetchChunkFrameLen;
7
- }
8
- get recFileService() {
9
- return this._recFileService;
10
- }
11
- get baseUrl() {
12
- return this._baseUrl;
13
- }
14
- get chunkFrameLen() {
15
- return this._chunkFrameLen;
16
- }
17
- get uuid() {
18
- return this._uuid;
19
- }
20
- constructor(_recFileService, _baseUrl, _channelCount, _sampleRate, _chunkFrameLen, _frameLen, _uuid = null, _orgFetchChunkFrameLen = _chunkFrameLen) {
21
- super();
22
- this._recFileService = _recFileService;
23
- this._baseUrl = _baseUrl;
24
- this._channelCount = _channelCount;
25
- this._sampleRate = _sampleRate;
26
- this._chunkFrameLen = _chunkFrameLen;
27
- this._frameLen = _frameLen;
28
- this._uuid = _uuid;
29
- this._orgFetchChunkFrameLen = _orgFetchChunkFrameLen;
30
- this._chunkCount = 0;
31
- this._sealed = false;
32
- }
33
- get channelCount() {
34
- return this._channelCount;
35
- }
36
- sealed() {
37
- return this._sealed;
38
- }
39
- seal() {
40
- this._sealed = true;
41
- }
42
- get sampleRate() {
43
- return this._sampleRate;
44
- }
45
- get frameLen() {
46
- return this._frameLen;
47
- }
48
- get chunkCount() {
49
- return this._chunkCount;
50
- }
51
- releaseAudioData() {
52
- return new Observable((subscriber) => {
53
- // nothing to remove
54
- subscriber.next();
55
- subscriber.complete();
56
- });
57
- }
58
- toString() {
59
- return "Indexed db audio buffer. Channels: " + this.channelCount + ", sample rate: " + this.sampleRate + ", chunk frame length: " + this._chunkFrameLen + ", number of chunks: " + this.chunkCount + ", frame length: " + this.frameLen + ", sealed: " + this.sealed();
60
- }
61
- static fromChunkAudioBuffer(recordingsService, baseUrl, ab, frameLen, orgFetchChunkFrameLen = ab.length) {
62
- let nab = new NetAudioBuffer(recordingsService, baseUrl, ab.numberOfChannels, ab.sampleRate, ab.length, frameLen, null, orgFetchChunkFrameLen);
63
- nab.ready();
64
- return nab;
65
- }
66
- asyncAudioInputStream() {
67
- return new NetAudioInputStream(this);
68
- }
69
- audioInputStream() {
70
- return null;
71
- }
72
- get duration() {
73
- return this._frameLen / this._sampleRate;
74
- }
75
- get numberOfChannels() {
76
- return this._channelCount;
77
- }
78
- sampleCounts() {
79
- return this._channelCount * this._frameLen;
80
- }
81
- randomAccessAudioStream() {
82
- return new NetRandomAccessAudioStream(this);
83
- }
84
- }
85
- // export class NetAudioChunk{
86
- //
87
- // get orgSampleRate(): number {
88
- // return this._orgSampleRate;
89
- // }
90
- //
91
- // get orgFrameLen(): number {
92
- // return this._orgFrameLen;
93
- // }
94
- // constructor(private _decodedBuffers:Float32Array[],private _orgSampleRate:number,private _orgFrameLen:number) {
95
- // }
96
- // }
97
- export class NetRandomAccessAudioStream {
98
- constructor(_netAb) {
99
- this._netAb = _netAb;
100
- this._currCi = 0;
101
- this._ccCache = null;
102
- }
103
- chunk(baseUrl, ci, cb, errCb) {
104
- let startFrame = ci * this._netAb.orgFetchChunkFrameLen;
105
- this._netAb.recFileService.chunkAudioRequest(baseUrl, startFrame, this._netAb.orgFetchChunkFrameLen).subscribe({
106
- next: (chDl) => {
107
- if (chDl) {
108
- const ab = chDl.decodedAudioBuffer;
109
- const ccChs = ab.numberOfChannels;
110
- let arrBuf = new Array();
111
- for (let ch = 0; ch < ccChs; ch++) {
112
- arrBuf.push(ab.getChannelData(ch));
113
- }
114
- cb(arrBuf, chDl.orgFrameLength);
115
- }
116
- else {
117
- cb(null, null);
118
- }
119
- },
120
- complete: () => { },
121
- error: (errEv) => {
122
- //NetRandomAccessAudioStream._runningRequests--;
123
- if (errEv instanceof HttpErrorResponse) {
124
- if (errEv.status === 404) {
125
- cb(null, null);
126
- }
127
- else {
128
- console.error("Net audio buffer chunk audio request Http error event: " + errEv.status + ", " + errEv.name + ", " + errEv.message);
129
- errCb(new Error(errEv.toString()));
130
- }
131
- }
132
- else {
133
- console.error("Net audio buffer chunk audio request error event: " + errEv.message);
134
- errCb(new Error(errEv.toString()));
135
- }
136
- }
137
- });
138
- }
139
- _fillBufs(ccBufs, orgFrameLen, trgState, srcState) {
140
- let ccBufsChs = ccBufs.length;
141
- if (ccBufsChs > 0) {
142
- let ccBuf0 = ccBufs[0];
143
- let ccBufsLen = ccBuf0.length;
144
- //console.debug('IndexedDbAudioBuffer::fillBufs framePos: '+framePos+', srcFramePos: '+srcFramePos+', ccBufsLen: '+ccBufsLen);
145
- if (trgState.framePos >= srcState.srcFramePos + ccBufsLen) {
146
- // target frame position is ahead, seek to next source buffer
147
- //console.debug('IndexedDbAudioBuffer::fillBufs seek to next inddb buffer');
148
- this._ccCache = null;
149
- srcState.ci++;
150
- srcState.ccPos = 0;
151
- if (orgFrameLen === null) {
152
- srcState.orgSrcFramePos += ccBufsLen;
153
- }
154
- else {
155
- srcState.orgSrcFramePos += orgFrameLen;
156
- }
157
- srcState.srcFramePos += ccBufsLen;
158
- }
159
- else {
160
- // Assuming target frame pos is inside current source buffer
161
- srcState.ccPos = trgState.framePos - srcState.srcFramePos;
162
- let ccAvail = ccBufsLen - srcState.ccPos;
163
- let toCopy = ccBufsLen;
164
- if (toCopy > ccAvail) {
165
- toCopy = ccAvail;
166
- }
167
- if (toCopy > trgState.frameLen) {
168
- toCopy = trgState.frameLen;
169
- }
170
- for (let ch = 0; ch < ccBufsChs; ch++) {
171
- for (let si = 0; si < toCopy; si++) {
172
- trgState.trgBufs[ch][trgState.filled + si] = ccBufs[ch][srcState.ccPos + si];
173
- }
174
- }
175
- trgState.filled += toCopy;
176
- trgState.frameLen -= toCopy;
177
- trgState.framePos += toCopy;
178
- srcState.ccPos += toCopy;
179
- if (srcState.ccPos >= ccBufsLen) {
180
- // Invalidate cache
181
- this._ccCache = null;
182
- srcState.ci++;
183
- this._currCi = srcState.ci;
184
- srcState.ccPos = 0;
185
- if (orgFrameLen === null) {
186
- srcState.orgSrcFramePos += ccBufsLen;
187
- }
188
- else {
189
- srcState.orgSrcFramePos += orgFrameLen;
190
- }
191
- srcState.srcFramePos += ccBufsLen;
192
- }
193
- }
194
- }
195
- }
196
- fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr) {
197
- //console.debug('IndexedDbAudioBuffer::fillBufs: framePos:'+framePos+', frameLen: '+frameLen+', filled: '+filled+', srcFramePos: '+srcFramePos+',ci: '+ci+', ccPos: '+ccPos);
198
- if (this._ccCache) {
199
- this._fillBufs(this._ccCache, orgFrameLen, trgState, srcState);
200
- //console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
201
- if (trgState.frameLen === 0) {
202
- //console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
203
- cbEnd(trgState.filled);
204
- }
205
- else {
206
- this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
207
- }
208
- }
209
- else {
210
- this.chunk(baseUrl, srcState.ci, (ccBufs, orgFrameLength) => {
211
- if (ccBufs) {
212
- this._currCi = srcState.ci;
213
- this._ccCache = ccBufs;
214
- this._fillBufs(ccBufs, orgFrameLength, trgState, srcState);
215
- //console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
216
- if (trgState.frameLen === 0) {
217
- //console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
218
- cbEnd(trgState.filled);
219
- }
220
- else {
221
- this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
222
- }
223
- }
224
- else {
225
- //console.debug('IndexedDbAudioBuffer::fillBufs (chunk not found) call: cbend '+filled);
226
- cbEnd(trgState.filled);
227
- }
228
- }, (err) => {
229
- cbErr(err);
230
- });
231
- }
232
- }
233
- framesObs(framePos, frameLen, bufs) {
234
- return new Observable((subscriber) => {
235
- // Positioning
236
- let newCi = Math.floor(framePos / this._netAb.chunkFrameLen);
237
- if (newCi !== this._currCi) {
238
- this._currCi = newCi;
239
- this._ccCache = null;
240
- }
241
- let srcFramePos = newCi * this._netAb.chunkFrameLen;
242
- let trgState = { framePos: framePos, frameLen: frameLen, trgBufs: bufs, filled: 0 };
243
- let srcState = { orgSrcFramePos: 0, srcFramePos: srcFramePos, ci: newCi, ccPos: 0, ccFilled: 0 };
244
- this.fillBufs(this._netAb.baseUrl, this._netAb.orgFetchChunkFrameLen, trgState, srcState, (val) => { }, (filled) => {
245
- subscriber.next(filled);
246
- subscriber.complete();
247
- }, err => {
248
- subscriber.error(err);
249
- });
250
- });
251
- }
252
- close() {
253
- this._currCi = 0;
254
- this._ccCache = null;
255
- }
256
- }
257
- export class NetAudioInputStream {
258
- constructor(netAb) {
259
- this.netAb = netAb;
260
- this.framePos = 0;
261
- this.netAbStr = new NetRandomAccessAudioStream(netAb);
262
- }
263
- close() {
264
- this.netAbStr.close();
265
- }
266
- readObs(buffers) {
267
- return new Observable(subscr => {
268
- if (buffers && buffers.length > 0) {
269
- let fl = buffers[0].length;
270
- this.netAbStr.framesObs(this.framePos, fl, buffers).subscribe({
271
- next: (read) => {
272
- this.framePos += read;
273
- subscr.next(read);
274
- },
275
- complete: () => {
276
- subscr.complete();
277
- },
278
- error: (err) => {
279
- subscr.error(err);
280
- }
281
- });
282
- }
283
- else {
284
- subscr.next(0);
285
- subscr.complete();
286
- }
287
- });
288
- }
289
- skipFrames(n) {
290
- this.framePos += n;
291
- }
292
- }
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0X2F1ZGlvX2J1ZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9uZXRfYXVkaW9fYnVmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFjLGdCQUFnQixFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXpELE1BQU0sT0FBTyxjQUFlLFNBQVEsZ0JBQWdCO0lBRWxELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFLRCxZQUNvQixlQUFxQyxFQUNyQyxRQUFlLEVBQ2YsYUFBcUIsRUFDckIsV0FBbUIsRUFDbkIsY0FBcUIsRUFDckIsU0FBZ0IsRUFDaEIsUUFBa0IsSUFBSSxFQUN0Qix5QkFBdUIsY0FBYztRQUN2RCxLQUFLLEVBQUUsQ0FBQztRQVJVLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUNyQyxhQUFRLEdBQVIsUUFBUSxDQUFPO1FBQ2Ysa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQU87UUFDckIsY0FBUyxHQUFU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QkFBSSxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUztRQUNsQixJQUFJLENBQUMsUUFBUSxJQUFFLENBQUMsQ0FBQztJQUNuQixDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7QXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSwgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW19IGZyb20gXCIuLi9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtBdWRpb1NvdXJjZSwgQmFzaWNBdWRpb1NvdXJjZSwgUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW19IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7QmFzaWNSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBOZXRBdWRpb0J1ZmZlciBleHRlbmRzIEJhc2ljQXVkaW9Tb3VyY2UgaW1wbGVtZW50cyBBdWRpb1NvdXJjZXtcclxuXHJcbiAgZ2V0IG9yZ0ZldGNoQ2h1bmtGcmFtZUxlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ0ZldGNoQ2h1bmtGcmFtZUxlbjtcclxuICB9XHJcbiAgZ2V0IHJlY0ZpbGVTZXJ2aWNlKCk6IEJhc2ljUmVjb3JkaW5nU2VydmljZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjRmlsZVNlcnZpY2U7XHJcbiAgfVxyXG4gIGdldCBiYXNlVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmFzZVVybDtcclxuICB9XHJcbiAgZ2V0IGNodW5rRnJhbWVMZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua0ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHV1aWQoKTogc3RyaW5nfG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3V1aWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaHVua0NvdW50PTA7XHJcbiAgcHJpdmF0ZSBfc2VhbGVkPWZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAgICAgICBwcml2YXRlIF9yZWNGaWxlU2VydmljZTpCYXNpY1JlY29yZGluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfYmFzZVVybDpzdHJpbmcsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY2hhbm5lbENvdW50OiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfc2FtcGxlUmF0ZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NodW5rRnJhbWVMZW46bnVtYmVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2ZyYW1lTGVuOm51bWJlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIF91dWlkOnN0cmluZ3xudWxsPW51bGwsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfb3JnRmV0Y2hDaHVua0ZyYW1lTGVuPV9jaHVua0ZyYW1lTGVuKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldCBjaGFubmVsQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICBzZWFsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhbGVkO1xyXG4gIH1cclxuXHJcbiAgc2VhbCgpOnZvaWR7XHJcbiAgICB0aGlzLl9zZWFsZWQ9dHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBmcmFtZUxlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNodW5rQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua0NvdW50O1xyXG4gIH1cclxuXHJcbiAgcmVsZWFzZUF1ZGlvRGF0YSgpOk9ic2VydmFibGU8dm9pZD57XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8dm9pZD4oKHN1YnNjcmliZXIpPT57XHJcbiAgICAgICAgLy8gbm90aGluZyB0byByZW1vdmVcclxuICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcclxuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgcmV0dXJuIFwiSW5kZXhlZCBkYiBhdWRpbyBidWZmZXIuIENoYW5uZWxzOiBcIit0aGlzLmNoYW5uZWxDb3VudCtcIiwgc2FtcGxlIHJhdGU6IFwiK3RoaXMuc2FtcGxlUmF0ZStcIiwgY2h1bmsgZnJhbWUgbGVuZ3RoOiBcIit0aGlzLl9jaHVua0ZyYW1lTGVuK1wiLCBudW1iZXIgb2YgY2h1bmtzOiBcIit0aGlzLmNodW5rQ291bnQrXCIsIGZyYW1lIGxlbmd0aDogXCIrdGhpcy5mcmFtZUxlbitcIiwgc2VhbGVkOiBcIit0aGlzLnNlYWxlZCgpO1xyXG4gIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbUNodW5rQXVkaW9CdWZmZXIocmVjb3JkaW5nc1NlcnZpY2U6QmFzaWNSZWNvcmRpbmdTZXJ2aWNlLGJhc2VVcmw6c3RyaW5nLGFiOiBBdWRpb0J1ZmZlcixmcmFtZUxlbjpudW1iZXIsb3JnRmV0Y2hDaHVua0ZyYW1lTGVuOm51bWJlcj1hYi5sZW5ndGgpOk5ldEF1ZGlvQnVmZmVyIHtcclxuICAgICAgbGV0IG5hYj1uZXcgTmV0QXVkaW9CdWZmZXIocmVjb3JkaW5nc1NlcnZpY2UsYmFzZVVybCxhYi5udW1iZXJPZkNoYW5uZWxzLGFiLnNhbXBsZVJhdGUsYWIubGVuZ3RoLGZyYW1lTGVuLG51bGwsb3JnRmV0Y2hDaHVua0ZyYW1lTGVuKTtcclxuICAgICAgbmFiLnJlYWR5KCk7XHJcbiAgICAgIHJldHVybiBuYWI7XHJcbiAgfVxyXG5cclxuICBhc3luY0F1ZGlvSW5wdXRTdHJlYW0oKTogQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG5ldyBOZXRBdWRpb0lucHV0U3RyZWFtKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgYXVkaW9JbnB1dFN0cmVhbSgpOiBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9mcmFtZUxlbi90aGlzLl9zYW1wbGVSYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG51bWJlck9mQ2hhbm5lbHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICBzYW1wbGVDb3VudHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQqdGhpcy5fZnJhbWVMZW47XHJcbiAgfVxyXG5cclxuICByYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSgpOiBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSB7XHJcbiAgICByZXR1cm4gbmV3IE5ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKHRoaXMpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gZXhwb3J0IGNsYXNzIE5ldEF1ZGlvQ2h1bmt7XHJcbi8vXHJcbi8vICAgZ2V0IG9yZ1NhbXBsZVJhdGUoKTogbnVtYmVyIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9vcmdTYW1wbGVSYXRlO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBnZXQgb3JnRnJhbWVMZW4oKTogbnVtYmVyIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9vcmdGcmFtZUxlbjtcclxuLy8gICB9XHJcbi8vICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGVjb2RlZEJ1ZmZlcnM6RmxvYXQzMkFycmF5W10scHJpdmF0ZSBfb3JnU2FtcGxlUmF0ZTpudW1iZXIscHJpdmF0ZSBfb3JnRnJhbWVMZW46bnVtYmVyKSB7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5leHBvcnQgY2xhc3MgTmV0UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0gaW1wbGVtZW50cyBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbXtcclxuXHJcbiAgcHJpdmF0ZSBfY3VyckNpPTA7XHJcbiAgcHJpdmF0ZSBfY2NDYWNoZTpGbG9hdDMyQXJyYXlbXXxudWxsPW51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ldEFiOk5ldEF1ZGlvQnVmZmVyKSB7fVxyXG5cclxuICBwcml2YXRlIGNodW5rKGJhc2VVcmw6c3RyaW5nLGNpOm51bWJlcixjYjooYnVmczpBcnJheTxGbG9hdDMyQXJyYXk+fG51bGwsb3JnRnJhbWVMZW5ndGg6bnVtYmVyfG51bGwpPT52b2lkLGVyckNiOihlcnI6RXJyb3IpPT52b2lkKXtcclxuXHJcbiAgICBsZXQgc3RhcnRGcmFtZT1jaSp0aGlzLl9uZXRBYi5vcmdGZXRjaENodW5rRnJhbWVMZW47XHJcblxyXG4gICAgdGhpcy5fbmV0QWIucmVjRmlsZVNlcnZpY2UuY2h1bmtBdWRpb1JlcXVlc3QoYmFzZVVybCxzdGFydEZyYW1lLHRoaXMuX25ldEFiLm9yZ0ZldGNoQ2h1bmtGcmFtZUxlbikuc3Vic2NyaWJlKFxyXG4gICAgICB7XHJcblxyXG4gICAgICAgIG5leHQ6IChjaERsKT0+e1xyXG4gICAgICAgICAgaWYoY2hEbCl7XHJcbiAgICAgICAgICAgIGNvbnN0IGFiPWNoRGwuZGVjb2RlZEF1ZGlvQnVmZmVyO1xyXG4gICAgICAgICAgICBjb25zdCBjY0Nocz1hYi5udW1iZXJPZkNoYW5uZWxzO1xyXG4gICAgICAgICAgICBsZXQgYXJyQnVmPW5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KCk7XHJcbiAgICAgICAgICAgIGZvcihsZXQgY2g9MDtjaDxjY0NocztjaCsrKXtcclxuICAgICAgICAgICAgICBhcnJCdWYucHVzaChhYi5nZXRDaGFubmVsRGF0YShjaCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNiKGFyckJ1ZixjaERsLm9yZ0ZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjYihudWxsLG51bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpPT57fSxcclxuICAgICAgICBlcnJvcjooZXJyRXYpPT57XHJcbiAgICAgICAgICAvL05ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtLl9ydW5uaW5nUmVxdWVzdHMtLTtcclxuICAgICAgICAgIGlmKGVyckV2IGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2Upe1xyXG4gICAgICAgICAgIGlmKGVyckV2LnN0YXR1cz09PTQwNCl7XHJcbiAgICAgICAgICAgICBjYihudWxsLG51bGwpO1xyXG4gICAgICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOZXQgYXVkaW8gYnVmZmVyIGNodW5rIGF1ZGlvIHJlcXVlc3QgSHR0cCBlcnJvciBldmVudDogXCIrZXJyRXYuc3RhdHVzK1wiLCBcIitlcnJFdi5uYW1lK1wiLCBcIitlcnJFdi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgIGVyckNiKG5ldyBFcnJvcihlcnJFdi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTmV0IGF1ZGlvIGJ1ZmZlciBjaHVuayBhdWRpbyByZXF1ZXN0IGVycm9yIGV2ZW50OiBcIitlcnJFdi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgZXJyQ2IobmV3IEVycm9yKGVyckV2LnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maWxsQnVmcyhjY0J1ZnM6RmxvYXQzMkFycmF5W10sb3JnRnJhbWVMZW46bnVtYmVyfG51bGwsdHJnU3RhdGU6e2ZyYW1lUG9zOm51bWJlcixmcmFtZUxlbjpudW1iZXIsdHJnQnVmczpGbG9hdDMyQXJyYXlbXSxmaWxsZWQ6bnVtYmVyfSxzcmNTdGF0ZTp7b3JnU3JjRnJhbWVQb3M6bnVtYmVyLHNyY0ZyYW1lUG9zOm51bWJlcixjaTpudW1iZXIsY2NQb3M6bnVtYmVyfSl7XHJcbiAgICBsZXQgY2NCdWZzQ2hzPWNjQnVmcy5sZW5ndGg7XHJcbiAgICBpZihjY0J1ZnNDaHM+MCkge1xyXG4gICAgICBsZXQgY2NCdWYwID0gY2NCdWZzWzBdO1xyXG4gICAgICBsZXQgY2NCdWZzTGVuID0gY2NCdWYwLmxlbmd0aDtcclxuXHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIGZyYW1lUG9zOiAnK2ZyYW1lUG9zKycsIHNyY0ZyYW1lUG9zOiAnK3NyY0ZyYW1lUG9zKycsIGNjQnVmc0xlbjogJytjY0J1ZnNMZW4pO1xyXG4gICAgICBpZiAodHJnU3RhdGUuZnJhbWVQb3MgPj0gc3JjU3RhdGUuc3JjRnJhbWVQb3MgKyBjY0J1ZnNMZW4pIHtcclxuICAgICAgICAvLyB0YXJnZXQgZnJhbWUgcG9zaXRpb24gaXMgYWhlYWQsIHNlZWsgdG8gbmV4dCBzb3VyY2UgYnVmZmVyXHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgc2VlayB0byBuZXh0IGluZGRiIGJ1ZmZlcicpO1xyXG4gICAgICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICAgICAgICBzcmNTdGF0ZS5jaSsrO1xyXG4gICAgICAgIHNyY1N0YXRlLmNjUG9zPTA7XHJcbiAgICAgICAgaWYob3JnRnJhbWVMZW49PT1udWxsKXtcclxuICAgICAgICAgIHNyY1N0YXRlLm9yZ1NyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBzcmNTdGF0ZS5vcmdTcmNGcmFtZVBvcys9b3JnRnJhbWVMZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNyY1N0YXRlLnNyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQXNzdW1pbmcgdGFyZ2V0IGZyYW1lIHBvcyBpcyBpbnNpZGUgY3VycmVudCBzb3VyY2UgYnVmZmVyXHJcbiAgICAgICAgc3JjU3RhdGUuY2NQb3M9dHJnU3RhdGUuZnJhbWVQb3Mtc3JjU3RhdGUuc3JjRnJhbWVQb3M7XHJcbiAgICAgICAgbGV0IGNjQXZhaWwgPSBjY0J1ZnNMZW4gLSBzcmNTdGF0ZS5jY1BvcztcclxuICAgICAgICBsZXQgdG9Db3B5ID0gY2NCdWZzTGVuO1xyXG5cclxuICAgICAgICBpZiAodG9Db3B5ID4gY2NBdmFpbCkge1xyXG4gICAgICAgICAgdG9Db3B5ID0gY2NBdmFpbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRvQ29weSA+IHRyZ1N0YXRlLmZyYW1lTGVuKSB7XHJcbiAgICAgICAgICB0b0NvcHkgPSB0cmdTdGF0ZS5mcmFtZUxlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNjQnVmc0NoczsgY2grKykge1xyXG4gICAgICAgICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHRvQ29weTsgc2krKykge1xyXG4gICAgICAgICAgICB0cmdTdGF0ZS50cmdCdWZzW2NoXVt0cmdTdGF0ZS5maWxsZWQrc2ldID0gY2NCdWZzW2NoXVtzcmNTdGF0ZS5jY1BvcytzaV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyZ1N0YXRlLmZpbGxlZCArPSB0b0NvcHk7XHJcbiAgICAgICAgdHJnU3RhdGUuZnJhbWVMZW4gLT0gdG9Db3B5O1xyXG4gICAgICAgIHRyZ1N0YXRlLmZyYW1lUG9zICs9IHRvQ29weTtcclxuICAgICAgICBzcmNTdGF0ZS5jY1BvcyArPSB0b0NvcHk7XHJcbiAgICAgICAgaWYgKHNyY1N0YXRlLmNjUG9zID49IGNjQnVmc0xlbikge1xyXG4gICAgICAgICAgLy8gSW52YWxpZGF0ZSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5fY2NDYWNoZT1udWxsO1xyXG4gICAgICAgICAgc3JjU3RhdGUuY2krKztcclxuICAgICAgICAgIHRoaXMuX2N1cnJDaT1zcmNTdGF0ZS5jaTtcclxuICAgICAgICAgIHNyY1N0YXRlLmNjUG9zID0gMDtcclxuICAgICAgICAgIGlmKG9yZ0ZyYW1lTGVuPT09bnVsbCl7XHJcbiAgICAgICAgICAgIHNyY1N0YXRlLm9yZ1NyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgc3JjU3RhdGUub3JnU3JjRnJhbWVQb3MrPW9yZ0ZyYW1lTGVuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc3JjU3RhdGUuc3JjRnJhbWVQb3MrPWNjQnVmc0xlbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxCdWZzKGJhc2VVcmw6c3RyaW5nLG9yZ0ZyYW1lTGVuOm51bWJlcnxudWxsLHRyZ1N0YXRlOntmcmFtZVBvczpudW1iZXIsZnJhbWVMZW46bnVtYmVyLHRyZ0J1ZnM6RmxvYXQzMkFycmF5W10sZmlsbGVkOm51bWJlcn0sc3JjU3RhdGU6e29yZ1NyY0ZyYW1lUG9zOm51bWJlcixzcmNGcmFtZVBvczpudW1iZXIsY2k6bnVtYmVyLGNjUG9zOm51bWJlcixjY0ZpbGxlZDpudW1iZXJ9LGNiOihmaWxsZWQ6bnVtYmVyKT0+dm9pZCxjYkVuZDooZmlsbGVkOm51bWJlcik9PnZvaWQsY2JFcnI6KGVycjpFcnJvcik9PnZvaWQpe1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnM6IGZyYW1lUG9zOicrZnJhbWVQb3MrJywgZnJhbWVMZW46ICcrZnJhbWVMZW4rJywgZmlsbGVkOiAnK2ZpbGxlZCsnLCBzcmNGcmFtZVBvczogJytzcmNGcmFtZVBvcysnLGNpOiAnK2NpKycsIGNjUG9zOiAnK2NjUG9zKTtcclxuICAgIGlmKHRoaXMuX2NjQ2FjaGUpe1xyXG4gICAgICB0aGlzLl9maWxsQnVmcyh0aGlzLl9jY0NhY2hlLG9yZ0ZyYW1lTGVuLHRyZ1N0YXRlLHNyY1N0YXRlKTtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgZnJhbWVMZW46ICcrZnJhbWVMZW4pO1xyXG4gICAgICBpZih0cmdTdGF0ZS5mcmFtZUxlbj09PTApe1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIChmcmFtZWxlbj09MCkgY2FsbDogY2JlbmQgJytmaWxsZWQpO1xyXG4gICAgICAgIGNiRW5kKHRyZ1N0YXRlLmZpbGxlZCk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICB0aGlzLmZpbGxCdWZzKGJhc2VVcmwsIG9yZ0ZyYW1lTGVuLHRyZ1N0YXRlLCBzcmNTdGF0ZSwgY2IsIGNiRW5kLCBjYkVycik7XHJcbiAgICAgIH1cclxuICAgIH1lbHNlIHtcclxuICAgICAgdGhpcy5jaHVuayhiYXNlVXJsLCBzcmNTdGF0ZS5jaSwgKGNjQnVmcyxvcmdGcmFtZUxlbmd0aCkgPT4ge1xyXG4gICAgICAgIGlmIChjY0J1ZnMpIHtcclxuICAgICAgICAgIHRoaXMuX2N1cnJDaSA9IHNyY1N0YXRlLmNpO1xyXG4gICAgICAgICAgdGhpcy5fY2NDYWNoZSA9IGNjQnVmcztcclxuXHJcbiAgICAgICAgICB0aGlzLl9maWxsQnVmcyhjY0J1ZnMsIG9yZ0ZyYW1lTGVuZ3RoLHRyZ1N0YXRlLCBzcmNTdGF0ZSk7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ0luZGV4ZWREYkF1ZGlvQnVmZmVyOjpmaWxsQnVmcyBmcmFtZUxlbjogJytmcmFtZUxlbik7XHJcbiAgICAgICAgICBpZiAodHJnU3RhdGUuZnJhbWVMZW4gPT09IDApIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgKGZyYW1lbGVuPT0wKSBjYWxsOiBjYmVuZCAnK2ZpbGxlZCk7XHJcbiAgICAgICAgICAgIGNiRW5kKHRyZ1N0YXRlLmZpbGxlZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGxCdWZzKGJhc2VVcmwsb3JnRnJhbWVMZW4sdHJnU3RhdGUsIHNyY1N0YXRlLCBjYiwgY2JFbmQsIGNiRXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgKGNodW5rIG5vdCBmb3VuZCkgY2FsbDogY2JlbmQgJytmaWxsZWQpO1xyXG4gICAgICAgICAgY2JFbmQodHJnU3RhdGUuZmlsbGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgICBjYkVycihlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBmcmFtZXNPYnMoZnJhbWVQb3M6bnVtYmVyLGZyYW1lTGVuOm51bWJlcixidWZzOkZsb2F0MzJBcnJheVtdKTpPYnNlcnZhYmxlPG51bWJlcj57XHJcblxyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPG51bWJlcj4oKHN1YnNjcmliZXIpPT57XHJcbiAgICAgIC8vIFBvc2l0aW9uaW5nXHJcbiAgICAgIGxldCBuZXdDaT1NYXRoLmZsb29yKGZyYW1lUG9zL3RoaXMuX25ldEFiLmNodW5rRnJhbWVMZW4pO1xyXG4gICAgICBpZihuZXdDaSE9PXRoaXMuX2N1cnJDaSl7XHJcbiAgICAgICAgdGhpcy5fY3VyckNpPW5ld0NpO1xyXG4gICAgICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc3JjRnJhbWVQb3M9bmV3Q2kqdGhpcy5fbmV0QWIuY2h1bmtGcmFtZUxlbjtcclxuICAgICAgbGV0IHRyZ1N0YXRlPXtmcmFtZVBvczpmcmFtZVBvcyxmcmFtZUxlbjpmcmFtZUxlbix0cmdCdWZzOmJ1ZnMsZmlsbGVkOjB9O1xyXG4gICAgICBsZXQgc3JjU3RhdGU9e29yZ1NyY0ZyYW1lUG9zOjAsc3JjRnJhbWVQb3M6c3JjRnJhbWVQb3MsY2k6bmV3Q2ksY2NQb3M6MCxjY0ZpbGxlZDowfTtcclxuICAgICAgdGhpcy5maWxsQnVmcyh0aGlzLl9uZXRBYi5iYXNlVXJsLHRoaXMuX25ldEFiLm9yZ0ZldGNoQ2h1bmtGcmFtZUxlbix0cmdTdGF0ZSxzcmNTdGF0ZSwodmFsKT0+e30sKGZpbGxlZDpudW1iZXIpPT57XHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGZpbGxlZCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LGVyciA9PiB7XHJcbiAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJDaT0wO1xyXG4gICAgdGhpcy5fY2NDYWNoZT1udWxsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5ldEF1ZGlvSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBBc3luY0Zsb2F0MzJBcnJheUlucHV0U3RyZWFte1xyXG5cclxuICBwcml2YXRlIGZyYW1lUG9zOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgbmV0QWJTdHI6TmV0UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW07XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZXRBYjpOZXRBdWRpb0J1ZmZlcikge1xyXG4gICAgICB0aGlzLm5ldEFiU3RyPW5ldyBOZXRSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbShuZXRBYik7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubmV0QWJTdHIuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHJlYWRPYnMoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8bnVtYmVyPihzdWJzY3I9PiB7XHJcbiAgICAgIGlmIChidWZmZXJzICYmIGJ1ZmZlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBmbCA9IGJ1ZmZlcnNbMF0ubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMubmV0QWJTdHIuZnJhbWVzT2JzKHRoaXMuZnJhbWVQb3MsIGZsLCBidWZmZXJzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlYWQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZVBvcyArPSByZWFkO1xyXG4gICAgICAgICAgICBzdWJzY3IubmV4dChyZWFkKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBzdWJzY3IuY29tcGxldGUoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICBzdWJzY3IuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBzdWJzY3IubmV4dCgwKTtcclxuICAgICAgICBzdWJzY3IuY29tcGxldGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBza2lwRnJhbWVzKG46IG51bWJlcik6dm9pZCB7XHJcbiAgICB0aGlzLmZyYW1lUG9zKz1uO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
@@ -1,81 +0,0 @@
1
- export class AudioClip {
2
- constructor(_audioDataHolder) {
3
- this._audioDataHolder = _audioDataHolder;
4
- this._selection = null;
5
- this._levelInfos = null;
6
- this.selectionObservers = new Array();
7
- }
8
- get audioDataHolder() {
9
- return this._audioDataHolder;
10
- }
11
- get selection() {
12
- return this._selection;
13
- }
14
- set selection(value) {
15
- this._selection = value;
16
- // let obsCnt=this.selectionObservers.length
17
- // this.selectionObservers.forEach((obs)=> {
18
- // console.log("Calling observer")
19
- // obs(this)
20
- // });
21
- for (let selObs of this.selectionObservers) {
22
- selObs(this);
23
- }
24
- }
25
- get levelInfos() {
26
- return this._levelInfos;
27
- }
28
- set levelInfos(value) {
29
- this._levelInfos = value;
30
- }
31
- addSelectionObserver(selectionObserver, init = false) {
32
- let obsAlreadyInList = this.selectionObservers.find((obs) => (obs === selectionObserver));
33
- if (!obsAlreadyInList) {
34
- this.selectionObservers.push(selectionObserver);
35
- }
36
- if (init) {
37
- selectionObserver(this);
38
- }
39
- }
40
- removeSelectionObserver(selectionObserver) {
41
- this.selectionObservers = this.selectionObservers.filter((obs) => obs !== selectionObserver);
42
- }
43
- }
44
- // export interface Reader {
45
- // read(data: Blob): AudioClip;
46
- // }
47
- // export interface Writer {
48
- // write(audioData: AudioClip): Blob;
49
- // }
50
- export class Selection {
51
- constructor(sampleRate, startFrame, endFrame) {
52
- this._sampleRate = sampleRate;
53
- this._startFrame = startFrame;
54
- this._endFrame = endFrame;
55
- }
56
- get sampleRate() {
57
- return this._sampleRate;
58
- }
59
- get endFrame() {
60
- return this._endFrame;
61
- }
62
- get startFrame() {
63
- return this._startFrame;
64
- }
65
- get leftFrame() {
66
- return (this._startFrame <= this._endFrame) ? this._startFrame : this._endFrame;
67
- }
68
- get rightFrame() {
69
- return (this._startFrame <= this._endFrame) ? this._endFrame : this._startFrame;
70
- }
71
- equals(otherSelection) {
72
- if (otherSelection) {
73
- return (this._sampleRate == otherSelection._sampleRate && this._startFrame === otherSelection._startFrame && this._endFrame === otherSelection._endFrame);
74
- }
75
- return false;
76
- }
77
- toString() {
78
- return "Selection: from: " + this.leftFrame + " to: " + this.rightFrame + " frame. Refers to sample rate :" + this._sampleRate;
79
- }
80
- }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3BlcnNpc3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLE9BQU8sU0FBUztJQU1wQixZQUFvQixnQkFBZ0M7UUFBaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQUo1QyxlQUFVLEdBQWdCLElBQUksQ0FBQztRQUN6QixnQkFBVyxHQUFtQixJQUFJLENBQUM7UUFLL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksS0FBSyxFQUErQixDQUFBO0lBQ2xFLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBcUI7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsNENBQTRDO1FBQzVDLDRDQUE0QztRQUM1QyxvQ0FBb0M7UUFDcEMsY0FBYztRQUNkLE1BQU07UUFDTixLQUFJLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxLQUF3QjtRQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsaUJBQTZDLEVBQUMsSUFBSSxHQUFDLEtBQUs7UUFDM0UsSUFBSSxnQkFBZ0IsR0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQSxDQUFDLEdBQUcsS0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7UUFDbkYsSUFBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ2pELENBQUM7UUFDRCxJQUFHLElBQUksRUFBQyxDQUFDO1lBQ1AsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxpQkFBNkM7UUFDbkUsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFBLEdBQUcsS0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7Q0FDRjtBQUVELDRCQUE0QjtBQUM1QixpQ0FBaUM7QUFDakMsSUFBSTtBQUNKLDRCQUE0QjtBQUM1Qix1Q0FBdUM7QUFDdkMsSUFBSTtBQUVKLE1BQU0sT0FBTyxTQUFTO0lBS3BCLFlBQVksVUFBaUIsRUFBQyxVQUFpQixFQUFDLFFBQWU7UUFDN0QsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUE7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUNqRixDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFBO0lBQ2pGLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBdUM7UUFDNUMsSUFBRyxjQUFjLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxjQUFjLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssY0FBYyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1SixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sbUJBQW1CLEdBQUMsSUFBSSxDQUFDLFNBQVMsR0FBQyxPQUFPLEdBQUMsSUFBSSxDQUFDLFVBQVUsR0FBQyxpQ0FBaUMsR0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3ZILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGV2ZWxJbmZvc30gZnJvbSBcIi4vZHNwL2xldmVsX21lYXN1cmVcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXVkaW9DbGlwIHtcclxuXHJcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uOlNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSBfbGV2ZWxJbmZvczpMZXZlbEluZm9zIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgc2VsZWN0aW9uT2JzZXJ2ZXJzOkFycmF5PChhdWRpb0NsaXA6QXVkaW9DbGlwKT0+dm9pZD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2F1ZGlvRGF0YUhvbGRlcjpBdWRpb0RhdGFIb2xkZXIpIHtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbk9ic2VydmVycz1uZXcgQXJyYXk8KGF1ZGlvQ2xpcDpBdWRpb0NsaXApPT52b2lkPigpXHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaW9EYXRhSG9sZGVyKCk6IEF1ZGlvRGF0YUhvbGRlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXVkaW9EYXRhSG9sZGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGlvbigpOiBTZWxlY3Rpb258bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBzZXQgc2VsZWN0aW9uKHZhbHVlOiBTZWxlY3Rpb258bnVsbCkge1xyXG4gICAgdGhpcy5fc2VsZWN0aW9uID0gdmFsdWU7XHJcbiAgICAvLyBsZXQgb2JzQ250PXRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzLmxlbmd0aFxyXG4gICAgLy8gdGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMuZm9yRWFjaCgob2JzKT0+IHtcclxuICAgIC8vICAgY29uc29sZS5sb2coXCJDYWxsaW5nIG9ic2VydmVyXCIpXHJcbiAgICAvLyAgIG9icyh0aGlzKVxyXG4gICAgLy8gfSk7XHJcbiAgICBmb3IobGV0IHNlbE9icyBvZiB0aGlzLnNlbGVjdGlvbk9ic2VydmVycyl7XHJcbiAgICAgIHNlbE9icyh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxldmVsSW5mb3MoKTogTGV2ZWxJbmZvcyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xldmVsSW5mb3M7XHJcbiAgfVxyXG5cclxuICBzZXQgbGV2ZWxJbmZvcyh2YWx1ZTogTGV2ZWxJbmZvcyB8IG51bGwpIHtcclxuICAgIHRoaXMuX2xldmVsSW5mb3MgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGFkZFNlbGVjdGlvbk9ic2VydmVyKHNlbGVjdGlvbk9ic2VydmVyOihhdWRpb0NsaXA6QXVkaW9DbGlwKT0+dm9pZCxpbml0PWZhbHNlKXtcclxuICAgIGxldCBvYnNBbHJlYWR5SW5MaXN0PXRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzLmZpbmQoKG9icyk9PihvYnM9PT1zZWxlY3Rpb25PYnNlcnZlcikpXHJcbiAgICBpZighb2JzQWxyZWFkeUluTGlzdCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbk9ic2VydmVycy5wdXNoKHNlbGVjdGlvbk9ic2VydmVyKVxyXG4gICAgfVxyXG4gICAgaWYoaW5pdCl7XHJcbiAgICAgIHNlbGVjdGlvbk9ic2VydmVyKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVTZWxlY3Rpb25PYnNlcnZlcihzZWxlY3Rpb25PYnNlcnZlcjooYXVkaW9DbGlwOkF1ZGlvQ2xpcCk9PnZvaWQpe1xyXG4gICAgdGhpcy5zZWxlY3Rpb25PYnNlcnZlcnM9dGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMuZmlsdGVyKChvYnMpPT5vYnMhPT1zZWxlY3Rpb25PYnNlcnZlcik7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBleHBvcnQgaW50ZXJmYWNlIFJlYWRlciB7XHJcbi8vICAgcmVhZChkYXRhOiBCbG9iKTogQXVkaW9DbGlwO1xyXG4vLyB9XHJcbi8vIGV4cG9ydCBpbnRlcmZhY2UgV3JpdGVyIHtcclxuLy8gICB3cml0ZShhdWRpb0RhdGE6IEF1ZGlvQ2xpcCk6IEJsb2I7XHJcbi8vIH1cclxuXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb257XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc2FtcGxlUmF0ZTpudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhcnRGcmFtZTpudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZW5kRnJhbWU6bnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlOm51bWJlcixzdGFydEZyYW1lOm51bWJlcixlbmRGcmFtZTpudW1iZXIpe1xyXG4gICAgdGhpcy5fc2FtcGxlUmF0ZT1zYW1wbGVSYXRlO1xyXG4gICAgdGhpcy5fc3RhcnRGcmFtZT1zdGFydEZyYW1lXHJcbiAgICB0aGlzLl9lbmRGcmFtZT1lbmRGcmFtZTtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcbiAgZ2V0IGVuZEZyYW1lKCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZEZyYW1lO1xyXG4gIH1cclxuICBnZXQgc3RhcnRGcmFtZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0RnJhbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbGVmdEZyYW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0RnJhbWUgPD0gdGhpcy5fZW5kRnJhbWUpID8gdGhpcy5fc3RhcnRGcmFtZSA6IHRoaXMuX2VuZEZyYW1lXHJcbiAgfVxyXG4gIGdldCByaWdodEZyYW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0RnJhbWUgPD0gdGhpcy5fZW5kRnJhbWUpID8gdGhpcy5fZW5kRnJhbWUgOiB0aGlzLl9zdGFydEZyYW1lXHJcbiAgfVxyXG5cclxuICBlcXVhbHMob3RoZXJTZWxlY3Rpb246U2VsZWN0aW9ufG51bGx8dW5kZWZpbmVkKTpib29sZWFue1xyXG4gICAgaWYob3RoZXJTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuICh0aGlzLl9zYW1wbGVSYXRlID09IG90aGVyU2VsZWN0aW9uLl9zYW1wbGVSYXRlICYmIHRoaXMuX3N0YXJ0RnJhbWUgPT09IG90aGVyU2VsZWN0aW9uLl9zdGFydEZyYW1lICYmIHRoaXMuX2VuZEZyYW1lID09PSBvdGhlclNlbGVjdGlvbi5fZW5kRnJhbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKXtcclxuICAgIHJldHVybiBcIlNlbGVjdGlvbjogZnJvbTogXCIrdGhpcy5sZWZ0RnJhbWUrXCIgdG86IFwiK3RoaXMucmlnaHRGcmFtZStcIiBmcmFtZS4gUmVmZXJzIHRvIHNhbXBsZSByYXRlIDpcIit0aGlzLl9zYW1wbGVSYXRlO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==