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,259 +0,0 @@
1
- import { Observable } from "rxjs";
2
- export class EditFloat32ArrayInputStream {
3
- constructor(_srcInputStream, offset = 0, length) {
4
- this._srcInputStream = _srcInputStream;
5
- this.offset = offset;
6
- this.length = length;
7
- this.framePos = 0;
8
- this.readFrames = 0;
9
- if (this.offset < 0) {
10
- throw Error('Parameter offset must be undefined or greater or equal zero.');
11
- }
12
- if (this.length !== undefined && this.length < 0) {
13
- throw Error('Parameter length must be undefined or greater or equal zero.');
14
- }
15
- }
16
- skipToOffset() {
17
- if (this.framePos == 0 && this.offset > 0) {
18
- this._srcInputStream.skipFrames(this.offset);
19
- this.framePos += this.offset;
20
- }
21
- }
22
- read(buffers) {
23
- this.skipToOffset();
24
- let read = 0;
25
- if (this.length === undefined) {
26
- read = this._srcInputStream.read(buffers);
27
- }
28
- else {
29
- if (buffers.length > 0) {
30
- let bufsCh0 = buffers[0];
31
- let bufsLen = bufsCh0.length;
32
- let avail = this.length - this.readFrames;
33
- if (avail > 0) {
34
- if (avail > bufsLen) {
35
- read = this._srcInputStream.read(buffers);
36
- }
37
- else {
38
- // temporary buffers required
39
- let tmpBufs = new Array(buffers.length);
40
- for (let ch = 0; ch < buffers.length; ch++) {
41
- tmpBufs[ch] = new Float32Array(avail);
42
- }
43
- read = this._srcInputStream.read(tmpBufs);
44
- for (let ch = 0; ch < buffers.length; ch++) {
45
- buffers[ch].set(tmpBufs[ch]);
46
- }
47
- }
48
- }
49
- }
50
- }
51
- this.readFrames += read;
52
- this.framePos += read;
53
- return read;
54
- }
55
- skipFrames(n) {
56
- this.skipToOffset();
57
- if (this.length === undefined) {
58
- this._srcInputStream.skipFrames(n);
59
- }
60
- else {
61
- let avail = this.length - this.readFrames;
62
- if (avail > 0) {
63
- if (avail >= n) {
64
- this._srcInputStream.skipFrames(n);
65
- this.readFrames += n;
66
- this.framePos += n;
67
- }
68
- else {
69
- throw Error('Tried to skip out of bounds.');
70
- }
71
- }
72
- }
73
- }
74
- close() {
75
- this._srcInputStream.close();
76
- }
77
- }
78
- export class AsyncEditFloat32ArrayInputStream {
79
- constructor(_srcInputStream, offset = 0, length) {
80
- this._srcInputStream = _srcInputStream;
81
- this.offset = offset;
82
- this.length = length;
83
- this.framePos = 0;
84
- this.readFrames = 0;
85
- if (this.offset < 0) {
86
- throw Error('Parameter offset must be undefined or greater or equal zero.');
87
- }
88
- if (this.length !== undefined && this.length < 0) {
89
- throw Error('Parameter length must be undefined or greater or equal zero.');
90
- }
91
- }
92
- skipToOffset() {
93
- if (this.framePos == 0 && this.offset > 0) {
94
- this._srcInputStream.skipFrames(this.offset);
95
- this.framePos += this.offset;
96
- }
97
- }
98
- readObs(buffers) {
99
- return new Observable(subscriber => {
100
- this.skipToOffset();
101
- if (this.length === undefined) {
102
- this._srcInputStream.readObs(buffers).subscribe(subscriber);
103
- }
104
- else {
105
- if (buffers.length > 0) {
106
- let bufsCh0 = buffers[0];
107
- let bufsLen = bufsCh0.length;
108
- let avail = this.length - this.readFrames;
109
- if (avail > 0) {
110
- if (avail > bufsLen) {
111
- this._srcInputStream.readObs(buffers).subscribe({
112
- next: (read) => {
113
- this.readFrames += read;
114
- this.framePos += read;
115
- subscriber.next(read);
116
- }, complete: () => {
117
- subscriber.complete();
118
- }
119
- });
120
- }
121
- else {
122
- // temporary buffers required
123
- let tmpBufs = new Array(buffers.length);
124
- for (let ch = 0; ch < buffers.length; ch++) {
125
- tmpBufs[ch] = new Float32Array(avail);
126
- }
127
- this._srcInputStream.readObs(tmpBufs).subscribe({
128
- next: (read) => {
129
- for (let ch = 0; ch < buffers.length; ch++) {
130
- buffers[ch].set(tmpBufs[ch]);
131
- }
132
- this.readFrames += read;
133
- this.framePos += read;
134
- subscriber.next(read);
135
- }, complete: () => {
136
- subscriber.complete();
137
- }
138
- });
139
- }
140
- }
141
- else {
142
- // end of stream
143
- subscriber.next(0);
144
- subscriber.complete();
145
- }
146
- }
147
- else {
148
- subscriber.next(0);
149
- subscriber.complete();
150
- }
151
- }
152
- });
153
- }
154
- skipFrames(n) {
155
- this.skipToOffset();
156
- if (this.length === undefined) {
157
- this._srcInputStream.skipFrames(n);
158
- }
159
- else {
160
- let avail = this.length - this.readFrames;
161
- if (avail > 0) {
162
- if (avail >= n) {
163
- this._srcInputStream.skipFrames(n);
164
- this.readFrames += n;
165
- this.framePos += n;
166
- }
167
- else {
168
- throw Error('Tried to skip out of bounds.');
169
- }
170
- }
171
- }
172
- }
173
- close() {
174
- this._srcInputStream.close();
175
- }
176
- }
177
- export class Float32ArrayChunkerOutStream {
178
- constructor(outStream) {
179
- this.outStream = outStream;
180
- this.bufs = new Array();
181
- this._channels = 0;
182
- this._chunkSize = 0;
183
- this.filled = 0;
184
- this.receivedFrames = 0;
185
- this.sentFrames = 0;
186
- }
187
- createBuffers() {
188
- this.bufs = new Array(this._channels);
189
- for (let ch = 0; ch < this._channels; ch++) {
190
- this.bufs[ch] = new Float32Array(this._chunkSize);
191
- }
192
- }
193
- set chunkSize(chunkSize) {
194
- this._chunkSize = chunkSize;
195
- this.createBuffers();
196
- }
197
- get chunkSize() {
198
- return this._chunkSize;
199
- }
200
- set channels(channels) {
201
- this._channels = channels;
202
- this.createBuffers();
203
- }
204
- get channels() {
205
- return this._channels;
206
- }
207
- available() {
208
- return this._chunkSize - this.filled;
209
- }
210
- write(buffers) {
211
- let copied = 0;
212
- if (buffers.length > 0) {
213
- let buffersLen = buffers[0].length;
214
- this.receivedFrames += buffersLen;
215
- let avail = buffersLen;
216
- // Fill out buffers until all values copied
217
- while (avail > 0) {
218
- let toFill = this._chunkSize - this.filled;
219
- if (toFill > avail) {
220
- toFill = avail;
221
- }
222
- let sliceEnd = copied + toFill;
223
- // Firefox on Android sends only the first channel
224
- for (let ch = 0; ch < buffersLen; ch++) {
225
- if (buffers[ch]) {
226
- let cpPrt = buffers[ch].slice(copied, sliceEnd);
227
- let buf = this.bufs[ch];
228
- buf.set(cpPrt, this.filled);
229
- }
230
- }
231
- copied += toFill;
232
- avail -= toFill;
233
- this.filled += toFill;
234
- if (this.filled == this._chunkSize) {
235
- this.outStream.write(this.bufs);
236
- this.sentFrames += this.filled;
237
- this.filled = 0;
238
- }
239
- }
240
- }
241
- return copied;
242
- }
243
- flush() {
244
- if (this.filled > 0) {
245
- let restBufs = new Array(this._channels);
246
- for (let ch = 0; ch < this._channels; ch++) {
247
- restBufs[ch] = this.bufs[ch].slice(0, this.filled);
248
- }
249
- this.outStream.write(restBufs);
250
- this.outStream.flush();
251
- this.sentFrames += this.filled;
252
- this.filled = 0;
253
- }
254
- }
255
- close() {
256
- this.outStream.close();
257
- }
258
- }
259
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBY2hDLE1BQU0sT0FBTywyQkFBMkI7SUFHdEMsWUFBb0IsZUFBdUMsRUFBUyxTQUFjLENBQUMsRUFBUyxNQUF3QjtRQUFoRyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFGNUcsYUFBUSxHQUFDLENBQUMsQ0FBQztRQUNYLGVBQVUsR0FBQyxDQUFDLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQyxDQUFDO1lBQ2YsTUFBTSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQyxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDOUUsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUcsSUFBSSxDQUFDLFFBQVEsSUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQTRCO1FBQy9CLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksR0FBQyxD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Q0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFHRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZsb2F0MzJBcnJheUlucHV0U3RyZWFte1xyXG4gIHJlYWQoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlcjtcclxuICBza2lwRnJhbWVzKG46bnVtYmVyKTp2b2lkO1xyXG4gIGNsb3NlKCk6dm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBc3luY0Zsb2F0MzJBcnJheUlucHV0U3RyZWFte1xyXG4gIHJlYWRPYnMoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6T2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWQ7XHJcbiAgY2xvc2UoKTp2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIGltcGxlbWVudHMgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcHJpdmF0ZSBmcmFtZVBvcz0wO1xyXG4gIHByaXZhdGUgcmVhZEZyYW1lcz0wO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NyY0lucHV0U3RyZWFtOkZsb2F0MzJBcnJheUlucHV0U3RyZWFtLHByaXZhdGUgb2Zmc2V0Om51bWJlcj0wLHByaXZhdGUgbGVuZ3RoPzpudW1iZXJ8dW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5vZmZzZXQ8MCl7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1BhcmFtZXRlciBvZmZzZXQgbXVzdCBiZSB1bmRlZmluZWQgb3IgZ3JlYXRlciBvciBlcXVhbCB6ZXJvLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGVuZ3RoIT09dW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoPDApe1xyXG4gICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIGxlbmd0aCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNraXBUb09mZnNldCgpe1xyXG4gICAgaWYodGhpcy5mcmFtZVBvcz09MCAmJiB0aGlzLm9mZnNldD4wKXtcclxuICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyh0aGlzLm9mZnNldCk7XHJcbiAgICAgIHRoaXMuZnJhbWVQb3MrPXRoaXMub2Zmc2V0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhZChidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVye1xyXG4gICAgdGhpcy5za2lwVG9PZmZzZXQoKTtcclxuICAgIGxldCByZWFkPTA7XHJcbiAgICBpZih0aGlzLmxlbmd0aD09PXVuZGVmaW5lZCl7XHJcbiAgICAgIHJlYWQgPSB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcnMpO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBpZiAoYnVmZmVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IGJ1ZnNDaDAgPSBidWZmZXJzWzBdO1xyXG4gICAgICAgIGxldCBidWZzTGVuID0gYnVmc0NoMC5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGF2YWlsID0gdGhpcy5sZW5ndGggLSB0aGlzLnJlYWRGcmFtZXM7XHJcbiAgICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgICAgaWYgKGF2YWlsID4gYnVmc0xlbikge1xyXG4gICAgICAgICAgICByZWFkID0gdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZChidWZmZXJzKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRlbXBvcmFyeSBidWZmZXJzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgIGxldCB0bXBCdWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oYnVmZmVycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYnVmZmVycy5sZW5ndGg7IGNoKyspIHtcclxuICAgICAgICAgICAgICB0bXBCdWZzW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoYXZhaWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlYWQgPSB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkKHRtcEJ1ZnMpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYnVmZmVycy5sZW5ndGg7IGNoKyspIHtcclxuICAgICAgICAgICAgICBidWZmZXJzW2NoXS5zZXQodG1wQnVmc1tjaF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlYWRGcmFtZXMrPXJlYWQ7XHJcbiAgICB0aGlzLmZyYW1lUG9zKz1yZWFkO1xyXG4gICAgcmV0dXJuIHJlYWQ7XHJcbiAgfVxyXG5cclxuICBza2lwRnJhbWVzKG46bnVtYmVyKTp2b2lke1xyXG4gICAgdGhpcy5za2lwVG9PZmZzZXQoKTtcclxuICAgIGlmKHRoaXMubGVuZ3RoPT09dW5kZWZpbmVkKXtcclxuICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyhuKTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgbGV0IGF2YWlsID0gdGhpcy5sZW5ndGggLSB0aGlzLnJlYWRGcmFtZXM7XHJcbiAgICAgIGlmIChhdmFpbCA+IDApIHtcclxuICAgICAgICBpZiAoYXZhaWwgPj0gbikge1xyXG4gICAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyhuKTtcclxuICAgICAgICAgIHRoaXMucmVhZEZyYW1lcyArPSBuO1xyXG4gICAgICAgICAgdGhpcy5mcmFtZVBvcyArPSBuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2tpcCBvdXQgb2YgYm91bmRzLicpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOnZvaWR7XHJcbiAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5jbG9zZSgpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBBc3luY0VkaXRGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIEFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcHJpdmF0ZSBmcmFtZVBvcz0wO1xyXG4gIHByaXZhdGUgcmVhZEZyYW1lcz0wO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NyY0lucHV0U3RyZWFtOkFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0scHJpdmF0ZSBvZmZzZXQ6bnVtYmVyPTAscHJpdmF0ZSBsZW5ndGg/Om51bWJlcnx1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLm9mZnNldDwwKXtcclxuICAgICAgdGhyb3cgRXJyb3IoJ1BhcmFtZXRlciBvZmZzZXQgbXVzdCBiZSB1bmRlZmluZWQgb3IgZ3JlYXRlciBvciBlcXVhbCB6ZXJvLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGVuZ3RoIT09dW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoPDApe1xyXG4gICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIGxlbmd0aCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNraXBUb09mZnNldCgpe1xyXG4gICAgaWYodGhpcy5mcmFtZVBvcz09MCAmJiB0aGlzLm9mZnNldD4wKXtcclxuICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyh0aGlzLm9mZnNldCk7XHJcbiAgICAgIHRoaXMuZnJhbWVQb3MrPXRoaXMub2Zmc2V0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhZE9icyhidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxudW1iZXI+KHN1YnNjcmliZXI9PntcclxuICAgICAgdGhpcy5za2lwVG9PZmZzZXQoKTtcclxuICAgICAgaWYodGhpcy5sZW5ndGg9PT11bmRlZmluZWQpe1xyXG4gICAgICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWRPYnMoYnVmZmVycykuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGJ1ZnNDaDAgPSBidWZmZXJzWzBdO1xyXG4gICAgICAgICAgbGV0IGJ1ZnNMZW4gPSBidWZzQ2gwLmxlbmd0aDtcclxuICAgICAgICAgIGxldCBhdmFpbCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5yZWFkRnJhbWVzO1xyXG4gICAgICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYXZhaWwgPiBidWZzTGVuKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZE9icyhidWZmZXJzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKHJlYWQpPT57XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVhZEZyYW1lcys9cmVhZDtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZVBvcys9cmVhZDtcclxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlYWQpO1xyXG4gICAgICAgICAgICAgICAgfSxjb21wbGV0ZTooKT0+e1xyXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgYnVmZmVycyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgIGxldCB0bXBCdWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oYnVmZmVycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgdG1wQnVmc1tjaF0gPSBuZXcgRmxvYXQzMkFycmF5KGF2YWlsKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZE9icyh0bXBCdWZzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDoocmVhZCk9PntcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICBidWZmZXJzW2NoXS5zZXQodG1wQnVmc1tjaF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkRnJhbWVzKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZVBvcys9cmVhZDtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZWFkKTtcclxuICAgICAgICAgICAgICB9LGNvbXBsZXRlOigpPT57XHJcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vIGVuZCBvZiBzdHJlYW1cclxuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KDApO1xyXG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoMCk7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWR7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgaWYodGhpcy5sZW5ndGg9PT11bmRlZmluZWQpe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgIGlmIChhdmFpbCA+PSBuKSB7XHJcbiAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgICAgICAgdGhpcy5yZWFkRnJhbWVzICs9IG47XHJcbiAgICAgICAgICB0aGlzLmZyYW1lUG9zICs9IG47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBza2lwIG91dCBvZiBib3VuZHMuJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlKCk6dm9pZHtcclxuICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmxvYXQzMkFycmF5T3V0U3RyZWFtIHtcclxuXHJcbiAgd3JpdGUoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlcjtcclxuXHJcbiAgZmx1c2goKTogdm9pZDtcclxuXHJcbiAgY2xvc2UoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZsb2F0MzJBcnJheUNodW5rZXJPdXRTdHJlYW0gaW1wbGVtZW50cyBGbG9hdDMyQXJyYXlPdXRTdHJlYW0ge1xyXG5cclxuICBwcml2YXRlIGJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpO1xyXG4gIHByaXZhdGUgZmlsbGVkOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX2NoYW5uZWxzOiBudW1iZXI9MDtcclxuICBwcml2YXRlIF9jaHVua1NpemU6IG51bWJlcj0wO1xyXG5cclxuICBwcml2YXRlIHJlY2VpdmVkRnJhbWVzOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBzZW50RnJhbWVzOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3V0U3RyZWFtOiBGbG9hdDMyQXJyYXlPdXRTdHJlYW0pIHtcclxuICAgIHRoaXMuZmlsbGVkID0gMDtcclxuICAgIHRoaXMucmVjZWl2ZWRGcmFtZXMgPSAwO1xyXG4gICAgdGhpcy5zZW50RnJhbWVzID0gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQnVmZmVycygpIHtcclxuICAgIHRoaXMuYnVmcyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KHRoaXMuX2NoYW5uZWxzKTtcclxuICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLl9jaGFubmVsczsgY2grKykge1xyXG4gICAgICB0aGlzLmJ1ZnNbY2hdID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLl9jaHVua1NpemUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGNodW5rU2l6ZShjaHVua1NpemU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY2h1bmtTaXplID0gY2h1bmtTaXplO1xyXG4gICAgdGhpcy5jcmVhdGVCdWZmZXJzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2h1bmtTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoYW5uZWxzKGNoYW5uZWxzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2NoYW5uZWxzID0gY2hhbm5lbHM7XHJcbiAgICB0aGlzLmNyZWF0ZUJ1ZmZlcnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGFubmVscygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxzO1xyXG4gIH1cclxuXHJcblxyXG4gIGF2YWlsYWJsZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NodW5rU2l6ZS10aGlzLmZpbGxlZDtcclxuICB9XHJcblxyXG4gIHdyaXRlKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBjb3BpZWQgPSAwO1xyXG4gICAgaWYoYnVmZmVycy5sZW5ndGg+MCkge1xyXG4gICAgICBsZXQgYnVmZmVyc0xlbiA9IGJ1ZmZlcnNbMF0ubGVuZ3RoO1xyXG4gICAgICB0aGlzLnJlY2VpdmVkRnJhbWVzICs9IGJ1ZmZlcnNMZW47XHJcbiAgICAgIGxldCBhdmFpbCA9IGJ1ZmZlcnNMZW47XHJcbiAgICAgIC8vIEZpbGwgb3V0IGJ1ZmZlcnMgdW50aWwgYWxsIHZhbHVlcyBjb3BpZWRcclxuXHJcbiAgICAgIHdoaWxlIChhdmFpbCA+IDApIHtcclxuICAgICAgICBsZXQgdG9GaWxsID0gdGhpcy5fY2h1bmtTaXplIC0gdGhpcy5maWxsZWQ7XHJcbiAgICAgICAgaWYgKHRvRmlsbCA+IGF2YWlsKSB7XHJcbiAgICAgICAgICB0b0ZpbGwgPSBhdmFpbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNsaWNlRW5kID0gY29waWVkICsgdG9GaWxsO1xyXG5cclxuICAgICAgICAvLyBGaXJlZm94IG9uIEFuZHJvaWQgc2VuZHMgb25seSB0aGUgZmlyc3QgY2hhbm5lbFxyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzTGVuOyBjaCsrKSB7XHJcbiAgICAgICAgICBpZihidWZmZXJzW2NoXSkge1xyXG4gICAgICAgICAgICBsZXQgY3BQcnQgPSBidWZmZXJzW2NoXS5zbGljZShjb3BpZWQsIHNsaWNlRW5kKTtcclxuICAgICAgICAgICAgbGV0IGJ1ZiA9IHRoaXMuYnVmc1tjaF07XHJcbiAgICAgICAgICAgIGJ1Zi5zZXQoY3BQcnQsIHRoaXMuZmlsbGVkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29waWVkICs9IHRvRmlsbDtcclxuICAgICAgICBhdmFpbCAtPSB0b0ZpbGw7XHJcbiAgICAgICAgdGhpcy5maWxsZWQgKz0gdG9GaWxsO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGxlZCA9PSB0aGlzLl9jaHVua1NpemUpIHtcclxuICAgICAgICAgIHRoaXMub3V0U3RyZWFtLndyaXRlKHRoaXMuYnVmcyk7XHJcbiAgICAgICAgICB0aGlzLnNlbnRGcmFtZXMgKz0gdGhpcy5maWxsZWQ7XHJcbiAgICAgICAgICB0aGlzLmZpbGxlZCA9IDA7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcGllZDtcclxuICB9XHJcblxyXG4gIGZsdXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmlsbGVkID4gMCkge1xyXG4gICAgICBsZXQgcmVzdEJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5Pih0aGlzLl9jaGFubmVscyk7XHJcbiAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLl9jaGFubmVsczsgY2grKykge1xyXG4gICAgICAgIHJlc3RCdWZzW2NoXSA9IHRoaXMuYnVmc1tjaF0uc2xpY2UoMCwgdGhpcy5maWxsZWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub3V0U3RyZWFtLndyaXRlKHJlc3RCdWZzKTtcclxuICAgICAgdGhpcy5vdXRTdHJlYW0uZmx1c2goKTtcclxuICAgICAgdGhpcy5zZW50RnJhbWVzICs9IHRoaXMuZmlsbGVkO1xyXG4gICAgICB0aGlzLmZpbGxlZCA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLm91dFN0cmVhbS5jbG9zZSgpO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
@@ -1,28 +0,0 @@
1
- export class Position {
2
- constructor(left, top) {
3
- this.left = left;
4
- this.top = top;
5
- }
6
- toString() {
7
- return this.left + "," + this.top;
8
- }
9
- }
10
- export class Dimension {
11
- constructor(width, height) {
12
- this.width = width;
13
- this.height = height;
14
- }
15
- toString() {
16
- return this.width + "x" + this.height;
17
- }
18
- }
19
- export class Rectangle {
20
- constructor(position, dimension) {
21
- this.position = position;
22
- this.dimension = dimension;
23
- }
24
- toString() {
25
- return this.position + ":" + this.dimension;
26
- }
27
- }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbWF0aC8yZC9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUFtQixJQUFXLEVBQVEsR0FBVTtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUFPO1FBQVEsUUFBRyxHQUFILEdBQUcsQ0FBTztJQUVoRCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQTtJQUMvQixDQUFDO0NBQ0Y7QUFHRCxNQUFNLE9BQU8sU0FBUztJQUNwQixZQUFtQixLQUFZLEVBQVEsTUFBYTtRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQVEsV0FBTSxHQUFOLE1BQU0sQ0FBTztJQUVwRCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUNuQyxDQUFDO0NBQ0Y7QUFHRCxNQUFNLE9BQU8sU0FBUztJQUVwQixZQUFtQixRQUFpQixFQUFRLFNBQW1CO1FBQTVDLGFBQVEsR0FBUixRQUFRLENBQVM7UUFBUSxjQUFTLEdBQVQsU0FBUyxDQUFVO0lBRS9ELENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFDLEdBQUcsR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3pDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBQb3NpdGlvbntcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbGVmdDpudW1iZXIscHVibGljIHRvcDpudW1iZXIpe1xyXG5cclxuICB9XHJcbiAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICByZXR1cm4gdGhpcy5sZWZ0K1wiLFwiK3RoaXMudG9wXHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIERpbWVuc2lvbiB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHdpZHRoOm51bWJlcixwdWJsaWMgaGVpZ2h0Om51bWJlcil7XHJcblxyXG4gIH1cclxuICB0b1N0cmluZygpOnN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLndpZHRoK1wieFwiK3RoaXMuaGVpZ2h0XHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY3RhbmdsZXtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHBvc2l0aW9uOlBvc2l0aW9uLHB1YmxpYyBkaW1lbnNpb246RGltZW5zaW9uKXtcclxuXHJcbiAgfVxyXG4gIHRvU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb24rXCI6XCIrdGhpcy5kaW1lbnNpb25cclxuICB9XHJcbn1cclxuIl19
@@ -1,58 +0,0 @@
1
- export class Complex {
2
- static fromPolarForm(magnitude, argument) {
3
- const r = Math.cos(argument) * magnitude;
4
- const i = Math.sin(argument) * magnitude;
5
- return new Complex(r, i);
6
- }
7
- constructor(real, img) {
8
- this.real = real;
9
- this.img = img;
10
- }
11
- magnitude() {
12
- return Math.sqrt((this.real * this.real) + (this.img * this.img));
13
- }
14
- argument() {
15
- return Math.atan2(this.img, this.real);
16
- }
17
- add(addC) {
18
- return new Complex(this.real + addC.real, this.img + addC.img);
19
- }
20
- sub(subC) {
21
- return new Complex(this.real - subC.real, this.img - subC.img);
22
- }
23
- mult(multC) {
24
- const multR = (this.real * multC.real) - (this.img * multC.img);
25
- const multI = (this.real * multC.img) + (multC.real * this.img);
26
- return new Complex(multR, multI);
27
- }
28
- multReal(multF) {
29
- return new Complex(this.real * multF, this.img * multF);
30
- }
31
- div(divisor) {
32
- const divReal = divisor.real;
33
- const divImg = divisor.img;
34
- const div = (divReal * divReal) + (divImg * divImg);
35
- const divisionReal = ((this.real * divReal) + (this.img * divImg)) / div;
36
- const divisionImg = ((divReal * this.img) - (this.real * divImg)) / div;
37
- return new Complex(divisionReal, divisionImg);
38
- }
39
- divReal(divisor) {
40
- const div = divisor * divisor;
41
- const divsionReal = (this.real * divisor) / div;
42
- const divsionImg = (divisor * this.img) / div;
43
- return new Complex(divsionReal, divsionImg);
44
- }
45
- conjugate() {
46
- return new Complex(this.real, -this.img);
47
- }
48
- equals(c) {
49
- if (c === null) {
50
- return false;
51
- }
52
- return (this.real === c.real && this.img === c.img);
53
- }
54
- toString() {
55
- return 'Real: ' + this.real + ', Img: ' + this.img;
56
- }
57
- }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9tYXRoL2NvbXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0ksTUFBTSxPQUFPLE9BQU87SUFLVCxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7UUFDM0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDekMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELFlBQVksSUFBWSxFQUFFLEdBQVc7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUNNLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLEdBQUcsQ0FBQyxJQUFhO1FBQ3BCLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxHQUFHLENBQUMsSUFBYTtRQUNwQixPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sSUFBSSxDQUFDLEtBQWM7UUFDdEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWE7UUFDekIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSxHQUFHLENBQUMsT0FBZ0I7UUFDdkIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6RSxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFeEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUFlO1FBQzFCLE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDOUIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRTlDLE9BQU8sSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTSxTQUFTO1FBQ1osT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxNQUFNLENBQUMsQ0FBVTtRQUNwQixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNiLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSxRQUFRO1FBQ1gsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN2RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuICAgIGV4cG9ydCBjbGFzcyBDb21wbGV4IHtcclxuXHJcbiAgICAgICAgcmVhbDogbnVtYmVyO1xyXG4gICAgICAgIGltZzogbnVtYmVyO1xyXG5cclxuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb21Qb2xhckZvcm0obWFnbml0dWRlOiBudW1iZXIsIGFyZ3VtZW50OiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgY29uc3QgciA9IE1hdGguY29zKGFyZ3VtZW50KSAqIG1hZ25pdHVkZTtcclxuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguc2luKGFyZ3VtZW50KSAqIG1hZ25pdHVkZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHIsIGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdHJ1Y3RvcihyZWFsOiBudW1iZXIsIGltZzogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVhbCA9IHJlYWw7XHJcbiAgICAgICAgICAgIHRoaXMuaW1nID0gaW1nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwdWJsaWMgbWFnbml0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoKHRoaXMucmVhbCAqIHRoaXMucmVhbCkgKyAodGhpcy5pbWcgKiB0aGlzLmltZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGFyZ3VtZW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMuaW1nLCB0aGlzLnJlYWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGFkZChhZGRDOiBDb21wbGV4KTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgKyBhZGRDLnJlYWwsIHRoaXMuaW1nICsgYWRkQy5pbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIHN1YihzdWJDOiBDb21wbGV4KTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgLSBzdWJDLnJlYWwsIHRoaXMuaW1nIC0gc3ViQy5pbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIG11bHQobXVsdEM6IENvbXBsZXgpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgY29uc3QgbXVsdFIgPSAodGhpcy5yZWFsICogbXVsdEMucmVhbCkgLSAodGhpcy5pbWcgKiBtdWx0Qy5pbWcpO1xyXG4gICAgICAgICAgICBjb25zdCBtdWx0SSA9ICh0aGlzLnJlYWwgKiBtdWx0Qy5pbWcpICsgKG11bHRDLnJlYWwgKiB0aGlzLmltZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleChtdWx0UiwgbXVsdEkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIG11bHRSZWFsKG11bHRGOiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHRoaXMucmVhbCAqIG11bHRGLCB0aGlzLmltZyAqIG11bHRGKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBkaXYoZGl2aXNvcjogQ29tcGxleCk6IENvbXBsZXgge1xyXG4gICAgICAgICAgICBjb25zdCBkaXZSZWFsID0gZGl2aXNvci5yZWFsO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZJbWcgPSBkaXZpc29yLmltZztcclxuICAgICAgICAgICAgY29uc3QgZGl2ID0gKGRpdlJlYWwgKiBkaXZSZWFsKSArIChkaXZJbWcgKiBkaXZJbWcpO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZpc2lvblJlYWwgPSAoKHRoaXMucmVhbCAqIGRpdlJlYWwpICsgKHRoaXMuaW1nICogZGl2SW1nKSkgLyBkaXY7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpdmlzaW9uSW1nID0gKChkaXZSZWFsICogdGhpcy5pbWcpIC0gKHRoaXMucmVhbCAqIGRpdkltZykpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdmlzaW9uUmVhbCwgZGl2aXNpb25JbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGRpdlJlYWwoZGl2aXNvcjogbnVtYmVyKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRpdmlzb3IgKiBkaXZpc29yO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZzaW9uUmVhbCA9ICh0aGlzLnJlYWwgKiBkaXZpc29yKSAvIGRpdjtcclxuICAgICAgICAgICAgY29uc3QgZGl2c2lvbkltZyA9IChkaXZpc29yICogdGhpcy5pbWcpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdnNpb25SZWFsLCBkaXZzaW9uSW1nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBjb25qdWdhdGUoKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwsIC10aGlzLmltZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgZXF1YWxzKGM6IENvbXBsZXgpOiBib29sZWFuIHtcclxuICAgICAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMucmVhbCA9PT0gYy5yZWFsICYmIHRoaXMuaW1nID09PSBjLmltZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgICAgICAgcmV0dXJuICdSZWFsOiAnICsgdGhpcy5yZWFsICsgJywgSW1nOiAnICsgdGhpcy5pbWc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4iXX0=
@@ -1,196 +0,0 @@
1
- import { Complex } from './complex';
2
- export class DFTFloat32 {
3
- constructor(n) {
4
- this.n = n;
5
- this.m = Math.log(n) / Math.log(2);
6
- // if(n != (1 << m))throw new RuntimeException("length N must be power of 2");
7
- // lookup tables
8
- this.cosLookup = new Float32Array(n / 2);
9
- this.sinLookup = new Float32Array(n / 2);
10
- for (let i = 0; i < n / 2; i++) {
11
- const arc = (-2 * Math.PI * i) / n;
12
- this.cosLookup[i] = Math.cos(arc);
13
- this.sinLookup[i] = Math.sin(arc);
14
- }
15
- }
16
- processReal(srcBuf) {
17
- const x = srcBuf.slice();
18
- const y = new Float32Array(srcBuf.length);
19
- for (let yi = 0; yi < y.length; yi++) {
20
- y[yi] = 0.0;
21
- }
22
- this.fftCooleyTukey(x, y);
23
- const rc = new Array(x.length);
24
- for (let i = 0; i < x.length; i++) {
25
- rc[i] = new Complex(x[i], y[i]);
26
- }
27
- return rc;
28
- }
29
- processRealMagnitude(srcBuf) {
30
- const x = srcBuf.slice();
31
- const y = new Float32Array(srcBuf.length);
32
- for (let yi = 0; yi < y.length; yi++) {
33
- y[yi] = 0.0;
34
- }
35
- this.fftCooleyTukey(x, y);
36
- const rc = new Float32Array(x.length);
37
- for (let i = 0; i < x.length; i++) {
38
- const rcc = new Complex(x[i], y[i]);
39
- rc[i] = rcc.magnitude();
40
- }
41
- return rc;
42
- }
43
- fftCooleyTukey(real, img) {
44
- let i;
45
- let j = 0;
46
- let k;
47
- let n1;
48
- let n2 = this.n / 2;
49
- let a;
50
- let c;
51
- let s;
52
- let t1;
53
- let t2;
54
- for (i = 1; i < this.n - 1; i++) {
55
- n1 = n2;
56
- while (j >= n1) {
57
- j = j - n1;
58
- n1 = n1 / 2;
59
- }
60
- j = j + n1;
61
- if (i < j) {
62
- t1 = real[i];
63
- real[i] = real[j];
64
- real[j] = t1;
65
- t1 = img[i];
66
- img[i] = img[j];
67
- img[j] = t1;
68
- }
69
- }
70
- n1 = 0;
71
- n2 = 1;
72
- for (i = 0; i < this.m; i++) {
73
- n1 = n2;
74
- n2 = n2 + n2;
75
- a = 0;
76
- for (j = 0; j < n1; j++) {
77
- c = this.cosLookup[a];
78
- s = this.sinLookup[a];
79
- a += (1 << (this.m - i - 1));
80
- for (k = j; k < this.n; k = k + n2) {
81
- t1 = c * real[k + n1] - s * img[k + n1];
82
- t2 = s * real[k + n1] + c * img[k + n1];
83
- real[k + n1] = real[k] - t1;
84
- img[k + n1] = img[k] - t2;
85
- real[k] = real[k] + t1;
86
- img[k] = img[k] + t2;
87
- }
88
- }
89
- }
90
- }
91
- process(t) {
92
- const reals = new Float32Array(this.n);
93
- const imgs = new Float32Array(this.n);
94
- const trans = new Array(this.n);
95
- for (let i = 0; i < this.n; i++) {
96
- reals[i] = t[i].real;
97
- imgs[i] = t[i].img;
98
- }
99
- this.fftCooleyTukey(reals, imgs);
100
- for (let i = 0; i < this.n; i++) {
101
- trans[i] = new Complex(reals[i], imgs[i]);
102
- }
103
- return trans;
104
- }
105
- }
106
- export class DFT {
107
- constructor(n) {
108
- this.n = n;
109
- this.m = Math.log(n) / Math.log(2);
110
- // if(n != (1 << m))throw new RuntimeException("length N must be power of 2");
111
- // lookup tables
112
- this.cosLookup = new Array(n / 2);
113
- this.sinLookup = new Array(n / 2);
114
- for (let i = 0; i < n / 2; i++) {
115
- const arc = (-2 * Math.PI * i) / n;
116
- this.cosLookup[i] = Math.cos(arc);
117
- this.sinLookup[i] = Math.sin(arc);
118
- }
119
- }
120
- processReal(srcBuf) {
121
- const x = srcBuf.slice();
122
- const y = new Array(srcBuf.length);
123
- for (let yi = 0; yi < y.length; yi++) {
124
- y[yi] = 0.0;
125
- }
126
- this.fftCooleyTukey(x, y);
127
- const rc = new Array(x.length);
128
- for (let i = 0; i < x.length; i++) {
129
- rc[i] = new Complex(x[i], y[i]);
130
- }
131
- return rc;
132
- }
133
- fftCooleyTukey(real, img) {
134
- let i;
135
- let j = 0;
136
- let k;
137
- let n1;
138
- let n2 = this.n / 2;
139
- let a;
140
- let c;
141
- let s;
142
- let t1;
143
- let t2;
144
- for (i = 1; i < this.n - 1; i++) {
145
- n1 = n2;
146
- while (j >= n1) {
147
- j = j - n1;
148
- n1 = n1 / 2;
149
- }
150
- j = j + n1;
151
- if (i < j) {
152
- t1 = real[i];
153
- real[i] = real[j];
154
- real[j] = t1;
155
- t1 = img[i];
156
- img[i] = img[j];
157
- img[j] = t1;
158
- }
159
- }
160
- n1 = 0;
161
- n2 = 1;
162
- for (i = 0; i < this.m; i++) {
163
- n1 = n2;
164
- n2 = n2 + n2;
165
- a = 0;
166
- for (j = 0; j < n1; j++) {
167
- c = this.cosLookup[a];
168
- s = this.sinLookup[a];
169
- a += 1 << (this.m - i - 1);
170
- for (k = j; k < this.n; k = k + n2) {
171
- t1 = c * real[k + n1] - s * img[k + n1];
172
- t2 = s * real[k + n1] + c * img[k + n1];
173
- real[k + n1] = real[k] - t1;
174
- img[k + n1] = img[k] - t2;
175
- real[k] = real[k] + t1;
176
- img[k] = img[k] + t2;
177
- }
178
- }
179
- }
180
- }
181
- process(t) {
182
- const reals = new Array(this.n);
183
- const imgs = new Array(this.n);
184
- const trans = new Array(this.n);
185
- for (let i = 0; i < this.n; i++) {
186
- reals[i] = t[i].real;
187
- imgs[i] = t[i].img;
188
- }
189
- this.fftCooleyTukey(reals, imgs);
190
- for (let i = 0; i < this.n; i++) {
191
- trans[i] = new Complex(reals[i], imgs[i]);
192
- }
193
- return trans;
194
- }
195
- }
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGZ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL21hdGgvZGZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEMsTUFBTSxPQUFPLFVBQVU7SUFRbkIsWUFBWSxDQUFTO1FBQ2pCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkMsOEVBQThFO1FBRTlFLGdCQUFnQjtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVcsQ0FBQyxNQUFvQjtRQUNuQyxNQUFNLENBQUMsR0FBRyxNQUFN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LENBQWlCO1FBQzVCLE1BQU0sS0FBSyxHQUFrQixJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQWtCLElBQUksS0FBSyxDQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBbUIsSUFBSSxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGxleCB9IGZyb20gJy4vY29tcGxleCc7XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIERGVEZsb2F0MzIge1xyXG5cclxuICAgICAgICBwcml2YXRlIG46IG51bWJlcjtcclxuICAgICAgICBwcml2YXRlIG06IG51bWJlcjtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSBjb3NMb29rdXA6IEZsb2F0MzJBcnJheTtcclxuICAgICAgICBwcml2YXRlIHNpbkxvb2t1cDogRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcihuOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5uID0gbjtcclxuICAgICAgICAgICAgdGhpcy5tID0gTWF0aC5sb2cobikgLyBNYXRoLmxvZygyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKG4gIT0gKDEgPDwgbSkpdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJsZW5ndGggTiBtdXN0IGJlIHBvd2VyIG9mIDJcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBsb29rdXAgdGFibGVzXHJcbiAgICAgICAgICAgIHRoaXMuY29zTG9va3VwID0gbmV3IEZsb2F0MzJBcnJheShuIC8gMik7XHJcbiAgICAgICAgICAgIHRoaXMuc2luTG9va3VwID0gbmV3IEZsb2F0MzJBcnJheShuIC8gMik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyYyA9ICgtMiAqIE1hdGguUEkgKiBpKSAvIG47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvc0xvb2t1cFtpXSA9IE1hdGguY29zKGFyYyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbkxvb2t1cFtpXSA9IE1hdGguc2luKGFyYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBwcm9jZXNzUmVhbChzcmNCdWY6IEZsb2F0MzJBcnJheSk6IEFycmF5PENvbXBsZXg+IHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHNyY0J1Zi5zbGljZSgpO1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShzcmNCdWYubGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgeWkgPSAwOyB5aSA8IHkubGVuZ3RoOyB5aSsrKSB7XHJcbiAgICAgICAgICAgICAgICB5W3lpXSA9IDAuMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmZmdENvb2xleVR1a2V5KHgsIHkpO1xyXG4gICAgICAgICAgICBjb25zdCByYyA9IG5ldyBBcnJheTxDb21wbGV4Pih4Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmNbaV0gPSBuZXcgQ29tcGxleCh4W2ldLCB5W2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgcHJvY2Vzc1JlYWxNYWduaXR1ZGUoc3JjQnVmOiBGbG9hdDMyQXJyYXkpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICAgICAgICBjb25zdCB4ID0gc3JjQnVmLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSBuZXcgRmxvYXQzMkFycmF5KHNyY0J1Zi5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5aSA9IDA7IHlpIDwgeS5sZW5ndGg7IHlpKyspIHtcclxuICAgICAgICAgICAgICAgIHlbeWldID0gMC4wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmZ0Q29vbGV5VHVrZXkoeCwgeSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJjID0gbmV3IEZsb2F0MzJBcnJheSh4Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmNjID0gbmV3IENvbXBsZXgoeFtpXSwgeVtpXSk7XHJcbiAgICAgICAgICAgICAgICByY1tpXSA9IHJjYy5tYWduaXR1ZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgZmZ0Q29vbGV5VHVrZXkocmVhbDogRmxvYXQzMkFycmF5LCBpbWc6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xyXG4gICAgICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgaiA9IDA7XHJcbiAgICAgICAgICAgIGxldCBrOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCBuMTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgbjI6IG51bWJlciA9IHRoaXMubiAvIDI7XHJcbiAgICAgICAgICAgIGxldCBhOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCBjOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCBzOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0MTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdDI6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB0aGlzLm4gLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG4xID0gbjI7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaiA+PSBuMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGogPSBqIC0gbjE7XHJcbiAgICAgICAgICAgICAgICAgICAgbjEgPSBuMSAvIDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqID0gaiArIG4xO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpIDwgaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHQxID0gcmVhbFtpXTtcclxuICAgICAgICAgICAgICAgICAgICByZWFsW2ldID0gcmVhbFtqXTtcclxuICAgICAgICAgICAgICAgICAgICByZWFsW2pdID0gdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdDEgPSBpbWdbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nW2ldID0gaW1nW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIGltZ1tqXSA9IHQxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBuMSA9IDA7XHJcbiAgICAgICAgICAgIG4yID0gMTtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBuMSA9IG4yO1xyXG4gICAgICAgICAgICAgICAgbjIgPSBuMiArIG4yO1xyXG4gICAgICAgICAgICAgICAgYSA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjE7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGMgPSB0aGlzLmNvc0xvb2t1cFthXTtcclxuICAgICAgICAgICAgICAgICAgICBzID0gdGhpcy5zaW5Mb29rdXBbYV07XHJcbiAgICAgICAgICAgICAgICAgICAgYSArPSAoIDEgPDwgKHRoaXMubSAtIGkgLSAxKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IGo7IGsgPCB0aGlzLm47IGsgPSBrICsgbjIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSBjICogcmVhbFtrICsgbjFdIC0gcyAqIGltZ1trICsgbjFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0MiA9IHMgKiByZWFsW2sgKyBuMV0gKyBjICogaW1nW2sgKyBuMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxbayArIG4xXSA9IHJlYWxba10gLSB0MTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2sgKyBuMV0gPSBpbWdba10gLSB0MjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFtrXSA9IHJlYWxba10gKyB0MTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2tdID0gaW1nW2tdICsgdDI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcHVibGljIHByb2Nlc3ModDogQXJyYXk8Q29tcGxleD4pOiBBcnJheTxDb21wbGV4PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYWxzOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubik7XHJcbiAgICAgICAgICAgIGNvbnN0IGltZ3M6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uKTtcclxuICAgICAgICAgICAgY29uc3QgdHJhbnM6IEFycmF5PENvbXBsZXg+ID0gbmV3IEFycmF5PENvbXBsZXg+KHRoaXMubik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlYWxzW2ldID0gdFtpXS5yZWFsO1xyXG4gICAgICAgICAgICAgICAgaW1nc1tpXSA9IHRbaV0uaW1nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmZ0Q29vbGV5VHVrZXkocmVhbHMsIGltZ3MpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc1tpXSA9IG5ldyBDb21wbGV4KHJlYWxzW2ldLCBpbWdzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJhbnM7XHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgZXhwb3J0IGNsYXNzIERGVCB7XHJcblxyXG4gICAgICAgIHByaXZhdGUgbjogbnVtYmVyO1xyXG4gICAgICAgIHByaXZhdGUgbTogbnVtYmVyO1xyXG5cclxuICAgICAgICBwcml2YXRlIGNvc0xvb2t1cDogQXJyYXk8bnVtYmVyPjtcclxuICAgICAgICBwcml2YXRlIHNpbkxvb2t1cDogQXJyYXk8bnVtYmVyPjtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IobjogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubiA9IG47XHJcbiAgICAgICAgICAgIHRoaXMubSA9IE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XHJcblxyXG4gICAgICAgICAgICAvLyBpZihuICE9ICgxIDw8IG0pKXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwibGVuZ3RoIE4gbXVzdCBiZSBwb3dlciBvZiAyXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gbG9va3VwIHRhYmxlc1xyXG4gICAgICAgICAgICB0aGlzLmNvc0xvb2t1cCA9IG5ldyBBcnJheTxudW1iZXI+KG4gLyAyKTtcclxuICAgICAgICAgICAgdGhpcy5zaW5Mb29rdXAgPSBuZXcgQXJyYXk8bnVtYmVyPihuIC8gMik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyYyA9ICgtMiAqIE1hdGguUEkgKiBpKSAvIG47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvc0xvb2t1cFtpXSA9IE1hdGguY29zKGFyYyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbkxvb2t1cFtpXSA9IE1hdGguc2luKGFyYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBwcm9jZXNzUmVhbChzcmNCdWY6IEFycmF5PG51bWJlcj4pOiBBcnJheTxDb21wbGV4PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBzcmNCdWYuc2xpY2UoKTtcclxuICAgICAgICAgICAgY29uc3QgeSA9IG5ldyBBcnJheTxudW1iZXI+KHNyY0J1Zi5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5aSA9IDA7IHlpIDwgeS5sZW5ndGg7IHlpKyspIHtcclxuICAgICAgICAgICAgICAgIHlbeWldID0gMC4wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmZ0Q29vbGV5VHVrZXkoeCwgeSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJjID0gbmV3IEFycmF5PENvbXBsZXg+KHgubGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByY1tpXSA9IG5ldyBDb21wbGV4KHhbaV0sIHlbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByYztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBmZnRDb29sZXlUdWtleShyZWFsOiBBcnJheTxudW1iZXI+LCBpbWc6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IGogPSAwO1xyXG4gICAgICAgICAgICBsZXQgazogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgbjE6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IG4yOiBudW1iZXIgPSB0aGlzLm4gLyAyO1xyXG4gICAgICAgICAgICBsZXQgYTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgYzogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgczogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdDE6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IHQyOiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgdGhpcy5uIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBuMSA9IG4yO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gbjEpIHtcclxuICAgICAgICAgICAgICAgICAgICBqID0gaiAtIG4xO1xyXG4gICAgICAgICAgICAgICAgICAgIG4xID0gbjEgLyAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaiA9IGogKyBuMTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGopIHtcclxuICAgICAgICAgICAgICAgICAgICB0MSA9IHJlYWxbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhbFtpXSA9IHJlYWxbal07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhbFtqXSA9IHQxO1xyXG4gICAgICAgICAgICAgICAgICAgIHQxID0gaW1nW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGltZ1tpXSA9IGltZ1tqXTtcclxuICAgICAgICAgICAgICAgICAgICBpbWdbal0gPSB0MTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbjEgPSAwO1xyXG4gICAgICAgICAgICBuMiA9IDE7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLm07IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbjEgPSBuMjtcclxuICAgICAgICAgICAgICAgIG4yID0gbjIgKyBuMjtcclxuICAgICAgICAgICAgICAgIGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG4xOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5jb3NMb29rdXBbYV07XHJcbiAgICAgICAgICAgICAgICAgICAgcyA9IHRoaXMuc2luTG9va3VwW2FdO1xyXG4gICAgICAgICAgICAgICAgICAgIGEgKz0gMSA8PCAodGhpcy5tIC0gaSAtIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSBqOyBrIDwgdGhpcy5uOyBrID0gayArIG4yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gYyAqIHJlYWxbayArIG4xXSAtIHMgKiBpbWdbayArIG4xXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdDIgPSBzICogcmVhbFtrICsgbjFdICsgYyAqIGltZ1trICsgbjFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsW2sgKyBuMV0gPSByZWFsW2tdIC0gdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZ1trICsgbjFdID0gaW1nW2tdIC0gdDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxba10gPSByZWFsW2tdICsgdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZ1trXSA9IGltZ1trXSArIHQyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHB1YmxpYyBwcm9jZXNzKHQ6IEFycmF5PENvbXBsZXg+KTogQXJyYXk8Q29tcGxleD4ge1xyXG4gICAgICAgICAgICBjb25zdCByZWFsczogQXJyYXk8bnVtYmVyPiA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMubik7XHJcbiAgICAgICAgICAgIGNvbnN0IGltZ3M6IEFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLm4pO1xyXG4gICAgICAgICAgICBjb25zdCB0cmFuczogQXJyYXk8Q29tcGxleD4gPSBuZXcgQXJyYXk8Q29tcGxleD4odGhpcy5uKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVhbHNbaV0gPSB0W2ldLnJlYWw7XHJcbiAgICAgICAgICAgICAgICBpbWdzW2ldID0gdFtpXS5pbWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5mZnRDb29sZXlUdWtleShyZWFscywgaW1ncyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zW2ldID0gbmV3IENvbXBsZXgocmVhbHNbaV0sIGltZ3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cmFucztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuIl19