speechrecorderng 2.25.3 → 3.0.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.
- package/esm2020/lib/audio/array_audio_buffer.mjs +101 -0
- package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +86 -0
- package/esm2020/lib/audio/audio_data_holder.mjs +109 -0
- package/esm2020/lib/audio/audio_display.mjs +5 -5
- package/esm2020/lib/audio/audio_player.mjs +9 -7
- package/esm2020/lib/audio/capture/capture.mjs +6 -1
- package/esm2020/lib/audio/dsp/level_measure.mjs +97 -55
- package/esm2020/lib/audio/io/stream.mjs +3 -3
- package/esm2020/lib/audio/persistor.mjs +5 -6
- package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +265 -0
- package/esm2020/lib/audio/playback/player.mjs +184 -50
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +25 -13
- package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +2 -2
- package/esm2020/lib/audio/ui/audiosignal.mjs +206 -77
- package/esm2020/lib/audio/ui/container.mjs +14 -14
- package/esm2020/lib/audio/ui/livelevel.mjs +15 -2
- package/esm2020/lib/audio/ui/sonagram.mjs +343 -160
- package/esm2020/lib/io/stream.mjs +77 -1
- package/esm2020/lib/net/uploader.mjs +15 -3
- package/esm2020/lib/speechrecorder/recording.mjs +52 -7
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +99 -7
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +117 -101
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +34 -6
- package/esm2020/lib/speechrecorder/session/progress.mjs +2 -2
- package/esm2020/lib/speechrecorder/session/prompting.mjs +2 -2
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -3
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +182 -0
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +23 -10
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +12 -6
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +5 -5
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +13 -9
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +8 -5
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +118 -95
- package/esm2020/lib/speechrecorderng.component.mjs +2 -2
- package/esm2020/lib/speechrecorderng.module.mjs +5 -4
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/esm2020/lib/ui/recordingitem_display.mjs +2 -2
- package/fesm2015/speechrecorderng.mjs +2321 -743
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +2321 -753
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/lib/audio/array_audio_buffer.d.ts +15 -0
- package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -0
- package/lib/audio/audio_data_holder.d.ts +29 -0
- package/lib/audio/audio_display.d.ts +2 -1
- package/lib/audio/audio_player.d.ts +2 -1
- package/lib/audio/capture/capture.d.ts +2 -0
- package/lib/audio/dsp/level_measure.d.ts +2 -1
- package/lib/audio/persistor.d.ts +4 -3
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +24 -0
- package/lib/audio/playback/player.d.ts +6 -0
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +4 -1
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +2 -1
- package/lib/audio/ui/audiosignal.d.ts +3 -2
- package/lib/audio/ui/container.d.ts +3 -2
- package/lib/audio/ui/livelevel.d.ts +3 -1
- package/lib/audio/ui/sonagram.d.ts +3 -2
- package/lib/io/stream.d.ts +17 -0
- package/lib/net/uploader.d.ts +6 -1
- package/lib/speechrecorder/recording.d.ts +15 -3
- package/lib/speechrecorder/recordings/recordings.service.d.ts +2 -0
- package/lib/speechrecorder/session/audiorecorder.d.ts +2 -7
- package/lib/speechrecorder/session/basicrecorder.d.ts +9 -3
- package/lib/speechrecorder/session/progress.d.ts +1 -1
- package/lib/speechrecorder/session/prompting.d.ts +1 -1
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +3 -1
- package/lib/speechrecorder/session/recording_file_cache.d.ts +30 -0
- package/lib/speechrecorder/session/recording_list.d.ts +3 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +2 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -0
- package/lib/speechrecorder/session/sessionmanager.d.ts +5 -11
- package/lib/speechrecorderng.module.d.ts +2 -1
- package/lib/spr.module.version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
9
9
|
this._playFramePosition = null;
|
|
10
10
|
this.worker = null;
|
|
11
11
|
this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction);
|
|
12
|
-
this.
|
|
12
|
+
this._audioDataHolder = null;
|
|
13
13
|
this._bgColor = 'black';
|
|
14
14
|
this._selectColor = 'rgba(255,255,0,0.8)';
|
|
15
15
|
}
|
|
@@ -62,25 +62,26 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
62
62
|
*/
|
|
63
63
|
workerFunction() {
|
|
64
64
|
addEventListener('message', ({ data }) => {
|
|
65
|
-
let audioData = data.audioData;
|
|
66
|
-
let
|
|
67
|
-
let
|
|
68
|
-
let
|
|
69
|
-
let vw = data.vw;
|
|
70
|
-
let chs = data.chs;
|
|
71
|
-
let
|
|
65
|
+
let audioData = data.audioData; // audio data part required to render view port
|
|
66
|
+
let auOffset = data.audioDataOffset;
|
|
67
|
+
let l = data.l; // left pixel position of view port
|
|
68
|
+
let w = data.w; // width of viewport
|
|
69
|
+
let vw = data.vw; // total width of (virtual) audio view (not viewport width)
|
|
70
|
+
let chs = data.chs; // number of channels
|
|
71
|
+
let dataFrameLength = data.audioDataFrameLength; // frame length of audio data part required for view port
|
|
72
|
+
let frameLength = data.frameLength; // total frame length (of audio clip)
|
|
73
|
+
//console.debug("W: left: "+l+", w:"+w+", vw: "+vw+", chs: "+chs+", frameLength: "+frameLength);
|
|
72
74
|
let psMinMax = new Float32Array(0);
|
|
73
|
-
if (audioData && w >= 0 && vw > 0) {
|
|
75
|
+
if (audioData && audioData.length > 0 && w >= 0 && vw > 0) {
|
|
74
76
|
let framesPerPixel = frameLength / vw;
|
|
75
|
-
let y = 0;
|
|
76
77
|
let pointsLen = w * chs;
|
|
77
78
|
// one for min one for max
|
|
78
79
|
let arrLen = pointsLen * 2;
|
|
79
80
|
psMinMax = new Float32Array(arrLen);
|
|
80
81
|
let chFramePos = 0;
|
|
82
|
+
let chFrameLength = audioData.length / chs;
|
|
81
83
|
for (let ch = 0; ch < chs; ch++) {
|
|
82
|
-
|
|
83
|
-
chFramePos = ch * frameLength;
|
|
84
|
+
chFramePos = ch * chFrameLength;
|
|
84
85
|
for (let pii = 0; pii < w; pii++) {
|
|
85
86
|
let virtPii = l + pii;
|
|
86
87
|
let pMin = Infinity;
|
|
@@ -90,24 +91,28 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
90
91
|
for (let ai = 0; ai < framesPerPixel; ai++) {
|
|
91
92
|
let framePos = pixelFramePos + ai;
|
|
92
93
|
let a = 0;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
94
|
+
let bufPos = framePos - auOffset;
|
|
95
|
+
//let bufPos=framePos;
|
|
96
|
+
if (bufPos >= 0 && bufPos < audioData.length) {
|
|
97
|
+
a = audioData[bufPos];
|
|
98
|
+
//console.debug("W: ch: "+ch+", pixelFramePos: "+pixelFramePos+", framePos: "+framePos+", auOffset: "+auOffset+", bufPos: "+bufPos+", audioData.length: "+audioData.length+", a: "+a);
|
|
99
|
+
if (a < pMin) {
|
|
100
|
+
pMin = a;
|
|
101
|
+
}
|
|
102
|
+
if (a > pMax) {
|
|
103
|
+
pMax = a;
|
|
104
|
+
}
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
107
|
let psMinPos = ch * w + pii;
|
|
104
108
|
psMinMax[psMinPos] = pMin;
|
|
105
109
|
let psMaxPos = pointsLen + psMinPos;
|
|
106
110
|
psMinMax[psMaxPos] = pMax;
|
|
111
|
+
//console.debug("psMinMax["+psMinPos+"]="+pMin+",psMinMax["+psMaxPos+"]="+pMax);
|
|
107
112
|
}
|
|
108
113
|
}
|
|
109
114
|
}
|
|
110
|
-
postMessage({ psMinMax: psMinMax, l: data.l,
|
|
115
|
+
postMessage({ psMinMax: psMinMax, l: data.l, w: data.w, chs: data.chs, eod: data.eod }, [psMinMax.buffer]);
|
|
111
116
|
});
|
|
112
117
|
}
|
|
113
118
|
startDraw(clear = true) {
|
|
@@ -135,41 +140,143 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
135
140
|
if (this.bounds && this.bounds.dimension) {
|
|
136
141
|
let w = Math.round(this.bounds.dimension.width);
|
|
137
142
|
let h = Math.round(this.bounds.dimension.height);
|
|
138
|
-
if (this.
|
|
143
|
+
if (this._audioDataHolder && w > 0 && h > 0) {
|
|
139
144
|
//this.wo = new Worker('./audiosignal.worker.js',{type: 'module'});
|
|
140
145
|
this.worker = new Worker(this.workerURL);
|
|
141
146
|
//this.wo = new Worker('worker/audiosignal.worker.ts');
|
|
142
147
|
//let Worker = require('worker!../../../workers/uploader/main');
|
|
143
|
-
let chs = this.
|
|
144
|
-
let
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
let
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
//let
|
|
148
|
+
let chs = this._audioDataHolder.numberOfChannels;
|
|
149
|
+
let leftPos = Math.round(this.bounds.position.left);
|
|
150
|
+
let renderPos = leftPos;
|
|
151
|
+
let vw = Math.round(this.virtualDimension.width);
|
|
152
|
+
let frameLength = this._audioDataHolder.frameLen;
|
|
153
|
+
let framesPerPixel = Math.ceil(frameLength / vw);
|
|
154
|
+
let audioBuffer = this._audioDataHolder.buffer;
|
|
155
|
+
//let arrayAudioBuffer=this._audioDataHolder.arrayBuffer;
|
|
156
|
+
let arrAbBuf;
|
|
157
|
+
//let ais:ArrayAudioBufferInputStream|null=null;
|
|
158
|
+
//let aisBuf:Float32Array[]|null=null;
|
|
159
|
+
let psMinMax = null;
|
|
153
160
|
if (this.worker) {
|
|
154
161
|
this.worker.onmessage = (me) => {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
162
|
+
if (me.data.eod === true) {
|
|
163
|
+
let psMinMaxTmp;
|
|
164
|
+
if (psMinMax) {
|
|
165
|
+
psMinMaxTmp = psMinMax;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
psMinMaxTmp = me.data.psMinMax;
|
|
169
|
+
}
|
|
170
|
+
this.drawRendered(leftPos, w, h, chs, psMinMaxTmp);
|
|
171
|
+
if (this.worker) {
|
|
172
|
+
this.worker.terminate();
|
|
173
|
+
}
|
|
174
|
+
this.worker = null;
|
|
175
|
+
}
|
|
176
|
+
else if (this._audioDataHolder && arrAbBuf) {
|
|
177
|
+
let rw = me.data.w;
|
|
178
|
+
let rPointsLen = chs * rw;
|
|
179
|
+
let pointsLen = chs * w;
|
|
180
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
181
|
+
if (psMinMax) {
|
|
182
|
+
let rBasePos = ch * rw;
|
|
183
|
+
let basePos = ch * w;
|
|
184
|
+
let rPosMin = rBasePos;
|
|
185
|
+
let rPosMax = rPointsLen + rPosMin;
|
|
186
|
+
let posMin = basePos + (renderPos - leftPos);
|
|
187
|
+
let posMax = pointsLen + posMin;
|
|
188
|
+
psMinMax[posMin] = me.data.psMinMax[rPosMin];
|
|
189
|
+
//console.debug('Min: ('+pos+'): '+me.data.psMinMax[0]);
|
|
190
|
+
psMinMax[posMax] = me.data.psMinMax[rPosMax];
|
|
191
|
+
// console.debug('Max: ('+(pointsLen+pos)+'): '+me.data.psMinMax[1]);
|
|
192
|
+
//console.debug("psMinMax["+posMin+"]="+me.data.psMinMax[rPosMin]+" (rPosMin="+rPosMin+"),psMinMax["+posMax+"]="+me.data.psMinMax[rPosMax]);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
let eod = false;
|
|
196
|
+
renderPos++;
|
|
197
|
+
let ad;
|
|
198
|
+
let leftFramePos = Math.floor(frameLength * renderPos / vw);
|
|
199
|
+
if (renderPos < leftPos + w) {
|
|
200
|
+
let read = this._audioDataHolder.frames(leftFramePos, framesPerPixel, arrAbBuf);
|
|
201
|
+
//console.debug("First read frame: "+arrAbBuf[0][0]);
|
|
202
|
+
ad = new Float32Array(chs * framesPerPixel);
|
|
203
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
204
|
+
ad.set(arrAbBuf[ch], ch * framesPerPixel);
|
|
205
|
+
}
|
|
206
|
+
eod = (read <= 0);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
ad = new Float32Array();
|
|
210
|
+
eod = true;
|
|
211
|
+
}
|
|
212
|
+
let adBuf = ad.buffer;
|
|
213
|
+
if (this.worker) {
|
|
214
|
+
this.worker.postMessage({
|
|
215
|
+
l: renderPos,
|
|
216
|
+
w: me.data.w,
|
|
217
|
+
h: h,
|
|
218
|
+
vw: vw,
|
|
219
|
+
chs: chs,
|
|
220
|
+
frameLength: frameLength,
|
|
221
|
+
audioData: ad,
|
|
222
|
+
audioDataOffset: leftFramePos,
|
|
223
|
+
eod: eod
|
|
224
|
+
}, [adBuf]);
|
|
225
|
+
}
|
|
159
226
|
}
|
|
160
|
-
this.worker = null;
|
|
161
227
|
};
|
|
162
228
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
229
|
+
if (audioBuffer && audioBuffer.length * audioBuffer.numberOfChannels < AudioCanvasLayerComponent.ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD) {
|
|
230
|
+
// Render whole clip at once
|
|
231
|
+
arrAbBuf = null;
|
|
232
|
+
psMinMax = null;
|
|
233
|
+
let ad = new Float32Array(chs * frameLength);
|
|
234
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
235
|
+
ad.set(audioBuffer.getChannelData(ch), ch * frameLength);
|
|
236
|
+
}
|
|
237
|
+
this.worker.postMessage({
|
|
238
|
+
l: leftPos,
|
|
239
|
+
w: w,
|
|
240
|
+
vw: vw,
|
|
241
|
+
chs: chs,
|
|
242
|
+
frameLength: frameLength,
|
|
243
|
+
audioData: ad,
|
|
244
|
+
audioDataOffset: 0,
|
|
245
|
+
eod: true
|
|
246
|
+
}, [ad.buffer]);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// Render pixel by pixel
|
|
250
|
+
if (w > 0) {
|
|
251
|
+
if (framesPerPixel > 0) {
|
|
252
|
+
let rw = 1;
|
|
253
|
+
//ais = new ArrayAudioBufferInputStream(arrayAudioBuffer);
|
|
254
|
+
arrAbBuf = new Array(chs);
|
|
255
|
+
psMinMax = new Float32Array(chs * w * 2);
|
|
256
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
257
|
+
arrAbBuf[ch] = new Float32Array(framesPerPixel);
|
|
258
|
+
}
|
|
259
|
+
let leftFramePos = Math.floor(frameLength * renderPos / vw);
|
|
260
|
+
let auOffset = leftFramePos; // should always be 0
|
|
261
|
+
//let read=arrayAudioBuffer.frames(leftFramePos,framesPerPixel,arrAbBuf);
|
|
262
|
+
let read = this._audioDataHolder.frames(leftFramePos, framesPerPixel, arrAbBuf);
|
|
263
|
+
let ad = new Float32Array(chs * framesPerPixel);
|
|
264
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
265
|
+
ad.set(arrAbBuf[ch], ch * framesPerPixel);
|
|
266
|
+
}
|
|
267
|
+
this.worker.postMessage({
|
|
268
|
+
l: renderPos,
|
|
269
|
+
w: rw,
|
|
270
|
+
vw: vw,
|
|
271
|
+
chs: chs,
|
|
272
|
+
frameLength: frameLength,
|
|
273
|
+
audioData: ad,
|
|
274
|
+
audioDataOffset: auOffset,
|
|
275
|
+
eod: (read <= 0)
|
|
276
|
+
}, [ad.buffer]);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
173
280
|
}
|
|
174
281
|
else {
|
|
175
282
|
let g = this.signalCanvas.getContext("2d");
|
|
@@ -179,42 +286,42 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
179
286
|
}
|
|
180
287
|
}
|
|
181
288
|
}
|
|
182
|
-
drawRendered(
|
|
289
|
+
drawRendered(left, w, h, chs, psMinMax) {
|
|
183
290
|
this.drawBg();
|
|
184
|
-
this.signalCanvas.style.left =
|
|
185
|
-
this.signalCanvas.width =
|
|
186
|
-
this.signalCanvas.height =
|
|
291
|
+
this.signalCanvas.style.left = left.toString() + 'px';
|
|
292
|
+
this.signalCanvas.width = w;
|
|
293
|
+
this.signalCanvas.height = h;
|
|
187
294
|
let g = this.signalCanvas.getContext("2d");
|
|
188
295
|
if (g) {
|
|
189
|
-
g.clearRect(0, 0,
|
|
296
|
+
g.clearRect(0, 0, w, h);
|
|
190
297
|
//g.fillStyle = "black";
|
|
191
298
|
//g.fillRect(0, 0, me.data.w, me.data.h);
|
|
192
|
-
let pointsLen =
|
|
299
|
+
let pointsLen = w * chs;
|
|
193
300
|
// one for min one for max
|
|
194
301
|
let arrLen = pointsLen * 2;
|
|
195
|
-
if (this.
|
|
302
|
+
if (this._audioDataHolder) {
|
|
196
303
|
let std = Date.now();
|
|
197
|
-
let chH =
|
|
304
|
+
let chH = h / chs;
|
|
198
305
|
let y = 0;
|
|
199
|
-
for (let ch = 0; ch <
|
|
306
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
200
307
|
let x = 0;
|
|
201
|
-
let psMinPos = ch *
|
|
308
|
+
let psMinPos = ch * w;
|
|
202
309
|
let psMaxPos = pointsLen + psMinPos;
|
|
203
310
|
g.fillStyle = 'green';
|
|
204
311
|
g.strokeStyle = 'green';
|
|
205
312
|
// draw audio signal as single polygon
|
|
206
313
|
g.beginPath();
|
|
207
|
-
g.moveTo(0, y + (chH / 2) +
|
|
208
|
-
for (let pii = 0; pii <
|
|
209
|
-
let psMax =
|
|
314
|
+
g.moveTo(0, y + (chH / 2) + psMinMax[psMaxPos] * chH / 2);
|
|
315
|
+
for (let pii = 0; pii < w; pii++) {
|
|
316
|
+
let psMax = psMinMax[psMaxPos + pii];
|
|
210
317
|
let pv = psMax * chH / 2;
|
|
211
318
|
let yd = y + (chH / 2) - pv;
|
|
212
319
|
//console.log("LineTo: : "+pii+" "+yd)
|
|
213
320
|
g.lineTo(pii, yd);
|
|
214
321
|
}
|
|
215
|
-
let revPixelStart =
|
|
322
|
+
let revPixelStart = w - 1;
|
|
216
323
|
for (let pii = revPixelStart; pii >= 0; pii--) {
|
|
217
|
-
let psMin =
|
|
324
|
+
let psMin = psMinMax[psMinPos + pii];
|
|
218
325
|
let pv = psMin * chH / 2;
|
|
219
326
|
let yd = y + (chH / 2) - pv;
|
|
220
327
|
//console.log("LineTo: : "+pii+" "+yd)
|
|
@@ -238,13 +345,23 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
238
345
|
g.clearRect(0, 0, w, h);
|
|
239
346
|
//g.fillStyle = "black";
|
|
240
347
|
//g.fillRect(0, 0, w, h);
|
|
241
|
-
if (this.
|
|
348
|
+
if (this._audioDataHolder) {
|
|
242
349
|
let std = Date.now();
|
|
243
|
-
let chs = this.
|
|
350
|
+
let chs = this._audioDataHolder.numberOfChannels;
|
|
244
351
|
let chH = h / chs;
|
|
245
|
-
let frameLength = this.
|
|
352
|
+
let frameLength = this._audioDataHolder.frameLen;
|
|
246
353
|
let framesPerPixel = frameLength / w;
|
|
247
354
|
let y = 0;
|
|
355
|
+
let ais = null;
|
|
356
|
+
let audioBuffer = this._audioDataHolder.buffer;
|
|
357
|
+
let aisBuffer = null;
|
|
358
|
+
if (!audioBuffer) {
|
|
359
|
+
ais = this._audioDataHolder.audioInputStream();
|
|
360
|
+
aisBuffer = new Array(chs);
|
|
361
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
362
|
+
aisBuffer[ch] = new Float32Array(framesPerPixel);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
248
365
|
for (let ch = 0; ch < chs; ch++) {
|
|
249
366
|
let x = 0;
|
|
250
367
|
let psMin = new Float32Array(w);
|
|
@@ -253,20 +370,33 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
253
370
|
for (let pii = 0; pii < w; pii++) {
|
|
254
371
|
let pMin = 0;
|
|
255
372
|
let pMax = 0;
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
pMin
|
|
373
|
+
if (audioBuffer) {
|
|
374
|
+
// calculate pixel min/max amplitude
|
|
375
|
+
for (let ai = 0; ai < framesPerPixel; ai++) {
|
|
376
|
+
//let framePos=(pii*framesPerPixel)+ai;
|
|
377
|
+
let a = audioBuffer.getChannelData(ch)[framePos++];
|
|
378
|
+
if (a < pMin) {
|
|
379
|
+
pMin = a;
|
|
380
|
+
}
|
|
381
|
+
if (a > pMax) {
|
|
382
|
+
pMax = a;
|
|
383
|
+
}
|
|
262
384
|
}
|
|
263
|
-
|
|
264
|
-
|
|
385
|
+
}
|
|
386
|
+
else if (ais && aisBuffer) {
|
|
387
|
+
let r = ais.read(aisBuffer);
|
|
388
|
+
for (let ai = 0; ai < r; ai++) {
|
|
389
|
+
let a = aisBuffer[ch][ai];
|
|
390
|
+
if (a < pMin) {
|
|
391
|
+
pMin = a;
|
|
392
|
+
}
|
|
393
|
+
if (a > pMax) {
|
|
394
|
+
pMax = a;
|
|
395
|
+
}
|
|
265
396
|
}
|
|
266
397
|
}
|
|
267
398
|
psMin[pii] = pMin;
|
|
268
399
|
psMax[pii] = pMax;
|
|
269
|
-
//console.log("Min: ", pMin, " max: ", pMax);
|
|
270
400
|
}
|
|
271
401
|
g.fillStyle = 'green';
|
|
272
402
|
g.strokeStyle = 'green';
|
|
@@ -291,12 +421,11 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
291
421
|
g.stroke();
|
|
292
422
|
y += chH;
|
|
293
423
|
}
|
|
294
|
-
//this.drawPlayPosition();
|
|
295
424
|
}
|
|
296
425
|
}
|
|
297
426
|
}
|
|
298
427
|
setData(audioData) {
|
|
299
|
-
this.
|
|
428
|
+
this._audioDataHolder = audioData;
|
|
300
429
|
this.playFramePosition = 0;
|
|
301
430
|
}
|
|
302
431
|
}
|
|
@@ -335,4 +464,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
|
|
|
335
464
|
type: ViewChild,
|
|
336
465
|
args: ['marker', { static: true }]
|
|
337
466
|
}] } });
|
|
338
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDOztBQTBCL0MsTUFBTSxPQUFPLFdBQVksU0FBUSx5QkFBeUI7SUFjeEQsWUFBb0IsR0FBZTtRQUNqQyxLQUFLLEVBQUUsQ0FBQztRQURVLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFKM0IsdUJBQWtCLEdBQWMsSUFBSSxDQUFDO1FBTTNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFDLHFCQUFxQixDQUFBO0lBRXpDLENBQUM7SUFFRCxlQUFlO1FBRWIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDO1FBQzVE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QUVELE9BQU8sQ0FBQyxTQUE2QjtRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7O3lHQXhXVSxXQUFXOzZGQUFYLFdBQVcseVRBbkJaOzs7OzswQ0FLOEI7NEZBYzdCLFdBQVc7a0JBdEJ2QixTQUFTO21CQUFDO29CQUVULFFBQVEsRUFBRSxjQUFjO29CQUN4QixRQUFRLEVBQUU7Ozs7OzBDQUs4QjtvQkFFeEMsTUFBTSxFQUFFLENBQUM7O01BRUwsRUFBQzs7Ozs7OztJQU9ILENBQUM7aUJBRUo7aUdBSzZDLG9CQUFvQjtzQkFBL0QsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNILGdCQUFnQjtzQkFBdEQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QXVkaW9DYW52YXNMYXllckNvbXBvbmVudH0gZnJvbSBcIi4vYXVkaW9fY2FudmFzX2xheWVyX2NvbXBcIjtcclxuaW1wb3J0IHtXb3JrZXJIZWxwZXJ9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlOiBhbnksIHRyYW5zZmVyOiBBcnJheTxhbnk+KTogdm9pZDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLXNpZ25hbCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxjYW52YXMgI2JnIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+XHJcbiAgICA8Y2FudmFzICNhdWRpb1NpZ25hbCBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGNhbnZhcyAjY3Vyc29yIGhlaWdodD1cIjEwXCIgKG1vdXNlZG93bik9XCJzZWxlY3Rpb25TdGFydCgkZXZlbnQpXCIgKG1vdXNlb3Zlcik9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50KVwiIChtb3VzZW1vdmUpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50LCBmYWxzZSlcIj48L2NhbnZhcz5cclxuICAgIDxjYW52YXMgI21hcmtlciBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPmAsXHJcblxyXG4gIHN0eWxlczogW2A6aG9zdHtcclxuICAgICAgbWluLWhlaWdodDogMHB4O1xyXG4gICAgfWAsYGNhbnZhcyB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9TaWduYWwgZXh0ZW5kcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50e1xyXG5cclxuICBuOiBhbnk7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICBAVmlld0NoaWxkKCdhdWRpb1NpZ25hbCcsIHsgc3RhdGljOiB0cnVlIH0pIGF1ZGlvU2lnbmFsQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdtYXJrZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBwbGF5UG9zQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBzaWduYWxDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgd29ya2VyOiBXb3JrZXIgfCBudWxsO1xyXG4gIHByaXZhdGUgd29ya2VyVVJMOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy53b3JrZXIgPSBudWxsO1xyXG4gICAgdGhpcy53b3JrZXJVUkwgPSBXb3JrZXJIZWxwZXIuYnVpbGRXb3JrZXJCbG9iVVJMKHRoaXMud29ya2VyRnVuY3Rpb24pXHJcbiAgICB0aGlzLl9hdWRpb0RhdGEgPSBudWxsO1xyXG4gICAgdGhpcy5fYmdDb2xvcj0nYmxhY2snO1xyXG4gICAgdGhpcy5fc2VsZWN0Q29sb3I9J3JnYmEoMjU1LDI1NSwwLDAuOCknXHJcblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cclxuICAgIHRoaXMuY2UgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5iZ0NhbnZhcyA9IHRoaXMuYmdDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuYmdDYW52YXMuc3R5bGUuekluZGV4ID0gJzEnO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMgPSB0aGlzLmF1ZGlvU2lnbmFsQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcy5zdHlsZS56SW5kZXggPSAnMic7XHJcbiAgICB0aGlzLm1hcmtlckNhbnZhcyA9IHRoaXMucGxheVBvc0NhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5tYXJrZXJDYW52YXMuc3R5bGUuekluZGV4ID0gJzMnO1xyXG4gICAgdGhpcy5jdXJzb3JDYW52YXMgPSB0aGlzLmN1cnNvckNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5jdXJzb3JDYW52YXMuc3R5bGUuekluZGV4ID0gJzQnO1xyXG5cclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzBdPXRoaXMuYmdDYW52YXM7XHJcbiAgICB0aGlzLmNhbnZhc0xheWVyc1sxXT10aGlzLnNpZ25hbENhbnZhcztcclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzJdPXRoaXMuY3Vyc29yQ2FudmFzO1xyXG4gICAgdGhpcy5jYW52YXNMYXllcnNbM109dGhpcy5tYXJrZXJDYW52YXM7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYXlGcmFtZVBvc2l0aW9uKCk6IG51bWJlciB8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihwbGF5RnJhbWVQb3NpdGlvbjogbnVtYmVyfG51bGwpIHtcclxuICAgIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZHJhd1BsYXlQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1hcmtlckNhbnZhcykge1xyXG4gICAgICBsZXQgdyA9IHRoaXMubWFya2VyQ2FudmFzLndpZHRoO1xyXG4gICAgICBsZXQgaCA9IHRoaXMubWFya2VyQ2FudmFzLmhlaWdodDtcclxuICAgICAgbGV0IGcgPSB0aGlzLm1hcmtlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgaWYodGhpcy5fcGxheUZyYW1lUG9zaXRpb24pIHtcclxuICAgICAgICAgIGxldCBwaXhlbFBvcyA9IHRoaXMuZnJhbWVUb1ZpZXdQb3J0WFBpeGVsUG9zaXRpb24odGhpcy5fcGxheUZyYW1lUG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKHBpeGVsUG9zKSB7XHJcbiAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAncmVkJztcclxuICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgZy5tb3ZlVG8ocGl4ZWxQb3MsIDApO1xyXG4gICAgICAgICAgICBnLmxpbmVUbyhwaXhlbFBvcywgaCk7XHJcbiAgICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqICBNZXRob2QgdXNlZCBhcyB3b3JrZXIgY29kZS5cclxuICAgKi9cclxuICB3b3JrZXJGdW5jdGlvbigpIHtcclxuICAgIGFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhIH0pID0+IHtcclxuXHJcbiAgICAgIGxldCBhdWRpb0RhdGEgPSBkYXRhLmF1ZGlvRGF0YTtcclxuICAgICAgbGV0IGw9IGRhdGEubDtcclxuICAgICAgbGV0IHcgPSBkYXRhLnc7XHJcbiAgICAgIGxldCBoID0gZGF0YS5oO1xyXG4gICAgICBsZXQgdncgPSBkYXRhLnZ3O1xyXG4gICAgICBsZXQgY2hzID0gZGF0YS5jaHM7XHJcbiAgICAgIGxldCBmcmFtZUxlbmd0aCA9IGRhdGEuZnJhbWVMZW5ndGg7XHJcbiAgICAgIGxldCBwc01pbk1heD0gbmV3IEZsb2F0MzJBcnJheSgwKTtcclxuXHJcbiAgICAgIGlmKGF1ZGlvRGF0YSAmJiB3Pj0wICYmIHZ3PjApIHtcclxuXHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB2dztcclxuXHJcbiAgICAgICAgbGV0IHkgPSAwO1xyXG4gICAgICAgIGxldCBwb2ludHNMZW4gPSB3ICogY2hzO1xyXG4gICAgICAgIC8vIG9uZSBmb3IgbWluIG9uZSBmb3IgbWF4XHJcbiAgICAgICAgbGV0IGFyckxlbiA9IHBvaW50c0xlbiAqIDI7XHJcbiAgICAgICAgcHNNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KGFyckxlbik7XHJcbiAgICAgICAgbGV0IGNoRnJhbWVQb3MgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgIGxldCB4ID0gMDtcclxuXHJcbiAgICAgICAgICBjaEZyYW1lUG9zID0gY2ggKiBmcmFtZUxlbmd0aDtcclxuICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB2aXJ0UGlpPWwrcGlpO1xyXG4gICAgICAgICAgICBsZXQgcE1pbiA9IEluZmluaXR5O1xyXG4gICAgICAgICAgICBsZXQgcE1heCA9IC1JbmZpbml0eTtcclxuICAgICAgICAgICAgbGV0IHBpeGVsRnJhbWVQb3MgPSBNYXRoLnJvdW5kKGNoRnJhbWVQb3MgKyAodmlydFBpaSAqIGZyYW1lc1BlclBpeGVsKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgcGl4ZWwgbWluL21heCBhbXBsaXR1ZGVcclxuICAgICAgICAgICAgZm9yIChsZXQgYWkgPSAwOyBhaSA8IGZyYW1lc1BlclBpeGVsOyBhaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGZyYW1lUG9zID0gcGl4ZWxGcmFtZVBvcyArIGFpO1xyXG5cclxuICAgICAgICAgICAgICBsZXQgYSA9IDA7XHJcbiAgICAgICAgICAgICAgaWYoZnJhbWVQb3M+PTAgJiYgZnJhbWVQb3M8YXVkaW9EYXRhLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICBhPWF1ZGlvRGF0YVtmcmFtZVBvc107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChhIDwgcE1pbikge1xyXG4gICAgICAgICAgICAgICAgcE1pbiA9IGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChhID4gcE1heCkge1xyXG4gICAgICAgICAgICAgICAgcE1heCA9IGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcHNNaW5Qb3MgPSBjaCAqIHcgKyBwaWk7XHJcbiAgICAgICAgICAgIHBzTWluTWF4W3BzTWluUG9zXSA9IHBNaW47XHJcbiAgICAgICAgICAgIGxldCBwc01heFBvcyA9IHBvaW50c0xlbiArIHBzTWluUG9zO1xyXG4gICAgICAgICAgICBwc01pbk1heFtwc01heFBvc10gPSBwTWF4O1xyXG5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgcG9zdE1lc3NhZ2Uoe3BzTWluTWF4OiBwc01pbk1heCwgbDpkYXRhLmwsdDpkYXRhLnQsdzogZGF0YS53LCBoOiBkYXRhLmgsIGNoczogZGF0YS5jaHN9LCBbcHNNaW5NYXguYnVmZmVyXSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc3RhcnREcmF3KGNsZWFyID0gdHJ1ZSkge1xyXG4gICAgaWYgKGNsZWFyKSB7XHJcbiAgICAgIGlmKHRoaXMuYm91bmRzKSB7XHJcbiAgICAgICAgdGhpcy5zaWduYWxDYW52YXMuc3R5bGUubGVmdCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCkudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgICAgdGhpcy5zaWduYWxDYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgICAgdGhpcy5zaWduYWxDYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgbGV0IGcgPSB0aGlzLnNpZ25hbENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgaWYgKGcpIHtcclxuICAgICAgICAgIC8vZy5jbGVhclJlY3QoMCwgMCx3LCBoKTtcclxuICAgICAgICAgIGcuZmlsbFN0eWxlID0gXCJibGFja1wiO1xyXG4gICAgICAgICAgZy5maWxsUmVjdCgwLCAwLCBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCksIE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydFJlbmRlcigpO1xyXG4gICAgdGhpcy5kcmF3Q3Vyc29yTGF5ZXIoKVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc3RhcnRSZW5kZXIoKSB7XHJcblxyXG4gICAgaWYgKHRoaXMud29ya2VyKSB7XHJcbiAgICAgIHRoaXMud29ya2VyLnRlcm1pbmF0ZSgpO1xyXG4gICAgICB0aGlzLndvcmtlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ib3VuZHMgJiYgdGhpcy5ib3VuZHMuZGltZW5zaW9uKSB7XHJcblxyXG4gICAgICBsZXQgdyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgbGV0IGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YSAmJiB3PjAgJiYgaD4wKSB7XHJcbiAgICAgICAgLy90aGlzLndvID0gbmV3IFdvcmtlcignLi9hdWRpb3NpZ25hbC53b3JrZXIuanMnLHt0eXBlOiAnbW9kdWxlJ30pO1xyXG4gICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcih0aGlzLndvcmtlclVSTCk7XHJcbiAgICAgICAgLy90aGlzLndvID0gbmV3IFdvcmtlcignd29ya2VyL2F1ZGlvc2lnbmFsLndvcmtlci50cycpO1xyXG5cclxuICAgICAgICAvL2xldCBXb3JrZXIgPSByZXF1aXJlKCd3b3JrZXIhLi4vLi4vLi4vd29ya2Vycy91cGxvYWRlci9tYWluJyk7XHJcbiAgICAgICAgbGV0IGNocyA9IHRoaXMuX2F1ZGlvRGF0YS5udW1iZXJPZkNoYW5uZWxzO1xyXG5cclxuICAgICAgICBsZXQgZnJhbWVMZW5ndGggPSB0aGlzLl9hdWRpb0RhdGEuZ2V0Q2hhbm5lbERhdGEoMCkubGVuZ3RoO1xyXG4gICAgICAgIC8vIGlmKGZyYW1lTGVuZ3RoICE9IHRoaXMuYXVkaW9EYXRhLmdldENoYW5uZWxEYXRhKDEpLmxlbmd0aCl7XHJcbiAgICAgICAgLy8gICBhbGVydChcIlVuZ2xlaWNoZSBMw6RuZ2VcIik7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIGxldCBhZCA9IG5ldyBGbG9hdDMyQXJyYXkoY2hzICogZnJhbWVMZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgIGFkLnNldCh0aGlzLl9hdWRpb0RhdGEuZ2V0Q2hhbm5lbERhdGEoY2gpLCBjaCAqIGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9sZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgdGhpcy53b3JrZXIub25tZXNzYWdlID0gKG1lKSA9PiB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJBcyByZW5kZXJ0aW1lOiBcIiwgRGF0ZS5ub3coKSAtIHN0YXJ0KTtcclxuICAgICAgICAgICAgdGhpcy5kcmF3UmVuZGVyZWQobWUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLndvcmtlciA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIGw6IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCksXHJcbiAgICAgICAgICB0OiBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLnRvcCksXHJcbiAgICAgICAgICB3OiB3LFxyXG4gICAgICAgICAgaDogaCxcclxuICAgICAgICAgIHZ3OiBNYXRoLnJvdW5kKHRoaXMudmlydHVhbERpbWVuc2lvbi53aWR0aCksXHJcbiAgICAgICAgICBjaHM6IGNocyxcclxuICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgIGF1ZGlvRGF0YTogYWRcclxuICAgICAgICB9LCBbYWQuYnVmZmVyXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGcgPSB0aGlzLnNpZ25hbENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgaWYgKGcpIHtcclxuICAgICAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGRyYXdSZW5kZXJlZChtZTogTWVzc2FnZUV2ZW50KSB7XHJcbiAgICB0aGlzLmRyYXdCZygpO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMuc3R5bGUubGVmdD1tZS5kYXRhLmwudG9TdHJpbmcoKSsncHgnO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMud2lkdGggPSBtZS5kYXRhLnc7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcy5oZWlnaHQgPSBtZS5kYXRhLmg7XHJcbiAgICBsZXQgZyA9IHRoaXMuc2lnbmFsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgIGlmIChnKSB7XHJcbiAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIG1lLmRhdGEudywgbWUuZGF0YS5oKTtcclxuICAgICAgLy9nLmZpbGxTdHlsZSA9IFwiYmxhY2tcIjtcclxuICAgICAgLy9nLmZpbGxSZWN0KDAsIDAsIG1lLmRhdGEudywgbWUuZGF0YS5oKTtcclxuICAgICAgbGV0IHBvaW50c0xlbiA9IG1lLmRhdGEudyAqIG1lLmRhdGEuY2hzO1xyXG4gICAgICAvLyBvbmUgZm9yIG1pbiBvbmUgZm9yIG1heFxyXG4gICAgICBsZXQgYXJyTGVuID0gcG9pbnRzTGVuICogMjtcclxuICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YSkge1xyXG4gICAgICAgIGxldCBzdGQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICBsZXQgY2hIID0gbWUuZGF0YS5oIC8gbWUuZGF0YS5jaHM7XHJcblxyXG4gICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgbWUuZGF0YS5jaHM7IGNoKyspIHtcclxuICAgICAgICAgIGxldCB4ID0gMDtcclxuXHJcbiAgICAgICAgICBsZXQgcHNNaW5Qb3MgPSBjaCAqIG1lLmRhdGEudztcclxuICAgICAgICAgIGxldCBwc01heFBvcyA9IHBvaW50c0xlbiArIHBzTWluUG9zO1xyXG5cclxuICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ2dyZWVuJztcclxuICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xyXG5cclxuICAgICAgICAgIC8vIGRyYXcgYXVkaW8gc2lnbmFsIGFzIHNpbmdsZSBwb2x5Z29uXHJcbiAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgZy5tb3ZlVG8oMCwgeSArIChjaEggLyAyKSArIG1lLmRhdGEucHNNaW5NYXhbcHNNYXhQb3NdICogY2hIIC8gMik7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgbWUuZGF0YS53OyBwaWkrKykge1xyXG4gICAgICAgICAgICBsZXQgcHNNYXggPSBtZS5kYXRhLnBzTWluTWF4W3BzTWF4UG9zICsgcGlpXTtcclxuICAgICAgICAgICAgbGV0IHB2ID0gcHNNYXggKiBjaEggLyAyO1xyXG4gICAgICAgICAgICBsZXQgeWQ9eSArIChjaEggLyAyKSAtIHB2O1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTGluZVRvOiA6IFwiK3BpaStcIiBcIit5ZClcclxuICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgcmV2UGl4ZWxTdGFydD1tZS5kYXRhLnctMTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSByZXZQaXhlbFN0YXJ0OyBwaWkgPj0gMDsgcGlpLS0pIHtcclxuICAgICAgICAgICAgbGV0IHBzTWluID0gbWUuZGF0YS5wc01pbk1heFtwc01pblBvcyArIHBpaV07XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHBzTWluICogY2hIIC8gMjtcclxuICAgICAgICAgICAgbGV0IHlkPXkgKyAoY2hIIC8gMikgLSBwdjtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxpbmVUbzogOiBcIitwaWkrXCIgXCIreWQpXHJcbiAgICAgICAgICAgIGcubGluZVRvKHBpaSwgeWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuXHJcbiAgICAgICAgICBnLmZpbGwoKTtcclxuICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB5ICs9IGNoSDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZHJhdygpIHtcclxuICAgIHRoaXMuZHJhd0JnKClcclxuICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgaWYgKGcpIHtcclxuICAgICAgbGV0IHcgPSB0aGlzLnNpZ25hbENhbnZhcy53aWR0aDtcclxuICAgICAgbGV0IGggPSB0aGlzLnNpZ25hbENhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAvL2cuZmlsbFN0eWxlID0gXCJibGFja1wiO1xyXG4gICAgICAvL2cuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGEpIHtcclxuICAgICAgICBsZXQgc3RkID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgY2hzID0gdGhpcy5fYXVkaW9EYXRhLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICAgICAgbGV0IGNoSCA9IGggLyBjaHM7XHJcblxyXG4gICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YS5nZXRDaGFubmVsRGF0YSgwKS5sZW5ndGg7XHJcblxyXG4gICAgICAgIGxldCBmcmFtZXNQZXJQaXhlbCA9IGZyYW1lTGVuZ3RoIC8gdztcclxuICAgICAgICBsZXQgeSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgbGV0IHggPSAwO1xyXG4gICAgICAgICAgbGV0IHBzTWluID0gbmV3IEZsb2F0MzJBcnJheSh3KTtcclxuICAgICAgICAgIGxldCBwc01heCA9IG5ldyBGbG9hdDMyQXJyYXkodyk7XHJcbiAgICAgICAgICBsZXQgZnJhbWVQb3MgPSAwO1xyXG4gICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuICAgICAgICAgICAgbGV0IHBNaW4gPSAwO1xyXG4gICAgICAgICAgICBsZXQgcE1heCA9IDA7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgcGl4ZWwgbWluL21heCBhbXBsaXR1ZGVcclxuICAgICAgICAgICAgZm9yIChsZXQgYWkgPSAwOyBhaSA8IGZyYW1lc1BlclBpeGVsOyBhaSsrKSB7XHJcbiAgICAgICAgICAgICAgLy9sZXQgZnJhbWVQb3M9KHBpaSpmcmFtZXNQZXJQaXhlbCkrYWk7XHJcbiAgICAgICAgICAgICAgbGV0IGEgPSB0aGlzLl9hdWRpb0RhdGEuZ2V0Q2hhbm5lbERhdGEoY2gpW2ZyYW1lUG9zKytdO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoYSA8IHBNaW4pIHtcclxuICAgICAgICAgICAgICAgIHBNaW4gPSBhO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYSA+IHBNYXgpIHtcclxuICAgICAgICAgICAgICAgIHBNYXggPSBhO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwc01pbltwaWldID0gcE1pbjtcclxuICAgICAgICAgICAgcHNNYXhbcGlpXSA9IHBNYXg7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJNaW46IFwiLCBwTWluLCBcIiBtYXg6IFwiLCBwTWF4KTtcclxuXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZy5maWxsU3R5bGUgPSAnZ3JlZW4nO1xyXG4gICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdncmVlbic7XHJcblxyXG4gICAgICAgICAgLy8gZHJhdyBhdWRpbyBzaWduYWwgYXMgc2luZ2xlIHBvbHlnb25cclxuICAgICAgICAgIGcuYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICBnLm1vdmVUbygwLCB5ICsgKGNoSCAvIDIpICsgcHNNaW5bMF0gKiBjaEggLyAyKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICBsZXQgcHYgPSBwc01pbltwaWldICogY2hIIC8gMjtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIk1pbjogXCIscHYpO1xyXG4gICAgICAgICAgICBnLmxpbmVUbyhwaWksIHkgKyAoY2hIIC8gMikgKyBwdik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSB3OyBwaWkgPj0gMDsgcGlpLS0pIHtcclxuICAgICAgICAgICAgbGV0IHB2ID0gcHNNYXhbcGlpXSAqIGNoSCAvIDI7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJNYXg6IFwiLHB2KTtcclxuICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ICsgKGNoSCAvIDIpICsgcHYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgIC8vZy5saW5lVG8oKVxyXG4gICAgICAgICAgZy5maWxsKCk7XHJcbiAgICAgICAgICBnLnN0cm9rZSgpO1xyXG4gICAgICAgICAgZy5maWxsU3R5bGUgPSBcInllbGxvd1wiO1xyXG4gICAgICAgICAgZy5zdHJva2UoKTtcclxuICAgICAgICAgIHkgKz0gY2hIO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy90aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RGF0YShhdWRpb0RhdGE6IEF1ZGlvQnVmZmVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fYXVkaW9EYXRhID0gYXVkaW9EYXRhO1xyXG4gICAgdGhpcy5wbGF5RnJhbWVQb3NpdGlvbiA9IDA7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|
|
467
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDOztBQTRCL0MsTUFBTSxPQUFPLFdBQVksU0FBUSx5QkFBeUI7SUFrQnhELFlBQW9CLEdBQWU7UUFDakMsS0FBSyxFQUFFLENBQUM7UUFEVSxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBUjNCLHVCQUFrQixHQUFjLElBQUksQ0FBQztRQVUzQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFDLHFCQUFxQixDQUFBO0lBRXpDLENBQUM7SUFFRCxlQUFlO1FBRWIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDO1FB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RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0F1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnR9IGZyb20gXCIuL2F1ZGlvX2NhbnZhc19sYXllcl9jb21wXCI7XHJcbmltcG9ydCB7V29ya2VySGVscGVyfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5pbXBvcnQgeyBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbX0gZnJvbSBcIi4uLy4uL2lvL3N0cmVhbVwiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlOiBhbnksIHRyYW5zZmVyOiBBcnJheTxhbnk+KTogdm9pZDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLXNpZ25hbCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxjYW52YXMgI2JnIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+XHJcbiAgICA8Y2FudmFzICNhdWRpb1NpZ25hbCBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGNhbnZhcyAjY3Vyc29yIGhlaWdodD1cIjEwXCIgKG1vdXNlZG93bik9XCJzZWxlY3Rpb25TdGFydCgkZXZlbnQpXCIgKG1vdXNlb3Zlcik9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50KVwiIChtb3VzZW1vdmUpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50LCBmYWxzZSlcIj48L2NhbnZhcz5cclxuICAgIDxjYW52YXMgI21hcmtlciBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPmAsXHJcblxyXG4gIHN0eWxlczogW2A6aG9zdHtcclxuICAgICAgbWluLWhlaWdodDogMHB4O1xyXG4gICAgfWAsYGNhbnZhcyB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9TaWduYWwgZXh0ZW5kcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50e1xyXG5cclxuICBuOiBhbnk7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICBAVmlld0NoaWxkKCdhdWRpb1NpZ25hbCcsIHsgc3RhdGljOiB0cnVlIH0pIGF1ZGlvU2lnbmFsQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdtYXJrZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBwbGF5UG9zQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBzaWduYWxDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAvL3ByaXZhdGUgYWlzOkFycmF5QXVkaW9CdWZmZXJJbnB1dHNTdHJlYW18bnVsbD1udWxsO1xyXG4gIC8vcHJpdmF0ZSBhaXNCdWY6RmxvYXQzMkFycmF5W118bnVsbD1udWxsO1xyXG4gIC8vcHJpdmF0ZSBwc01pbk1heDpGbG9hdDMyQXJyYXlbXXxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSB3b3JrZXI6IFdvcmtlciB8IG51bGw7XHJcbiAgcHJpdmF0ZSB3b3JrZXJVUkw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XHJcbiAgICB0aGlzLndvcmtlclVSTCA9IFdvcmtlckhlbHBlci5idWlsZFdvcmtlckJsb2JVUkwodGhpcy53b3JrZXJGdW5jdGlvbilcclxuICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlciA9IG51bGw7XHJcbiAgICB0aGlzLl9iZ0NvbG9yPSdibGFjayc7XHJcbiAgICB0aGlzLl9zZWxlY3RDb2xvcj0ncmdiYSgyNTUsMjU1LDAsMC44KSdcclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcblxyXG4gICAgdGhpcy5jZSA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmJnQ2FudmFzID0gdGhpcy5iZ0NhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5iZ0NhbnZhcy5zdHlsZS56SW5kZXggPSAnMSc7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcyA9IHRoaXMuYXVkaW9TaWduYWxDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuc2lnbmFsQ2FudmFzLnN0eWxlLnpJbmRleCA9ICcyJztcclxuICAgIHRoaXMubWFya2VyQ2FudmFzID0gdGhpcy5wbGF5UG9zQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLm1hcmtlckNhbnZhcy5zdHlsZS56SW5kZXggPSAnMyc7XHJcbiAgICB0aGlzLmN1cnNvckNhbnZhcyA9IHRoaXMuY3Vyc29yQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmN1cnNvckNhbnZhcy5zdHlsZS56SW5kZXggPSAnNCc7XHJcblxyXG4gICAgdGhpcy5jYW52YXNMYXllcnNbMF09dGhpcy5iZ0NhbnZhcztcclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzFdPXRoaXMuc2lnbmFsQ2FudmFzO1xyXG4gICAgdGhpcy5jYW52YXNMYXllcnNbMl09dGhpcy5jdXJzb3JDYW52YXM7XHJcbiAgICB0aGlzLmNhbnZhc0xheWVyc1szXT10aGlzLm1hcmtlckNhbnZhcztcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgcGxheUZyYW1lUG9zaXRpb24oKTogbnVtYmVyIHxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKHBsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbCkge1xyXG4gICAgdGhpcy5fcGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgIHRoaXMuZHJhd1BsYXlQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBkcmF3UGxheVBvc2l0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWFya2VyQ2FudmFzKSB7XHJcbiAgICAgIGxldCB3ID0gdGhpcy5tYXJrZXJDYW52YXMud2lkdGg7XHJcbiAgICAgIGxldCBoID0gdGhpcy5tYXJrZXJDYW52YXMuaGVpZ2h0O1xyXG4gICAgICBsZXQgZyA9IHRoaXMubWFya2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgaWYgKGcpIHtcclxuICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICBpZih0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbikge1xyXG4gICAgICAgICAgbGV0IHBpeGVsUG9zID0gdGhpcy5mcmFtZVRvVmlld1BvcnRYUGl4ZWxQb3NpdGlvbih0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAocGl4ZWxQb3MpIHtcclxuICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAncmVkJztcclxuICAgICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdyZWQnO1xyXG4gICAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgICBnLm1vdmVUbyhwaXhlbFBvcywgMCk7XHJcbiAgICAgICAgICAgIGcubGluZVRvKHBpeGVsUG9zLCBoKTtcclxuICAgICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgZy5zdHJva2UoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogIE1ldGhvZCB1c2VkIGFzIHdvcmtlciBjb2RlLlxyXG4gICAqL1xyXG4gIHdvcmtlckZ1bmN0aW9uKCkge1xyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGEgfSkgPT4ge1xyXG5cclxuICAgICAgbGV0IGF1ZGlvRGF0YSA9IGRhdGEuYXVkaW9EYXRhOyAvLyBhdWRpbyBkYXRhIHBhcnQgcmVxdWlyZWQgdG8gcmVuZGVyIHZpZXcgcG9ydFxyXG4gICAgICBsZXQgYXVPZmZzZXQ6bnVtYmVyPWRhdGEuYXVkaW9EYXRhT2Zmc2V0O1xyXG4gICAgICBsZXQgbD0gZGF0YS5sOyAvLyBsZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHZpZXcgcG9ydFxyXG4gICAgICBsZXQgdyA9IGRhdGEudzsgIC8vIHdpZHRoIG9mIHZpZXdwb3J0XHJcbiAgICAgIGxldCB2dyA9IGRhdGEudnc7IC8vICB0b3RhbCB3aWR0aCBvZiAodmlydHVhbCkgYXVkaW8gdmlldyAobm90IHZpZXdwb3J0IHdpZHRoKVxyXG4gICAgICBsZXQgY2hzID0gZGF0YS5jaHM7IC8vIG51bWJlciBvZiBjaGFubmVsc1xyXG4gICAgICBsZXQgZGF0YUZyYW1lTGVuZ3RoID0gZGF0YS5hdWRpb0RhdGFGcmFtZUxlbmd0aDsgIC8vIGZyYW1lIGxlbmd0aCBvZiBhdWRpbyBkYXRhIHBhcnQgcmVxdWlyZWQgZm9yIHZpZXcgcG9ydFxyXG4gICAgICBsZXQgZnJhbWVMZW5ndGggPSBkYXRhLmZyYW1lTGVuZ3RoOyAgLy8gdG90YWwgZnJhbWUgbGVuZ3RoIChvZiBhdWRpbyBjbGlwKVxyXG5cclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiVzogbGVmdDogXCIrbCtcIiwgdzpcIit3K1wiLCB2dzogXCIrdncrXCIsIGNoczogXCIrY2hzK1wiLCBmcmFtZUxlbmd0aDogXCIrZnJhbWVMZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHBzTWluTWF4PSBuZXcgRmxvYXQzMkFycmF5KDApO1xyXG5cclxuICAgICAgaWYoYXVkaW9EYXRhICYmIGF1ZGlvRGF0YS5sZW5ndGg+MCAmJiB3Pj0wICYmIHZ3PjApIHtcclxuXHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB2dztcclxuXHJcbiAgICAgICAgbGV0IHBvaW50c0xlbiA9IHcgKiBjaHM7XHJcbiAgICAgICAgLy8gb25lIGZvciBtaW4gb25lIGZvciBtYXhcclxuICAgICAgICBsZXQgYXJyTGVuID0gcG9pbnRzTGVuICogMjtcclxuICAgICAgICBwc01pbk1heCA9IG5ldyBGbG9hdDMyQXJyYXkoYXJyTGVuKTtcclxuICAgICAgICBsZXQgY2hGcmFtZVBvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNoRnJhbWVMZW5ndGg9YXVkaW9EYXRhLmxlbmd0aC9jaHM7XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG5cclxuICAgICAgICAgIGNoRnJhbWVQb3MgPSBjaCAqIGNoRnJhbWVMZW5ndGg7XHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICBsZXQgdmlydFBpaT1sK3BpaTtcclxuICAgICAgICAgICAgbGV0IHBNaW4gPSBJbmZpbml0eTtcclxuICAgICAgICAgICAgbGV0IHBNYXggPSAtSW5maW5pdHk7XHJcbiAgICAgICAgICAgIGxldCBwaXhlbEZyYW1lUG9zID0gTWF0aC5yb3VuZChjaEZyYW1lUG9zICsgKHZpcnRQaWkgKiBmcmFtZXNQZXJQaXhlbCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHBpeGVsIG1pbi9tYXggYW1wbGl0dWRlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGFpID0gMDsgYWkgPCBmcmFtZXNQZXJQaXhlbDsgYWkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBmcmFtZVBvcyA9IHBpeGVsRnJhbWVQb3MgKyBhaTtcclxuICAgICAgICAgICAgICBsZXQgYSA9IDA7XHJcbiAgICAgICAgICAgICAgbGV0IGJ1ZlBvcz1mcmFtZVBvcy1hdU9mZnNldDtcclxuICAgICAgICAgICAgICAvL2xldCBidWZQb3M9ZnJhbWVQb3M7XHJcbiAgICAgICAgICAgICAgaWYoYnVmUG9zPj0wICYmIGJ1ZlBvczxhdWRpb0RhdGEubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgIGE9YXVkaW9EYXRhW2J1ZlBvc107XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXOiBjaDogXCIrY2grXCIsIHBpeGVsRnJhbWVQb3M6IFwiK3BpeGVsRnJhbWVQb3MrXCIsIGZyYW1lUG9zOiBcIitmcmFtZVBvcytcIiwgYXVPZmZzZXQ6IFwiK2F1T2Zmc2V0K1wiLCBidWZQb3M6IFwiK2J1ZlBvcytcIiwgYXVkaW9EYXRhLmxlbmd0aDogXCIrYXVkaW9EYXRhLmxlbmd0aCtcIiwgYTogXCIrYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA8IHBNaW4pIHtcclxuICAgICAgICAgICAgICAgICAgcE1pbiA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA+IHBNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgcE1heCA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcHNNaW5Qb3MgPSBjaCAqIHcgKyBwaWk7XHJcbiAgICAgICAgICAgIHBzTWluTWF4W3BzTWluUG9zXSA9IHBNaW47XHJcbiAgICAgICAgICAgIGxldCBwc01heFBvcyA9IHBvaW50c0xlbiArIHBzTWluUG9zO1xyXG4gICAgICAgICAgICBwc01pbk1heFtwc01heFBvc10gPSBwTWF4O1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJwc01pbk1heFtcIitwc01pblBvcytcIl09XCIrcE1pbitcIixwc01pbk1heFtcIitwc01heFBvcytcIl09XCIrcE1heCk7XHJcblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcG9zdE1lc3NhZ2Uoe3BzTWluTWF4OiBwc01pbk1heCwgbDpkYXRhLmwsdzogZGF0YS53LCBjaHM6IGRhdGEuY2hzLGVvZDpkYXRhLmVvZH0sIFtwc01pbk1heC5idWZmZXJdKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHN0YXJ0RHJhdyhjbGVhciA9IHRydWUpIHtcclxuICAgIGlmIChjbGVhcikge1xyXG4gICAgICBpZih0aGlzLmJvdW5kcykge1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAvL2cuY2xlYXJSZWN0KDAsIDAsdywgaCk7XHJcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9IFwiYmxhY2tcIjtcclxuICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpLCBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRSZW5kZXIoKTtcclxuICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHN0YXJ0UmVuZGVyKCkge1xyXG5cclxuICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYm91bmRzICYmIHRoaXMuYm91bmRzLmRpbWVuc2lvbikge1xyXG5cclxuICAgICAgbGV0IHcgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgIGxldCBoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIgJiYgdz4wICYmIGg+MCkge1xyXG4gICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJy4vYXVkaW9zaWduYWwud29ya2VyLmpzJyx7dHlwZTogJ21vZHVsZSd9KTtcclxuICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIodGhpcy53b3JrZXJVUkwpO1xyXG4gICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJ3dvcmtlci9hdWRpb3NpZ25hbC53b3JrZXIudHMnKTtcclxuXHJcbiAgICAgICAgLy9sZXQgV29ya2VyID0gcmVxdWlyZSgnd29ya2VyIS4uLy4uLy4uL3dvcmtlcnMvdXBsb2FkZXIvbWFpbicpO1xyXG4gICAgICAgIGxldCBjaHMgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICBsZXQgbGVmdFBvcz0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5wb3NpdGlvbi5sZWZ0KTtcclxuICAgICAgICBsZXQgcmVuZGVyUG9zPWxlZnRQb3M7XHJcbiAgICAgICAgbGV0IHZ3PU1hdGgucm91bmQodGhpcy52aXJ0dWFsRGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICBsZXQgZnJhbWVMZW5ndGggPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIuZnJhbWVMZW47XHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gTWF0aC5jZWlsKGZyYW1lTGVuZ3RoIC8gdncpO1xyXG4gICAgICAgIGxldCBhdWRpb0J1ZmZlcj10aGlzLl9hdWRpb0RhdGFIb2xkZXIuYnVmZmVyO1xyXG4gICAgICAgIC8vbGV0IGFycmF5QXVkaW9CdWZmZXI9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmFycmF5QnVmZmVyO1xyXG4gICAgICAgIGxldCBhcnJBYkJ1ZjpGbG9hdDMyQXJyYXlbXXxudWxsO1xyXG5cclxuICAgICAgICAvL2xldCBhaXM6QXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAgICAgICAvL2xldCBhaXNCdWY6RmxvYXQzMkFycmF5W118bnVsbD1udWxsO1xyXG4gICAgICAgIGxldCBwc01pbk1heDpGbG9hdDMyQXJyYXl8bnVsbD1udWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgIHRoaXMud29ya2VyLm9ubWVzc2FnZSA9IChtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZihtZS5kYXRhLmVvZD09PXRydWUpe1xyXG4gICAgICAgICAgICAgIGxldCBwc01pbk1heFRtcDtcclxuICAgICAgICAgICAgICBpZihwc01pbk1heCl7XHJcbiAgICAgICAgICAgICAgICBwc01pbk1heFRtcD1wc01pbk1heDtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHBzTWluTWF4VG1wPW1lLmRhdGEucHNNaW5NYXg7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuZHJhd1JlbmRlcmVkKGxlZnRQb3MsdyxoLGNocyxwc01pbk1heFRtcCk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZih0aGlzLl9hdWRpb0RhdGFIb2xkZXIgJiYgYXJyQWJCdWYpe1xyXG4gICAgICAgICAgICAgIGxldCBydz1tZS5kYXRhLnc7XHJcbiAgICAgICAgICAgICAgbGV0IHJQb2ludHNMZW49Y2hzKnJ3O1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludHNMZW49Y2hzKnc7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgaWYocHNNaW5NYXgpe1xyXG4gICAgICAgICAgICAgICAgICBsZXQgckJhc2VQb3M9Y2gqcnc7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBiYXNlUG9zPWNoKnc7XHJcbiAgICAgICAgICAgICAgICAgIGxldCByUG9zTWluID1yQmFzZVBvcztcclxuICAgICAgICAgICAgICAgICAgbGV0IHJQb3NNYXg9clBvaW50c0xlbityUG9zTWluO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcG9zTWluID1iYXNlUG9zKyhyZW5kZXJQb3MtbGVmdFBvcyk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBwb3NNYXg9cG9pbnRzTGVuK3Bvc01pbjtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHBzTWluTWF4W3Bvc01pbl09bWUuZGF0YS5wc01pbk1heFtyUG9zTWluXTtcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdNaW46ICgnK3BvcysnKTogJyttZS5kYXRhLnBzTWluTWF4WzBdKTtcclxuICAgICAgICAgICAgICAgICAgcHNNaW5NYXhbcG9zTWF4XT1tZS5kYXRhLnBzTWluTWF4W3JQb3NNYXhdO1xyXG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKCdNYXg6ICgnKyhwb2ludHNMZW4rcG9zKSsnKTogJyttZS5kYXRhLnBzTWluTWF4WzFdKTtcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwicHNNaW5NYXhbXCIrcG9zTWluK1wiXT1cIittZS5kYXRhLnBzTWluTWF4W3JQb3NNaW5dK1wiICAoclBvc01pbj1cIityUG9zTWluK1wiKSxwc01pbk1heFtcIitwb3NNYXgrXCJdPVwiK21lLmRhdGEucHNNaW5NYXhbclBvc01heF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgZW9kPWZhbHNlO1xyXG4gICAgICAgICAgICAgIHJlbmRlclBvcysrO1xyXG4gICAgICAgICAgICAgIGxldCBhZDpGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBsZWZ0RnJhbWVQb3MgPSBNYXRoLmZsb29yKGZyYW1lTGVuZ3RoICogcmVuZGVyUG9zIC8gdncpO1xyXG4gICAgICAgICAgICAgIGlmKHJlbmRlclBvczxsZWZ0UG9zK3cpIHtcclxuICAgICAgICAgICAgICAgIGxldCByZWFkID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lcyhsZWZ0RnJhbWVQb3MsIGZyYW1lc1BlclBpeGVsLCBhcnJBYkJ1Zik7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJGaXJzdCByZWFkIGZyYW1lOiBcIithcnJBYkJ1ZlswXVswXSk7XHJcbiAgICAgICAgICAgICAgICBhZCA9IG5ldyBGbG9hdDMyQXJyYXkoY2hzICogZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICBhZC5zZXQoYXJyQWJCdWZbY2hdLCBjaCAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVvZD0ocmVhZDw9MCk7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBhZD1uZXcgRmxvYXQzMkFycmF5KCk7XHJcbiAgICAgICAgICAgICAgICBlb2Q9dHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbGV0IGFkQnVmPWFkLmJ1ZmZlcjtcclxuICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgbDogcmVuZGVyUG9zLFxyXG4gICAgICAgICAgICAgICAgICB3OiBtZS5kYXRhLncsXHJcbiAgICAgICAgICAgICAgICAgIGg6aCxcclxuICAgICAgICAgICAgICAgICAgdnc6IHZ3LFxyXG4gICAgICAgICAgICAgICAgICBjaHM6IGNocyxcclxuICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICBhdWRpb0RhdGE6IGFkLFxyXG4gICAgICAgICAgICAgICAgICBhdWRpb0RhdGFPZmZzZXQ6IGxlZnRGcmFtZVBvcyxcclxuICAgICAgICAgICAgICAgICAgZW9kOmVvZFxyXG4gICAgICAgICAgICAgICAgfSwgW2FkQnVmXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXVkaW9CdWZmZXIgJiYgYXVkaW9CdWZmZXIubGVuZ3RoKmF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHMgPCBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50LkVOQUJMRV9TVFJFQU1JTkdfTlVNQkVSX09GX1NBTVBMRVNfVEhSRVNIT0xEKSB7XHJcblxyXG4gICAgICAgICAgLy8gUmVuZGVyIHdob2xlIGNsaXAgYXQgb25jZVxyXG4gICAgICAgICAgYXJyQWJCdWY9bnVsbDtcclxuICAgICAgICAgIHBzTWluTWF4PW51bGw7XHJcbiAgICAgICAgICBsZXQgYWQgPSBuZXcgRmxvYXQzMkFycmF5KGNocyAqIGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgYWQuc2V0KGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKSwgY2ggKiBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGw6IGxlZnRQb3MsXHJcbiAgICAgICAgICAgIHc6IHcsXHJcbiAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OjAsXHJcbiAgICAgICAgICAgIGVvZDp0cnVlXHJcbiAgICAgICAgICB9LCBbYWQuYnVmZmVyXSk7XHJcblxyXG4gICAgICAgIH1lbHNle1xyXG5cclxuICAgICAgICAgIC8vIFJlbmRlciBwaXhlbCBieSBwaXhlbFxyXG4gICAgICAgICAgaWYodz4wKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoZnJhbWVzUGVyUGl4ZWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHJ3PTE7XHJcbiAgICAgICAgICAgICAgLy9haXMgPSBuZXcgQXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtKGFycmF5QXVkaW9CdWZmZXIpO1xyXG4gICAgICAgICAgICAgIGFyckFiQnVmID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hzKTtcclxuICAgICAgICAgICAgICBwc01pbk1heD1uZXcgRmxvYXQzMkFycmF5KGNocyp3KjIpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgIGFyckFiQnVmW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgbGVmdEZyYW1lUG9zPU1hdGguZmxvb3IoZnJhbWVMZW5ndGgqcmVuZGVyUG9zL3Z3KTtcclxuICAgICAgICAgICAgICBsZXQgYXVPZmZzZXQ9bGVmdEZyYW1lUG9zOyAvLyBzaG91bGQgYWx3YXlzIGJlIDBcclxuICAgICAgICAgICAgICAvL2xldCByZWFkPWFycmF5QXVkaW9CdWZmZXIuZnJhbWVzKGxlZnRGcmFtZVBvcyxmcmFtZXNQZXJQaXhlbCxhcnJBYkJ1Zik7XHJcbiAgICAgICAgICAgICAgbGV0IHJlYWQ9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lcyhsZWZ0RnJhbWVQb3MsZnJhbWVzUGVyUGl4ZWwsYXJyQWJCdWYpO1xyXG4gICAgICAgICAgICAgIGxldCBhZD1uZXcgRmxvYXQzMkFycmF5KGNocypmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgYWQuc2V0KGFyckFiQnVmW2NoXSxjaCpmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICBsOiByZW5kZXJQb3MsXHJcbiAgICAgICAgICAgICAgICB3OiBydyxcclxuICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgIGNoczogY2hzLFxyXG4gICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgICAgIGF1ZGlvRGF0YU9mZnNldDphdU9mZnNldCxcclxuICAgICAgICAgICAgICAgIGVvZDoocmVhZDw9MClcclxuICAgICAgICAgICAgICB9LCBbYWQuYnVmZmVyXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBkcmF3UmVuZGVyZWQobGVmdDpudW1iZXIsdzpudW1iZXIsaDpudW1iZXIsY2hzOm51bWJlcixwc01pbk1heDpGbG9hdDMyQXJyYXkpIHtcclxuICAgIHRoaXMuZHJhd0JnKCk7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcy5zdHlsZS5sZWZ0PWxlZnQudG9TdHJpbmcoKSsncHgnO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMud2lkdGggPSB3O1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMuaGVpZ2h0ID0gaDtcclxuICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgaWYgKGcpIHtcclxuICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIC8vZy5maWxsU3R5bGUgPSBcImJsYWNrXCI7XHJcbiAgICAgIC8vZy5maWxsUmVjdCgwLCAwLCBtZS5kYXRhLncsIG1lLmRhdGEuaCk7XHJcbiAgICAgIGxldCBwb2ludHNMZW4gPSB3ICogY2hzO1xyXG4gICAgICAvLyBvbmUgZm9yIG1pbiBvbmUgZm9yIG1heFxyXG4gICAgICBsZXQgYXJyTGVuID0gcG9pbnRzTGVuICogMjtcclxuICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICAgIGxldCBzdGQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICBsZXQgY2hIID0gaCAvIGNocztcclxuXHJcbiAgICAgICAgbGV0IHkgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgIGxldCB4ID0gMDtcclxuXHJcbiAgICAgICAgICBsZXQgcHNNaW5Qb3MgPSBjaCAqIHc7XHJcbiAgICAgICAgICBsZXQgcHNNYXhQb3MgPSBwb2ludHNMZW4gKyBwc01pblBvcztcclxuXHJcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9ICdncmVlbic7XHJcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcclxuXHJcbiAgICAgICAgICAvLyBkcmF3IGF1ZGlvIHNpZ25hbCBhcyBzaW5nbGUgcG9seWdvblxyXG4gICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgIGcubW92ZVRvKDAsIHkgKyAoY2hIIC8gMikgKyBwc01pbk1heFtwc01heFBvc10gKiBjaEggLyAyKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICBsZXQgcHNNYXggPSBwc01pbk1heFtwc01heFBvcyArIHBpaV07XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHBzTWF4ICogY2hIIC8gMjtcclxuICAgICAgICAgICAgbGV0IHlkPXkgKyAoY2hIIC8gMikgLSBwdjtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxpbmVUbzogOiBcIitwaWkrXCIgXCIreWQpXHJcbiAgICAgICAgICAgIGcubGluZVRvKHBpaSwgeWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHJldlBpeGVsU3RhcnQ9dy0xO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IHBpaSA9IHJldlBpeGVsU3RhcnQ7IHBpaSA+PSAwOyBwaWktLSkge1xyXG4gICAgICAgICAgICBsZXQgcHNNaW4gPSBwc01pbk1heFtwc01pblBvcyArIHBpaV07XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHBzTWluICogY2hIIC8gMjtcclxuICAgICAgICAgICAgbGV0IHlkPXkgKyAoY2hIIC8gMikgLSBwdjtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxpbmVUbzogOiBcIitwaWkrXCIgXCIreWQpXHJcbiAgICAgICAgICAgIGcubGluZVRvKHBpaSwgeWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuXHJcbiAgICAgICAgICBnLmZpbGwoKTtcclxuICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB5ICs9IGNoSDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZHJhdygpIHtcclxuICAgIHRoaXMuZHJhd0JnKClcclxuICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgaWYgKGcpIHtcclxuICAgICAgbGV0IHcgPSB0aGlzLnNpZ25hbENhbnZhcy53aWR0aDtcclxuICAgICAgbGV0IGggPSB0aGlzLnNpZ25hbENhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAvL2cuZmlsbFN0eWxlID0gXCJibGFja1wiO1xyXG4gICAgICAvL2cuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpIHtcclxuICAgICAgICBsZXQgc3RkID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgY2hzID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICAgICAgbGV0IGNoSCA9IGggLyBjaHM7XHJcblxyXG4gICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuXHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB3O1xyXG4gICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICBsZXQgYWlzOkZsb2F0MzJBcnJheUlucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAgICAgICBsZXQgYXVkaW9CdWZmZXI9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmJ1ZmZlcjtcclxuICAgICAgICBsZXQgYWlzQnVmZmVyOkFycmF5PEZsb2F0MzJBcnJheT58bnVsbD1udWxsO1xyXG4gICAgICAgIGlmKCFhdWRpb0J1ZmZlcikge1xyXG4gICAgICAgICAgYWlzPXRoaXMuX2F1ZGlvRGF0YUhvbGRlci5hdWRpb0lucHV0U3RyZWFtKCk7XHJcbiAgICAgICAgICBhaXNCdWZmZXI9bmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hzKTtcclxuICAgICAgICAgIGZvcihsZXQgY2g9MDtjaDxjaHM7Y2grKykge1xyXG4gICAgICAgICAgICBhaXNCdWZmZXJbY2hdID0gbmV3IEZsb2F0MzJBcnJheShmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICBsZXQgeCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwc01pbiA9IG5ldyBGbG9hdDMyQXJyYXkodyk7XHJcbiAgICAgICAgICAgIGxldCBwc01heCA9IG5ldyBGbG9hdDMyQXJyYXkodyk7XHJcbiAgICAgICAgICAgIGxldCBmcmFtZVBvcyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBNaW4gPSAwO1xyXG4gICAgICAgICAgICAgIGxldCBwTWF4ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyKXtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBwaXhlbCBtaW4vbWF4IGFtcGxpdHVkZVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYWkgPSAwOyBhaSA8IGZyYW1lc1BlclBpeGVsOyBhaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vbGV0IGZyYW1lUG9zPShwaWkqZnJhbWVzUGVyUGl4ZWwpK2FpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYSA9IGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKVtmcmFtZVBvcysrXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChhIDwgcE1pbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHBNaW4gPSBhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChhID4gcE1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBNYXggPSBhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGFpcyAmJiBhaXNCdWZmZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCByID0gYWlzLnJlYWQoYWlzQnVmZmVyKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGFpID0gMDsgYWkgPCByOyBhaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgYSA9IGFpc0J1ZmZlcltjaF1bYWldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKGEgPCBwTWluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcE1pbiA9IGE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKGEgPiBwTWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcE1heCA9IGE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcHNNaW5bcGlpXSA9IHBNaW47XHJcbiAgICAgICAgICAgICAgcHNNYXhbcGlpXSA9IHBNYXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAnZ3JlZW4nO1xyXG4gICAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcclxuXHJcbiAgICAgICAgICAgIC8vIGRyYXcgYXVkaW8gc2lnbmFsIGFzIHNpbmdsZSBwb2x5Z29uXHJcbiAgICAgICAgICAgIGcuYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgIGcubW92ZVRvKDAsIHkgKyAoY2hIIC8gMikgKyBwc01pblswXSAqIGNoSCAvIDIpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgcHYgPSBwc01pbltwaWldICogY2hIIC8gMjtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTWluOiBcIixwdik7XHJcbiAgICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ICsgKGNoSCAvIDIpICsgcHYpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IHBpaSA9IHc7IHBpaSA+PSAwOyBwaWktLSkge1xyXG4gICAgICAgICAgICAgIGxldCBwdiA9IHBzTWF4W3BpaV0gKiBjaEggLyAyO1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJNYXg6IFwiLHB2KTtcclxuICAgICAgICAgICAgICBnLmxpbmVUbyhwaWksIHkgKyAoY2hIIC8gMikgKyBwdik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgLy9nLmxpbmVUbygpXHJcbiAgICAgICAgICAgIGcuZmlsbCgpO1xyXG4gICAgICAgICAgICBnLnN0cm9rZSgpO1xyXG4gICAgICAgICAgICBnLmZpbGxTdHlsZSA9IFwieWVsbG93XCI7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgIHkgKz0gY2hIO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RGF0YShhdWRpb0RhdGE6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwpIHtcclxuICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlciA9IGF1ZGlvRGF0YTtcclxuICAgIHRoaXMucGxheUZyYW1lUG9zaXRpb24gPSAwO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|