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.
Files changed (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. 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
- let audioData = data.audioData; // audio data part required to render view port
66
- let auOffset = data.audioDataOffset;
67
- let l = data.l; // left pixel position of view port
68
- let w = data.w; // width of viewport
69
- let vw = data.vw; // total width of (virtual) audio view (not viewport width)
70
- let chs = data.chs; // number of channels
71
- let dataFrameLength = data.audioDataFrameLength; // frame length of audio data part required for view port
72
- let frameLength = data.frameLength; // total frame length (of audio clip)
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
- let framesPerPixel = frameLength / vw;
77
- let pointsLen = w * chs;
78
+ const framesPerPixel = frameLength / vw;
79
+ const pointsLen = w * chs;
78
80
  // one for min one for max
79
- let arrLen = pointsLen * 2;
81
+ const arrLen = pointsLen * 2;
80
82
  psMinMax = new Float32Array(arrLen);
81
83
  let chFramePos = 0;
82
- let chFrameLength = audioData.length / chs;
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
- let virtPii = l + pii;
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
- let framePos = pixelFramePos + ai;
94
+ const framePos = pixelFramePos + ai;
93
95
  let a = 0;
94
- let bufPos = framePos - auOffset;
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
- let psMinPos = ch * w + pii;
109
+ const psMinPos = ch * w + pii;
108
110
  psMinMax[psMinPos] = pMin;
109
- let psMaxPos = pointsLen + psMinPos;
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.bounds && this.bounds.dimension) {
141
- let w = Math.round(this.bounds.dimension.width);
142
- let h = Math.round(this.bounds.dimension.height);
143
- if (this._audioDataHolder && w > 0 && h > 0) {
144
- //this.wo = new Worker('./audiosignal.worker.js',{type: 'module'});
145
- this.worker = new Worker(this.workerURL);
146
- //this.wo = new Worker('worker/audiosignal.worker.ts');
147
- //let Worker = require('worker!../../../workers/uploader/main');
148
- let chs = this._audioDataHolder.numberOfChannels;
149
- let leftPos = Math.round(this.bounds.position.left);
150
- let renderPos = leftPos;
151
- let vw = Math.round(this.virtualDimension.width);
152
- let frameLength = this._audioDataHolder.frameLen;
153
- let framesPerPixel = Math.ceil(frameLength / vw);
154
- let audioBuffer = this._audioDataHolder.buffer;
155
- //let arrayAudioBuffer=this._audioDataHolder.arrayBuffer;
156
- let arrAbBuf;
157
- //let ais:ArrayAudioBufferInputStream|null=null;
158
- //let aisBuf:Float32Array[]|null=null;
159
- let psMinMax = null;
160
- if (this.worker) {
161
- this.worker.onmessage = (me) => {
162
- if (me.data.eod === true) {
163
- let psMinMaxTmp;
164
- if (psMinMax) {
165
- psMinMaxTmp = psMinMax;
166
- }
167
- else {
168
- psMinMaxTmp = me.data.psMinMax;
169
- }
170
- this.drawRendered(leftPos, w, h, chs, psMinMaxTmp);
171
- if (this.worker) {
172
- this.worker.terminate();
173
- }
174
- this.worker = null;
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
- else if (this._audioDataHolder && arrAbBuf) {
177
- let rw = me.data.w;
178
- let rPointsLen = chs * rw;
179
- let pointsLen = chs * w;
180
- for (let ch = 0; ch < chs; ch++) {
181
- if (psMinMax) {
182
- let rBasePos = ch * rw;
183
- let basePos = ch * w;
184
- let rPosMin = rBasePos;
185
- let rPosMax = rPointsLen + rPosMin;
186
- let posMin = basePos + (renderPos - leftPos);
187
- let posMax = pointsLen + posMin;
188
- psMinMax[posMin] = me.data.psMinMax[rPosMin];
189
- //console.debug('Min: ('+pos+'): '+me.data.psMinMax[0]);
190
- psMinMax[posMax] = me.data.psMinMax[rPosMax];
191
- // console.debug('Max: ('+(pointsLen+pos)+'): '+me.data.psMinMax[1]);
192
- //console.debug("psMinMax["+posMin+"]="+me.data.psMinMax[rPosMin]+" (rPosMin="+rPosMin+"),psMinMax["+posMax+"]="+me.data.psMinMax[rPosMax]);
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
- let eod = false;
196
- renderPos++;
197
- let ad;
198
- let leftFramePos = Math.floor(frameLength * renderPos / vw);
199
- if (renderPos < leftPos + w) {
200
- let read = this._audioDataHolder.frames(leftFramePos, framesPerPixel, arrAbBuf);
201
- //console.debug("First read frame: "+arrAbBuf[0][0]);
202
- ad = new Float32Array(chs * framesPerPixel);
203
- for (let ch = 0; ch < chs; ch++) {
204
- ad.set(arrAbBuf[ch], ch * framesPerPixel);
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
- eod = (read <= 0);
207
- }
208
- else {
209
- ad = new Float32Array();
210
- eod = true;
211
- }
212
- let adBuf = ad.buffer;
213
- if (this.worker) {
214
- this.worker.postMessage({
215
- l: renderPos,
216
- w: me.data.w,
217
- h: h,
218
- vw: vw,
219
- chs: chs,
220
- frameLength: frameLength,
221
- audioData: ad,
222
- audioDataOffset: leftFramePos,
223
- eod: eod
224
- }, [adBuf]);
225
- }
267
+ };
226
268
  }
227
- };
228
- }
229
- if (audioBuffer && audioBuffer.length * audioBuffer.numberOfChannels < AudioCanvasLayerComponent.ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD) {
230
- // Render whole clip at once
231
- arrAbBuf = null;
232
- psMinMax = null;
233
- let ad = new Float32Array(chs * frameLength);
234
- for (let ch = 0; ch < chs; ch++) {
235
- ad.set(audioBuffer.getChannelData(ch), ch * frameLength);
236
- }
237
- this.worker.postMessage({
238
- l: leftPos,
239
- w: w,
240
- vw: vw,
241
- chs: chs,
242
- frameLength: frameLength,
243
- audioData: ad,
244
- audioDataOffset: 0,
245
- eod: true
246
- }, [ad.buffer]);
247
- }
248
- else {
249
- // Render pixel by pixel
250
- if (w > 0) {
251
- if (framesPerPixel > 0) {
252
- let rw = 1;
253
- //ais = new ArrayAudioBufferInputStream(arrayAudioBuffer);
254
- arrAbBuf = new Array(chs);
255
- psMinMax = new Float32Array(chs * w * 2);
256
- for (let ch = 0; ch < chs; ch++) {
257
- arrAbBuf[ch] = new Float32Array(framesPerPixel);
258
- }
259
- let leftFramePos = Math.floor(frameLength * renderPos / vw);
260
- let auOffset = leftFramePos; // should always be 0
261
- //let read=arrayAudioBuffer.frames(leftFramePos,framesPerPixel,arrAbBuf);
262
- let read = this._audioDataHolder.frames(leftFramePos, framesPerPixel, arrAbBuf);
263
- let ad = new Float32Array(chs * framesPerPixel);
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(arrAbBuf[ch], ch * framesPerPixel);
275
+ ad.set(audioBuffer.getChannelData(ch), ch * frameLength);
266
276
  }
267
277
  this.worker.postMessage({
268
- l: renderPos,
269
- w: rw,
278
+ l: leftPos,
279
+ w: w,
270
280
  vw: vw,
271
281
  chs: chs,
272
282
  frameLength: frameLength,
273
283
  audioData: ad,
274
- audioDataOffset: auOffset,
275
- eod: (read <= 0)
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
- else {
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
- let arrLen = pointsLen * 2;
370
+ //const arrLen = pointsLen * 2;
302
371
  if (this._audioDataHolder) {
303
- let std = Date.now();
304
- let chH = h / chs;
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
- let x = 0;
308
- let psMinPos = ch * w;
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
- let psMax = psMinMax[psMaxPos + pii];
317
- let pv = psMax * chH / 2;
318
- let yd = y + (chH / 2) - pv;
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
- let revPixelStart = w - 1;
390
+ const revPixelStart = w - 1;
323
391
  for (let pii = revPixelStart; pii >= 0; pii--) {
324
- let psMin = psMinMax[psMinPos + pii];
325
- let pv = psMin * chH / 2;
326
- let yd = y + (chH / 2) - pv;
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: "13.3.11", ngImport: i0, type: AudioSignal, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
433
- AudioSignal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", 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: `
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: "13.3.11", ngImport: i0, type: AudioSignal, decorators: [{
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9zaWduYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9zaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBa0IsTUFBTSxzQkFBc0IsQ0FBQzs7QUEyQnhFLE1BQU0sT0FBTyxXQUFZLFNBQVEseUJBQXlCO0lBaUJ4RCxZQUFvQixHQUFlO1FBQ2pDLEtBQUssRUFBRSxDQUFDO1FBRFUsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQVAzQix1QkFBa0IsR0FBYyxJQUFJLENBQUM7UUFFckMsV0FBTSxHQUFnQixJQUFJLENBQUM7UUFHM0IsY0FBUyxHQUFtQixJQUFJLENBQUM7UUFJdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBQyxPQUFPLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBQyxxQkFBcUIsQ0FBQTtJQUV6QyxDQUFDO0lBRUQsZUFBZTtRQUViLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxD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RSxJQUFJLEVBQUU7Z0JBQ0gsZ0JBQWdCO3NCQUF0RCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgVmlld0NoaWxkLCBFbGVtZW50UmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50fSBmcm9tIFwiLi9hdWRpb19jYW52YXNfbGF5ZXJfY29tcFwiO1xyXG5pbXBvcnQge1dvcmtlckhlbHBlcn0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7QXVkaW9CdWZmZXJTb3VyY2UsIEF1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlOiBhbnksIHRyYW5zZmVyOiBBcnJheTxhbnk+KTogdm9pZDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLXNpZ25hbCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxjYW52YXMgI2JnIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+XHJcbiAgICA8Y2FudmFzICNhdWRpb1NpZ25hbCBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGNhbnZhcyAjY3Vyc29yIGhlaWdodD1cIjEwXCIgKG1vdXNlZG93bik9XCJzZWxlY3Rpb25TdGFydCgkZXZlbnQpXCIgKG1vdXNlb3Zlcik9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50KVwiIChtb3VzZW1vdmUpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50LCBmYWxzZSlcIj48L2NhbnZhcz5cclxuICAgIDxjYW52YXMgI21hcmtlciBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPmAsXHJcblxyXG4gIHN0eWxlczogW2A6aG9zdHtcclxuICAgICAgbWluLWhlaWdodDogMHB4O1xyXG4gICAgfWAsYGNhbnZhcyB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9TaWduYWwgZXh0ZW5kcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50e1xyXG5cclxuICBuOiBhbnk7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICBAVmlld0NoaWxkKCdhdWRpb1NpZ25hbCcsIHsgc3RhdGljOiB0cnVlIH0pIGF1ZGlvU2lnbmFsQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdtYXJrZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBwbGF5UG9zQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBzaWduYWxDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICBwcml2YXRlIHdvcmtlcjogV29ya2VyIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2VyVVJMOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcmFBc1N1YnNjOlN1YnNjcmlwdGlvbnxudWxsPW51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy53b3JrZXJVUkwgPSBXb3JrZXJIZWxwZXIuYnVpbGRXb3JrZXJCbG9iVVJMKHRoaXMud29ya2VyRnVuY3Rpb24pXHJcbiAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIgPSBudWxsO1xyXG4gICAgdGhpcy5fYmdDb2xvcj0nYmxhY2snO1xyXG4gICAgdGhpcy5fc2VsZWN0Q29sb3I9J3JnYmEoMjU1LDI1NSwwLDAuOCknXHJcblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cclxuICAgIHRoaXMuY2UgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5iZ0NhbnZhcyA9IHRoaXMuYmdDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuYmdDYW52YXMuc3R5bGUuekluZGV4ID0gJzEnO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMgPSB0aGlzLmF1ZGlvU2lnbmFsQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnNpZ25hbENhbnZhcy5zdHlsZS56SW5kZXggPSAnMic7XHJcbiAgICB0aGlzLm1hcmtlckNhbnZhcyA9IHRoaXMucGxheVBvc0NhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5tYXJrZXJDYW52YXMuc3R5bGUuekluZGV4ID0gJzMnO1xyXG4gICAgdGhpcy5jdXJzb3JDYW52YXMgPSB0aGlzLmN1cnNvckNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5jdXJzb3JDYW52YXMuc3R5bGUuekluZGV4ID0gJzQnO1xyXG5cclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzBdPXRoaXMuYmdDYW52YXM7XHJcbiAgICB0aGlzLmNhbnZhc0xheWVyc1sxXT10aGlzLnNpZ25hbENhbnZhcztcclxuICAgIHRoaXMuY2FudmFzTGF5ZXJzWzJdPXRoaXMuY3Vyc29yQ2FudmFzO1xyXG4gICAgdGhpcy5jYW52YXNMYXllcnNbM109dGhpcy5tYXJrZXJDYW52YXM7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYXlGcmFtZVBvc2l0aW9uKCk6IG51bWJlciB8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihwbGF5RnJhbWVQb3NpdGlvbjogbnVtYmVyfG51bGwpIHtcclxuICAgIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZHJhd1BsYXlQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1hcmtlckNhbnZhcykge1xyXG4gICAgICBsZXQgdyA9IHRoaXMubWFya2VyQ2FudmFzLndpZHRoO1xyXG4gICAgICBsZXQgaCA9IHRoaXMubWFya2VyQ2FudmFzLmhlaWdodDtcclxuICAgICAgbGV0IGcgPSB0aGlzLm1hcmtlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgaWYodGhpcy5fcGxheUZyYW1lUG9zaXRpb24pIHtcclxuICAgICAgICAgIGxldCBwaXhlbFBvcyA9IHRoaXMuZnJhbWVUb1ZpZXdQb3J0WFBpeGVsUG9zaXRpb24odGhpcy5fcGxheUZyYW1lUG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKHBpeGVsUG9zKSB7XHJcbiAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAncmVkJztcclxuICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgZy5tb3ZlVG8ocGl4ZWxQb3MsIDApO1xyXG4gICAgICAgICAgICBnLmxpbmVUbyhwaXhlbFBvcywgaCk7XHJcbiAgICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqICBNZXRob2QgdXNlZCBhcyB3b3JrZXIgY29kZS5cclxuICAgKi9cclxuICB3b3JrZXJGdW5jdGlvbigpIHtcclxuICAgIGFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhIH0pID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IGF1ZGlvRGF0YSA9IGRhdGEuYXVkaW9EYXRhOyAvLyBhdWRpbyBkYXRhIHBhcnQgcmVxdWlyZWQgdG8gcmVuZGVyIHZpZXcgcG9ydFxyXG4gICAgICBjb25zdCBhdU9mZnNldDpudW1iZXI9ZGF0YS5hdWRpb0RhdGFPZmZzZXQ7XHJcbiAgICAgIGNvbnN0IGw9IGRhdGEubDsgLy8gbGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB2aWV3IHBvcnRcclxuICAgICAgY29uc3QgdyA9IGRhdGEudzsgIC8vIHdpZHRoIG9mIHZpZXdwb3J0XHJcbiAgICAgIGNvbnN0IHZ3ID0gZGF0YS52dzsgLy8gIHRvdGFsIHdpZHRoIG9mICh2aXJ0dWFsKSBhdWRpbyB2aWV3IChub3Qgdmlld3BvcnQgd2lkdGgpXHJcbiAgICAgIGNvbnN0IGNocyA9IGRhdGEuY2hzOyAvLyBudW1iZXIgb2YgY2hhbm5lbHNcclxuICAgICAgLy9jb25zdCBkYXRhRnJhbWVMZW5ndGggPSBkYXRhLmF1ZGlvRGF0YUZyYW1lTGVuZ3RoOyAgLy8gZnJhbWUgbGVuZ3RoIG9mIGF1ZGlvIGRhdGEgcGFydCByZXF1aXJlZCBmb3IgdmlldyBwb3J0XHJcbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gZGF0YS5mcmFtZUxlbmd0aDsgIC8vIHRvdGFsIGZyYW1lIGxlbmd0aCAob2YgYXVkaW8gY2xpcClcclxuXHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlc6IGxlZnQ6IFwiK2wrXCIsIHc6XCIrdytcIiwgdnc6IFwiK3Z3K1wiLCBjaHM6IFwiK2NocytcIiwgZnJhbWVMZW5ndGg6IFwiK2ZyYW1lTGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCBwc01pbk1heD0gbmV3IEZsb2F0MzJBcnJheSgwKTtcclxuXHJcbiAgICAgIGlmKGF1ZGlvRGF0YSAmJiBhdWRpb0RhdGEubGVuZ3RoPjAgJiYgdz49MCAmJiB2dz4wKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB2dztcclxuXHJcbiAgICAgICAgY29uc3QgcG9pbnRzTGVuID0gdyAqIGNocztcclxuICAgICAgICAvLyBvbmUgZm9yIG1pbiBvbmUgZm9yIG1heFxyXG4gICAgICAgIGNvbnN0IGFyckxlbiA9IHBvaW50c0xlbiAqIDI7XHJcbiAgICAgICAgcHNNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KGFyckxlbik7XHJcbiAgICAgICAgbGV0IGNoRnJhbWVQb3MgPSAwO1xyXG4gICAgICAgIGNvbnN0IGNoRnJhbWVMZW5ndGg9YXVkaW9EYXRhLmxlbmd0aC9jaHM7XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG5cclxuICAgICAgICAgIGNoRnJhbWVQb3MgPSBjaCAqIGNoRnJhbWVMZW5ndGg7XHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2aXJ0UGlpPWwrcGlpO1xyXG4gICAgICAgICAgICBsZXQgcE1pbiA9IEluZmluaXR5O1xyXG4gICAgICAgICAgICBsZXQgcE1heCA9IC1JbmZpbml0eTtcclxuICAgICAgICAgICAgbGV0IHBpeGVsRnJhbWVQb3MgPSBNYXRoLnJvdW5kKGNoRnJhbWVQb3MgKyAodmlydFBpaSAqIGZyYW1lc1BlclBpeGVsKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgcGl4ZWwgbWluL21heCBhbXBsaXR1ZGVcclxuICAgICAgICAgICAgZm9yIChsZXQgYWkgPSAwOyBhaSA8IGZyYW1lc1BlclBpeGVsOyBhaSsrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZnJhbWVQb3MgPSBwaXhlbEZyYW1lUG9zICsgYWk7XHJcbiAgICAgICAgICAgICAgbGV0IGEgPSAwO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJ1ZlBvcz1mcmFtZVBvcy1hdU9mZnNldDtcclxuICAgICAgICAgICAgICAvL2xldCBidWZQb3M9ZnJhbWVQb3M7XHJcbiAgICAgICAgICAgICAgaWYoYnVmUG9zPj0wICYmIGJ1ZlBvczxhdWRpb0RhdGEubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgIGE9YXVkaW9EYXRhW2J1ZlBvc107XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXOiBjaDogXCIrY2grXCIsIHBpeGVsRnJhbWVQb3M6IFwiK3BpeGVsRnJhbWVQb3MrXCIsIGZyYW1lUG9zOiBcIitmcmFtZVBvcytcIiwgYXVPZmZzZXQ6IFwiK2F1T2Zmc2V0K1wiLCBidWZQb3M6IFwiK2J1ZlBvcytcIiwgYXVkaW9EYXRhLmxlbmd0aDogXCIrYXVkaW9EYXRhLmxlbmd0aCtcIiwgYTogXCIrYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA8IHBNaW4pIHtcclxuICAgICAgICAgICAgICAgICAgcE1pbiA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA+IHBNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgcE1heCA9IGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwc01pblBvcyA9IGNoICogdyArIHBpaTtcclxuICAgICAgICAgICAgcHNNaW5NYXhbcHNNaW5Qb3NdID0gcE1pbjtcclxuICAgICAgICAgICAgY29uc3QgcHNNYXhQb3MgPSBwb2ludHNMZW4gKyBwc01pblBvcztcclxuICAgICAgICAgICAgcHNNaW5NYXhbcHNNYXhQb3NdID0gcE1heDtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwicHNNaW5NYXhbXCIrcHNNaW5Qb3MrXCJdPVwiK3BNaW4rXCIscHNNaW5NYXhbXCIrcHNNYXhQb3MrXCJdPVwiK3BNYXgpO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcG9zdE1lc3NhZ2Uoe3BzTWluTWF4OiBwc01pbk1heCwgbDpkYXRhLmwsdzogZGF0YS53LCBjaHM6IGRhdGEuY2hzLGVvZDpkYXRhLmVvZH0sIFtwc01pbk1heC5idWZmZXJdKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHN0YXJ0RHJhdyhjbGVhciA9IHRydWUpIHtcclxuICAgIGlmIChjbGVhcikge1xyXG4gICAgICBpZih0aGlzLmJvdW5kcykge1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsQ2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGxldCBnID0gdGhpcy5zaWduYWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAvL2cuY2xlYXJSZWN0KDAsIDAsdywgaCk7XHJcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9IFwiYmxhY2tcIjtcclxuICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpLCBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRSZW5kZXIoKTtcclxuICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHN0YXJ0UmVuZGVyKCkge1xyXG5cclxuICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5yYUFzU3Vic2Mpe1xyXG4gICAgICB0aGlzLnJhQXNTdWJzYy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmFkZE9uUmVhZHlMaXN0ZW5lcigoKT0+e1xyXG4gICAgICAgICAgaWYodGhpcy5fYXVkaW9EYXRhSG9sZGVyICYmIHRoaXMuYm91bmRzICYmIHRoaXMuYm91bmRzLmRpbWVuc2lvbikge1xyXG4gICAgICAgICAgICBsZXQgdyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICAgICAgbGV0IGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpO1xyXG4gICAgICAgICAgICBsZXQgdncgPSBNYXRoLnJvdW5kKHRoaXMudmlydHVhbERpbWVuc2lvbi53aWR0aCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodyA+IDAgJiYgaCA+IDAgJiYgdncgPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJy4vYXVkaW9zaWduYWwud29ya2VyLmpzJyx7dHlwZTogJ21vZHVsZSd9KTtcclxuICAgICAgICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIodGhpcy53b3JrZXJVUkwpO1xyXG4gICAgICAgICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJ3dvcmtlci9hdWRpb3NpZ25hbC53b3JrZXIudHMnKTtcclxuXHJcbiAgICAgICAgICAgICAgLy9sZXQgV29ya2VyID0gcmVxdWlyZSgnd29ya2VyIS4uLy4uLy4uL3dvcmtlcnMvdXBsb2FkZXIvbWFpbicpO1xyXG4gICAgICAgICAgICAgIGxldCBjaHMgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICAgICAgICBsZXQgbGVmdFBvcyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCk7XHJcbiAgICAgICAgICAgICAgbGV0IHJlbmRlclBvcyA9IGxlZnRQb3M7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgICAgICAgICBsZXQgZnJhbWVzUGVyUGl4ZWwgPSBNYXRoLmNlaWwoZnJhbWVMZW5ndGggLyB2dyk7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2hzOiBcIiArIGNocyArIFwiLCB2dzogXCIgKyB2dyArIFwiLCBmcmFtZUxlbmd0aDogXCIgKyBmcmFtZUxlbmd0aCArIFwiLCBmcmFtZXNQZXJQaXhlbDogXCIgKyBmcmFtZXNQZXJQaXhlbCk7XHJcbiAgICAgICAgICAgICAgbGV0IGFkOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGNocyAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICBsZXQgcmFBcyA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5yYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSgpO1xyXG4gICAgICAgICAgICAgIGxldCBhdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgICBsZXQgYXVkaW9Tb3VyY2UgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIuYXVkaW9Tb3VyY2U7XHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvU291cmNlIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyID0gYXVkaW9Tb3VyY2UuYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vbGV0IGFycmF5QXVkaW9CdWZmZXI9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmFycmF5QnVmZmVyO1xyXG4gICAgICAgICAgICAgIGxldCBhcnJBYkJ1ZjogRmxvYXQzMkFycmF5W10gfCBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAvL2xldCBhaXM6QXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgICAvL2xldCBhaXNCdWY6RmxvYXQzMkFycmF5W118bnVsbD1udWxsO1xyXG4gICAgICAgICAgICAgIGxldCBwc01pbk1heDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JrZXIub25tZXNzYWdlID0gKG1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChtZS5kYXRhLmVvZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwc01pbk1heFRtcDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHNNaW5NYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHBzTWluTWF4VG1wID0gcHNNaW5NYXg7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHBzTWluTWF4VG1wID0gbWUuZGF0YS5wc01pbk1heDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3UmVuZGVyZWQobGVmdFBvcywgdywgaCwgY2hzLCBwc01pbk1heFRtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmFBcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlciAmJiBhcnJBYkJ1Zikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ3ID0gbWUuZGF0YS53O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJQb2ludHNMZW4gPSBjaHMgKiBydztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludHNMZW4gPSBjaHMgKiB3O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChwc01pbk1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgckJhc2VQb3MgPSBjaCAqIHJ3O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZVBvcyA9IGNoICogdztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJQb3NNaW4gPSByQmFzZVBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJQb3NNYXggPSByUG9pbnRzTGVuICsgclBvc01pbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc01pbiA9IGJhc2VQb3MgKyAocmVuZGVyUG9zIC0gbGVmdFBvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NNYXggPSBwb2ludHNMZW4gKyBwb3NNaW47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwc01pbk1heFtwb3NNaW5dID0gbWUuZGF0YS5wc01pbk1heFtyUG9zTWluXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdNaW46ICgnK3Bvc01pbisnKTogJyttZS5kYXRhLnBzTWluTWF4W3JQb3NNaW5dKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHNNaW5NYXhbcG9zTWF4XSA9IG1lLmRhdGEucHNNaW5NYXhbclBvc01heF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnTWF4OiAoJysocG9zTWF4KSsnKTogJyttZS5kYXRhLnBzTWluTWF4W3JQb3NNYXhdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwicHNNaW5NYXhbXCIrcG9zTWluK1wiXT1cIittZS5kYXRhLnBzTWluTWF4W3JQb3NNaW5dK1wiICAoclBvc01pbj1cIityUG9zTWluK1wiKSxwc01pbk1heFtcIitwb3NNYXgrXCJdPVwiK21lLmRhdGEucHNNaW5NYXhbclBvc01heF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZW9kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUG9zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgYWQ6RmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0RnJhbWVQb3MgPSBNYXRoLmZsb29yKGZyYW1lTGVuZ3RoICogcmVuZGVyUG9zIC8gdncpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJQb3MgPCBsZWZ0UG9zICsgdykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhQXNPYnMgPSByYUFzLmZyYW1lc09icyhsZWZ0RnJhbWVQb3MsIGZyYW1lc1BlclBpeGVsLCBhcnJBYkJ1ZilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhQXNTdWJzYyA9IHJhQXNPYnMuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlYWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkZpcnN0IHJlYWQgZnJhbWU6IFwiK2FyckFiQnVmWzBdWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJBYkJ1Zikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZExlbiA9IGNocyAqIGZyYW1lc1BlclBpeGVsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkIHx8IGFkLmxlbmd0aCAhPT0gYWRMZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZCA9IG5ldyBGbG9hdDMyQXJyYXkoYWRMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZC5zZXQoYXJyQWJCdWZbY2hdLCBjaCAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9kID0gKHJlYWQgPD0gMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRCdWYgPSBhZC5idWZmZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBtZS5kYXRhLncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dzogdncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YTogYWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OiBsZWZ0RnJhbWVQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9kOiBlb2RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW2FkQnVmXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkF1ZGlvU2lnbmFsOiBFcnJvciByZWFkaW5nIGF1ZGlvIGRhdGE6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGFkID0gbmV3IEZsb2F0MzJBcnJheSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZW9kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkQnVmID0gYWQuYnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsOiByZW5kZXJQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdzogbWUuZGF0YS53LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdnc6IHZ3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoczogY2hzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0RhdGE6IGFkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YU9mZnNldDogbGVmdEZyYW1lUG9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVvZDogZW9kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFthZEJ1Zl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyICYmIGF1ZGlvQnVmZmVyLmxlbmd0aCAqIGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHMgPCBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50LkVOQUJMRV9TVFJFQU1JTkdfTlVNQkVSX09GX1NBTVBMRVNfVEhSRVNIT0xEKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyIHdob2xlIGNsaXAgYXQgb25jZVxyXG4gICAgICAgICAgICAgICAgYXJyQWJCdWYgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgcHNNaW5NYXggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWQgPSBuZXcgRmxvYXQzMkFycmF5KGNocyAqIGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgYWQuc2V0KGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKSwgY2ggKiBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgIGw6IGxlZnRQb3MsXHJcbiAgICAgICAgICAgICAgICAgIHc6IHcsXHJcbiAgICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgICBlb2Q6IHRydWVcclxuICAgICAgICAgICAgICAgIH0sIFthZC5idWZmZXJdKTtcclxuXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBSZW5kZXIgcGl4ZWwgYnkgcGl4ZWxcclxuICAgICAgICAgICAgICAgIGlmICh3ID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc1BlclBpeGVsID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBydyA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyQWJCdWYgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBzTWluTWF4ID0gbmV3IEZsb2F0MzJBcnJheShjaHMgKiB3ICogMik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQXVkaW9zaWduYWw6IEFsbG9jYXRpbmcgYnVmZmVyczogXCIrZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGFyckFiQnVmW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoZnJhbWVzUGVyUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0RnJhbWVQb3MgPSBNYXRoLmZsb29yKGZyYW1lTGVuZ3RoICogcmVuZGVyUG9zIC8gdncpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1T2Zmc2V0ID0gbGVmdEZyYW1lUG9zOyAvLyBzaG91bGQgYWx3YXlzIGJlIDBcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFBc09icyA9IHJhQXMuZnJhbWVzT2JzKGxlZnRGcmFtZVBvcywgZnJhbWVzUGVyUGl4ZWwsIGFyckFiQnVmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3U3RhdGVUZXh0KFwiTG9hZGluZy9SZW5kZXJpbmcuLi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmFBc1N1YnNjID0gcmFBc09icy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZWFkKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJBYkJ1ZiAmJiB0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRMZW4gPSBjaHMgKiBmcmFtZXNQZXJQaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWQgfHwgYWQubGVuZ3RoICE9PSBhZExlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZCA9IG5ldyBGbG9hdDMyQXJyYXkoYWRMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZC5zZXQoYXJyQWJCdWZbY2hdLCBjaCAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogcncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OiBhdU9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9kOiAocmVhZCA8PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW2FkLmJ1ZmZlcl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXVkaW9TaWduYWw6IEVycm9yIHJlYWRpbmcgYXVkaW8gZGF0YTogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmJvdW5kcyAmJiB0aGlzLmJvdW5kcy5kaW1lbnNpb24pIHtcclxuICAgICAgICAgIGxldCB3ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgICAgICAgbGV0IGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpO1xyXG4gICAgICAgICAgbGV0IGcgPSB0aGlzLnNpZ25hbENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICBpZiAoZykge1xyXG4gICAgICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuZHJhd1N0YXRlVGV4dChzdGF0ZVRleHQ6c3RyaW5nKSB7XHJcbiAgICBpZihzdGF0ZVRleHQpIHtcclxuICAgICAgY29uc3QgZyA9IHRoaXMuc2lnbmFsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgY29uc3Qgdz10aGlzLnNpZ25hbENhbnZhcy53aWR0aDtcclxuICAgICAgY29uc3QgaD10aGlzLnNpZ25hbENhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGlmIChnICYmIHcgJiYgaCkge1xyXG4gICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xyXG4gICAgICAgIGcuZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgICBnLmZvbnQgPSAnMjBweCBzYW5zLXNlcmlmJztcclxuICAgICAgICBnLmZpbGxUZXh0KHN0YXRlVGV4dCwgMTAsIDI1KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiAgZHJhd1JlbmRlcmVkKGxlZnQ6bnVtYmVyLHc6bnVtYmVyLGg6bnVtYmVyLGNoczpudW1iZXIscHNNaW5NYXg6RmxvYXQzMkFycmF5KSB7XHJcbiAgICB0aGlzLmRyYXdCZygpO1xyXG4gICAgdGhpcy5zaWduYWxDYW52YXMuc3R5bGUubGVmdD1sZWZ0LnRvU3RyaW5nKCkrJ3B4JztcclxuICAgIHRoaXMuc2lnbmFsQ2FudmFzLndpZHRoID0gdztcclxuICAgIHRoaXMuc2lnbmFsQ2FudmFzLmhlaWdodCA9IGg7XHJcbiAgICBsZXQgZyA9IHRoaXMuc2lnbmFsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgIGlmIChnKSB7XHJcbiAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICBsZXQgcG9pbnRzTGVuID0gdyAqIGNocztcclxuICAgICAgLy8gb25lIGZvciBtaW4gb25lIGZvciBtYXhcclxuICAgICAgLy9jb25zdCBhcnJMZW4gPSBwb2ludHNMZW4gKiAyO1xyXG4gICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgICAgICAgLy9jb25zdCBzdGQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICBjb25zdCBjaEggPSBoIC8gY2hzO1xyXG5cclxuICAgICAgICBsZXQgeSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgY29uc3QgcHNNaW5Qb3MgPSBjaCAqIHc7XHJcbiAgICAgICAgICBjb25zdCBwc01heFBvcyA9IHBvaW50c0xlbiArIHBzTWluUG9zO1xyXG5cclxuICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ2dyZWVuJztcclxuICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xyXG5cclxuICAgICAgICAgIC8vIGRyYXcgYXVkaW8gc2lnbmFsIGFzIHNpbmdsZSBwb2x5Z29uXHJcbiAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgZy5tb3ZlVG8oMCwgeSArIChjaEggLyAyKSArIHBzTWluTWF4W3BzTWF4UG9zXSAqIGNoSCAvIDIpO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBzTWF4ID0gcHNNaW5NYXhbcHNNYXhQb3MgKyBwaWldO1xyXG4gICAgICAgICAgICBjb25zdCBwdiA9IHBzTWF4ICogY2hIIC8gMjtcclxuICAgICAgICAgICAgY29uc3QgeWQ9eSArIChjaEggLyAyKSAtIHB2O1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTGluZVRvOiA6IFwiK3BpaStcIiBcIit5ZClcclxuICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCByZXZQaXhlbFN0YXJ0PXctMTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBwaWkgPSByZXZQaXhlbFN0YXJ0OyBwaWkgPj0gMDsgcGlpLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgcHNNaW4gPSBwc01pbk1heFtwc01pblBvcyArIHBpaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHB2ID0gcHNNaW4gKiBjaEggLyAyO1xyXG4gICAgICAgICAgICBjb25zdCB5ZD15ICsgKGNoSCAvIDIpIC0gcHY7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMaW5lVG86IDogXCIrcGlpK1wiIFwiK3lkKVxyXG4gICAgICAgICAgICBnLmxpbmVUbyhwaWksIHlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcblxyXG4gICAgICAgICAgZy5maWxsKCk7XHJcbiAgICAgICAgICBnLnN0cm9rZSgpO1xyXG4gICAgICAgICAgeSArPSBjaEg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyByZWRyYXcoKSB7XHJcbiAgLy8gICB0aGlzLmRyYXdCZygpXHJcbiAgLy8gICBsZXQgZyA9IHRoaXMuc2lnbmFsQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAvLyAgIGlmIChnKSB7XHJcbiAgLy8gICAgIGxldCB3ID0gdGhpcy5zaWduYWxDYW52YXMud2lkdGg7XHJcbiAgLy8gICAgIGxldCBoID0gdGhpcy5zaWduYWxDYW52YXMuaGVpZ2h0O1xyXG4gIC8vICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAvLyAgICAgLy9nLmZpbGxTdHlsZSA9IFwiYmxhY2tcIjtcclxuICAvLyAgICAgLy9nLmZpbGxSZWN0KDAsIDAsIHcsIGgpO1xyXG4gIC8vICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgLy8gICAgICAgbGV0IHN0ZCA9IERhdGUubm93KCk7XHJcbiAgLy8gICAgICAgbGV0IGNocyA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5udW1iZXJPZkNoYW5uZWxzO1xyXG4gIC8vICAgICAgIGxldCBjaEggPSBoIC8gY2hzO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lTGVuO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB3O1xyXG4gIC8vICAgICAgIGxldCB5ID0gMDtcclxuICAvLyAgICAgICBsZXQgYWlzOkZsb2F0MzJBcnJheUlucHV0U3RyZWFtfG51bGw9bnVsbDtcclxuICAvLyAgICAgICBsZXQgYXVkaW9Tb3VyY2U9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmF1ZGlvU291cmNlO1xyXG4gIC8vICAgICAgIGxldCBhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcnxudWxsPW51bGw7XHJcbiAgLy8gICAgICAgaWYoYXVkaW9Tb3VyY2UgaW5zdGFuY2VvZiBBdWRpb0J1ZmZlclNvdXJjZSl7XHJcbiAgLy8gICAgICAgICBhdWRpb0J1ZmZlcj1hdWRpb1NvdXJjZS5hdWRpb0J1ZmZlcjtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgbGV0IGFpc0J1ZmZlcjpBcnJheTxGbG9hdDMyQXJyYXk+fG51bGw9bnVsbDtcclxuICAvLyAgICAgICBpZighYXVkaW9CdWZmZXIpIHtcclxuICAvLyAgICAgICAgIGFpcz10aGlzLl9hdWRpb0RhdGFIb2xkZXIuYXVkaW9JbnB1dFN0cmVhbSgpO1xyXG4gIC8vICAgICAgICAgYWlzQnVmZmVyPW5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNocyk7XHJcbiAgLy8gICAgICAgICBmb3IobGV0IGNoPTA7Y2g8Y2hzO2NoKyspIHtcclxuICAvLyAgICAgICAgICAgYWlzQnVmZmVyW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoZnJhbWVzUGVyUGl4ZWwpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAvLyAgICAgICAgICAgbGV0IHggPSAwO1xyXG4gIC8vICAgICAgICAgICBsZXQgcHNNaW4gPSBuZXcgRmxvYXQzMkFycmF5KHcpO1xyXG4gIC8vICAgICAgICAgICBsZXQgcHNNYXggPSBuZXcgRmxvYXQzMkFycmF5KHcpO1xyXG4gIC8vICAgICAgICAgICBsZXQgZnJhbWVQb3MgPSAwO1xyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gIC8vICAgICAgICAgICAgIGxldCBwTWluID0gMDtcclxuICAvLyAgICAgICAgICAgICBsZXQgcE1heCA9IDA7XHJcbiAgLy9cclxuICAvLyAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXIpe1xyXG4gIC8vICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHBpeGVsIG1pbi9tYXggYW1wbGl0dWRlXHJcbiAgLy8gICAgICAgICAgICAgICBmb3IgKGxldCBhaSA9IDA7IGFpIDwgZnJhbWVzUGVyUGl4ZWw7IGFpKyspIHtcclxuICAvLyAgICAgICAgICAgICAgICAgLy9sZXQgZnJhbWVQb3M9KHBpaSpmcmFtZXNQZXJQaXhlbCkrYWk7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGxldCBhID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpW2ZyYW1lUG9zKytdO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChhIDwgcE1pbikge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHBNaW4gPSBhO1xyXG4gIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChhID4gcE1heCkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIHBNYXggPSBhO1xyXG4gIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1lbHNlIGlmKGFpcyAmJiBhaXNCdWZmZXIpIHtcclxuICAvLyAgICAgICAgICAgICAgIGxldCByID0gYWlzLnJlYWQoYWlzQnVmZmVyKTtcclxuICAvLyAgICAgICAgICAgICAgIGZvciAobGV0IGFpID0gMDsgYWkgPCByOyBhaSsrKSB7XHJcbiAgLy9cclxuICAvLyAgICAgICAgICAgICAgICAgbGV0IGEgPSBhaXNCdWZmZXJbY2hdW2FpXTtcclxuICAvL1xyXG4gIC8vICAgICAgICAgICAgICAgICBpZiAoYSA8IHBNaW4pIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBwTWluID0gYTtcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICBpZiAoYSA+IHBNYXgpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBwTWF4ID0gYTtcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICBwc01pbltwaWldID0gcE1pbjtcclxuICAvLyAgICAgICAgICAgICBwc01heFtwaWldID0gcE1heDtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICdncmVlbic7XHJcbiAgLy8gICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgICAgIC8vIGRyYXcgYXVkaW8gc2lnbmFsIGFzIHNpbmdsZSBwb2x5Z29uXHJcbiAgLy8gICAgICAgICAgIGcuYmVnaW5QYXRoKCk7XHJcbiAgLy8gICAgICAgICAgIGcubW92ZVRvKDAsIHkgKyAoY2hIIC8gMikgKyBwc01pblswXSAqIGNoSCAvIDIpO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgLy8gICAgICAgICAgICAgbGV0IHB2ID0gcHNNaW5bcGlpXSAqIGNoSCAvIDI7XHJcbiAgLy8gICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIk1pbjogXCIscHYpO1xyXG4gIC8vICAgICAgICAgICAgIGcubGluZVRvKHBpaSwgeSArIChjaEggLyAyKSArIHB2KTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBwaWkgPSB3OyBwaWkgPj0gMDsgcGlpLS0pIHtcclxuICAvLyAgICAgICAgICAgICBsZXQgcHYgPSBwc01heFtwaWldICogY2hIIC8gMjtcclxuICAvLyAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTWF4OiBcIixwdik7XHJcbiAgLy8gICAgICAgICAgICAgZy5saW5lVG8ocGlpLCB5ICsgKGNoSCAvIDIpICsgcHYpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgLy8gICAgICAgICAgIC8vZy5saW5lVG8oKVxyXG4gIC8vICAgICAgICAgICBnLmZpbGwoKTtcclxuICAvLyAgICAgICAgICAgZy5zdHJva2UoKTtcclxuICAvLyAgICAgICAgICAgZy5maWxsU3R5bGUgPSBcInllbGxvd1wiO1xyXG4gIC8vICAgICAgICAgICBnLnN0cm9rZSgpO1xyXG4gIC8vICAgICAgICAgICB5ICs9IGNoSDtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICBhaXM/LmNsb3NlKCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHNldERhdGEoYXVkaW9EYXRhOiBBdWRpb0RhdGFIb2xkZXIgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIgPSBhdWRpb0RhdGE7XHJcbiAgICB0aGlzLnBsYXlGcmFtZVBvc2l0aW9uID0gMDtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==