speechrecorderng 3.0.0 → 3.3.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/action/action.mjs +2 -1
- package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
- package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
- package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
- package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
- package/esm2020/lib/audio/audio_display.mjs +10 -34
- package/esm2020/lib/audio/audio_player.mjs +18 -45
- package/esm2020/lib/audio/capture/capture.mjs +293 -69
- package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
- package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
- package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
- package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
- package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
- package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
- package/esm2020/lib/audio/persistor.mjs +8 -2
- package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
- package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
- package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
- package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
- package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
- package/esm2020/lib/audio/playback/player.mjs +190 -171
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
- package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
- package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
- package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
- package/esm2020/lib/audio/ui/container.mjs +40 -57
- package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
- package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
- package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
- package/esm2020/lib/db/inddb.mjs +120 -0
- package/esm2020/lib/io/BinaryReader.mjs +85 -0
- package/esm2020/lib/io/stream.mjs +101 -1
- package/esm2020/lib/net/uploader.mjs +111 -5
- package/esm2020/lib/recorder_component.mjs +59 -1
- package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
- package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
- package/esm2020/lib/speechrecorder/recording.mjs +30 -6
- package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
- package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
- package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
- package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
- package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
- package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
- package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
- package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
- package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
- package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
- package/esm2020/lib/speechrecorderng.component.mjs +42 -31
- package/esm2020/lib/speechrecorderng.module.mjs +5 -5
- package/esm2020/lib/spr.config.mjs +3 -3
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
- package/esm2020/lib/ui/message_dialog.mjs +7 -7
- package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
- package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
- package/esm2020/lib/utils/ua-parser.mjs +28 -4
- package/esm2020/lib/utils/utils.mjs +29 -1
- package/fesm2015/speechrecorderng.mjs +12755 -9195
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +12652 -9101
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/{speechrecorderng.d.ts → index.d.ts} +0 -0
- package/lib/audio/array_audio_buffer.d.ts +17 -1
- package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
- package/lib/audio/audio_data_holder.d.ts +69 -14
- package/lib/audio/audio_display.d.ts +1 -1
- package/lib/audio/audio_player.d.ts +3 -7
- package/lib/audio/capture/capture.d.ts +24 -4
- package/lib/audio/dsp/level_measure.d.ts +2 -23
- package/lib/audio/impl/wavformat.d.ts +3 -3
- package/lib/audio/impl/wavreader.d.ts +16 -0
- package/lib/audio/impl/wavwriter.d.ts +1 -4
- package/lib/audio/inddb_audio_buffer.d.ts +68 -0
- package/lib/audio/net_audio_buffer.d.ts +59 -0
- package/lib/audio/persistor.d.ts +3 -9
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
- package/lib/audio/playback/audio_source_node.d.ts +10 -0
- package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
- package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
- package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
- package/lib/audio/playback/player.d.ts +19 -16
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
- package/lib/audio/ui/audio_display_control.d.ts +3 -6
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
- package/lib/audio/ui/audiosignal.d.ts +4 -3
- package/lib/audio/ui/container.d.ts +1 -1
- package/lib/audio/ui/livelevel.d.ts +11 -4
- package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
- package/lib/audio/ui/sonagram.d.ts +4 -3
- package/lib/db/inddb.d.ts +21 -0
- package/lib/io/BinaryReader.d.ts +18 -0
- package/lib/io/stream.d.ts +18 -0
- package/lib/net/uploader.d.ts +20 -2
- package/lib/recorder_component.d.ts +5 -0
- package/lib/speechrecorder/project/project.d.ts +9 -0
- package/lib/speechrecorder/recording.d.ts +8 -2
- package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
- package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
- package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
- package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
- package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
- package/lib/speechrecorder/session/item.d.ts +1 -0
- package/lib/speechrecorder/session/progress.d.ts +2 -1
- package/lib/speechrecorder/session/prompting.d.ts +5 -5
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
- package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
- package/lib/speechrecorder/session/recording_list.d.ts +2 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
- package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
- package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
- package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
- package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
- package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
- package/lib/speechrecorderng.component.d.ts +2 -1
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/message_dialog.d.ts +1 -1
- package/lib/ui/recordingitem_display.d.ts +3 -2
- package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
- package/lib/utils/ua-parser.d.ts +4 -1
- package/lib/utils/utils.d.ts +6 -0
- package/package.json +5 -4
- package/esm2020/lib/math/utils.mjs +0 -14
- package/esm2020/lib/utils/css_utils.mjs +0 -7
- package/lib/math/utils.d.ts +0 -3
- package/lib/utils/css_utils.d.ts +0 -3
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Component, ViewChild } from '@angular/core';
|
|
2
2
|
import { AudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
|
|
3
3
|
import { WorkerHelper } from "../../utils/utils";
|
|
4
|
+
import { AudioBufferSource } from "../audio_data_holder";
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export class AudioSignal extends AudioCanvasLayerComponent {
|
|
6
7
|
constructor(ref) {
|
|
@@ -8,6 +9,7 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
8
9
|
this.ref = ref;
|
|
9
10
|
this._playFramePosition = null;
|
|
10
11
|
this.worker = null;
|
|
12
|
+
this.raAsSubsc = null;
|
|
11
13
|
this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction);
|
|
12
14
|
this._audioDataHolder = null;
|
|
13
15
|
this._bgColor = 'black';
|
|
@@ -62,36 +64,36 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
62
64
|
*/
|
|
63
65
|
workerFunction() {
|
|
64
66
|
addEventListener('message', ({ data }) => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
const audioData = data.audioData; // audio data part required to render view port
|
|
68
|
+
const auOffset = data.audioDataOffset;
|
|
69
|
+
const l = data.l; // left pixel position of view port
|
|
70
|
+
const w = data.w; // width of viewport
|
|
71
|
+
const vw = data.vw; // total width of (virtual) audio view (not viewport width)
|
|
72
|
+
const chs = data.chs; // number of channels
|
|
73
|
+
//const dataFrameLength = data.audioDataFrameLength; // frame length of audio data part required for view port
|
|
74
|
+
const frameLength = data.frameLength; // total frame length (of audio clip)
|
|
73
75
|
//console.debug("W: left: "+l+", w:"+w+", vw: "+vw+", chs: "+chs+", frameLength: "+frameLength);
|
|
74
76
|
let psMinMax = new Float32Array(0);
|
|
75
77
|
if (audioData && audioData.length > 0 && w >= 0 && vw > 0) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
+
const framesPerPixel = frameLength / vw;
|
|
79
|
+
const pointsLen = w * chs;
|
|
78
80
|
// one for min one for max
|
|
79
|
-
|
|
81
|
+
const arrLen = pointsLen * 2;
|
|
80
82
|
psMinMax = new Float32Array(arrLen);
|
|
81
83
|
let chFramePos = 0;
|
|
82
|
-
|
|
84
|
+
const chFrameLength = audioData.length / chs;
|
|
83
85
|
for (let ch = 0; ch < chs; ch++) {
|
|
84
86
|
chFramePos = ch * chFrameLength;
|
|
85
87
|
for (let pii = 0; pii < w; pii++) {
|
|
86
|
-
|
|
88
|
+
const virtPii = l + pii;
|
|
87
89
|
let pMin = Infinity;
|
|
88
90
|
let pMax = -Infinity;
|
|
89
91
|
let pixelFramePos = Math.round(chFramePos + (virtPii * framesPerPixel));
|
|
90
92
|
// calculate pixel min/max amplitude
|
|
91
93
|
for (let ai = 0; ai < framesPerPixel; ai++) {
|
|
92
|
-
|
|
94
|
+
const framePos = pixelFramePos + ai;
|
|
93
95
|
let a = 0;
|
|
94
|
-
|
|
96
|
+
const bufPos = framePos - auOffset;
|
|
95
97
|
//let bufPos=framePos;
|
|
96
98
|
if (bufPos >= 0 && bufPos < audioData.length) {
|
|
97
99
|
a = audioData[bufPos];
|
|
@@ -104,9 +106,9 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
|
-
|
|
109
|
+
const psMinPos = ch * w + pii;
|
|
108
110
|
psMinMax[psMinPos] = pMin;
|
|
109
|
-
|
|
111
|
+
const psMaxPos = pointsLen + psMinPos;
|
|
110
112
|
psMinMax[psMaxPos] = pMax;
|
|
111
113
|
//console.debug("psMinMax["+psMinPos+"]="+pMin+",psMinMax["+psMaxPos+"]="+pMax);
|
|
112
114
|
}
|
|
@@ -137,148 +139,204 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
137
139
|
this.worker.terminate();
|
|
138
140
|
this.worker = null;
|
|
139
141
|
}
|
|
140
|
-
if (this.
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
this.
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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;
|
|
142
|
+
if (this.raAsSubsc) {
|
|
143
|
+
this.raAsSubsc.unsubscribe();
|
|
144
|
+
}
|
|
145
|
+
if (this._audioDataHolder) {
|
|
146
|
+
this._audioDataHolder.addOnReadyListener(() => {
|
|
147
|
+
if (this._audioDataHolder && this.bounds && this.bounds.dimension) {
|
|
148
|
+
let w = Math.round(this.bounds.dimension.width);
|
|
149
|
+
let h = Math.round(this.bounds.dimension.height);
|
|
150
|
+
let vw = Math.round(this.virtualDimension.width);
|
|
151
|
+
if (w > 0 && h > 0 && vw > 0) {
|
|
152
|
+
//this.wo = new Worker('./audiosignal.worker.js',{type: 'module'});
|
|
153
|
+
this.worker = new Worker(this.workerURL);
|
|
154
|
+
//this.wo = new Worker('worker/audiosignal.worker.ts');
|
|
155
|
+
//let Worker = require('worker!../../../workers/uploader/main');
|
|
156
|
+
let chs = this._audioDataHolder.numberOfChannels;
|
|
157
|
+
let leftPos = Math.round(this.bounds.position.left);
|
|
158
|
+
let renderPos = leftPos;
|
|
159
|
+
let frameLength = this._audioDataHolder.frameLen;
|
|
160
|
+
let framesPerPixel = Math.ceil(frameLength / vw);
|
|
161
|
+
//console.debug("Chs: " + chs + ", vw: " + vw + ", frameLength: " + frameLength + ", framesPerPixel: " + framesPerPixel);
|
|
162
|
+
let ad = new Float32Array(chs * framesPerPixel);
|
|
163
|
+
let raAs = this._audioDataHolder.randomAccessAudioStream();
|
|
164
|
+
let audioBuffer = null;
|
|
165
|
+
let audioSource = this._audioDataHolder.audioSource;
|
|
166
|
+
if (audioSource instanceof AudioBufferSource) {
|
|
167
|
+
audioBuffer = audioSource.audioBuffer;
|
|
175
168
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
let
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
169
|
+
//let arrayAudioBuffer=this._audioDataHolder.arrayBuffer;
|
|
170
|
+
let arrAbBuf;
|
|
171
|
+
//let ais:ArrayAudioBufferInputStream|null=null;
|
|
172
|
+
//let aisBuf:Float32Array[]|null=null;
|
|
173
|
+
let psMinMax = null;
|
|
174
|
+
if (this.worker) {
|
|
175
|
+
this.worker.onmessage = (me) => {
|
|
176
|
+
if (me.data.eod === true) {
|
|
177
|
+
let psMinMaxTmp;
|
|
178
|
+
if (psMinMax) {
|
|
179
|
+
psMinMaxTmp = psMinMax;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
psMinMaxTmp = me.data.psMinMax;
|
|
183
|
+
}
|
|
184
|
+
this.drawRendered(leftPos, w, h, chs, psMinMaxTmp);
|
|
185
|
+
if (this.worker) {
|
|
186
|
+
this.worker.terminate();
|
|
187
|
+
}
|
|
188
|
+
raAs.close();
|
|
193
189
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
190
|
+
else if (this._audioDataHolder && arrAbBuf) {
|
|
191
|
+
const rw = me.data.w;
|
|
192
|
+
const rPointsLen = chs * rw;
|
|
193
|
+
const pointsLen = chs * w;
|
|
194
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
195
|
+
if (psMinMax) {
|
|
196
|
+
let rBasePos = ch * rw;
|
|
197
|
+
let basePos = ch * w;
|
|
198
|
+
let rPosMin = rBasePos;
|
|
199
|
+
let rPosMax = rPointsLen + rPosMin;
|
|
200
|
+
let posMin = basePos + (renderPos - leftPos);
|
|
201
|
+
let posMax = pointsLen + posMin;
|
|
202
|
+
psMinMax[posMin] = me.data.psMinMax[rPosMin];
|
|
203
|
+
//console.debug('Min: ('+posMin+'): '+me.data.psMinMax[rPosMin]);
|
|
204
|
+
psMinMax[posMax] = me.data.psMinMax[rPosMax];
|
|
205
|
+
//console.debug('Max: ('+(posMax)+'): '+me.data.psMinMax[rPosMax]);
|
|
206
|
+
//console.debug("psMinMax["+posMin+"]="+me.data.psMinMax[rPosMin]+" (rPosMin="+rPosMin+"),psMinMax["+posMax+"]="+me.data.psMinMax[rPosMax]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
let eod = false;
|
|
210
|
+
renderPos++;
|
|
211
|
+
//let ad:Float32Array;
|
|
212
|
+
const leftFramePos = Math.floor(frameLength * renderPos / vw);
|
|
213
|
+
if (renderPos < leftPos + w) {
|
|
214
|
+
const raAsObs = raAs.framesObs(leftFramePos, framesPerPixel, arrAbBuf);
|
|
215
|
+
this.raAsSubsc = raAsObs.subscribe({
|
|
216
|
+
next: (read) => {
|
|
217
|
+
//console.debug("First read frame: "+arrAbBuf[0][0]);
|
|
218
|
+
if (arrAbBuf) {
|
|
219
|
+
const adLen = chs * framesPerPixel;
|
|
220
|
+
if (!ad || ad.length !== adLen) {
|
|
221
|
+
ad = new Float32Array(adLen);
|
|
222
|
+
}
|
|
223
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
224
|
+
ad.set(arrAbBuf[ch], ch * framesPerPixel);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
eod = (read <= 0);
|
|
228
|
+
let adBuf = ad.buffer;
|
|
229
|
+
if (this.worker) {
|
|
230
|
+
this.worker.postMessage({
|
|
231
|
+
l: renderPos,
|
|
232
|
+
w: me.data.w,
|
|
233
|
+
h: h,
|
|
234
|
+
vw: vw,
|
|
235
|
+
chs: chs,
|
|
236
|
+
frameLength: frameLength,
|
|
237
|
+
audioData: ad,
|
|
238
|
+
audioDataOffset: leftFramePos,
|
|
239
|
+
eod: eod
|
|
240
|
+
}, [adBuf]);
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
error: (err) => {
|
|
244
|
+
console.error("AudioSignal: Error reading audio data: " + err);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
ad = new Float32Array();
|
|
250
|
+
eod = true;
|
|
251
|
+
const adBuf = ad.buffer;
|
|
252
|
+
if (this.worker) {
|
|
253
|
+
this.worker.postMessage({
|
|
254
|
+
l: renderPos,
|
|
255
|
+
w: me.data.w,
|
|
256
|
+
h: h,
|
|
257
|
+
vw: vw,
|
|
258
|
+
chs: chs,
|
|
259
|
+
frameLength: frameLength,
|
|
260
|
+
audioData: ad,
|
|
261
|
+
audioDataOffset: leftFramePos,
|
|
262
|
+
eod: eod
|
|
263
|
+
}, [adBuf]);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
205
266
|
}
|
|
206
|
-
|
|
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
|
-
}
|
|
267
|
+
};
|
|
226
268
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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);
|
|
269
|
+
if (audioBuffer && audioBuffer.length * audioBuffer.numberOfChannels < AudioCanvasLayerComponent.ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD) {
|
|
270
|
+
// Render whole clip at once
|
|
271
|
+
arrAbBuf = null;
|
|
272
|
+
psMinMax = null;
|
|
273
|
+
const ad = new Float32Array(chs * frameLength);
|
|
264
274
|
for (let ch = 0; ch < chs; ch++) {
|
|
265
|
-
ad.set(
|
|
275
|
+
ad.set(audioBuffer.getChannelData(ch), ch * frameLength);
|
|
266
276
|
}
|
|
267
277
|
this.worker.postMessage({
|
|
268
|
-
l:
|
|
269
|
-
w:
|
|
278
|
+
l: leftPos,
|
|
279
|
+
w: w,
|
|
270
280
|
vw: vw,
|
|
271
281
|
chs: chs,
|
|
272
282
|
frameLength: frameLength,
|
|
273
283
|
audioData: ad,
|
|
274
|
-
audioDataOffset:
|
|
275
|
-
eod:
|
|
284
|
+
audioDataOffset: 0,
|
|
285
|
+
eod: true
|
|
276
286
|
}, [ad.buffer]);
|
|
277
287
|
}
|
|
288
|
+
else {
|
|
289
|
+
// Render pixel by pixel
|
|
290
|
+
if (w > 0) {
|
|
291
|
+
if (framesPerPixel > 0) {
|
|
292
|
+
let rw = 1;
|
|
293
|
+
arrAbBuf = new Array(chs);
|
|
294
|
+
psMinMax = new Float32Array(chs * w * 2);
|
|
295
|
+
//console.debug("Audiosignal: Allocating buffers: "+framesPerPixel);
|
|
296
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
297
|
+
arrAbBuf[ch] = new Float32Array(framesPerPixel);
|
|
298
|
+
}
|
|
299
|
+
const leftFramePos = Math.floor(frameLength * renderPos / vw);
|
|
300
|
+
const auOffset = leftFramePos; // should always be 0
|
|
301
|
+
const raAsObs = raAs.framesObs(leftFramePos, framesPerPixel, arrAbBuf);
|
|
302
|
+
this.drawStateText("Loading/Rendering...");
|
|
303
|
+
this.raAsSubsc = raAsObs.subscribe({
|
|
304
|
+
next: (read) => {
|
|
305
|
+
if (arrAbBuf && this.worker) {
|
|
306
|
+
const adLen = chs * framesPerPixel;
|
|
307
|
+
if (!ad || ad.length !== adLen) {
|
|
308
|
+
ad = new Float32Array(adLen);
|
|
309
|
+
}
|
|
310
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
311
|
+
ad.set(arrAbBuf[ch], ch * framesPerPixel);
|
|
312
|
+
}
|
|
313
|
+
this.worker.postMessage({
|
|
314
|
+
l: renderPos,
|
|
315
|
+
w: rw,
|
|
316
|
+
vw: vw,
|
|
317
|
+
chs: chs,
|
|
318
|
+
frameLength: frameLength,
|
|
319
|
+
audioData: ad,
|
|
320
|
+
audioDataOffset: auOffset,
|
|
321
|
+
eod: (read <= 0)
|
|
322
|
+
}, [ad.buffer]);
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
error: (err) => {
|
|
326
|
+
console.error("AudioSignal: Error reading audio data: " + err);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
278
332
|
}
|
|
279
333
|
}
|
|
280
|
-
}
|
|
281
|
-
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
if (this.bounds && this.bounds.dimension) {
|
|
338
|
+
let w = Math.round(this.bounds.dimension.width);
|
|
339
|
+
let h = Math.round(this.bounds.dimension.height);
|
|
282
340
|
let g = this.signalCanvas.getContext("2d");
|
|
283
341
|
if (g) {
|
|
284
342
|
g.clearRect(0, 0, w, h);
|
|
@@ -286,6 +344,19 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
286
344
|
}
|
|
287
345
|
}
|
|
288
346
|
}
|
|
347
|
+
drawStateText(stateText) {
|
|
348
|
+
if (stateText) {
|
|
349
|
+
const g = this.signalCanvas.getContext("2d");
|
|
350
|
+
const w = this.signalCanvas.width;
|
|
351
|
+
const h = this.signalCanvas.height;
|
|
352
|
+
if (g && w && h) {
|
|
353
|
+
g.strokeStyle = 'white';
|
|
354
|
+
g.fillStyle = 'white';
|
|
355
|
+
g.font = '20px sans-serif';
|
|
356
|
+
g.fillText(stateText, 10, 25);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
289
360
|
drawRendered(left, w, h, chs, psMinMax) {
|
|
290
361
|
this.drawBg();
|
|
291
362
|
this.signalCanvas.style.left = left.toString() + 'px';
|
|
@@ -294,36 +365,33 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
294
365
|
let g = this.signalCanvas.getContext("2d");
|
|
295
366
|
if (g) {
|
|
296
367
|
g.clearRect(0, 0, w, h);
|
|
297
|
-
//g.fillStyle = "black";
|
|
298
|
-
//g.fillRect(0, 0, me.data.w, me.data.h);
|
|
299
368
|
let pointsLen = w * chs;
|
|
300
369
|
// one for min one for max
|
|
301
|
-
|
|
370
|
+
//const arrLen = pointsLen * 2;
|
|
302
371
|
if (this._audioDataHolder) {
|
|
303
|
-
|
|
304
|
-
|
|
372
|
+
//const std = Date.now();
|
|
373
|
+
const chH = h / chs;
|
|
305
374
|
let y = 0;
|
|
306
375
|
for (let ch = 0; ch < chs; ch++) {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
let psMaxPos = pointsLen + psMinPos;
|
|
376
|
+
const psMinPos = ch * w;
|
|
377
|
+
const psMaxPos = pointsLen + psMinPos;
|
|
310
378
|
g.fillStyle = 'green';
|
|
311
379
|
g.strokeStyle = 'green';
|
|
312
380
|
// draw audio signal as single polygon
|
|
313
381
|
g.beginPath();
|
|
314
382
|
g.moveTo(0, y + (chH / 2) + psMinMax[psMaxPos] * chH / 2);
|
|
315
383
|
for (let pii = 0; pii < w; pii++) {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
384
|
+
const psMax = psMinMax[psMaxPos + pii];
|
|
385
|
+
const pv = psMax * chH / 2;
|
|
386
|
+
const yd = y + (chH / 2) - pv;
|
|
319
387
|
//console.log("LineTo: : "+pii+" "+yd)
|
|
320
388
|
g.lineTo(pii, yd);
|
|
321
389
|
}
|
|
322
|
-
|
|
390
|
+
const revPixelStart = w - 1;
|
|
323
391
|
for (let pii = revPixelStart; pii >= 0; pii--) {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
392
|
+
const psMin = psMinMax[psMinPos + pii];
|
|
393
|
+
const pv = psMin * chH / 2;
|
|
394
|
+
const yd = y + (chH / 2) - pv;
|
|
327
395
|
//console.log("LineTo: : "+pii+" "+yd)
|
|
328
396
|
g.lineTo(pii, yd);
|
|
329
397
|
}
|
|
@@ -332,131 +400,129 @@ export class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
332
400
|
g.stroke();
|
|
333
401
|
y += chH;
|
|
334
402
|
}
|
|
335
|
-
//this.drawPlayPosition();
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
redraw() {
|
|
340
|
-
this.drawBg();
|
|
341
|
-
let g = this.signalCanvas.getContext("2d");
|
|
342
|
-
if (g) {
|
|
343
|
-
let w = this.signalCanvas.width;
|
|
344
|
-
let h = this.signalCanvas.height;
|
|
345
|
-
g.clearRect(0, 0, w, h);
|
|
346
|
-
//g.fillStyle = "black";
|
|
347
|
-
//g.fillRect(0, 0, w, h);
|
|
348
|
-
if (this._audioDataHolder) {
|
|
349
|
-
let std = Date.now();
|
|
350
|
-
let chs = this._audioDataHolder.numberOfChannels;
|
|
351
|
-
let chH = h / chs;
|
|
352
|
-
let frameLength = this._audioDataHolder.frameLen;
|
|
353
|
-
let framesPerPixel = frameLength / w;
|
|
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
|
-
}
|
|
365
|
-
for (let ch = 0; ch < chs; ch++) {
|
|
366
|
-
let x = 0;
|
|
367
|
-
let psMin = new Float32Array(w);
|
|
368
|
-
let psMax = new Float32Array(w);
|
|
369
|
-
let framePos = 0;
|
|
370
|
-
for (let pii = 0; pii < w; pii++) {
|
|
371
|
-
let pMin = 0;
|
|
372
|
-
let pMax = 0;
|
|
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
|
-
}
|
|
384
|
-
}
|
|
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
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
psMin[pii] = pMin;
|
|
399
|
-
psMax[pii] = pMax;
|
|
400
|
-
}
|
|
401
|
-
g.fillStyle = 'green';
|
|
402
|
-
g.strokeStyle = 'green';
|
|
403
|
-
// draw audio signal as single polygon
|
|
404
|
-
g.beginPath();
|
|
405
|
-
g.moveTo(0, y + (chH / 2) + psMin[0] * chH / 2);
|
|
406
|
-
for (let pii = 0; pii < w; pii++) {
|
|
407
|
-
let pv = psMin[pii] * chH / 2;
|
|
408
|
-
//console.log("Min: ",pv);
|
|
409
|
-
g.lineTo(pii, y + (chH / 2) + pv);
|
|
410
|
-
}
|
|
411
|
-
for (let pii = w; pii >= 0; pii--) {
|
|
412
|
-
let pv = psMax[pii] * chH / 2;
|
|
413
|
-
//console.log("Max: ",pv);
|
|
414
|
-
g.lineTo(pii, y + (chH / 2) + pv);
|
|
415
|
-
}
|
|
416
|
-
g.closePath();
|
|
417
|
-
//g.lineTo()
|
|
418
|
-
g.fill();
|
|
419
|
-
g.stroke();
|
|
420
|
-
g.fillStyle = "yellow";
|
|
421
|
-
g.stroke();
|
|
422
|
-
y += chH;
|
|
423
|
-
}
|
|
424
403
|
}
|
|
425
404
|
}
|
|
426
405
|
}
|
|
406
|
+
// redraw() {
|
|
407
|
+
// this.drawBg()
|
|
408
|
+
// let g = this.signalCanvas.getContext("2d");
|
|
409
|
+
// if (g) {
|
|
410
|
+
// let w = this.signalCanvas.width;
|
|
411
|
+
// let h = this.signalCanvas.height;
|
|
412
|
+
// g.clearRect(0, 0, w, h);
|
|
413
|
+
// //g.fillStyle = "black";
|
|
414
|
+
// //g.fillRect(0, 0, w, h);
|
|
415
|
+
// if (this._audioDataHolder) {
|
|
416
|
+
// let std = Date.now();
|
|
417
|
+
// let chs = this._audioDataHolder.numberOfChannels;
|
|
418
|
+
// let chH = h / chs;
|
|
419
|
+
//
|
|
420
|
+
// let frameLength = this._audioDataHolder.frameLen;
|
|
421
|
+
//
|
|
422
|
+
// let framesPerPixel = frameLength / w;
|
|
423
|
+
// let y = 0;
|
|
424
|
+
// let ais:Float32ArrayInputStream|null=null;
|
|
425
|
+
// let audioSource=this._audioDataHolder.audioSource;
|
|
426
|
+
// let audioBuffer:AudioBuffer|null=null;
|
|
427
|
+
// if(audioSource instanceof AudioBufferSource){
|
|
428
|
+
// audioBuffer=audioSource.audioBuffer;
|
|
429
|
+
// }
|
|
430
|
+
// let aisBuffer:Array<Float32Array>|null=null;
|
|
431
|
+
// if(!audioBuffer) {
|
|
432
|
+
// ais=this._audioDataHolder.audioInputStream();
|
|
433
|
+
// aisBuffer=new Array<Float32Array>(chs);
|
|
434
|
+
// for(let ch=0;ch<chs;ch++) {
|
|
435
|
+
// aisBuffer[ch] = new Float32Array(framesPerPixel);
|
|
436
|
+
// }
|
|
437
|
+
// }
|
|
438
|
+
// for (let ch = 0; ch < chs; ch++) {
|
|
439
|
+
// let x = 0;
|
|
440
|
+
// let psMin = new Float32Array(w);
|
|
441
|
+
// let psMax = new Float32Array(w);
|
|
442
|
+
// let framePos = 0;
|
|
443
|
+
// for (let pii = 0; pii < w; pii++) {
|
|
444
|
+
// let pMin = 0;
|
|
445
|
+
// let pMax = 0;
|
|
446
|
+
//
|
|
447
|
+
// if (audioBuffer){
|
|
448
|
+
// // calculate pixel min/max amplitude
|
|
449
|
+
// for (let ai = 0; ai < framesPerPixel; ai++) {
|
|
450
|
+
// //let framePos=(pii*framesPerPixel)+ai;
|
|
451
|
+
// let a = audioBuffer.getChannelData(ch)[framePos++];
|
|
452
|
+
//
|
|
453
|
+
// if (a < pMin) {
|
|
454
|
+
// pMin = a;
|
|
455
|
+
// }
|
|
456
|
+
// if (a > pMax) {
|
|
457
|
+
// pMax = a;
|
|
458
|
+
// }
|
|
459
|
+
// }
|
|
460
|
+
// }else if(ais && aisBuffer) {
|
|
461
|
+
// let r = ais.read(aisBuffer);
|
|
462
|
+
// for (let ai = 0; ai < r; ai++) {
|
|
463
|
+
//
|
|
464
|
+
// let a = aisBuffer[ch][ai];
|
|
465
|
+
//
|
|
466
|
+
// if (a < pMin) {
|
|
467
|
+
// pMin = a;
|
|
468
|
+
// }
|
|
469
|
+
// if (a > pMax) {
|
|
470
|
+
// pMax = a;
|
|
471
|
+
// }
|
|
472
|
+
// }
|
|
473
|
+
// }
|
|
474
|
+
// psMin[pii] = pMin;
|
|
475
|
+
// psMax[pii] = pMax;
|
|
476
|
+
// }
|
|
477
|
+
// g.fillStyle = 'green';
|
|
478
|
+
// g.strokeStyle = 'green';
|
|
479
|
+
//
|
|
480
|
+
// // draw audio signal as single polygon
|
|
481
|
+
// g.beginPath();
|
|
482
|
+
// g.moveTo(0, y + (chH / 2) + psMin[0] * chH / 2);
|
|
483
|
+
//
|
|
484
|
+
// for (let pii = 0; pii < w; pii++) {
|
|
485
|
+
// let pv = psMin[pii] * chH / 2;
|
|
486
|
+
// //console.log("Min: ",pv);
|
|
487
|
+
// g.lineTo(pii, y + (chH / 2) + pv);
|
|
488
|
+
// }
|
|
489
|
+
// for (let pii = w; pii >= 0; pii--) {
|
|
490
|
+
// let pv = psMax[pii] * chH / 2;
|
|
491
|
+
// //console.log("Max: ",pv);
|
|
492
|
+
// g.lineTo(pii, y + (chH / 2) + pv);
|
|
493
|
+
// }
|
|
494
|
+
// g.closePath();
|
|
495
|
+
// //g.lineTo()
|
|
496
|
+
// g.fill();
|
|
497
|
+
// g.stroke();
|
|
498
|
+
// g.fillStyle = "yellow";
|
|
499
|
+
// g.stroke();
|
|
500
|
+
// y += chH;
|
|
501
|
+
// }
|
|
502
|
+
// ais?.close();
|
|
503
|
+
// }
|
|
504
|
+
// }
|
|
505
|
+
// }
|
|
427
506
|
setData(audioData) {
|
|
428
507
|
this._audioDataHolder = audioData;
|
|
429
508
|
this.playFramePosition = 0;
|
|
430
509
|
}
|
|
431
510
|
}
|
|
432
|
-
AudioSignal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
433
|
-
AudioSignal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
511
|
+
AudioSignal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioSignal, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
512
|
+
AudioSignal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioSignal, selector: "audio-signal", viewQueries: [{ propertyName: "audioSignalCanvasRef", first: true, predicate: ["audioSignal"], descendants: true, static: true }, { propertyName: "playPosCanvasRef", first: true, predicate: ["marker"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
434
513
|
<canvas #bg height="10"></canvas>
|
|
435
514
|
<canvas #audioSignal height="10"></canvas>
|
|
436
515
|
<canvas #cursor height="10" (mousedown)="selectionStart($event)" (mouseover)="updateCursorCanvas($event)" (mousemove)="updateCursorCanvas($event)"
|
|
437
516
|
(mouseleave)="updateCursorCanvas($event, false)"></canvas>
|
|
438
517
|
<canvas #marker height="10"></canvas>`, isInline: true, styles: [":host{min-height:0px}\n", "canvas{top:0;left:0;width:0;height:0;min-height:0px;position:absolute}\n"] });
|
|
439
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
518
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioSignal, decorators: [{
|
|
440
519
|
type: Component,
|
|
441
|
-
args: [{
|
|
442
|
-
selector: 'audio-signal',
|
|
443
|
-
template: `
|
|
520
|
+
args: [{ selector: 'audio-signal', template: `
|
|
444
521
|
<canvas #bg height="10"></canvas>
|
|
445
522
|
<canvas #audioSignal height="10"></canvas>
|
|
446
523
|
<canvas #cursor height="10" (mousedown)="selectionStart($event)" (mouseover)="updateCursorCanvas($event)" (mousemove)="updateCursorCanvas($event)"
|
|
447
524
|
(mouseleave)="updateCursorCanvas($event, false)"></canvas>
|
|
448
|
-
<canvas #marker height="10"></canvas>`,
|
|
449
|
-
styles: [`:host{
|
|
450
|
-
min-height: 0px;
|
|
451
|
-
}`, `canvas {
|
|
452
|
-
top: 0;
|
|
453
|
-
left: 0;
|
|
454
|
-
width: 0;
|
|
455
|
-
height: 0;
|
|
456
|
-
min-height: 0px;
|
|
457
|
-
position: absolute;
|
|
458
|
-
}`]
|
|
459
|
-
}]
|
|
525
|
+
<canvas #marker height="10"></canvas>`, styles: [":host{min-height:0px}\n", "canvas{top:0;left:0;width:0;height:0;min-height:0px;position:absolute}\n"] }]
|
|
460
526
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { audioSignalCanvasRef: [{
|
|
461
527
|
type: ViewChild,
|
|
462
528
|
args: ['audioSignal', { static: true }]
|
|
@@ -464,4 +530,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
|
|
|
464
530
|
type: ViewChild,
|
|
465
531
|
args: ['marker', { static: true }]
|
|
466
532
|
}] } });
|
|
467
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDOztBQTRCL0MsTUFBTSxPQUFPLFdBQVksU0FBUSx5QkFBeUI7SUFrQnhELFlBQW9CLEdBQWU7UUFDakMsS0FBSyxFQUFFLENBQUM7UUFEVSxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBUjNCLHVCQUFrQixHQUFjLElBQUksQ0FBQztRQVUzQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFDLHFCQUFxQixDQUFBO0lBRXpDLENBQUM7SUFFRCxlQUFlO1FBRWIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDO1FB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RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0F1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnR9IGZyb20gXCIuL2F1ZGlvX2NhbnZhc19sYXllcl9jb21wXCI7XHJcbmltcG9ydCB7V29ya2VySGVscGVyfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5pbXBvcnQgeyBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbX0gZnJvbSBcIi4uLy4uL2lvL3N0cmVhbVwiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlOiBhbnksIHRyYW5zZmVyOiBBcnJheTxhbnk+KTogdm9pZDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLXNpZ25hbCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxjYW52YXMgI2JnIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+XHJcbiAgICA8Y2FudmFzICNhdWRpb1NpZ25hbCBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGNhbnZhcyAjY3Vyc29yIGhlaWdodD1cIjEwXCIgKG1vdXNlZG93bik9XCJzZWxlY3Rpb25TdGFydCgkZXZlbnQpXCIgKG1vdXNlb3Zlcik9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50KVwiIChtb3VzZW1vdmUpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50LCBmYWxzZSlcIj48L2NhbnZhcz5cclxuICAgIDxjYW52YXMgI21hcmtlciBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPmAsXHJcblxyXG4gIHN0eWxlczogW2A6aG9zdHtcclxuICAgICAgbWluLWhlaWdodDogMHB4O1xyXG4gICAgfWAsYGNhbnZhcyB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9TaWduYWwgZXh0ZW5kcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50e1xyXG5cclxuICBuOiBhbnk7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICBAVmlld0NoaWxkKCdhdWRpb1NpZ25hbCcsIHsgc3RhdGljOiB0cnVlIH0pIGF1ZGlvU2lnbmFsQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdtYXJrZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBwbGF5UG9zQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBzaWduYWxDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAvL3ByaXZhdGUgYWlzOkFycmF5QXVkaW9CdWZmZXJJbnB1dHNTdHJlYW18bnVsbD1udWxsO1xyXG4gIC8vcHJpdmF0ZSBhaXNCdWY6RmxvYXQzMkFycmF5W118bnVsbD1udWxsO1xyXG4gIC8vcHJpdmF0ZSBwc01pbk1heDpGbG9hdDMyQXJyYXlbXXxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSB3b3JrZXI6IFdvcmtlciB8IG51bGw7XHJcbiAgcHJpdmF0ZSB3b3JrZXJVUkw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XHJcbiAgICB0aGlzLndvcmtlclVSTCA9IFdvcmtlckhlbHBlci5idWlsZFdvcmtlckJsb2JVUkwodGhpcy53b3JrZXJGdW5jdGlvbilcclxuICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlciA9IG51bGw7XHJcbiAgICB0aGlzLl9iZ0NvbG9yPSdibGFjayc7XHJcbiAgICB0aGlzLl9zZWxlY3RDb2xvcj0ncmdiYSgyNTUsMjU1LDAsMC44KSdcclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcblxyXG4gICAgdGhpcy5jZSA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmJnQ2FudmFzID0gdGhpcy5iZ0NhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5iZ0NhbnZhcy5zdHlsZS56SW5kZXggPSAnMSc7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcyA9IHRoaXMuYXVkaW9TaWduYWxDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuc2lnbmFsQ2FudmFzLnN0eWxlLnpJbmRleCA9ICcyJztcclxuICAgIHRoaXMubWFya2VyQ2FudmFzID0gdGhpcy5wbGF5UG9zQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLm1hcmtlckNhbnZhcy5zdHlsZS56SW5kZXggPSAnMyc7XHJcbiAgICB0aGlzLmN1cnNvckNhbnZhcyA9IHRoaXMuY3Vyc29yQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmN1cnNvckNhbnZhcy5zdHlsZS56SW5kZXggPSAnNCc7XHJcblxyXG4gICAgdGhpcy5jYW52YXNMYXllcnNbMF09dGhpcy5iZ0NhbnZhcztcclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzFdPXRoaXMuc2lnbmFsQ2FudmFzO1xyXG4gICAgdGhpcy5jYW52YXNMYXllcnNbMl09dGhpcy5jdXJzb3JDYW52YXM7XHJcbiAgICB0aGlzLmNhbnZhc0xheWVyc1szXT10aGlzLm1hcmtlckNhbnZhcztcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgcGxheUZyYW1lUG9zaXRpb24oKTogbnVtYmVyIHxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKHBsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbCkge1xyXG4gICAgdGhpcy5fcGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgIHRoaXMuZHJhd1BsYXlQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBkcmF3UGxheVBvc2l0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWFya2VyQ2FudmFzKSB7XHJcbiAgICAgIGxldCB3ID0gdGhpcy5tYXJrZXJDYW52YXMud2lkdGg7XHJcbiAgICAgIGxldCBoID0gdGhpcy5tYXJrZXJDYW52YXMuaGVpZ2h0O1xyXG4gICAgICBsZXQgZyA9IHRoaXMubWFya2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgaWYgKGcpIHtcclxuICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICBpZih0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbikge1xyXG4gICAgICAgICAgbGV0IHBpeGVsUG9zID0gdGhpcy5mcmFtZVRvVmlld1BvcnRYUGl4ZWxQb3NpdGlvbih0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAocGl4ZWxQb3MpIHtcclxuICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAncmVkJztcclxuICAgICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdyZWQnO1xyXG4gICAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgICBnLm1vdmVUbyhwaXhlbFBvcywgMCk7XHJcbiAgICAgICAgICAgIGcubGluZVRvKHBpeGVsUG9zLCBoKTtcclxuICAgICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgZy5zdHJva2UoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogIE1ldGhvZCB1c2VkIGFzIHdvcmtlciBjb2RlLlxyXG4gICAqL1xyXG4gIHdvcmtlckZ1bmN0aW9uKCkge1xyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGEgfSkgPT4ge1xyXG5cclxuICAgICAgbGV0IGF1ZGlvRGF0YSA9IGRhdGEuYXVkaW9EYXRhOyAvLyBhdWRpbyBkYXRhIHBhcnQgcmVxdWlyZWQgdG8gcmVuZGVyIHZpZXcgcG9ydFxyXG4gICAgICBsZXQgYXVPZmZzZXQ6bnVtYmVyPWRhdGEuYXVkaW9EYXRhT2Zmc2V0O1xyXG4gICAgICBsZXQgbD0gZGF0YS5sOyAvLyBsZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHZpZXcgcG9ydFxyXG4gICAgICBsZXQgdyA9IGRhdGEudzsgIC8vIHdpZHRoIG9mIHZpZXdwb3J0XHJcbiAgICAgIGxldCB2dyA9IGRhdGEudnc7IC8vICB0b3RhbCB3aWR0aCBvZiAodmlydHVhbCkgYXVkaW8gdmlldyAobm90IHZpZXdwb3J0IHdpZHRoKVxyXG4gICAgICBsZXQgY2hzID0gZGF0YS5jaHM7IC8vIG51bWJlciBvZiBjaGFubmVsc1xyXG4gICAgICBsZXQgZGF0YUZyYW1lTGVuZ3RoID0gZGF0YS5hdWRpb0RhdGFGcmFtZUxlbmd0aDsgIC8vIGZyYW1lIGxlbmd0aCBvZiBhdWRpbyBkYXRhIHBhcnQgcmVxdWlyZWQgZm9yIHZpZXcgcG9ydFxyXG4gICAgICBsZXQgZnJhbWVMZW5ndGggPSBkYXRhLmZyYW1lTGVuZ3RoOyAgLy8gdG90YWwgZnJhbWUgbGVuZ3RoIChvZiBhdWRpbyBjbGlwKVxyXG5cclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiVzogbGVmdDogXCIrbCtcIiwgdzpcIit3K1wiLCB2dzogXCIrdncrXCIsIGNoczogXCIrY2hzK1wiLCBmcmFtZUxlbmd0aDogXCIrZnJhbWVMZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHBzTWluTWF4PSBuZXcgRmxvYXQzMkFycmF5KDApO1xyXG5cclxuICAgICAgaWYoYXVkaW9EYXRhICYmIGF1ZGlvRGF0YS5sZW5ndGg+MCAmJiB3Pj0wICYmIHZ3PjApIHtcclxuXHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB2dztcclxuXHJcbiAgICAgICAgbGV0IHBvaW50c0xlbiA9IHcgKiBjaHM7XHJcbiAgICAgICAgLy8gb25lIGZvciBtaW4gb25lIGZvciBtYXhcclxuICAgICAgICBsZXQgYXJyTGVuID0gcG9pbnRzTGVuICogMjtcclxuICAgICAgICBwc01pbk1heCA9IG5ldyBGbG9hdDMyQXJyYXkoYXJyTGVuKTtcclxuICAgICAgICBsZXQgY2hGcmFtZVBvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNoRnJhbWVMZW5ndGg9YXVkaW9EYXRhLmxlbmd0aC9jaHM7XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG5cclxuICAgICAgICAgIGNoRnJhbWVQb3MgPSBjaCAqIGNoRnJhbWVMZW5ndGg7XHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICBsZXQgdmlydFBpaT1sK3BpaTtcclxuICAgICAgICAgICAgbGV0IHBNaW4gPSBJbmZpbml0eTtcclxuICAgICAgICAgICAgbGV0IHBNYXggPSAtSW5maW5pdHk7XHJcbiAgICAgICAgICAgIGxldCBwaXhlbEZyYW1lUG9zID0gTWF0aC5yb3VuZChjaEZyYW1lUG9zICsgKHZpcnRQaWkgKiBmcmFtZXNQZXJQaXhlbCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHBpeGVsIG1pbi9tYXggYW1wbGl0dWRlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGFpID0gMDsgYWkgPCBmcmFtZXNQZXJQaXhlbDsgYWkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBmcmFtZVBvcyA9IHBpeGVsRnJhbWVQb3MgKyBhaTtcclxuICAgICAgICAgICAgICBsZXQgYSA9IDA7XHJcbiAgICAgICAgICAgICAgbGV0IGJ1ZlBvcz1mcmFtZVBvcy1hdU9mZnNldDtcclxuICAgICAgICAgICAgICAvL2xldCBidWZQb3M9ZnJhbWVQb3M7XHJcbiAgICAgICAgICAgICAgaWYoYnVmUG9zPj0wICYmIGJ1ZlBvczxhdWRpb0RhdGEubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgIGE9YXVkaW9EYXRhW2J1ZlBvc107XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXOiBjaDogXCIrY2grXCIsIHBpeGVsRnJhbWVQb3M6IFwiK3BpeGVsRnJhbWVQb3MrXCIsIGZyYW1lUG9zOiBcIitmcmFtZVBvcytcIiwgYXVPZmZzZXQ6IFwiK2F1T2Zmc2V0K1wiLCBidWZQb3M6IFwiK2J1ZlBvcytcIiwgYXVkaW9EYXRhLmxlbmd0aDogXCIrYXVkaW9EYXRhLmxlbmd0aCtcIiwgYTogXCIrYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA8IHBNaW4pIHtcclxuICAgICAgICAgICAgICAgICAgcE1pbiA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA+IHBNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgcE1heCA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcHNNaW5Qb3MgPSBjaCAqIHcgKyBwaWk7XHJcbiAgICAgICAgICAgIHBzTWluTWF4W3BzTWluUG9zXSA9IHBNaW47XHJcbiAgICAgICAgICAgIGxldCBwc01heFBvcyA9IHBvaW50c0xlbiArIHBzTWluUG9zO1xyXG4gICAgICAgICAgICBwc01pbk1heFtwc01heFBvc10gPSBwTWF4O1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJwc01pbk1heFtcIitwc01pblBvcytcIl09XCIrcE1pbitcIixwc01pbk1heFtcIitwc01heFBvcytcIl09XCIrcE1heCk7XHJcblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcG9zdE1lc3NhZ2Uoe3BzTWluTWF4OiBwc01pbk1heCwgbDpkYXRhLmwsdzogZGF0YS53LCBjaHM6IGRhdGEuY2hzLGVvZDpkYXRhLmVvZH0sIFtwc01pbk1heC5idWZmZXJdKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHN0YXJ0RHJhdyhjbGVhciA9IHRydWUpIHtcclxuICAgIGlmIChjbGVhcikge1xyXG4gICAgICBpZih0aGlzLmJvdW5kcykge1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAvL2cuY2xlYXJSZWN0KDAsIDAsdywgaCk7XHJcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9IFwiYmxhY2tcIjtcclxuICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpLCBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRSZW5kZXIoKTtcclxuICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHN0YXJ0UmVuZGVyKCkge1xyXG5cclxuICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYm91bmRzICYmIHRoaXMuYm91bmRzLmRpbWVuc2lvbikge1xyXG5cclxuICAgICAgbGV0IHcgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgIGxldCBoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIgJiYgdz4wICYmIGg+MCkge1xyXG4gICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJy4vYXVkaW9zaWduYWwud29ya2VyLmpzJyx7dHlwZTogJ21vZHVsZSd9KTtcclxuICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIodGhpcy53b3JrZXJVUkwpO1xyXG4gICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJ3dvcmtlci9hdWRpb3NpZ25hbC53b3JrZXIudHMnKTtcclxuXHJcbiAgICAgICAgLy9sZXQgV29ya2VyID0gcmVxdWlyZSgnd29ya2VyIS4uLy4uLy4uL3dvcmtlcnMvdXBsb2FkZXIvbWFpbicpO1xyXG4gICAgICAgIGxldCBjaHMgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICBsZXQgbGVmdFBvcz0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5wb3NpdGlvbi5sZWZ0KTtcclxuICAgICAgICBsZXQgcmVuZGVyUG9zPWxlZnRQb3M7XHJcbiAgICAgICAgbGV0IHZ3PU1hdGgucm91bmQodGhpcy52aXJ0dWFsRGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICBsZXQgZnJhbWVMZW5ndGggPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIuZnJhbWVMZW47XHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gTWF0aC5jZWlsKGZyYW1lTGVuZ3RoIC8gdncpO1xyXG4gICAgICAgIGxldCBhdWRpb0J1ZmZlcj10aGlzLl9hdWRpb0RhdGFIb2xkZXIuYnVmZmVyO1xyXG4gICAgICAgIC8vbGV0IGFycmF5QXVkaW9CdWZmZXI9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmFycmF5QnVmZmVyO1xyXG4gICAgICAgIGxldCBhcnJBYkJ1ZjpGbG9hdDMyQXJyYXlbXXxudWxsO1xyXG5cclxuICAgICAgICAvL2xldCBhaXM6QXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAgICAgICAvL2xldCBhaXNCdWY6RmxvYXQzMkFycmF5W118bnVsbD1udWxsO1xyXG4gICAgICAgIGxldCBwc01pbk1heDpGbG9hdDMyQXJyYXl8bnVsbD1udWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgIHRoaXMud29ya2VyLm9ubWVzc2FnZSA9IChtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZihtZS5kYXRhLmVvZD09PXRydWUpe1xyXG4gICAgICAgICAgICAgIGxldCBwc01pbk1heFRtcDtcclxuICAgICAgICAgICAgICBpZihwc01pbk1heCl7XHJcbiAgICAgICAgICAgICAgICBwc01pbk1heFRtcD1wc01pbk1heDtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHBzTWluTWF4VG1wPW1lLmRhdGEucHNNaW5NYXg7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuZHJhd1JlbmRlcmVkKGxlZnRQb3MsdyxoLGNocyxwc01pbk1heFRtcCk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZih0aGlzLl9hdWRpb0RhdGFIb2xkZXIgJiYgYXJyQWJCdWYpe1xyXG4gICAgICAgICAgICAgIGxldCBydz1tZS5kYXRhLnc7XHJcbiAgICAgICAgICAgICAgbGV0IHJQb2ludHNMZW49Y2hzKnJ3O1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludHNMZW49Y2hzKnc7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgaWYocHNNaW5NYXgpe1xyXG4gICAgICAgICAgICAgICAgICBsZXQgckJhc2VQb3M9Y2gqcnc7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBiYXNlUG9zPWNoKnc7XHJcbiAgICAgICAgICAgICAgICAgIGxldCByUG9zTWluID1yQmFzZVBvcztcclxuICAgICAgICAgICAgICAgICAgbGV0IHJQb3NNYXg9clBvaW50c0xlbityUG9zTWluO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcG9zTWluID1iYXNlUG9zKyhyZW5kZXJQb3MtbGVmdFBvcyk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBwb3NNYXg9cG9pbnRzTGVuK3Bvc01pbjtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHBzTWluTWF4W3Bvc01pbl09bWUuZGF0YS5wc01pbk1heFtyUG9zTWluXTtcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdNaW46ICgnK3BvcysnKTogJyttZS5kYXRhLnBzTWluTWF4WzBdKTtcclxuICAgICAgICAgICAgICAgICAgcHNNaW5NYXhbcG9zTWF4XT1tZS5kYXRhLnBzTWluTWF4W3JQb3NNYXhdO1xyXG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKCdNYXg6ICgnKyhwb2ludHNMZW4rcG9zKSsnKTogJyttZS5kYXRhLnBzTWluTWF4WzFdKTtcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwicHNNaW5NYXhbXCIrcG9zTWluK1wiXT1cIittZS5kYXRhLnBzTWluTWF4W3JQb3NNaW5dK1wiICAoclBvc01pbj1cIityUG9zTWluK1wiKSxwc01pbk1heFtcIitwb3NNYXgrXCJdPVwiK21lLmRhdGEucHNNaW5NYXhbclBvc01heF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgZW9kPWZhbHNlO1xyXG4gICAgICAgICAgICAgIHJlbmRlclBvcysrO1xyXG4gICAgICAgICAgICAgIGxldCBhZDpGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBsZWZ0RnJhbWVQb3MgPSBNYXRoLmZsb29yKGZyYW1lTGVuZ3RoICogcmVuZGVyUG9zIC8gdncpO1xyXG4gICAgICAgICAgICAgIGlmKHJlbmRlclBvczxsZWZ0UG9zK3cpIHtcclxuICAgICAgICAgICAgICAgIGxldCByZWFkID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lcyhsZWZ0RnJhbWVQb3MsIGZyYW1lc1BlclBpeGVsLCBhcnJBYkJ1Zik7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJGaXJzdCByZWFkIGZyYW1lOiBcIithcnJBYkJ1ZlswXVswXSk7XHJcbiAgICAgICAgICAgICAgICBhZCA9IG5ldyBGbG9hdDMyQXJyYXkoY2hzICogZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICBhZC5zZXQoYXJyQWJCdWZbY2hdLCBjaCAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVvZD0ocmVhZDw9MCk7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBhZD1uZXcgRmxvYXQzMkFycmF5KCk7XHJcbiAgICAgICAgICAgICAgICBlb2Q9dHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbGV0IGFkQnVmPWFkLmJ1ZmZlcjtcclxuICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgbDogcmVuZGVyUG9zLFxyXG4gICAgICAgICAgICAgICAgICB3OiBtZS5kYXRhLncsXHJcbiAgICAgICAgICAgICAgICAgIGg6aCxcclxuICAgICAgICAgICAgICAgICAgdnc6IHZ3LFxyXG4gICAgICAgICAgICAgICAgICBjaHM6IGNocyxcclxuICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICBhdWRpb0RhdGE6IGFkLFxyXG4gICAgICAgICAgICAgICAgICBhdWRpb0RhdGFPZmZzZXQ6IGxlZnRGcmFtZVBvcyxcclxuICAgICAgICAgICAgICAgICAgZW9kOmVvZFxyXG4gICAgICAgICAgICAgICAgfSwgW2FkQnVmXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXVkaW9CdWZmZXIgJiYgYXVkaW9CdWZmZXIubGVuZ3RoKmF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHMgPCBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50LkVOQUJMRV9TVFJFQU1JTkdfTlVNQkVSX09GX1NBTVBMRVNfVEhSRVNIT0xEKSB7XHJcblxyXG4gICAgICAgICAgLy8gUmVuZGVyIHdob2xlIGNsaXAgYXQgb25jZVxyXG4gICAgICAgICAgYXJyQWJCdWY9bnVsbDtcclxuICAgICAgICAgIHBzTWluTWF4PW51bGw7XHJcbiAgICAgICAgICBsZXQgYWQgPSBuZXcgRmxvYXQzMkFycmF5KGNocyAqIGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgYWQuc2V0KGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKSwgY2ggKiBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGw6IGxlZnRQb3MsXHJcbiAgICAgICAgICAgIHc6IHcsXHJcbiAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OjAsXHJcbiAgICAgICAgICAgIGVvZDp0cnVlXHJcbiAgICAgICAgICB9LCBbYWQuYnVmZmVyXSk7XHJcblxyXG4gICAgICAgIH1lbHNle1xyXG5cclxuICAgICAgICAgIC8vIFJlbmRlciBwaXhlbCBieSBwaXhlbFxyXG4gICAgICAgICAgaWYodz4wKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoZnJhbWVzUGVyUGl4ZWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHJ3PTE7XHJcbiAgICAgICAgICAgICAgLy9haXMgPSBuZXcgQXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtKGFycmF5QXVkaW9CdWZmZXIpO1xyXG4gICAgICAgICAgICAgIGFyckFiQnVmID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hzKTtcclxuICAgICAgICAgICAgICBwc01pbk1heD1uZXcgRmxvYXQzMkFycmF5KGNocyp3KjIpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgIGFyckFiQnVmW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgbGVmdEZyYW1lUG9zPU1hdGguZmxvb3IoZnJhbWVMZW5ndGgqcmVuZGVyUG9zL3Z3KTtcclxuICAgICAgICAgICAgICBsZXQgYXVPZmZzZXQ9bGVmdEZyYW1lUG9zOyAvLyBzaG91bGQgYWx3YXlzIGJlIDBcclxuICAgICAgICAgICAgICAvL2xldCByZWFkPWFycmF5QXVkaW9CdWZmZXIuZnJhbWVzKGxlZnRGcmFtZVBvcyxmcmFtZXNQZXJQaXhlbCxhcnJBYkJ1Zik7XHJcbiAgICAgICAgICAgICAgbGV0IHJlYWQ9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lcyhsZWZ0RnJhbWVQb3MsZnJhbWVzUGVyUGl4ZWwsYXJyQWJCdWYpO1xyXG4gICAgICAgICAgICAgIGxldCBhZD1uZXcgRmxvYXQzMkFycmF5KGNocypmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgYWQuc2V0KGFyckFiQnVmW2NoXSxjaCpmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICBsOiByZW5kZXJQb3MsXHJcbiAgICAgICAgICAgICAgICB3OiBydyxcclxuICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgIGNoczogY2hzLFxyXG4gICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgICAgIGF1ZGlvRGF0YU9mZnNldDphdU9mZnNldCxcclxuICAgICAgICAgICAgICAgIGVvZDoocmVhZDw9MClcclxuICAgICAgICAgICAgICB9LCBbYWQuYnVmZmVyXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBkcmF3UmVuZGVyZWQobGVmdDpudW1iZXIsdzpudW1iZXIsaDpudW1iZXIsY2hzOm51bWJlcixwc01pbk1heDpGbG9hdDMyQXJyYXkpIHtcclxuICAgIHRoaXMuZHJhd0JnKCk7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcy5zdHlsZS5sZWZ0PWxlZnQudG9TdHJpbmcoKSsncHgnO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMud2lkdGggPSB3O1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMuaGVpZ2h0ID0gaDtcclxuICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgaWYgKGcpIHtcclxuICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIC8vZy5maWxsU3R5bGUgPSBcImJsYWNrXCI7XHJcbiAgICAgIC8vZy5maWxsUmVjdCgwLCAwLCBtZS5kYXRhLncsIG1lLmRhdGEuaCk7XHJcbiAgICAgIGxldCBwb2ludHNMZW4gPSB3ICogY2hzO1xyXG4gICAgICAvLyBvbmUgZm9yIG1pbiBvbmUgZm9yIG1heFxyXG4gICAgICBsZXQgYXJyTGVuID0gcG9pbnRzTGVuICogMjtcclxuICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICAgIGxldCBzdGQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICBsZXQgY2hIID0gaCAvIGNocztcclxuXHJcbiAgICAgICAgbGV0IHkgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgIGxldCB4ID0gMDtcclxuXHJcbiAgICAgICAgICBsZXQgcHNNaW5Qb3MgPSBjaCAqIHc7XHJcbiAgICAgICAgICBsZXQgcHNNYXhQb3MgPSBwb2ludHNMZW4gKyBwc01pblBvcztcclxuXHJcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9ICdncmVlbic7XHJcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcclxuXHJcbiAgICAgICAgICAvLyBkcmF3IGF1ZGlvIHNpZ25hbCBhcyBzaW5nbGUgcG9seWdvblxyXG4gICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgIGcubW92ZVRvKDAsIHkgKyAoY2hIIC8gMikgKyBwc01pbk1heFtwc01heFBvc10gKiBjaEggLyAyKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICBsZXQgcHNNYXggPSBwc01pbk1heFtwc01heFBvcyArIHBpaV07XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHBzTWF4ICogY2hIIC8gMjtcclxuICAgICAgICAgICAgbGV0IHlkPXkgKyAoY2hIIC8gMikgLSBwdjtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxpbmVUbzogOiBcIitwaWkrXCIgXCIreWQpXHJcbiAgICAgICAgICAgIGcubGluZVRvKHBpaSwgeWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHJldlBpeGVsU3RhcnQ9dy0xO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IHBpaSA9IHJldlBpeGVsU3RhcnQ7IHBpaSA+PSAwOyBwaWktLSkge1xyXG4gICAgICAgICAgICBsZXQgcHNNaW4gPSBwc01pbk1heFtwc01pblBvcyArIHBpaV07XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHBzTWluICogY2hIIC8gMjtcclxuICAgICAgICAgICAgbGV0IHlkPXkgKyAoY2hIIC8gMikgLSBwdjtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkxpbmVUbzogOiBcIitwaWkrXCIgXCIreWQpXHJcbiAgICAgICAgICAgIGcubGluZVRvKHBpaSwgeWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuXHJcbiAgICAgICAgICBnLmZpbGwoKTtcclxuICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB5ICs9IGNoSDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZHJhdygpIHtcclxuICAgIHRoaXMuZHJhd0JnKClcclxuICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgaWYgKGcpIHtcclxuICAgICAgbGV0IHcgPSB0aGlzLnNpZ25hbENhbnZhcy53aWR0aDtcclxuICAgICAgbGV0IGggPSB0aGlzLnNpZ25hbENhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAvL2cuZmlsbFN0eWxlID0gXCJibGFja1wiO1xyXG4gICAgICAvL2cuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpIHtcclxuICAgICAgICBsZXQgc3RkID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgY2hzID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICAgICAgbGV0IGNoSCA9IGggLyBjaHM7XHJcblxyXG4gICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuXHJcbiAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB3O1xyXG4gICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICBsZXQgYWlzOkZsb2F0MzJBcnJheUlucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAgICAgICBsZXQgYXVkaW9CdWZmZXI9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmJ1ZmZlcjtcclxuICAgICAgICBsZXQgYWlzQnVmZmVyOkFycmF5PEZsb2F0MzJBcnJheT58bnVsbD1udWxsO1xyXG4gICAgICAgIGlmKCFhdWRpb0J1ZmZlcikge1xyXG4gICAgICAgICAgYWlzPXRoaXMuX2F1ZGlvRGF0YUhvbGRlci5hdWRpb0lucHV0U3RyZWFtKCk7XHJcbiAgICAgICAgICBhaXNCdWZmZXI9bmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hzKTtcclxuICAgICAgICAgIGZvcihsZXQgY2g9MDtjaDxjaHM7Y2grKykge1xyXG4gICAgICAgICAgICBhaXNCdWZmZXJbY2hdID0gbmV3IEZsb2F0MzJBcnJheShmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICBsZXQgeCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwc01pbiA9IG5ldyBGbG9hdDMyQXJyYXkodyk7XHJcbiAgICAgICAgICAgIGxldCBwc01heCA9IG5ldyBGbG9hdDMyQXJyYXkodyk7XHJcbiAgICAgICAgICAgIGxldCBmcmFtZVBvcyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBNaW4gPSAwO1xyXG4gICAgICAgICAgICAgIGxldCBwTWF4ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyKXtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBwaXhlbCBtaW4vbWF4IGFtcGxpdHVkZVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYWkgPSAwOyBhaSA8IGZyYW1lc1BlclBpeGVsOyBhaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vbGV0IGZyYW1lUG9zPShwaWkqZnJhbWVzUGVyUGl4ZWwpK2FpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYSA9IGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKVtmcmFtZVBvcysrXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChhIDwgcE1pbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHBNaW4gPSBhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChhID4gcE1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBNYXggPSBhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGFpcyAmJiBhaXNCdWZmZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCByID0gYWlzLnJlYWQoYWlzQnVmZmVyKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGFpID0gMDsgYWkgPCByOyBhaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgYSA9IGFpc0J1ZmZlcltjaF1bYWldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKGEgPCBwTWluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcE1pbiA9IGE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKGEgPiBwTWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcE1heCA9IGE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcHNNaW5bcGlpXSA9IHBNaW47XHJcbiAgICAgICAgICAgICAgcHNNYXhbcGlpXSA9IHBNYXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAnZ3JlZW4nO1xyXG4gICAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcclxuXHJcbiAgICAgICAgICAgIC8vIGRyYXcgYXVkaW8gc2lnbmFsIGFzIHNpbmdsZSBwb2x5Z29uXHJcbiAgICAgICAgICAgIGcuYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgIGcubW92ZVRvKDAsIHkgKyAoY2hIIC8gMikgKyBwc01pblswXSAqIGNoSCAvIDIpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgcHYgPSBwc01pbltwaWldICogY2hIIC8gMjtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTWluOiBcIixwdik7XHJcbiAgICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ICsgKGNoSCAvIDIpICsgcHYpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IHBpaSA9IHc7IHBpaSA+PSAwOyBwaWktLSkge1xyXG4gICAgICAgICAgICAgIGxldCBwdiA9IHBzTWF4W3BpaV0gKiBjaEggLyAyO1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJNYXg6IFwiLHB2KTtcclxuICAgICAgICAgICAgICBnLmxpbmVUbyhwaWksIHkgKyAoY2hIIC8gMikgKyBwdik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgLy9nLmxpbmVUbygpXHJcbiAgICAgICAgICAgIGcuZmlsbCgpO1xyXG4gICAgICAgICAgICBnLnN0cm9rZSgpO1xyXG4gICAgICAgICAgICBnLmZpbGxTdHlsZSA9IFwieWVsbG93XCI7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgIHkgKz0gY2hIO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RGF0YShhdWRpb0RhdGE6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwpIHtcclxuICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlciA9IGF1ZGlvRGF0YTtcclxuICAgIHRoaXMucGxheUZyYW1lUG9zaXRpb24gPSAwO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|
|
533
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBa0IsTUFBTSxzQkFBc0IsQ0FBQzs7QUEyQnhFLE1BQU0sT0FBTyxXQUFZLFNBQVEseUJBQXlCO0lBaUJ4RCxZQUFvQixHQUFlO1FBQ2pDLEtBQUssRUFBRSxDQUFDO1FBRFUsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQVAzQix1QkFBa0IsR0FBYyxJQUFJLENBQUM7UUFFckMsV0FBTSxHQUFnQixJQUFJLENBQUM7UUFHM0IsY0FBUyxHQUFtQixJQUFJLENBQUM7UUFJdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBQyxPQUFPLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBQyxxQkFBcUIsQ0FBQTtJQUV6QyxDQUFDO0lBRUQsZUFBZTtRQUViLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUVyQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFFekMsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLGlCQUFpQixDQUFDLGlCQUE4QjtRQUNsRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsaUJBQWlCLENBQUM7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUlELGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNoQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsRUFBRTtnQkFDTCxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDMUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUMzRSxJQUFJLFFBQVEsRUFBRTt3QkFDWixDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzt3QkFDcEIsQ0FBQyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7d0JBQ3RCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDZCxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDdEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3RCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDZCxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ1o7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUV2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsK0NBQStDO1lBQ2pGLE1BQU0sUUFBUSxHQUFRLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDM0MsTUFBTSxDQUFDLEdBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztZQUNwRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUUsb0JBQW9CO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyw0REFBNEQ7WUFDaEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQjtZQUMzQywrR0FBK0c7WUFDL0csTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFFLHFDQUFxQztZQUU1RSxnR0FBZ0c7WUFFaEcsSUFBSSxRQUFRLEdBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEMsSUFBRyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBQyxDQUFDLElBQUksQ0FBQyxJQUFFLENBQUMsSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFFO2dCQUVsRCxNQUFNLGNBQWMsR0FBRyxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUV4QyxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUMxQiwwQkFBMEI7Z0JBQzFCLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQzdCLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLGFBQWEsR0FBQyxTQUFTLENBQUMsTUFBTSxHQUFDLEdBQUcsQ0FBQztnQkFDekMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtvQkFFL0IsVUFBVSxHQUFHLEVBQUUsR0FBRyxhQUFhLENBQUM7b0JBQ2hDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0JBQ2hDLE1BQU0sT0FBTyxHQUFDLENBQUMsR0FBQyxHQUFHLENBQUM7d0JBQ3BCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQzt3QkFDcEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7d0JBQ3JCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7d0JBRXhFLG9DQUFvQzt3QkFDcEMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGNBQWMsRUFBRSxFQUFFLEVBQUUsRUFBRTs0QkFDMUMsTUFBTSxRQUFRLEdBQUcsYUFBYSxHQUFHLEVBQUUsQ0FBQzs0QkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUNWLE1BQU0sTUFBTSxHQUFDLFFBQVEsR0FBQyxRQUFRLENBQUM7NEJBQy9CLHNCQUFzQjs0QkFDdEIsSUFBRyxNQUFNLElBQUUsQ0FBQyxJQUFJLE1BQU0sR0FBQyxTQUFTLENBQUMsTUFBTSxFQUFDO2dDQUN0QyxDQUFDLEdBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dDQUNwQixzTEFBc0w7Z0NBQ3RMLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRTtvQ0FDWixJQUFJLEdBQUcsQ0FBQyxDQUFDO2lDQUNWO2dDQUNELElBQUksQ0FBQyxHQUFHLElBQUksRUFBRTtvQ0FDWixJQUFJLEdBQUcsQ0FBQyxDQUFDO2lDQUNWOzZCQUNGO3lCQUNGO3dCQUVELE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO3dCQUM5QixRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsUUFBUSxDQUFDO3dCQUN0QyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixnRkFBZ0Y7cUJBRWpGO2lCQUNGO2FBQ0Y7WUFDRCxXQUFXLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxJQUFJLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN2RyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFJRCxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUk7UUFDcEIsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEVBQUU7b0JBQ0wseUJBQXlCO29CQUN6QixDQUFDLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2lCQUNyRzthQUNGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQ3hCLENBQUM7SUFHTyxXQUFXO1FBRWpCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDcEI7UUFDRCxJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUM7WUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM5QjtRQUNDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFFLEVBQUU7Z0JBQzNDLElBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQ2hFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUVqRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO3dCQUU1QixtRUFBbUU7d0JBQ25FLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUN6Qyx1REFBdUQ7d0JBRXZELGdFQUFnRTt3QkFDaEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO3dCQUNqRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNwRCxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUM7d0JBRXhCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7d0JBQ2pELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRCx5SEFBeUg7d0JBQ3pILElBQUksRUFBRSxHQUFpQixJQUFJLFlBQVksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLENBQUM7d0JBQzlELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO3dCQUMzRCxJQUFJLFdBQVcsR0FBdUIsSUFBSSxDQUFDO3dCQUMzQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO3dCQUNwRCxJQUFJLFdBQVcsWUFBWSxpQkFBaUIsRUFBRTs0QkFDNUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7eUJBQ3ZDO3dCQUNELHlEQUF5RDt3QkFDekQsSUFBSSxRQUErQixDQUFDO3dCQUVwQyxnREFBZ0Q7d0JBQ2hELHNDQUFzQzt3QkFDdEMsSUFBSSxRQUFRLEdBQXdCLElBQUksQ0FBQzt3QkFFekMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFOzRCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0NBQzdCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFO29DQUN4QixJQUFJLFdBQVcsQ0FBQztvQ0FDaEIsSUFBSSxRQUFRLEVBQUU7d0NBQ1osV0FBVyxHQUFHLFFBQVEsQ0FBQztxQ0FDeEI7eUNBQU07d0NBQ0wsV0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3FDQUNoQztvQ0FDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztvQ0FDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO3dDQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7cUNBQ3pCO29DQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQ0FDZDtxQ0FBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLEVBQUU7b0NBQzVDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29DQUNyQixNQUFNLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO29DQUM1QixNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO29DQUMxQixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFO3dDQUMvQixJQUFJLFFBQVEsRUFBRTs0Q0FDWixJQUFJLFFBQVEsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOzRDQUN2QixJQUFJLE9BQU8sR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRDQUNyQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7NENBQ3ZCLElBQUksT0FBTyxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7NENBQ25DLElBQUksTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQzs0Q0FDN0MsSUFBSSxNQUFNLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQzs0Q0FFaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRDQUM3QyxpRUFBaUU7NENBQ2pFLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzs0Q0FDN0MsbUVBQW1FOzRDQUNuRSw2SUFBNkk7eUNBQzlJO3FDQUNGO29DQUNELElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztvQ0FDaEIsU0FBUyxFQUFFLENBQUM7b0NBQ1osc0JBQXNCO29DQUV0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUM7b0NBQzlELElBQUksU0FBUyxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQUU7d0NBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQTt3Q0FFdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUNoQzs0Q0FDRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnREFDYixxREFBcUQ7Z0RBQ3JELElBQUksUUFBUSxFQUFFO29EQUNaLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxjQUFjLENBQUM7b0RBQ25DLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7d0RBQzlCLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztxREFDOUI7b0RBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTt3REFDL0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO3FEQUMzQztpREFDRjtnREFDRCxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7Z0RBQ2xCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0RBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvREFDZixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQzt3REFDdEIsQ0FBQyxFQUFFLFNBQVM7d0RBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3REFDWixDQUFDLEVBQUUsQ0FBQzt3REFDSixFQUFFLEVBQUUsRUFBRTt3REFDTixHQUFHLEVBQUUsR0FBRzt3REFDUixXQUFXLEVBQUUsV0FBVzt3REFDeEIsU0FBUyxFQUFFLEVBQUU7d0RBQ2IsZUFBZSxFQUFFLFlBQVk7d0RBQzdCLEdBQUcsRUFBRSxHQUFHO3FEQUNULEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lEQUNiOzRDQUNILENBQUM7NENBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0RBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs0Q0FDakUsQ0FBQzt5Q0FDRixDQUNGLENBQUE7cUNBRUY7eUNBQU07d0NBQ0wsRUFBRSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7d0NBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUM7d0NBQ1gsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQzt3Q0FDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFOzRDQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO2dEQUN0QixDQUFDLEVBQUUsU0FBUztnREFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2dEQUNaLENBQUMsRUFBRSxDQUFDO2dEQUNKLEVBQUUsRUFBRSxFQUFFO2dEQUNOLEdBQUcsRUFBRSxHQUFHO2dEQUNSLFdBQVcsRUFBRSxXQUFXO2dEQUN4QixTQUFTLEVBQUUsRUFBRTtnREFDYixlQUFlLEVBQUUsWUFBWTtnREFDN0IsR0FBRyxFQUFFLEdBQUc7NkNBQ1QsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7eUNBQ2I7cUNBQ0Y7aUNBQ0Y7NEJBQ0gsQ0FBQyxDQUFBO3lCQUNGO3dCQUVELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDLDRDQUE0QyxFQUFFOzRCQUU3SSw0QkFBNEI7NEJBQzVCLFFBQVEsR0FBRyxJQUFJLENBQUM7NEJBQ2hCLFFBQVEsR0FBRyxJQUFJLENBQUM7NEJBQ2hCLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQzs0QkFDL0MsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtnQ0FDL0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQzs2QkFDMUQ7NEJBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7Z0NBQ3RCLENBQUMsRUFBRSxPQUFPO2dDQUNWLENBQUMsRUFBRSxDQUFDO2dDQUNKLEVBQUUsRUFBRSxFQUFFO2dDQUNOLEdBQUcsRUFBRSxHQUFHO2dDQUNSLFdBQVcsRUFBRSxXQUFXO2dDQUN4QixTQUFTLEVBQUUsRUFBRTtnQ0FDYixlQUFlLEVBQUUsQ0FBQztnQ0FDbEIsR0FBRyxFQUFFLElBQUk7NkJBQ1YsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3lCQUVqQjs2QkFBTTs0QkFFTCx3QkFBd0I7NEJBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQ0FFVCxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7b0NBQ3RCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztvQ0FDWCxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQWUsR0FBRyxDQUFDLENBQUM7b0NBQ3hDLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29DQUN6QyxvRUFBb0U7b0NBQ3BFLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7d0NBQy9CLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztxQ0FDakQ7b0NBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDO29DQUM5RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxxQkFBcUI7b0NBRXBELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQ0FFdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29DQUUzQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQ2hDO3dDQUNFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFOzRDQUViLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0RBQzNCLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxjQUFjLENBQUM7Z0RBQ25DLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7b0RBQzlCLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztpREFDOUI7Z0RBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtvREFDL0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO2lEQUMzQztnREFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztvREFDdEIsQ0FBQyxFQUFFLFNBQVM7b0RBQ1osQ0FBQyxFQUFFLEVBQUU7b0RBQ0wsRUFBRSxFQUFFLEVBQUU7b0RBQ04sR0FBRyxFQUFFLEdBQUc7b0RBQ1IsV0FBVyxFQUFFLFdBQVc7b0RBQ3hCLFNBQVMsRUFBRSxFQUFFO29EQUNiLGVBQWUsRUFBRSxRQUFRO29EQUN6QixHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO2lEQUNqQixFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7NkNBQ2pCO3dDQUNILENBQUM7d0NBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7NENBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsR0FBRyxHQUFHLENBQUMsQ0FBQzt3Q0FDakUsQ0FBQztxQ0FDRixDQUNGLENBQUM7aUNBQ0g7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsRUFBRTtvQkFDTCxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN6QjthQUNGO1NBQ0Y7SUFFTCxDQUFDO0lBRUgsYUFBYSxDQUFDLFNBQWdCO1FBQzFCLElBQUcsU0FBUyxFQUFFO1lBQ1osTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDaEMsTUFBTSxDQUFDLEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDZixDQUFDLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztnQkFDeEIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Z0JBQ3RCLENBQUMsQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUMvQjtTQUNGO0lBQ0wsQ0FBQztJQUNDLFlBQVksQ0FBQyxJQUFXLEVBQUMsQ0FBUSxFQUFDLENBQVEsRUFBQyxHQUFVLEVBQUMsUUFBcUI7UUFDekUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBQyxJQUFJLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsRUFBRTtZQUNMLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUN4QiwwQkFBMEI7WUFDMUIsK0JBQStCO1lBQy9CLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUN6Qix5QkFBeUI7Z0JBRXpCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBRXBCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFO29CQUMvQixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN4QixNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsUUFBUSxDQUFDO29CQUV0QyxDQUFDLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7b0JBRXhCLHNDQUFzQztvQkFDdEMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNkLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUUxRCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dCQUNoQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDO3dCQUN2QyxNQUFNLEVBQUUsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDM0IsTUFBTSxFQUFFLEdBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDNUIsc0NBQXNDO3dCQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDbkI7b0JBQ0QsTUFBTSxhQUFhLEdBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQztvQkFFeEIsS0FBSyxJQUFJLEdBQUcsR0FBRyxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTt3QkFDN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDdkMsTUFBTSxFQUFFLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7d0JBQzNCLE1BQU0sRUFBRSxHQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQzVCLHNDQUFzQzt3QkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQ25CO29CQUNELENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFFZCxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ1QsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNYLENBQUMsSUFBSSxHQUFHLENBQUM7aUJBQ1Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsZ0RBQWdEO0lBQ2hELGFBQWE7SUFDYix1Q0FBdUM7SUFDdkMsd0NBQXdDO0lBQ3hDLCtCQUErQjtJQUMvQiwrQkFBK0I7SUFDL0IsZ0NBQWdDO0lBQ2hDLG1DQUFtQztJQUNuQyw4QkFBOEI7SUFDOUIsMERBQTBEO0lBQzFELDJCQUEyQjtJQUMzQixFQUFFO0lBQ0YsMERBQTBEO0lBQzFELEVBQUU7SUFDRiw4Q0FBOEM7SUFDOUMsbUJBQW1CO0lBQ25CLG1EQUFtRDtJQUNuRCwyREFBMkQ7SUFDM0QsK0NBQStDO0lBQy9DLHNEQUFzRDtJQUN0RCwrQ0FBK0M7SUFDL0MsVUFBVTtJQUNWLHFEQUFxRDtJQUNyRCwyQkFBMkI7SUFDM0Isd0RBQXdEO0lBQ3hELGtEQUFrRDtJQUNsRCxzQ0FBc0M7SUFDdEMsOERBQThEO0lBQzlELFlBQVk7SUFDWixVQUFVO0lBQ1YsNkNBQTZDO0lBQzdDLHVCQUF1QjtJQUN2Qiw2Q0FBNkM7SUFDN0MsNkNBQTZDO0lBQzdDLDhCQUE4QjtJQUM5QixnREFBZ0Q7SUFDaEQsNEJBQTRCO0lBQzVCLDRCQUE0QjtJQUM1QixFQUFFO0lBQ0YsZ0NBQWdDO0lBQ2hDLHFEQUFxRDtJQUNyRCw4REFBOEQ7SUFDOUQsMERBQTBEO0lBQzFELHNFQUFzRTtJQUN0RSxFQUFFO0lBQ0Ysa0NBQWtDO0lBQ2xDLDhCQUE4QjtJQUM5QixvQkFBb0I7SUFDcEIsa0NBQWtDO0lBQ2xDLDhCQUE4QjtJQUM5QixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLHlDQUF5QztJQUN6Qyw2Q0FBNkM7SUFDN0MsaURBQWlEO0lBQ2pELEVBQUU7SUFDRiw2Q0FBNkM7SUFDN0MsRUFBRTtJQUNGLGtDQUFrQztJQUNsQyw4QkFBOEI7SUFDOUIsb0JBQW9CO0lBQ3BCLGtDQUFrQztJQUNsQyw4QkFBOEI7SUFDOUIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsaUNBQWlDO0lBQ2pDLGlDQUFpQztJQUNqQyxjQUFjO0lBQ2QsbUNBQW1DO0lBQ25DLHFDQUFxQztJQUNyQyxFQUFFO0lBQ0YsbURBQW1EO0lBQ25ELDJCQUEyQjtJQUMzQiw2REFBNkQ7SUFDN0QsRUFBRTtJQUNGLGdEQUFnRDtJQUNoRCw2Q0FBNkM7SUFDN0MseUNBQXlDO0lBQ3pDLGlEQUFpRDtJQUNqRCxjQUFjO0lBQ2QsaURBQWlEO0lBQ2pELDZDQUE2QztJQUM3Qyx5Q0FBeUM7SUFDekMsaURBQWlEO0lBQ2pELGNBQWM7SUFDZCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLHNCQUFzQjtJQUN0Qix3QkFBd0I7SUFDeEIsb0NBQW9DO0lBQ3BDLHdCQUF3QjtJQUN4QixzQkFBc0I7SUFDdEIsWUFBWTtJQUNaLHNCQUFzQjtJQUN0QixRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFFSixPQUFPLENBQUMsU0FBaUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7O3lHQTlqQlUsV0FBVzs2RkFBWCxXQUFXLHlUQW5CWjs7Ozs7MENBSzhCOzRGQWM3QixXQUFXO2tCQXRCdkIsU0FBUzsrQkFFRSxjQUFjLFlBQ2Q7Ozs7OzBDQUs4QjtpR0FrQkksb0JBQW9CO3NCQUEvRCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0gsZ0JBQWdCO3NCQUF0RCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgVmlld0NoaWxkLCBFbGVtZW50UmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50fSBmcm9tIFwiLi9hdWRpb19jYW52YXNfbGF5ZXJfY29tcFwiO1xyXG5pbXBvcnQge1dvcmtlckhlbHBlcn0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7QXVkaW9CdWZmZXJTb3VyY2UsIEF1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlOiBhbnksIHRyYW5zZmVyOiBBcnJheTxhbnk+KTogdm9pZDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLXNpZ25hbCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxjYW52YXMgI2JnIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+XHJcbiAgICA8Y2FudmFzICNhdWRpb1NpZ25hbCBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGNhbnZhcyAjY3Vyc29yIGhlaWdodD1cIjEwXCIgKG1vdXNlZG93bik9XCJzZWxlY3Rpb25TdGFydCgkZXZlbnQpXCIgKG1vdXNlb3Zlcik9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50KVwiIChtb3VzZW1vdmUpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50LCBmYWxzZSlcIj48L2NhbnZhcz5cclxuICAgIDxjYW52YXMgI21hcmtlciBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPmAsXHJcblxyXG4gIHN0eWxlczogW2A6aG9zdHtcclxuICAgICAgbWluLWhlaWdodDogMHB4O1xyXG4gICAgfWAsYGNhbnZhcyB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9TaWduYWwgZXh0ZW5kcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50e1xyXG5cclxuICBuOiBhbnk7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICBAVmlld0NoaWxkKCdhdWRpb1NpZ25hbCcsIHsgc3RhdGljOiB0cnVlIH0pIGF1ZGlvU2lnbmFsQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdtYXJrZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBwbGF5UG9zQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBzaWduYWxDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICBwcml2YXRlIHdvcmtlcjogV29ya2VyIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2VyVVJMOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcmFBc1N1YnNjOlN1YnNjcmlwdGlvbnxudWxsPW51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy53b3JrZXJVUkwgPSBXb3JrZXJIZWxwZXIuYnVpbGRXb3JrZXJCbG9iVVJMKHRoaXMud29ya2VyRnVuY3Rpb24pXHJcbiAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIgPSBudWxsO1xyXG4gICAgdGhpcy5fYmdDb2xvcj0nYmxhY2snO1xyXG4gICAgdGhpcy5fc2VsZWN0Q29sb3I9J3JnYmEoMjU1LDI1NSwwLDAuOCknXHJcblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cclxuICAgIHRoaXMuY2UgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5iZ0NhbnZhcyA9IHRoaXMuYmdDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuYmdDYW52YXMuc3R5bGUuekluZGV4ID0gJzEnO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMgPSB0aGlzLmF1ZGlvU2lnbmFsQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcy5zdHlsZS56SW5kZXggPSAnMic7XHJcbiAgICB0aGlzLm1hcmtlckNhbnZhcyA9IHRoaXMucGxheVBvc0NhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5tYXJrZXJDYW52YXMuc3R5bGUuekluZGV4ID0gJzMnO1xyXG4gICAgdGhpcy5jdXJzb3JDYW52YXMgPSB0aGlzLmN1cnNvckNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5jdXJzb3JDYW52YXMuc3R5bGUuekluZGV4ID0gJzQnO1xyXG5cclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzBdPXRoaXMuYmdDYW52YXM7XHJcbiAgICB0aGlzLmNhbnZhc0xheWVyc1sxXT10aGlzLnNpZ25hbENhbnZhcztcclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzJdPXRoaXMuY3Vyc29yQ2FudmFzO1xyXG4gICAgdGhpcy5jYW52YXNMYXllcnNbM109dGhpcy5tYXJrZXJDYW52YXM7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYXlGcmFtZVBvc2l0aW9uKCk6IG51bWJlciB8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihwbGF5RnJhbWVQb3NpdGlvbjogbnVtYmVyfG51bGwpIHtcclxuICAgIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZHJhd1BsYXlQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1hcmtlckNhbnZhcykge1xyXG4gICAgICBsZXQgdyA9IHRoaXMubWFya2VyQ2FudmFzLndpZHRoO1xyXG4gICAgICBsZXQgaCA9IHRoaXMubWFya2VyQ2FudmFzLmhlaWdodDtcclxuICAgICAgbGV0IGcgPSB0aGlzLm1hcmtlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgaWYodGhpcy5fcGxheUZyYW1lUG9zaXRpb24pIHtcclxuICAgICAgICAgIGxldCBwaXhlbFBvcyA9IHRoaXMuZnJhbWVUb1ZpZXdQb3J0WFBpeGVsUG9zaXRpb24odGhpcy5fcGxheUZyYW1lUG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKHBpeGVsUG9zKSB7XHJcbiAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAncmVkJztcclxuICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgZy5tb3ZlVG8ocGl4ZWxQb3MsIDApO1xyXG4gICAgICAgICAgICBnLmxpbmVUbyhwaXhlbFBvcywgaCk7XHJcbiAgICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqICBNZXRob2QgdXNlZCBhcyB3b3JrZXIgY29kZS5cclxuICAgKi9cclxuICB3b3JrZXJGdW5jdGlvbigpIHtcclxuICAgIGFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhIH0pID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IGF1ZGlvRGF0YSA9IGRhdGEuYXVkaW9EYXRhOyAvLyBhdWRpbyBkYXRhIHBhcnQgcmVxdWlyZWQgdG8gcmVuZGVyIHZpZXcgcG9ydFxyXG4gICAgICBjb25zdCBhdU9mZnNldDpudW1iZXI9ZGF0YS5hdWRpb0RhdGFPZmZzZXQ7XHJcbiAgICAgIGNvbnN0IGw9IGRhdGEubDsgLy8gbGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB2aWV3IHBvcnRcclxuICAgICAgY29uc3QgdyA9IGRhdGEudzsgIC8vIHdpZHRoIG9mIHZpZXdwb3J0XHJcbiAgICAgIGNvbnN0IHZ3ID0gZGF0YS52dzsgLy8gIHRvdGFsIHdpZHRoIG9mICh2aXJ0dWFsKSBhdWRpbyB2aWV3IChub3Qgdmlld3BvcnQgd2lkdGgpXHJcbiAgICAgIGNvbnN0IGNocyA9IGRhdGEuY2hzOyAvLyBudW1iZXIgb2YgY2hhbm5lbHNcclxuICAgICAgLy9jb25zdCBkYXRhRnJhbWVMZW5ndGggPSBkYXRhLmF1ZGlvRGF0YUZyYW1lTGVuZ3RoOyAgLy8gZnJhbWUgbGVuZ3RoIG9mIGF1ZGlvIGRhdGEgcGFydCByZXF1aXJlZCBmb3IgdmlldyBwb3J0XHJcbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gZGF0YS5mcmFtZUxlbmd0aDsgIC8vIHRvdGFsIGZyYW1lIGxlbmd0aCAob2YgYXVkaW8gY2xpcClcclxuXHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlc6IGxlZnQ6IFwiK2wrXCIsIHc6XCIrdytcIiwgdnc6IFwiK3Z3K1wiLCBjaHM6IFwiK2NocytcIiwgZnJhbWVMZW5ndGg6IFwiK2ZyYW1lTGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCBwc01pbk1heD0gbmV3IEZsb2F0MzJBcnJheSgwKTtcclxuXHJcbiAgICAgIGlmKGF1ZGlvRGF0YSAmJiBhdWRpb0RhdGEubGVuZ3RoPjAgJiYgdz49MCAmJiB2dz4wKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB2dztcclxuXHJcbiAgICAgICAgY29uc3QgcG9pbnRzTGVuID0gdyAqIGNocztcclxuICAgICAgICAvLyBvbmUgZm9yIG1pbiBvbmUgZm9yIG1heFxyXG4gICAgICAgIGNvbnN0IGFyckxlbiA9IHBvaW50c0xlbiAqIDI7XHJcbiAgICAgICAgcHNNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KGFyckxlbik7XHJcbiAgICAgICAgbGV0IGNoRnJhbWVQb3MgPSAwO1xyXG4gICAgICAgIGNvbnN0IGNoRnJhbWVMZW5ndGg9YXVkaW9EYXRhLmxlbmd0aC9jaHM7XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG5cclxuICAgICAgICAgIGNoRnJhbWVQb3MgPSBjaCAqIGNoRnJhbWVMZW5ndGg7XHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2aXJ0UGlpPWwrcGlpO1xyXG4gICAgICAgICAgICBsZXQgcE1pbiA9IEluZmluaXR5O1xyXG4gICAgICAgICAgICBsZXQgcE1heCA9IC1JbmZpbml0eTtcclxuICAgICAgICAgICAgbGV0IHBpeGVsRnJhbWVQb3MgPSBNYXRoLnJvdW5kKGNoRnJhbWVQb3MgKyAodmlydFBpaSAqIGZyYW1lc1BlclBpeGVsKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgcGl4ZWwgbWluL21heCBhbXBsaXR1ZGVcclxuICAgICAgICAgICAgZm9yIChsZXQgYWkgPSAwOyBhaSA8IGZyYW1lc1BlclBpeGVsOyBhaSsrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZnJhbWVQb3MgPSBwaXhlbEZyYW1lUG9zICsgYWk7XHJcbiAgICAgICAgICAgICAgbGV0IGEgPSAwO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJ1ZlBvcz1mcmFtZVBvcy1hdU9mZnNldDtcclxuICAgICAgICAgICAgICAvL2xldCBidWZQb3M9ZnJhbWVQb3M7XHJcbiAgICAgICAgICAgICAgaWYoYnVmUG9zPj0wICYmIGJ1ZlBvczxhdWRpb0RhdGEubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgIGE9YXVkaW9EYXRhW2J1ZlBvc107XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXOiBjaDogXCIrY2grXCIsIHBpeGVsRnJhbWVQb3M6IFwiK3BpeGVsRnJhbWVQb3MrXCIsIGZyYW1lUG9zOiBcIitmcmFtZVBvcytcIiwgYXVPZmZzZXQ6IFwiK2F1T2Zmc2V0K1wiLCBidWZQb3M6IFwiK2J1ZlBvcytcIiwgYXVkaW9EYXRhLmxlbmd0aDogXCIrYXVkaW9EYXRhLmxlbmd0aCtcIiwgYTogXCIrYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA8IHBNaW4pIHtcclxuICAgICAgICAgICAgICAgICAgcE1pbiA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA+IHBNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgcE1heCA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwc01pblBvcyA9IGNoICogdyArIHBpaTtcclxuICAgICAgICAgICAgcHNNaW5NYXhbcHNNaW5Qb3NdID0gcE1pbjtcclxuICAgICAgICAgICAgY29uc3QgcHNNYXhQb3MgPSBwb2ludHNMZW4gKyBwc01pblBvcztcclxuICAgICAgICAgICAgcHNNaW5NYXhbcHNNYXhQb3NdID0gcE1heDtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwicHNNaW5NYXhbXCIrcHNNaW5Qb3MrXCJdPVwiK3BNaW4rXCIscHNNaW5NYXhbXCIrcHNNYXhQb3MrXCJdPVwiK3BNYXgpO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcG9zdE1lc3NhZ2Uoe3BzTWluTWF4OiBwc01pbk1heCwgbDpkYXRhLmwsdzogZGF0YS53LCBjaHM6IGRhdGEuY2hzLGVvZDpkYXRhLmVvZH0sIFtwc01pbk1heC5idWZmZXJdKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHN0YXJ0RHJhdyhjbGVhciA9IHRydWUpIHtcclxuICAgIGlmIChjbGVhcikge1xyXG4gICAgICBpZih0aGlzLmJvdW5kcykge1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAvL2cuY2xlYXJSZWN0KDAsIDAsdywgaCk7XHJcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9IFwiYmxhY2tcIjtcclxuICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpLCBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRSZW5kZXIoKTtcclxuICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHN0YXJ0UmVuZGVyKCkge1xyXG5cclxuICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5yYUFzU3Vic2Mpe1xyXG4gICAgICB0aGlzLnJhQXNTdWJzYy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmFkZE9uUmVhZHlMaXN0ZW5lcigoKT0+e1xyXG4gICAgICAgICAgaWYodGhpcy5fYXVkaW9EYXRhSG9sZGVyICYmIHRoaXMuYm91bmRzICYmIHRoaXMuYm91bmRzLmRpbWVuc2lvbikge1xyXG4gICAgICAgICAgICBsZXQgdyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICAgICAgbGV0IGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpO1xyXG4gICAgICAgICAgICBsZXQgdncgPSBNYXRoLnJvdW5kKHRoaXMudmlydHVhbERpbWVuc2lvbi53aWR0aCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodyA+IDAgJiYgaCA+IDAgJiYgdncgPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJy4vYXVkaW9zaWduYWwud29ya2VyLmpzJyx7dHlwZTogJ21vZHVsZSd9KTtcclxuICAgICAgICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIodGhpcy53b3JrZXJVUkwpO1xyXG4gICAgICAgICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJ3dvcmtlci9hdWRpb3NpZ25hbC53b3JrZXIudHMnKTtcclxuXHJcbiAgICAgICAgICAgICAgLy9sZXQgV29ya2VyID0gcmVxdWlyZSgnd29ya2VyIS4uLy4uLy4uL3dvcmtlcnMvdXBsb2FkZXIvbWFpbicpO1xyXG4gICAgICAgICAgICAgIGxldCBjaHMgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICAgICAgICBsZXQgbGVmdFBvcyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCk7XHJcbiAgICAgICAgICAgICAgbGV0IHJlbmRlclBvcyA9IGxlZnRQb3M7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgICAgICAgICBsZXQgZnJhbWVzUGVyUGl4ZWwgPSBNYXRoLmNlaWwoZnJhbWVMZW5ndGggLyB2dyk7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2hzOiBcIiArIGNocyArIFwiLCB2dzogXCIgKyB2dyArIFwiLCBmcmFtZUxlbmd0aDogXCIgKyBmcmFtZUxlbmd0aCArIFwiLCBmcmFtZXNQZXJQaXhlbDogXCIgKyBmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICAgICAgbGV0IGFkOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGNocyAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICBsZXQgcmFBcyA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5yYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSgpO1xyXG4gICAgICAgICAgICAgIGxldCBhdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgICBsZXQgYXVkaW9Tb3VyY2UgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIuYXVkaW9Tb3VyY2U7XHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvU291cmNlIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyID0gYXVkaW9Tb3VyY2UuYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vbGV0IGFycmF5QXVkaW9CdWZmZXI9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmFycmF5QnVmZmVyO1xyXG4gICAgICAgICAgICAgIGxldCBhcnJBYkJ1ZjogRmxvYXQzMkFycmF5W10gfCBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAvL2xldCBhaXM6QXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgICAvL2xldCBhaXNCdWY6RmxvYXQzMkFycmF5W118bnVsbD1udWxsO1xyXG4gICAgICAgICAgICAgIGxldCBwc01pbk1heDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JrZXIub25tZXNzYWdlID0gKG1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChtZS5kYXRhLmVvZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwc01pbk1heFRtcDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHNNaW5NYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHBzTWluTWF4VG1wID0gcHNNaW5NYXg7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHBzTWluTWF4VG1wID0gbWUuZGF0YS5wc01pbk1heDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3UmVuZGVyZWQobGVmdFBvcywgdywgaCwgY2hzLCBwc01pbk1heFRtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmFBcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlciAmJiBhcnJBYkJ1Zikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ3ID0gbWUuZGF0YS53O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJQb2ludHNMZW4gPSBjaHMgKiBydztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludHNMZW4gPSBjaHMgKiB3O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChwc01pbk1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgckJhc2VQb3MgPSBjaCAqIHJ3O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZVBvcyA9IGNoICogdztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJQb3NNaW4gPSByQmFzZVBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJQb3NNYXggPSByUG9pbnRzTGVuICsgclBvc01pbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc01pbiA9IGJhc2VQb3MgKyAocmVuZGVyUG9zIC0gbGVmdFBvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NNYXggPSBwb2ludHNMZW4gKyBwb3NNaW47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwc01pbk1heFtwb3NNaW5dID0gbWUuZGF0YS5wc01pbk1heFtyUG9zTWluXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdNaW46ICgnK3Bvc01pbisnKTogJyttZS5kYXRhLnBzTWluTWF4W3JQb3NNaW5dKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHNNaW5NYXhbcG9zTWF4XSA9IG1lLmRhdGEucHNNaW5NYXhbclBvc01heF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnTWF4OiAoJysocG9zTWF4KSsnKTogJyttZS5kYXRhLnBzTWluTWF4W3JQb3NNYXhdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwicHNNaW5NYXhbXCIrcG9zTWluK1wiXT1cIittZS5kYXRhLnBzTWluTWF4W3JQb3NNaW5dK1wiICAoclBvc01pbj1cIityUG9zTWluK1wiKSxwc01pbk1heFtcIitwb3NNYXgrXCJdPVwiK21lLmRhdGEucHNNaW5NYXhbclBvc01heF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZW9kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUG9zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgYWQ6RmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0RnJhbWVQb3MgPSBNYXRoLmZsb29yKGZyYW1lTGVuZ3RoICogcmVuZGVyUG9zIC8gdncpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJQb3MgPCBsZWZ0UG9zICsgdykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhQXNPYnMgPSByYUFzLmZyYW1lc09icyhsZWZ0RnJhbWVQb3MsIGZyYW1lc1BlclBpeGVsLCBhcnJBYkJ1ZilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhQXNTdWJzYyA9IHJhQXNPYnMuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlYWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkZpcnN0IHJlYWQgZnJhbWU6IFwiK2FyckFiQnVmWzBdWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJBYkJ1Zikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZExlbiA9IGNocyAqIGZyYW1lc1BlclBpeGVsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkIHx8IGFkLmxlbmd0aCAhPT0gYWRMZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZCA9IG5ldyBGbG9hdDMyQXJyYXkoYWRMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZC5zZXQoYXJyQWJCdWZbY2hdLCBjaCAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9kID0gKHJlYWQgPD0gMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRCdWYgPSBhZC5idWZmZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBtZS5kYXRhLncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dzogdncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YTogYWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OiBsZWZ0RnJhbWVQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9kOiBlb2RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW2FkQnVmXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkF1ZGlvU2lnbmFsOiBFcnJvciByZWFkaW5nIGF1ZGlvIGRhdGE6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGFkID0gbmV3IEZsb2F0MzJBcnJheSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZW9kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkQnVmID0gYWQuYnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsOiByZW5kZXJQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdzogbWUuZGF0YS53LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdnc6IHZ3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoczogY2hzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0RhdGE6IGFkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YU9mZnNldDogbGVmdEZyYW1lUG9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVvZDogZW9kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFthZEJ1Zl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyICYmIGF1ZGlvQnVmZmVyLmxlbmd0aCAqIGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHMgPCBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50LkVOQUJMRV9TVFJFQU1JTkdfTlVNQkVSX09GX1NBTVBMRVNfVEhSRVNIT0xEKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyIHdob2xlIGNsaXAgYXQgb25jZVxyXG4gICAgICAgICAgICAgICAgYXJyQWJCdWYgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgcHNNaW5NYXggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWQgPSBuZXcgRmxvYXQzMkFycmF5KGNocyAqIGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgYWQuc2V0KGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKSwgY2ggKiBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgIGw6IGxlZnRQb3MsXHJcbiAgICAgICAgICAgICAgICAgIHc6IHcsXHJcbiAgICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgICBlb2Q6IHRydWVcclxuICAgICAgICAgICAgICAgIH0sIFthZC5idWZmZXJdKTtcclxuXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBSZW5kZXIgcGl4ZWwgYnkgcGl4ZWxcclxuICAgICAgICAgICAgICAgIGlmICh3ID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc1BlclBpeGVsID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBydyA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyQWJCdWYgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBzTWluTWF4ID0gbmV3IEZsb2F0MzJBcnJheShjaHMgKiB3ICogMik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQXVkaW9zaWduYWw6IEFsbG9jYXRpbmcgYnVmZmVyczogXCIrZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGFyckFiQnVmW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0RnJhbWVQb3MgPSBNYXRoLmZsb29yKGZyYW1lTGVuZ3RoICogcmVuZGVyUG9zIC8gdncpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1T2Zmc2V0ID0gbGVmdEZyYW1lUG9zOyAvLyBzaG91bGQgYWx3YXlzIGJlIDBcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFBc09icyA9IHJhQXMuZnJhbWVzT2JzKGxlZnRGcmFtZVBvcywgZnJhbWVzUGVyUGl4ZWwsIGFyckFiQnVmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3U3RhdGVUZXh0KFwiTG9hZGluZy9SZW5kZXJpbmcuLi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmFBc1N1YnNjID0gcmFBc09icy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZWFkKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJBYkJ1ZiAmJiB0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRMZW4gPSBjaHMgKiBmcmFtZXNQZXJQaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWQgfHwgYWQubGVuZ3RoICE9PSBhZExlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZCA9IG5ldyBGbG9hdDMyQXJyYXkoYWRMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZC5zZXQoYXJyQWJCdWZbY2hdLCBjaCAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogcncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OiBhdU9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9kOiAocmVhZCA8PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW2FkLmJ1ZmZlcl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXVkaW9TaWduYWw6IEVycm9yIHJlYWRpbmcgYXVkaW8gZGF0YTogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmJvdW5kcyAmJiB0aGlzLmJvdW5kcy5kaW1lbnNpb24pIHtcclxuICAgICAgICAgIGxldCB3ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgICAgICAgbGV0IGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpO1xyXG4gICAgICAgICAgbGV0IGcgPSB0aGlzLnNpZ25hbENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICBpZiAoZykge1xyXG4gICAgICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuZHJhd1N0YXRlVGV4dChzdGF0ZVRleHQ6c3RyaW5nKSB7XHJcbiAgICBpZihzdGF0ZVRleHQpIHtcclxuICAgICAgY29uc3QgZyA9IHRoaXMuc2lnbmFsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgY29uc3Qgdz10aGlzLnNpZ25hbENhbnZhcy53aWR0aDtcclxuICAgICAgY29uc3QgaD10aGlzLnNpZ25hbENhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGlmIChnICYmIHcgJiYgaCkge1xyXG4gICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xyXG4gICAgICAgIGcuZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgICBnLmZvbnQgPSAnMjBweCBzYW5zLXNlcmlmJztcclxuICAgICAgICBnLmZpbGxUZXh0KHN0YXRlVGV4dCwgMTAsIDI1KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiAgZHJhd1JlbmRlcmVkKGxlZnQ6bnVtYmVyLHc6bnVtYmVyLGg6bnVtYmVyLGNoczpudW1iZXIscHNNaW5NYXg6RmxvYXQzMkFycmF5KSB7XHJcbiAgICB0aGlzLmRyYXdCZygpO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMuc3R5bGUubGVmdD1sZWZ0LnRvU3RyaW5nKCkrJ3B4JztcclxuICAgIHRoaXMuc2lnbmFsQ2FudmFzLndpZHRoID0gdztcclxuICAgIHRoaXMuc2lnbmFsQ2FudmFzLmhlaWdodCA9IGg7XHJcbiAgICBsZXQgZyA9IHRoaXMuc2lnbmFsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgIGlmIChnKSB7XHJcbiAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICBsZXQgcG9pbnRzTGVuID0gdyAqIGNocztcclxuICAgICAgLy8gb25lIGZvciBtaW4gb25lIGZvciBtYXhcclxuICAgICAgLy9jb25zdCBhcnJMZW4gPSBwb2ludHNMZW4gKiAyO1xyXG4gICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgICAgICAgLy9jb25zdCBzdGQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICBjb25zdCBjaEggPSBoIC8gY2hzO1xyXG5cclxuICAgICAgICBsZXQgeSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgY29uc3QgcHNNaW5Qb3MgPSBjaCAqIHc7XHJcbiAgICAgICAgICBjb25zdCBwc01heFBvcyA9IHBvaW50c0xlbiArIHBzTWluUG9zO1xyXG5cclxuICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ2dyZWVuJztcclxuICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xyXG5cclxuICAgICAgICAgIC8vIGRyYXcgYXVkaW8gc2lnbmFsIGFzIHNpbmdsZSBwb2x5Z29uXHJcbiAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgZy5tb3ZlVG8oMCwgeSArIChjaEggLyAyKSArIHBzTWluTWF4W3BzTWF4UG9zXSAqIGNoSCAvIDIpO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBzTWF4ID0gcHNNaW5NYXhbcHNNYXhQb3MgKyBwaWldO1xyXG4gICAgICAgICAgICBjb25zdCBwdiA9IHBzTWF4ICogY2hIIC8gMjtcclxuICAgICAgICAgICAgY29uc3QgeWQ9eSArIChjaEggLyAyKSAtIHB2O1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTGluZVRvOiA6IFwiK3BpaStcIiBcIit5ZClcclxuICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCByZXZQaXhlbFN0YXJ0PXctMTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSByZXZQaXhlbFN0YXJ0OyBwaWkgPj0gMDsgcGlpLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgcHNNaW4gPSBwc01pbk1heFtwc01pblBvcyArIHBpaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHB2ID0gcHNNaW4gKiBjaEggLyAyO1xyXG4gICAgICAgICAgICBjb25zdCB5ZD15ICsgKGNoSCAvIDIpIC0gcHY7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMaW5lVG86IDogXCIrcGlpK1wiIFwiK3lkKVxyXG4gICAgICAgICAgICBnLmxpbmVUbyhwaWksIHlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcblxyXG4gICAgICAgICAgZy5maWxsKCk7XHJcbiAgICAgICAgICBnLnN0cm9rZSgpO1xyXG4gICAgICAgICAgeSArPSBjaEg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyByZWRyYXcoKSB7XHJcbiAgLy8gICB0aGlzLmRyYXdCZygpXHJcbiAgLy8gICBsZXQgZyA9IHRoaXMuc2lnbmFsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAvLyAgIGlmIChnKSB7XHJcbiAgLy8gICAgIGxldCB3ID0gdGhpcy5zaWduYWxDYW52YXMud2lkdGg7XHJcbiAgLy8gICAgIGxldCBoID0gdGhpcy5zaWduYWxDYW52YXMuaGVpZ2h0O1xyXG4gIC8vICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAvLyAgICAgLy9nLmZpbGxTdHlsZSA9IFwiYmxhY2tcIjtcclxuICAvLyAgICAgLy9nLmZpbGxSZWN0KDAsIDAsIHcsIGgpO1xyXG4gIC8vICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgLy8gICAgICAgbGV0IHN0ZCA9IERhdGUubm93KCk7XHJcbiAgLy8gICAgICAgbGV0IGNocyA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5udW1iZXJPZkNoYW5uZWxzO1xyXG4gIC8vICAgICAgIGxldCBjaEggPSBoIC8gY2hzO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lTGVuO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB3O1xyXG4gIC8vICAgICAgIGxldCB5ID0gMDtcclxuICAvLyAgICAgICBsZXQgYWlzOkZsb2F0MzJBcnJheUlucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAvLyAgICAgICBsZXQgYXVkaW9Tb3VyY2U9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmF1ZGlvU291cmNlO1xyXG4gIC8vICAgICAgIGxldCBhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcnxudWxsPW51bGw7XHJcbiAgLy8gICAgICAgaWYoYXVkaW9Tb3VyY2UgaW5zdGFuY2VvZiBBdWRpb0J1ZmZlclNvdXJjZSl7XHJcbiAgLy8gICAgICAgICBhdWRpb0J1ZmZlcj1hdWRpb1NvdXJjZS5hdWRpb0J1ZmZlcjtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgbGV0IGFpc0J1ZmZlcjpBcnJheTxGbG9hdDMyQXJyYXk+fG51bGw9bnVsbDtcclxuICAvLyAgICAgICBpZighYXVkaW9CdWZmZXIpIHtcclxuICAvLyAgICAgICAgIGFpcz10aGlzLl9hdWRpb0RhdGFIb2xkZXIuYXVkaW9JbnB1dFN0cmVhbSgpO1xyXG4gIC8vICAgICAgICAgYWlzQnVmZmVyPW5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNocyk7XHJcbiAgLy8gICAgICAgICBmb3IobGV0IGNoPTA7Y2g8Y2hzO2NoKyspIHtcclxuICAvLyAgICAgICAgICAgYWlzQnVmZmVyW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoZnJhbWVzUGVyUGl4ZWwpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAvLyAgICAgICAgICAgbGV0IHggPSAwO1xyXG4gIC8vICAgICAgICAgICBsZXQgcHNNaW4gPSBuZXcgRmxvYXQzMkFycmF5KHcpO1xyXG4gIC8vICAgICAgICAgICBsZXQgcHNNYXggPSBuZXcgRmxvYXQzMkFycmF5KHcpO1xyXG4gIC8vICAgICAgICAgICBsZXQgZnJhbWVQb3MgPSAwO1xyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gIC8vICAgICAgICAgICAgIGxldCBwTWluID0gMDtcclxuICAvLyAgICAgICAgICAgICBsZXQgcE1heCA9IDA7XHJcbiAgLy9cclxuICAvLyAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXIpe1xyXG4gIC8vICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHBpeGVsIG1pbi9tYXggYW1wbGl0dWRlXHJcbiAgLy8gICAgICAgICAgICAgICBmb3IgKGxldCBhaSA9IDA7IGFpIDwgZnJhbWVzUGVyUGl4ZWw7IGFpKyspIHtcclxuICAvLyAgICAgICAgICAgICAgICAgLy9sZXQgZnJhbWVQb3M9KHBpaSpmcmFtZXNQZXJQaXhlbCkrYWk7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGxldCBhID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpW2ZyYW1lUG9zKytdO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChhIDwgcE1pbikge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHBNaW4gPSBhO1xyXG4gIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChhID4gcE1heCkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHBNYXggPSBhO1xyXG4gIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1lbHNlIGlmKGFpcyAmJiBhaXNCdWZmZXIpIHtcclxuICAvLyAgICAgICAgICAgICAgIGxldCByID0gYWlzLnJlYWQoYWlzQnVmZmVyKTtcclxuICAvLyAgICAgICAgICAgICAgIGZvciAobGV0IGFpID0gMDsgYWkgPCByOyBhaSsrKSB7XHJcbiAgLy9cclxuICAvLyAgICAgICAgICAgICAgICAgbGV0IGEgPSBhaXNCdWZmZXJbY2hdW2FpXTtcclxuICAvL1xyXG4gIC8vICAgICAgICAgICAgICAgICBpZiAoYSA8IHBNaW4pIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBwTWluID0gYTtcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICBpZiAoYSA+IHBNYXgpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBwTWF4ID0gYTtcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICBwc01pbltwaWldID0gcE1pbjtcclxuICAvLyAgICAgICAgICAgICBwc01heFtwaWldID0gcE1heDtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICdncmVlbic7XHJcbiAgLy8gICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgICAgIC8vIGRyYXcgYXVkaW8gc2lnbmFsIGFzIHNpbmdsZSBwb2x5Z29uXHJcbiAgLy8gICAgICAgICAgIGcuYmVnaW5QYXRoKCk7XHJcbiAgLy8gICAgICAgICAgIGcubW92ZVRvKDAsIHkgKyAoY2hIIC8gMikgKyBwc01pblswXSAqIGNoSCAvIDIpO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgLy8gICAgICAgICAgICAgbGV0IHB2ID0gcHNNaW5bcGlpXSAqIGNoSCAvIDI7XHJcbiAgLy8gICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIk1pbjogXCIscHYpO1xyXG4gIC8vICAgICAgICAgICAgIGcubGluZVRvKHBpaSwgeSArIChjaEggLyAyKSArIHB2KTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBwaWkgPSB3OyBwaWkgPj0gMDsgcGlpLS0pIHtcclxuICAvLyAgICAgICAgICAgICBsZXQgcHYgPSBwc01heFtwaWldICogY2hIIC8gMjtcclxuICAvLyAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTWF4OiBcIixwdik7XHJcbiAgLy8gICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ICsgKGNoSCAvIDIpICsgcHYpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgLy8gICAgICAgICAgIC8vZy5saW5lVG8oKVxyXG4gIC8vICAgICAgICAgICBnLmZpbGwoKTtcclxuICAvLyAgICAgICAgICAgZy5zdHJva2UoKTtcclxuICAvLyAgICAgICAgICAgZy5maWxsU3R5bGUgPSBcInllbGxvd1wiO1xyXG4gIC8vICAgICAgICAgICBnLnN0cm9rZSgpO1xyXG4gIC8vICAgICAgICAgICB5ICs9IGNoSDtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICBhaXM/LmNsb3NlKCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHNldERhdGEoYXVkaW9EYXRhOiBBdWRpb0RhdGFIb2xkZXIgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIgPSBhdWRpb0RhdGE7XHJcbiAgICB0aGlzLnBsYXlGcmFtZVBvc2l0aW9uID0gMDtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
|