speechrecorderng 3.6.0 → 3.8.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 (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -79
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -1,216 +0,0 @@
1
- import { __decorate, __param } from "tslib";
2
- import { HttpHeaders } from "@angular/common/http";
3
- import { Inject } from "@angular/core";
4
- import { ApiType, SPEECHRECORDER_CONFIG } from "../../spr.config";
5
- import { Observable } from "rxjs";
6
- import { NetAudioBuffer } from "../../audio/net_audio_buffer";
7
- import { UUID } from "../../utils/utils";
8
- import { WavReader } from "../../audio/impl/wavreader";
9
- import { AudioContextProvider } from "../../audio/context";
10
- export class ChunkDownload {
11
- constructor(_orgPCMAudioFormat, _orgFrameLength, _decodedAudioBuffer) {
12
- this._orgPCMAudioFormat = _orgPCMAudioFormat;
13
- this._orgFrameLength = _orgFrameLength;
14
- this._decodedAudioBuffer = _decodedAudioBuffer;
15
- }
16
- get orgPCMAudioFormat() {
17
- return this._orgPCMAudioFormat;
18
- }
19
- get orgFrameLength() {
20
- return this._orgFrameLength;
21
- }
22
- get decodedAudioBuffer() {
23
- return this._decodedAudioBuffer;
24
- }
25
- }
26
- let BasicRecordingService = class BasicRecordingService {
27
- constructor(http, config) {
28
- this.http = http;
29
- this.config = config;
30
- this._maxAutoNetMemStoreSamples = BasicRecordingService.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES;
31
- this.withCredentials = false;
32
- this.apiEndPoint = '';
33
- if (config && config.apiEndPoint) {
34
- this.apiEndPoint = config.apiEndPoint;
35
- }
36
- if (this.apiEndPoint !== '') {
37
- this.apiEndPoint = this.apiEndPoint + '/';
38
- }
39
- if (config != null && config.withCredentials != null) {
40
- this.withCredentials = config.withCredentials;
41
- }
42
- }
43
- audioRequestByURL(audioBaseUrl, audioURLSearchParams) {
44
- let audioUrl = audioBaseUrl;
45
- if (this.config && this.config.apiType === ApiType.FILES) {
46
- // for development and demo
47
- audioUrl = audioUrl + '.wav';
48
- // append UUID to make request URL unique to avoid localhost server caching
49
- audioURLSearchParams.set('requestUUID', UUID.generate());
50
- //audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
51
- }
52
- audioUrl = audioUrl + '?' + audioURLSearchParams.toString();
53
- let headers = new HttpHeaders();
54
- headers = headers.set('Accept', 'audio/wav');
55
- return this.http.get(audioUrl, {
56
- headers: headers,
57
- observe: 'response',
58
- responseType: 'arraybuffer',
59
- withCredentials: this.withCredentials
60
- });
61
- }
62
- chunkAudioRequest(baseAudioUrl, startFrame = 0, frameLength) {
63
- let ausps = new URLSearchParams();
64
- ausps.set('startFrame', startFrame.toString());
65
- ausps.set('frameLength', frameLength.toString());
66
- if (this.config && this.config.apiType === ApiType.FILES) {
67
- // for development and demo
68
- // append UUID to make request URL unique to avoid localhost server caching
69
- //audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
70
- ausps.set('requestUUID', UUID.generate());
71
- }
72
- let obs = new Observable(observer => {
73
- this.audioRequestByURL(baseAudioUrl, ausps).subscribe({
74
- next: resp => {
75
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
76
- if (resp.body) {
77
- //console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
78
- //console.debug("Audio file bytes: "+resp.body.byteLength);
79
- // Check original audio format
80
- let wr = new WavReader(resp.body);
81
- const pcmFmt = wr.readFormat();
82
- const orgFl = wr.frameLength();
83
- // if(pcmFmt){
84
- // console.debug("Original WAVE format of download chunk: "+pcmFmt);
85
- // }else{
86
- // console.error("Could not read WAVE format of original download chunk!");
87
- // }
88
- // if(orgFl){
89
- // console.debug("Original frame length of download chunk: "+orgFl);
90
- // }else{
91
- // console.error("Could not read WAVE format of original download chunk!");
92
- // }
93
- if (pcmFmt && orgFl) {
94
- AudioContextProvider.decodeAudioData(resp.body).then((ab) => {
95
- //console.debug("Decoded audio chunk frames: "+ab.length);
96
- let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
97
- observer.next(chDl);
98
- observer.complete();
99
- }).catch(error => {
100
- //if(error instanceof HttpErrorResponse) {
101
- // if (error.status == 404) {
102
- // // Interpret not as an error, the file ist not recorded yet
103
- // observer.next(null);
104
- // observer.complete()
105
- // } else {
106
- // // all other states are errors
107
- console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
108
- observer.error(error);
109
- // }
110
- // }
111
- });
112
- }
113
- else {
114
- const errMsg = 'Could not parse audio header for format and/or frame length of download.';
115
- console.error(errMsg);
116
- observer.error(errMsg);
117
- }
118
- }
119
- else {
120
- const errMsg = 'Fetching audio file: response has no body';
121
- console.error(errMsg);
122
- observer.error(errMsg);
123
- }
124
- }, error: (error) => {
125
- // all other states are errors
126
- //const errMsg='Fetching audio file HTTP error: '+error;
127
- //console.error(errMsg);
128
- observer.error(error);
129
- //observer.complete();
130
- }
131
- });
132
- });
133
- return obs;
134
- }
135
- chunkAudioRequestToNetAudioBuffer(baseAudioUrl, startFrame = 0, orgSampleRate, seconds, frames) {
136
- //let audioUrl=baseAudioUrl+'?startFrame='+startFrame+'&frameLength='+frameLength;
137
- //let audioUrl=new URL(baseAudioUrl);
138
- // if(orgSampleRate!=null && frameLength%orgSampleRate>0){
139
- // const errMsg='frameLength must be equal or multiple of original samplerate.';
140
- // console.error(errMsg+' ('+frameLength+'%'+orgSampleRate+'=='+(frameLength%orgSampleRate)+')');
141
- // throw Error(errMsg)
142
- // }
143
- let frameLength = orgSampleRate * Math.round(seconds);
144
- let ausps = new URLSearchParams();
145
- ausps.set('startFrame', startFrame.toString());
146
- ausps.set('frameLength', frameLength.toString());
147
- if (this.config && this.config.apiType === ApiType.FILES) {
148
- // for development and demo
149
- // append UUID to make request URL unique to avoid localhost server caching
150
- //audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
151
- ausps.set('requestUUID', UUID.generate());
152
- }
153
- let obs = new Observable(subscriber => {
154
- this.audioRequestByURL(baseAudioUrl, ausps).subscribe({ next: (resp) => {
155
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
156
- if (resp.body) {
157
- //console.debug("chunkAudioRequestTonetAb: subscriber.closed: "+subscriber.closed);
158
- //console.debug("chunkAudioRequestTonetAb: Audio file bytes: "+resp.body.byteLength);
159
- AudioContextProvider.decodeAudioData(resp.body).then(ab => {
160
- //console.debug("chunkAudioRequestTonetAb: Decoded audio chunk frames for netAb: "+ab.length);
161
- //console.debug("chunkAudioRequestTonetAb: Create netAb ab from chunk ab...");
162
- if (frames === null) {
163
- subscriber.error(new Error('Could not get frame length from recording file object'));
164
- }
165
- else {
166
- let fl = frames;
167
- if (ab.sampleRate !== orgSampleRate) {
168
- if (orgSampleRate && frames) {
169
- fl = Math.round(ab.sampleRate * frames / orgSampleRate);
170
- //console.debug("Platform sr: "+ab.sampleRate+", file sr: "+orgSampleRate+", decoded/org frame length: "+fl+"/"+frames+", ab.length: "+ab.length);
171
- }
172
- }
173
- let nab = NetAudioBuffer.fromChunkAudioBuffer(this, baseAudioUrl, ab, fl, frameLength);
174
- //let rp=new ReadyProvider();
175
- //nab.readyProvider=rp;
176
- //rp.ready();
177
- nab.ready();
178
- if (nab.frameLen < frameLength) {
179
- //console.debug("chunkAudioRequestTonetAb: Built netAb ab from chunk ab: First chunk shorter tha frameLength ("+netAbAudioBuffer.frameLen+"<"+frameLength+"), assuming end of data, sealing netAb ab.");
180
- nab.seal();
181
- }
182
- subscriber.next(nab);
183
- subscriber.complete();
184
- }
185
- }).catch(error => {
186
- console.error('chunkAudioRequestToNetAb: error: ' + error);
187
- //if(error instanceof HttpErrorResponse) {
188
- subscriber.error(error);
189
- //}
190
- });
191
- }
192
- else {
193
- console.error('chunkAudioRequestToNetAb: Fetching audio file: response has no body');
194
- subscriber.error('chunkAudioRequestToNetAb: Fetching audio file: response has no body');
195
- }
196
- },
197
- error: (error) => {
198
- console.error('chunkAudioRequestToNetAb: error: ' + error);
199
- subscriber.error(error);
200
- //subscriber.complete();
201
- }
202
- });
203
- });
204
- return obs;
205
- }
206
- };
207
- // iPad 9th generation, iOS 15.7.1, sometimes:
208
- // Failed to load resource: WebKit hat einen internen Fehler festgestellt
209
- // Firefox on Windows crashes
210
- BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS = 10;
211
- BasicRecordingService.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES = 2880000 * 5; // Default 5 minutes one channel at 48kHz
212
- BasicRecordingService = __decorate([
213
- __param(1, Inject(SPEECHRECORDER_CONFIG))
214
- ], BasicRecordingService);
215
- export { BasicRecordingService };
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfcmVjb3JkaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFhLFdBQVcsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXJELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXpELE1BQU0sT0FBTyxhQUFhO0lBWXhCLFlBQW9CLGtCQUFpQyxFQUFTLGVBQXNCLEVBQVMsbUJBQStCO1FBQXhHLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBZTtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFPO1FBQVMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFZO0lBQUUsQ0FBQztJQVgvSCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FB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LEdBQUMsQ0FBRSxDQUFBLENBQUMseUNBQXlDO0FBTDlHLHFCQUFxQjtJQVVXLFdBQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7R0FWN0QscUJBQXFCLENBdU1qQztTQXZNWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2V9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge0luamVjdH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7TmV0QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9uZXRfYXVkaW9fYnVmZmVyXCI7XHJcbmltcG9ydCB7VVVJRH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7V2F2UmVhZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vaW1wbC93YXZyZWFkZXJcIjtcclxuaW1wb3J0IHtQQ01BdWRpb0Zvcm1hdH0gZnJvbSBcIi4uLy4uL2F1ZGlvL2Zvcm1hdFwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udGV4dFByb3ZpZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vY29udGV4dFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENodW5rRG93bmxvYWR7XHJcbiAgZ2V0IG9yZ1BDTUF1ZGlvRm9ybWF0KCk6IFBDTUF1ZGlvRm9ybWF0IHtcclxuICAgIHJldHVybiB0aGlzLl9vcmdQQ01BdWRpb0Zvcm1hdDtcclxuICB9XHJcblxyXG4gIGdldCBvcmdGcmFtZUxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ0ZyYW1lTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlY29kZWRBdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlZEF1ZGlvQnVmZmVyO1xyXG4gIH1cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9vcmdQQ01BdWRpb0Zvcm1hdDpQQ01BdWRpb0Zvcm1hdCxwcml2YXRlIF9vcmdGcmFtZUxlbmd0aDpudW1iZXIscHJpdmF0ZSBfZGVjb2RlZEF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyKXt9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBCYXNpY1JlY29yZGluZ1NlcnZpY2V7XHJcbiAgLy8gaVBhZCA5dGggZ2VuZXJhdGlvbiwgaU9TIDE1LjcuMSwgc29tZXRpbWVzOlxyXG4gIC8vIEZhaWxlZCB0byBsb2FkIHJlc291cmNlOiBXZWJLaXQgaGF0IGVpbmVuIGludGVybmVuIEZlaGxlciBmZXN0Z2VzdGVsbHRcclxuICAvLyBGaXJlZm94IG9uIFdpbmRvd3MgY3Jhc2hlc1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DSFVOS0VEX0RPV05MT0FEX1NFQ09ORFM6bnVtYmVyPTEwO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfTkVUX0FVVE9fTUVNX1NUT1JFX1NBTVBMRVM6bnVtYmVyPTI4ODAwMDAqNTsgLy8gRGVmYXVsdCA1IG1pbnV0ZXMgb25lIGNoYW5uZWwgYXQgNDhrSHpcclxuICBwcm90ZWN0ZWQgX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXM6bnVtYmVyPUJhc2ljUmVjb3JkaW5nU2VydmljZS5ERUZBVUxUX01BWF9ORVRfQVVUT19NRU1fU1RPUkVfU0FNUExFUztcclxuICAgIHByb3RlY3RlZCBhcGlFbmRQb2ludDogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIHdpdGhDcmVkZW50aWFsczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LCBASW5qZWN0KFNQRUVDSFJFQ09SREVSX0NPTkZJRykgcHJvdGVjdGVkIGNvbmZpZz86IFNwZWVjaFJlY29yZGVyQ29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5hcGlFbmRQb2ludCA9ICcnXHJcblxyXG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmFwaUVuZFBvaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSBjb25maWcuYXBpRW5kUG9pbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmFwaUVuZFBvaW50ICE9PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLmFwaUVuZFBvaW50ID0gdGhpcy5hcGlFbmRQb2ludCArICcvJ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gY29uZmlnLndpdGhDcmVkZW50aWFscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGF1ZGlvUmVxdWVzdEJ5VVJMKGF1ZGlvQmFzZVVybDpzdHJpbmcsYXVkaW9VUkxTZWFyY2hQYXJhbXM6VVJMU2VhcmNoUGFyYW1zKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PiB7XHJcbiAgICAgICAgbGV0IGF1ZGlvVXJsPWF1ZGlvQmFzZVVybDtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpVHlwZSA9PT0gQXBpVHlwZS5GSUxFUykge1xyXG4gICAgICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlbW9cclxuICAgICAgICAgICAgYXVkaW9Vcmw9YXVkaW9VcmwrJy53YXYnO1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgICAgICAgYXVkaW9VUkxTZWFyY2hQYXJhbXMuc2V0KCdyZXF1ZXN0VVVJRCcsVVVJRC5nZW5lcmF0ZSgpKTtcclxuICAgICAgICAgICAgLy9hdWRpb1VybCA9IGF1ZGlvVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF1ZGlvVXJsPWF1ZGlvVXJsKyc/JythdWRpb1VSTFNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgJ2F1ZGlvL3dhdicpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGF1ZGlvVXJsLCB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcclxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2h1bmtBdWRpb1JlcXVlc3QoYmFzZUF1ZGlvVXJsOnN0cmluZyxzdGFydEZyYW1lOm51bWJlcj0wLGZyYW1lTGVuZ3RoOm51bWJlcik6IE9ic2VydmFibGU8Q2h1bmtEb3dubG9hZHxudWxsPiB7XHJcblxyXG4gICAgICAgIGxldCBhdXNwcz1uZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdzdGFydEZyYW1lJyxzdGFydEZyYW1lLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGF1c3BzLnNldCgnZnJhbWVMZW5ndGgnLGZyYW1lTGVuZ3RoLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgICAgICAgLy9hdWRpb1VybCA9IGF1ZGlvVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgICAgICAgICAgYXVzcHMuc2V0KCdyZXF1ZXN0VVVJRCcsVVVJRC5nZW5lcmF0ZSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvYnM9bmV3IE9ic2VydmFibGU8Q2h1bmtEb3dubG9hZHxudWxsPihvYnNlcnZlcj0+IHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb1JlcXVlc3RCeVVSTChiYXNlQXVkaW9VcmwsYXVzcHMpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0OiByZXNwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTMgKDEzLjAuNSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3Q6IG9ic2VydmVyLmNsb3NlZDogXCIrb2JzZXJ2ZXIuY2xvc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGZpbGUgYnl0ZXM6IFwiK3Jlc3AuYm9keS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBvcmlnaW5hbCBhdWRpbyBmb3JtYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3ciA9IG5ldyBXYXZSZWFkZXIocmVzcC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjbUZtdCA9IHdyLnJlYWRGb3JtYXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yZ0ZsID0gd3IuZnJhbWVMZW5ndGgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKHBjbUZtdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJPcmlnaW5hbCBXQVZFIGZvcm1hdCBvZiBkb3dubG9hZCBjaHVuazogXCIrcGNtRm10KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IHJlYWQgV0FWRSBmb3JtYXQgb2Ygb3JpZ2luYWwgZG93bmxvYWQgY2h1bmshXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYob3JnRmwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmRlYnVnKFwiT3JpZ2luYWwgZnJhbWUgbGVuZ3RoIG9mIGRvd25sb2FkIGNodW5rOiBcIitvcmdGbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCByZWFkIFdBVkUgZm9ybWF0IG9mIG9yaWdpbmFsIGRvd25sb2FkIGNodW5rIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNtRm10ICYmIG9yZ0ZsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udGV4dFByb3ZpZGVyLmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHkpLnRoZW4oKGFiKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkRlY29kZWQgYXVkaW8gY2h1bmsgZnJhbWVzOiBcIithYi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaERsID0gbmV3IENodW5rRG93bmxvYWQocGNtRm10LCBvcmdGbCwgYWIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoY2hEbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlY29yZGluZ3Mgc2VydmljZSBjaHVua0F1ZGlvUmVxdWVzdCBlcnJvciBkZWNvZGluZyBhdWRpbyBkYXRhOiBcIiArIGVycm9yLm5hbWUgKyBcIjogXCIgKyBlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdDb3VsZCBub3QgcGFyc2UgYXVkaW8gaGVhZGVyIGZvciBmb3JtYXQgYW5kL29yIGZyYW1lIGxlbmd0aCBvZiBkb3dubG9hZC4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gJ0ZldGNoaW5nIGF1ZGlvIGZpbGU6IHJlc3BvbnNlIGhhcyBubyBib2R5JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBlcnJvcjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgZXJyTXNnPSdGZXRjaGluZyBhdWRpbyBmaWxlIEhUVFAgZXJyb3I6ICcrZXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBvYnM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QXVkaW9CdWZmZXIoYmFzZUF1ZGlvVXJsOiBzdHJpbmcsIHN0YXJ0RnJhbWU6IG51bWJlciA9IDAsIG9yZ1NhbXBsZVJhdGU6IG51bWJlciwgc2Vjb25kczpudW1iZXIsZnJhbWVzOiBudW1iZXIgfCBudWxsKTogT2JzZXJ2YWJsZTxOZXRBdWRpb0J1ZmZlciB8IG51bGw+IHtcclxuICAgICAgICAvL2xldCBhdWRpb1VybD1iYXNlQXVkaW9VcmwrJz9zdGFydEZyYW1lPScrc3RhcnRGcmFtZSsnJmZyYW1lTGVuZ3RoPScrZnJhbWVMZW5ndGg7XHJcbiAgICAgICAgLy9sZXQgYXVkaW9Vcmw9bmV3IFVSTChiYXNlQXVkaW9VcmwpO1xyXG4gICAgICAgIC8vIGlmKG9yZ1NhbXBsZVJhdGUhPW51bGwgJiYgZnJhbWVMZW5ndGglb3JnU2FtcGxlUmF0ZT4wKXtcclxuICAgICAgICAvLyAgIGNvbnN0IGVyck1zZz0nZnJhbWVMZW5ndGggbXVzdCBiZSBlcXVhbCBvciBtdWx0aXBsZSBvZiBvcmlnaW5hbCBzYW1wbGVyYXRlLic7XHJcbiAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKGVyck1zZysnICgnK2ZyYW1lTGVuZ3RoKyclJytvcmdTYW1wbGVSYXRlKyc9PScrKGZyYW1lTGVuZ3RoJW9yZ1NhbXBsZVJhdGUpKycpJyk7XHJcbiAgICAgICAgLy8gICB0aHJvdyBFcnJvcihlcnJNc2cpXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIGxldCBmcmFtZUxlbmd0aDpudW1iZXI9b3JnU2FtcGxlUmF0ZSpNYXRoLnJvdW5kKHNlY29uZHMpO1xyXG4gICAgICAgIGxldCBhdXNwcz1uZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdzdGFydEZyYW1lJyxzdGFydEZyYW1lLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGF1c3BzLnNldCgnZnJhbWVMZW5ndGgnLGZyYW1lTGVuZ3RoLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgICAgICAgLy9hdWRpb1VybCA9IGF1ZGlvVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgICAgICAgICAgYXVzcHMuc2V0KCdyZXF1ZXN0VVVJRCcsVVVJRC5nZW5lcmF0ZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9icz1uZXcgT2JzZXJ2YWJsZTxOZXRBdWRpb0J1ZmZlcnxudWxsPihzdWJzY3JpYmVyPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvUmVxdWVzdEJ5VVJMKGJhc2VBdWRpb1VybCxhdXNwcykuc3Vic2NyaWJlKHtuZXh0OihyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTMgKDEzLjAuNSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogc3Vic2NyaWJlci5jbG9zZWQ6IFwiK3N1YnNjcmliZXIuY2xvc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBBdWRpbyBmaWxlIGJ5dGVzOiBcIityZXNwLmJvZHkuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udGV4dFByb3ZpZGVyLmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHkpLnRoZW4oYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogRGVjb2RlZCBhdWRpbyBjaHVuayBmcmFtZXMgZm9yIG5ldEFiOiBcIithYi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogQ3JlYXRlIG5ldEFiIGFiIGZyb20gY2h1bmsgYWIuLi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWVzPT09bnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IGZyYW1lIGxlbmd0aCBmcm9tIHJlY29yZGluZyBmaWxlIG9iamVjdCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbCA9IGZyYW1lcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFiLnNhbXBsZVJhdGUgIT09IG9yZ1NhbXBsZVJhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmdTYW1wbGVSYXRlICYmIGZyYW1lcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsID0gTWF0aC5yb3VuZChhYi5zYW1wbGVSYXRlICogZnJhbWVzIC8gb3JnU2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUGxhdGZvcm0gc3I6IFwiK2FiLnNhbXBsZVJhdGUrXCIsIGZpbGUgc3I6IFwiK29yZ1NhbXBsZVJhdGUrXCIsIGRlY29kZWQvb3JnIGZyYW1lIGxlbmd0aDogXCIrZmwrXCIvXCIrZnJhbWVzK1wiLCBhYi5sZW5ndGg6IFwiK2FiLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYWIgPSBOZXRBdWRpb0J1ZmZlci5mcm9tQ2h1bmtBdWRpb0J1ZmZlcih0aGlzLGJhc2VBdWRpb1VybCwgYWIsIGZsLGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgcnA9bmV3IFJlYWR5UHJvdmlkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uYWIucmVhZHlQcm92aWRlcj1ycDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ycC5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWIucmVhZHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hYi5mcmFtZUxlbiA8IGZyYW1lTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdFRvbmV0QWI6IEJ1aWx0IG5ldEFiIGFiIGZyb20gY2h1bmsgYWI6IEZpcnN0IGNodW5rIHNob3J0ZXIgdGhhIGZyYW1lTGVuZ3RoIChcIituZXRBYkF1ZGlvQnVmZmVyLmZyYW1lTGVuK1wiPFwiK2ZyYW1lTGVuZ3RoK1wiKSwgYXNzdW1pbmcgZW5kIG9mIGRhdGEsIHNlYWxpbmcgbmV0QWIgYWIuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFiLnNlYWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobmFiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBlcnJvcjogJytlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZihlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NodW5rQXVkaW9SZXF1ZXN0VG9OZXRBYjogRmV0Y2hpbmcgYXVkaW8gZmlsZTogcmVzcG9uc2UgaGFzIG5vIGJvZHknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjooZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QWI6IGVycm9yOiAnK2Vycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3N1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9icztcclxuICAgIH1cclxuXHJcbn1cclxuIl19