raise-common-lib 0.0.220 → 0.0.222-beta

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.
@@ -161,22 +161,91 @@ export class SmartPopupComponent {
161
161
  if (this.opened === "yes" &&
162
162
  previousTrigger !== this.currentTriggerElement &&
163
163
  this.currentTriggerElement) {
164
- // 使用新的打开方式更新位置
165
- this.positioning = "yes";
166
- this.ref.markForCheck();
167
- requestAnimationFrame((/**
168
- * @return {?}
169
- */
170
- () => {
164
+ // 如果提供了固定尺寸,直接重新计算位置(避免位置跳动)
165
+ if (this._width !== null && this._height !== null) {
166
+ // 先隐藏弹窗(positioning = yes)
167
+ this.positioning = "yes";
168
+ this.ref.markForCheck();
169
+ this.ref.detectChanges(); // 立即应用隐藏状态
171
170
  requestAnimationFrame((/**
172
171
  * @return {?}
173
172
  */
174
173
  () => {
175
- this.updatePopupPosition();
176
- this.positioning = "no";
177
- this.ref.markForCheck();
174
+ if (this.currentTriggerElement) {
175
+ /** @type {?} */
176
+ const triggerRect = this.currentTriggerElement.getBoundingClientRect();
177
+ /** @type {?} */
178
+ const popupSize = {
179
+ width: (/** @type {?} */ (this._width)),
180
+ height: (/** @type {?} */ (this._height)),
181
+ };
182
+ /** @type {?} */
183
+ const targetInfo = this.placementInfo;
184
+ /** @type {?} */
185
+ let finalPlacement = targetInfo.placement;
186
+ /** @type {?} */
187
+ const finalPosition = targetInfo.position;
188
+ if (this.autoAdjust) {
189
+ /** @type {?} */
190
+ const popupRect = (/** @type {?} */ ({
191
+ width: popupSize.width,
192
+ height: popupSize.height,
193
+ top: 0,
194
+ left: 0,
195
+ right: popupSize.width,
196
+ bottom: popupSize.height,
197
+ x: 0,
198
+ y: 0,
199
+ toJSON: (/**
200
+ * @return {?}
201
+ */
202
+ () => ({})),
203
+ }));
204
+ /** @type {?} */
205
+ const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, window.innerWidth, window.innerHeight);
206
+ finalPlacement = optimal.placement;
207
+ }
208
+ this.actualPlacement = finalPlacement;
209
+ this.actualPosition = finalPosition;
210
+ /** @type {?} */
211
+ const position = this.calculatePositionCoordinates(triggerRect, finalPlacement, finalPosition, popupSize);
212
+ if (this.popupElement && this.popupElement.nativeElement) {
213
+ /** @type {?} */
214
+ const popupEl = this.popupElement.nativeElement;
215
+ popupEl.style.top = position.top;
216
+ popupEl.style.left = position.left;
217
+ popupEl.style.transform = `translate(${position.translateX}, ${position.translateY})`;
218
+ popupEl.offsetHeight; // 强制同步应用样式
219
+ // 位置设置完成后,再显示弹窗
220
+ requestAnimationFrame((/**
221
+ * @return {?}
222
+ */
223
+ () => {
224
+ this.positioning = "no";
225
+ this.ref.markForCheck();
226
+ }));
227
+ }
228
+ }
178
229
  }));
179
- }));
230
+ }
231
+ else {
232
+ // 使用新的打开方式更新位置
233
+ this.positioning = "yes";
234
+ this.ref.markForCheck();
235
+ requestAnimationFrame((/**
236
+ * @return {?}
237
+ */
238
+ () => {
239
+ requestAnimationFrame((/**
240
+ * @return {?}
241
+ */
242
+ () => {
243
+ this.updatePopupPosition();
244
+ this.positioning = "no";
245
+ this.ref.markForCheck();
246
+ }));
247
+ }));
248
+ }
180
249
  }
181
250
  }
182
251
  // 处理 open 变化(确保在触发元素更新后处理)
@@ -292,22 +361,92 @@ export class SmartPopupComponent {
292
361
  console.warn("SmartPopupComponent: No trigger element found");
293
362
  return;
294
363
  }
295
- // 如果已经打开,先关闭再打开(更新位置)
364
+ // 如果已经打开,且提供了固定尺寸,直接重新计算位置(避免关闭再打开导致的跳动)
296
365
  if (this.opened === "yes") {
297
- // 先关闭弹窗
298
- this.opened = "no";
299
- this.positioning = "no";
300
- this.ref.markForCheck();
301
- // 立即在新位置打开
302
- requestAnimationFrame((/**
303
- * @return {?}
304
- */
305
- () => {
306
- // 再次确保触发元素已更新
307
- this.updateTriggerElement();
308
- this.openPopup();
309
- }));
310
- return;
366
+ if (this._width !== null && this._height !== null) {
367
+ // 有固定尺寸,直接重新计算位置,不关闭弹窗
368
+ // 先隐藏弹窗(positioning = yes)
369
+ this.positioning = "yes";
370
+ this.ref.markForCheck();
371
+ this.ref.detectChanges(); // 立即应用隐藏状态
372
+ requestAnimationFrame((/**
373
+ * @return {?}
374
+ */
375
+ () => {
376
+ // 再次确保触发元素已更新
377
+ this.updateTriggerElement();
378
+ if (this.currentTriggerElement) {
379
+ /** @type {?} */
380
+ const triggerRect = this.currentTriggerElement.getBoundingClientRect();
381
+ /** @type {?} */
382
+ const popupSize = {
383
+ width: (/** @type {?} */ (this._width)),
384
+ height: (/** @type {?} */ (this._height)),
385
+ };
386
+ /** @type {?} */
387
+ const targetInfo = this.placementInfo;
388
+ /** @type {?} */
389
+ let finalPlacement = targetInfo.placement;
390
+ /** @type {?} */
391
+ const finalPosition = targetInfo.position;
392
+ if (this.autoAdjust) {
393
+ /** @type {?} */
394
+ const popupRect = (/** @type {?} */ ({
395
+ width: popupSize.width,
396
+ height: popupSize.height,
397
+ top: 0,
398
+ left: 0,
399
+ right: popupSize.width,
400
+ bottom: popupSize.height,
401
+ x: 0,
402
+ y: 0,
403
+ toJSON: (/**
404
+ * @return {?}
405
+ */
406
+ () => ({})),
407
+ }));
408
+ /** @type {?} */
409
+ const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, window.innerWidth, window.innerHeight);
410
+ finalPlacement = optimal.placement;
411
+ }
412
+ this.actualPlacement = finalPlacement;
413
+ this.actualPosition = finalPosition;
414
+ /** @type {?} */
415
+ const position = this.calculatePositionCoordinates(triggerRect, finalPlacement, finalPosition, popupSize);
416
+ if (this.popupElement && this.popupElement.nativeElement) {
417
+ /** @type {?} */
418
+ const popupEl = this.popupElement.nativeElement;
419
+ popupEl.style.top = position.top;
420
+ popupEl.style.left = position.left;
421
+ popupEl.style.transform = `translate(${position.translateX}, ${position.translateY})`;
422
+ popupEl.offsetHeight; // 强制同步应用样式
423
+ // 位置设置完成后,再显示弹窗
424
+ requestAnimationFrame((/**
425
+ * @return {?}
426
+ */
427
+ () => {
428
+ this.positioning = "no";
429
+ this.ref.markForCheck();
430
+ }));
431
+ }
432
+ }
433
+ }));
434
+ return;
435
+ }
436
+ else {
437
+ // 没有固定尺寸,先关闭再打开
438
+ this.opened = "no";
439
+ this.positioning = "no";
440
+ this.ref.markForCheck();
441
+ requestAnimationFrame((/**
442
+ * @return {?}
443
+ */
444
+ () => {
445
+ this.updateTriggerElement();
446
+ this.openPopup();
447
+ }));
448
+ return;
449
+ }
311
450
  }
312
451
  // 确保触发元素已更新
313
452
  this.updateTriggerElement();
@@ -357,13 +496,15 @@ export class SmartPopupComponent {
357
496
  const targetInfo = this.placementInfo;
358
497
  /** @type {?} */
359
498
  let finalPlacement = targetInfo.placement;
499
+ // 始终使用用户指定的 position,autoAdjust 只调整 placement(方向),不改变对齐方式
360
500
  /** @type {?} */
361
- let finalPosition = targetInfo.position;
501
+ const finalPosition = targetInfo.position;
362
502
  if (this.autoAdjust) {
363
503
  /** @type {?} */
364
504
  const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, viewportWidth, viewportHeight);
505
+ // autoAdjust 只调整 placement(上下左右),保持用户指定的 position(对齐方式)
365
506
  finalPlacement = optimal.placement;
366
- finalPosition = optimal.position;
507
+ // finalPosition 保持用户指定的值,不改变
367
508
  }
368
509
  this.actualPlacement = finalPlacement;
369
510
  this.actualPosition = finalPosition;
@@ -371,56 +512,57 @@ export class SmartPopupComponent {
371
512
  /** @type {?} */
372
513
  const position = this.calculatePositionCoordinates(triggerRect, finalPlacement, finalPosition, popupSize);
373
514
  // 先设置打开状态,但保持隐藏(positioning = yes)
374
- this.opened = "yes";
515
+ // 注意:先设置 positioning = yes,再设置 opened = yes,确保弹窗在位置计算完成前始终隐藏
375
516
  this.positioning = "yes";
517
+ this.opened = "yes";
376
518
  this.openChange.emit(true);
377
519
  this.ref.markForCheck();
378
- // 强制更新视图,确保DOM已更新
520
+ // 强制更新视图,确保DOM已更新,但弹窗仍然隐藏(因为 positioning = yes)
379
521
  this.ref.detectChanges();
380
- // 如果元素已经存在,立即设置位置(不等待 requestAnimationFrame)
522
+ // 设置位置的函数
523
+ /** @type {?} */
524
+ const setPosition = (/**
525
+ * @return {?}
526
+ */
527
+ () => {
528
+ if (this.popupElement && this.popupElement.nativeElement) {
529
+ /** @type {?} */
530
+ const popupEl = this.popupElement.nativeElement;
531
+ // 立即设置尺寸和位置
532
+ popupEl.style.width = this._width + "px";
533
+ popupEl.style.height = this._height + "px";
534
+ popupEl.style.minWidth = this._width + "px";
535
+ popupEl.style.maxWidth = this._width + "px";
536
+ popupEl.style.minHeight = this._height + "px";
537
+ popupEl.style.maxHeight = this._height + "px";
538
+ popupEl.style.top = position.top;
539
+ popupEl.style.left = position.left;
540
+ popupEl.style.transform = `translate(${position.translateX}, ${position.translateY})`;
541
+ // 强制同步应用样式,确保位置已设置
542
+ popupEl.offsetHeight;
543
+ // 位置设置完成后,再显示弹窗(设置 positioning = no)
544
+ // 使用 requestAnimationFrame 确保样式已应用
545
+ requestAnimationFrame((/**
546
+ * @return {?}
547
+ */
548
+ () => {
549
+ this.positioning = "no";
550
+ this.ref.markForCheck();
551
+ }));
552
+ }
553
+ });
554
+ // 如果元素已经存在,立即设置位置
381
555
  if (this.popupElement && this.popupElement.nativeElement) {
382
- /** @type {?} */
383
- const popupEl = this.popupElement.nativeElement;
384
- // 立即设置尺寸和位置
385
- popupEl.style.width = this._width + "px";
386
- popupEl.style.height = this._height + "px";
387
- popupEl.style.minWidth = this._width + "px";
388
- popupEl.style.maxWidth = this._width + "px";
389
- popupEl.style.minHeight = this._height + "px";
390
- popupEl.style.maxHeight = this._height + "px";
391
- popupEl.style.top = position.top;
392
- popupEl.style.left = position.left;
393
- popupEl.style.transform = `translate(${position.translateX}, ${position.translateY})`;
394
- // 强制同步应用样式
395
- popupEl.offsetHeight;
396
- // 位置设置完成后,立即显示弹窗
397
- this.positioning = "no";
398
- this.ref.markForCheck();
556
+ setPosition();
399
557
  }
400
558
  else {
401
- // 如果元素还不存在,等待渲染
559
+ // 如果元素还不存在,等待渲染后再设置位置
402
560
  requestAnimationFrame((/**
403
561
  * @return {?}
404
562
  */
405
563
  () => {
406
564
  if (this.popupElement && this.popupElement.nativeElement) {
407
- /** @type {?} */
408
- const popupEl = this.popupElement.nativeElement;
409
- // 立即设置尺寸和位置
410
- popupEl.style.width = this._width + "px";
411
- popupEl.style.height = this._height + "px";
412
- popupEl.style.minWidth = this._width + "px";
413
- popupEl.style.maxWidth = this._width + "px";
414
- popupEl.style.minHeight = this._height + "px";
415
- popupEl.style.maxHeight = this._height + "px";
416
- popupEl.style.top = position.top;
417
- popupEl.style.left = position.left;
418
- popupEl.style.transform = `translate(${position.translateX}, ${position.translateY})`;
419
- // 强制同步应用样式
420
- popupEl.offsetHeight;
421
- // 位置设置完成后,立即显示弹窗
422
- this.positioning = "no";
423
- this.ref.markForCheck();
565
+ setPosition();
424
566
  }
425
567
  }));
426
568
  }
@@ -552,13 +694,15 @@ export class SmartPopupComponent {
552
694
  const targetInfo = this.placementInfo;
553
695
  /** @type {?} */
554
696
  let finalPlacement = targetInfo.placement;
697
+ // 始终使用用户指定的 position,autoAdjust 只调整 placement(方向),不改变对齐方式
555
698
  /** @type {?} */
556
- let finalPosition = targetInfo.position;
699
+ const finalPosition = targetInfo.position;
557
700
  if (this.autoAdjust) {
558
701
  /** @type {?} */
559
702
  const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, viewportWidth, viewportHeight);
703
+ // autoAdjust 只调整 placement(上下左右),保持用户指定的 position(对齐方式)
560
704
  finalPlacement = optimal.placement;
561
- finalPosition = optimal.position;
705
+ // finalPosition 保持用户指定的值,不改变
562
706
  }
563
707
  this.actualPlacement = finalPlacement;
564
708
  this.actualPosition = finalPosition;
@@ -609,13 +753,15 @@ export class SmartPopupComponent {
609
753
  const targetInfo = this.placementInfo;
610
754
  /** @type {?} */
611
755
  let finalPlacement = targetInfo.placement;
756
+ // 始终使用用户指定的 position,autoAdjust 只调整 placement(方向),不改变对齐方式
612
757
  /** @type {?} */
613
- let finalPosition = targetInfo.position;
758
+ const finalPosition = targetInfo.position;
614
759
  if (this.autoAdjust) {
615
760
  /** @type {?} */
616
761
  const optimal = this.calculateOptimalPlacement(triggerRect, popupRect, viewportWidth, viewportHeight);
762
+ // autoAdjust 只调整 placement(上下左右),保持用户指定的 position(对齐方式)
617
763
  finalPlacement = optimal.placement;
618
- finalPosition = optimal.position;
764
+ // finalPosition 保持用户指定的值,不改变
619
765
  }
620
766
  this.actualPlacement = finalPlacement;
621
767
  this.actualPosition = finalPosition;
@@ -776,17 +922,12 @@ export class SmartPopupComponent {
776
922
  });
777
923
  // 如果首选位置有足够空间,优先使用用户指定的position
778
924
  if (hasEnoughSpace(preferred)) {
779
- // 检查用户指定的position是否有足够空间
780
- if (checkPositionSpace(preferred, preferredPosition)) {
781
- return {
782
- placement: preferred,
783
- position: preferredPosition,
784
- };
785
- }
786
- // 如果指定的position空间不足,自动计算最佳position
925
+ // 即使指定的position空间不足,也尽量保持用户指定的position
926
+ // 边界约束逻辑会在 calculatePositionCoordinates 中处理位置调整
927
+ // 这样可以保持用户期望的对齐方式
787
928
  return {
788
929
  placement: preferred,
789
- position: calculatePosition(preferred),
930
+ position: preferredPosition,
790
931
  };
791
932
  }
792
933
  // 根据首选位置选择备选位置
@@ -827,6 +968,7 @@ export class SmartPopupComponent {
827
968
  };
828
969
  }
829
970
  // 计算位置坐标(纯计算,不依赖DOM,包含边界约束)
971
+ // 注意:弹窗使用 position: fixed,所以坐标应该是相对于视口的,不需要加上滚动偏移
830
972
  /**
831
973
  * @private
832
974
  * @param {?} triggerRect
@@ -845,10 +987,6 @@ export class SmartPopupComponent {
845
987
  /** @type {?} */
846
988
  const viewportHeight = window.innerHeight;
847
989
  /** @type {?} */
848
- const scrollX = window.scrollX;
849
- /** @type {?} */
850
- const scrollY = window.scrollY;
851
- /** @type {?} */
852
990
  let top = 0;
853
991
  /** @type {?} */
854
992
  let left = 0;
@@ -858,109 +996,268 @@ export class SmartPopupComponent {
858
996
  let translateY = "0";
859
997
  switch (placement) {
860
998
  case "top":
861
- top = triggerRect.top + scrollY - this.offset;
999
+ // 弹窗在触发元素上方
1000
+ top = triggerRect.top - this.offset;
862
1001
  translateY = "-100%";
863
1002
  if (position === "start") {
864
- left = triggerRect.left + scrollX;
1003
+ // 左对齐
1004
+ left = triggerRect.left;
1005
+ translateX = "0";
865
1006
  }
866
1007
  else if (position === "center") {
867
- left = triggerRect.left + scrollX + triggerWidth / 2;
1008
+ // 居中对齐
1009
+ left = triggerRect.left + triggerWidth / 2;
868
1010
  translateX = "-50%";
869
1011
  }
870
1012
  else {
871
- left = triggerRect.left + scrollX + triggerWidth;
1013
+ // 右对齐(end)
1014
+ left = triggerRect.right;
872
1015
  translateX = "-100%";
873
1016
  }
874
1017
  // 边界约束:确保弹窗不超出视口
875
- if (top - popupSize.height < scrollY) {
876
- top = scrollY + 8; // 距离顶部至少8px
1018
+ /** @type {?} */
1019
+ const popupTop = top - popupSize.height;
1020
+ if (popupTop < 0) {
1021
+ top = popupSize.height + 8; // 距离顶部至少8px
1022
+ translateY = "0"; // 取消向上偏移
877
1023
  }
878
- if (left < scrollX) {
879
- left = scrollX + 8;
880
- translateX = "0";
1024
+ // 水平边界约束:尽量保持原始对齐方式
1025
+ if (position === "start") {
1026
+ // 左对齐:如果超出右边界,调整到右边界;如果超出左边界,调整到左边界
1027
+ if (left + popupSize.width > viewportWidth) {
1028
+ left = viewportWidth - popupSize.width - 8;
1029
+ }
1030
+ if (left < 8) {
1031
+ left = 8;
1032
+ }
881
1033
  }
882
- else if (left + popupSize.width > scrollX + viewportWidth) {
883
- left = scrollX + viewportWidth - popupSize.width - 8;
884
- translateX = "0";
1034
+ else if (position === "center") {
1035
+ // 居中对齐:计算实际左边界
1036
+ /** @type {?} */
1037
+ const actualLeft = left - popupSize.width / 2;
1038
+ if (actualLeft < 8) {
1039
+ // 左边界不足,尽量保持居中,但调整到不超出左边界
1040
+ left = 8 + popupSize.width / 2;
1041
+ translateX = "-50%";
1042
+ }
1043
+ else if (actualLeft + popupSize.width > viewportWidth - 8) {
1044
+ // 右边界不足,尽量保持居中,但调整到不超出右边界
1045
+ left = viewportWidth - 8 - popupSize.width / 2;
1046
+ translateX = "-50%";
1047
+ }
1048
+ }
1049
+ else {
1050
+ // 右对齐(end):弹窗右边缘与触发元素右边缘对齐
1051
+ // left 是弹窗的右边缘位置(因为 translateX = "-100%")
1052
+ // 弹窗的左边缘在 left - popupSize.width
1053
+ /** @type {?} */
1054
+ const popupLeftEdge = left - popupSize.width;
1055
+ // 如果弹窗左边缘超出左边界,调整位置但保持右对齐
1056
+ if (popupLeftEdge < 8) {
1057
+ left = 8 + popupSize.width;
1058
+ translateX = "-100%";
1059
+ }
1060
+ // 如果弹窗右边缘超出右边界,调整位置但保持右对齐
1061
+ if (left > viewportWidth - 8) {
1062
+ left = viewportWidth - 8;
1063
+ translateX = "-100%";
1064
+ }
885
1065
  }
886
1066
  break;
887
1067
  case "bottom":
888
- top = triggerRect.bottom + scrollY + this.offset;
1068
+ // 弹窗在触发元素下方
1069
+ top = triggerRect.bottom + this.offset;
889
1070
  if (position === "start") {
890
- left = triggerRect.left + scrollX;
1071
+ // 左对齐
1072
+ left = triggerRect.left;
1073
+ translateX = "0";
891
1074
  }
892
1075
  else if (position === "center") {
893
- left = triggerRect.left + scrollX + triggerWidth / 2;
1076
+ // 居中对齐
1077
+ left = triggerRect.left + triggerWidth / 2;
894
1078
  translateX = "-50%";
895
1079
  }
896
1080
  else {
897
- left = triggerRect.left + scrollX + triggerWidth;
1081
+ // 右对齐(end)
1082
+ left = triggerRect.right;
898
1083
  translateX = "-100%";
899
1084
  }
900
1085
  // 边界约束:确保弹窗不超出视口
901
- if (top + popupSize.height > scrollY + viewportHeight) {
902
- top = scrollY + viewportHeight - popupSize.height - 8; // 距离底部至少8px
1086
+ if (top + popupSize.height > viewportHeight) {
1087
+ top = viewportHeight - popupSize.height - 8; // 距离底部至少8px
903
1088
  }
904
- if (left < scrollX) {
905
- left = scrollX + 8;
906
- translateX = "0";
1089
+ // 水平边界约束:尽量保持原始对齐方式
1090
+ if (position === "start") {
1091
+ // 左对齐:如果超出右边界,调整到右边界;如果超出左边界,调整到左边界
1092
+ if (left + popupSize.width > viewportWidth) {
1093
+ left = viewportWidth - popupSize.width - 8;
1094
+ }
1095
+ if (left < 8) {
1096
+ left = 8;
1097
+ }
907
1098
  }
908
- else if (left + popupSize.width > scrollX + viewportWidth) {
909
- left = scrollX + viewportWidth - popupSize.width - 8;
910
- translateX = "0";
1099
+ else if (position === "center") {
1100
+ // 居中对齐:计算实际左边界
1101
+ /** @type {?} */
1102
+ const actualLeft = left - popupSize.width / 2;
1103
+ if (actualLeft < 8) {
1104
+ // 左边界不足,尽量保持居中,但调整到不超出左边界
1105
+ left = 8 + popupSize.width / 2;
1106
+ translateX = "-50%";
1107
+ }
1108
+ else if (actualLeft + popupSize.width > viewportWidth - 8) {
1109
+ // 右边界不足,尽量保持居中,但调整到不超出右边界
1110
+ left = viewportWidth - 8 - popupSize.width / 2;
1111
+ translateX = "-50%";
1112
+ }
1113
+ }
1114
+ else {
1115
+ // 右对齐(end):弹窗右边缘与触发元素右边缘对齐
1116
+ // left 是弹窗的右边缘位置(因为 translateX = "-100%")
1117
+ // 弹窗的左边缘在 left - popupSize.width
1118
+ /** @type {?} */
1119
+ const popupLeftEdge = left - popupSize.width;
1120
+ // 优先保持与触发元素右对齐,只在必要时调整
1121
+ // 如果弹窗右边缘超出右边界,调整位置但保持右对齐
1122
+ if (left > viewportWidth - 8) {
1123
+ left = viewportWidth - 8;
1124
+ translateX = "-100%";
1125
+ }
1126
+ // 如果弹窗左边缘超出左边界,且弹窗可以完全显示在视口内,才调整位置
1127
+ // 这样可以确保在可能的情况下,弹窗始终与触发元素右对齐
1128
+ if (popupLeftEdge < 8 && popupSize.width < viewportWidth - 16) {
1129
+ // 只有当弹窗可以完全显示在视口内时,才调整位置
1130
+ // 否则保持与触发元素右对齐,即使部分超出左边界
1131
+ left = 8 + popupSize.width;
1132
+ translateX = "-100%";
1133
+ }
911
1134
  }
912
1135
  break;
913
1136
  case "left":
914
- left = triggerRect.left + scrollX - this.offset;
1137
+ // 弹窗在触发元素左侧
1138
+ left = triggerRect.left - this.offset;
915
1139
  translateX = "-100%";
916
1140
  if (position === "start") {
917
- top = triggerRect.top + scrollY;
1141
+ // 上对齐
1142
+ top = triggerRect.top;
1143
+ translateY = "0";
918
1144
  }
919
1145
  else if (position === "center") {
920
- top = triggerRect.top + scrollY + triggerHeight / 2;
1146
+ // 居中对齐
1147
+ top = triggerRect.top + triggerHeight / 2;
921
1148
  translateY = "-50%";
922
1149
  }
923
1150
  else {
924
- top = triggerRect.top + scrollY + triggerHeight;
1151
+ // 下对齐(end)
1152
+ top = triggerRect.bottom;
925
1153
  translateY = "-100%";
926
1154
  }
927
1155
  // 边界约束:确保弹窗不超出视口
928
- if (left - popupSize.width < scrollX) {
929
- left = scrollX + 8; // 距离左侧至少8px
1156
+ /** @type {?} */
1157
+ const popupLeftSide = left - popupSize.width;
1158
+ if (popupLeftSide < 0) {
1159
+ left = 8; // 距离左侧至少8px
1160
+ translateX = "0"; // 取消向左偏移
930
1161
  }
931
- if (top < scrollY) {
932
- top = scrollY + 8;
933
- translateY = "0";
1162
+ // 垂直边界约束:尽量保持原始对齐方式
1163
+ if (position === "start") {
1164
+ // 上对齐:如果超出下边界,调整到下边界;如果超出上边界,调整到上边界
1165
+ if (top + popupSize.height > viewportHeight) {
1166
+ top = viewportHeight - popupSize.height - 8;
1167
+ }
1168
+ if (top < 8) {
1169
+ top = 8;
1170
+ }
934
1171
  }
935
- else if (top + popupSize.height > scrollY + viewportHeight) {
936
- top = scrollY + viewportHeight - popupSize.height - 8;
937
- translateY = "0";
1172
+ else if (position === "center") {
1173
+ // 居中对齐:计算实际上边界
1174
+ /** @type {?} */
1175
+ const actualTop = top - popupSize.height / 2;
1176
+ if (actualTop < 8) {
1177
+ // 上边界不足,尽量保持居中,但调整到不超出上边界
1178
+ top = 8 + popupSize.height / 2;
1179
+ translateY = "-50%";
1180
+ }
1181
+ else if (actualTop + popupSize.height > viewportHeight - 8) {
1182
+ // 下边界不足,尽量保持居中,但调整到不超出下边界
1183
+ top = viewportHeight - 8 - popupSize.height / 2;
1184
+ translateY = "-50%";
1185
+ }
1186
+ }
1187
+ else {
1188
+ // 下对齐(end):如果超出上边界,调整到上边界;如果超出下边界,调整到下边界
1189
+ /** @type {?} */
1190
+ const actualTop = top - popupSize.height;
1191
+ if (actualTop < 8) {
1192
+ top = 8 + popupSize.height;
1193
+ translateY = "-100%";
1194
+ }
1195
+ if (top > viewportHeight - 8) {
1196
+ top = viewportHeight - 8;
1197
+ translateY = "-100%";
1198
+ }
938
1199
  }
939
1200
  break;
940
1201
  case "right":
941
- left = triggerRect.right + scrollX + this.offset;
1202
+ // 弹窗在触发元素右侧
1203
+ left = triggerRect.right + this.offset;
1204
+ translateX = "0";
942
1205
  if (position === "start") {
943
- top = triggerRect.top + scrollY;
1206
+ // 上对齐
1207
+ top = triggerRect.top;
1208
+ translateY = "0";
944
1209
  }
945
1210
  else if (position === "center") {
946
- top = triggerRect.top + scrollY + triggerHeight / 2;
1211
+ // 居中对齐
1212
+ top = triggerRect.top + triggerHeight / 2;
947
1213
  translateY = "-50%";
948
1214
  }
949
1215
  else {
950
- top = triggerRect.top + scrollY + triggerHeight;
1216
+ // 下对齐(end)
1217
+ top = triggerRect.bottom;
951
1218
  translateY = "-100%";
952
1219
  }
953
1220
  // 边界约束:确保弹窗不超出视口
954
- if (left + popupSize.width > scrollX + viewportWidth) {
955
- left = scrollX + viewportWidth - popupSize.width - 8; // 距离右侧至少8px
1221
+ if (left + popupSize.width > viewportWidth) {
1222
+ left = viewportWidth - popupSize.width - 8; // 距离右侧至少8px
956
1223
  }
957
- if (top < scrollY) {
958
- top = scrollY + 8;
959
- translateY = "0";
1224
+ // 垂直边界约束:尽量保持原始对齐方式
1225
+ if (position === "start") {
1226
+ // 上对齐:如果超出下边界,调整到下边界;如果超出上边界,调整到上边界
1227
+ if (top + popupSize.height > viewportHeight) {
1228
+ top = viewportHeight - popupSize.height - 8;
1229
+ }
1230
+ if (top < 8) {
1231
+ top = 8;
1232
+ }
960
1233
  }
961
- else if (top + popupSize.height > scrollY + viewportHeight) {
962
- top = scrollY + viewportHeight - popupSize.height - 8;
963
- translateY = "0";
1234
+ else if (position === "center") {
1235
+ // 居中对齐:计算实际上边界
1236
+ /** @type {?} */
1237
+ const actualTop = top - popupSize.height / 2;
1238
+ if (actualTop < 8) {
1239
+ // 上边界不足,尽量保持居中,但调整到不超出上边界
1240
+ top = 8 + popupSize.height / 2;
1241
+ translateY = "-50%";
1242
+ }
1243
+ else if (actualTop + popupSize.height > viewportHeight - 8) {
1244
+ // 下边界不足,尽量保持居中,但调整到不超出下边界
1245
+ top = viewportHeight - 8 - popupSize.height / 2;
1246
+ translateY = "-50%";
1247
+ }
1248
+ }
1249
+ else {
1250
+ // 下对齐(end):如果超出上边界,调整到上边界;如果超出下边界,调整到下边界
1251
+ /** @type {?} */
1252
+ const actualTop = top - popupSize.height;
1253
+ if (actualTop < 8) {
1254
+ top = 8 + popupSize.height;
1255
+ translateY = "-100%";
1256
+ }
1257
+ if (top > viewportHeight - 8) {
1258
+ top = viewportHeight - 8;
1259
+ translateY = "-100%";
1260
+ }
964
1261
  }
965
1262
  break;
966
1263
  }
@@ -1015,7 +1312,7 @@ SmartPopupComponent.decorators = [
1015
1312
  { type: Component, args: [{
1016
1313
  selector: "rs-smart-popup",
1017
1314
  template: "<!-- \u89E6\u53D1\u5143\u7D20\u63D2\u69FD -->\r\n<ng-container #trigger>\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n</ng-container>\r\n\r\n<!-- \u5F39\u7A97\u5185\u5BB9 -->\r\n<div\r\n #popup\r\n class=\"rs-smart-popup-content\"\r\n [attr.data-opened]=\"opened\"\r\n [attr.data-positioning]=\"positioning\"\r\n (wheel)=\"onPopupWheel($event)\"\r\n (scroll)=\"onPopupScroll($event)\"\r\n>\r\n <div *ngIf=\"loading\" class=\"rs-smart-popup-loading\">\r\n <div class=\"loading-spinner\"></div>\r\n </div>\r\n <div *ngIf=\"!loading\" class=\"rs-smart-popup-body\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n\r\n",
1018
- styles: [".rs-smart-popup-trigger{display:inline-block;cursor:pointer}::ng-deep #rs-smart-popup-fixed-container{width:0;height:0;z-index:100000;pointer-events:none}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content{pointer-events:auto;position:fixed;z-index:100001;padding:8px;border-radius:8px;background:#fff;box-shadow:0 0 8px 0 rgba(0,0,0,.25);min-width:200px;max-width:400px;max-height:500px;overflow:auto}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=no]{display:none}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes]{display:block}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes][data-positioning=yes]{display:none!important}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes][data-positioning=no]{display:block;visibility:visible;opacity:1;pointer-events:auto;-webkit-animation:.2s ease-out popup-fade-in;animation:.2s ease-out popup-fade-in}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;min-height:100px}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading .loading-spinner{width:24px;height:24px;border:3px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;-webkit-animation:1s linear infinite spin;animation:1s linear infinite spin;margin-bottom:12px}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading .loading-text{color:#666;font-size:14px}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-body{width:100%}@-webkit-keyframes popup-fade-in{from{opacity:0;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(.95)}to{opacity:1;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(1)}}@keyframes popup-fade-in{from{opacity:0;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(.95)}to{opacity:1;transform:translate(var(--translate-x,0),var(--translate-y,0)) scale(1)}}"]
1315
+ styles: [".rs-smart-popup-trigger{display:inline-block;cursor:pointer}::ng-deep #rs-smart-popup-fixed-container{width:0;height:0;z-index:100000;pointer-events:none}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content{pointer-events:auto;position:fixed;z-index:100001;padding:8px;border-radius:8px;background:#fff;box-shadow:0 0 8px 0 rgba(0,0,0,.25);min-width:200px;max-width:400px;max-height:500px;overflow:auto}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=no]{display:none}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes]{display:block}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes][data-positioning=yes]{display:none!important}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content[data-opened=yes][data-positioning=no]{display:block;visibility:visible;opacity:1;pointer-events:auto}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;min-height:100px}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading .loading-spinner{width:24px;height:24px;border:3px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;-webkit-animation:1s linear infinite spin;animation:1s linear infinite spin;margin-bottom:12px}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-loading .loading-text{color:#666;font-size:14px}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}::ng-deep #rs-smart-popup-fixed-container .rs-smart-popup-content .rs-smart-popup-body{width:100%}"]
1019
1316
  }] }
1020
1317
  ];
1021
1318
  /** @nocollapse */
@@ -1086,4 +1383,4 @@ if (false) {
1086
1383
  */
1087
1384
  SmartPopupComponent.prototype.ref;
1088
1385
  }
1089
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zbWFydC1wb3B1cC9pbmRleC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQXFCdkIsTUFBTSxPQUFPLG1CQUFtQjs7OztJQThEOUIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEzRHRCLGVBQVUsR0FBa0IsWUFBWSxDQUFDO1FBQzVDLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDaEIsZ0JBQVcsR0FBaUIsS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUF1QixJQUFJLENBQUM7UUFDcEQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUM1QixVQUFLLEdBQVksS0FBSyxDQUFDO1FBQ3RCLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBQzVCLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBMEN6QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN4QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFPOUQsMEJBQXFCLEdBQXVCLElBQUksQ0FBQztRQWlKakQsdUJBQWtCLEdBQUcsZ0NBQWdDLENBQUM7UUFZdEQsV0FBTSxHQUFpQixJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBaUIsSUFBSSxDQUFDO1FBQ2pDLG9CQUFlLEdBQXdDLFFBQVEsQ0FBQztRQUNoRSxtQkFBYyxHQUErQixPQUFPLENBQUM7UUErTXJELG1CQUFjOzs7O1FBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7O2tCQUMvQixNQUFNLEdBQUcsbUJBQUEsS0FBSyxDQUFDLE1BQU0sRUFBVzs7a0JBQ2hDLGdC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QXFEOztJQStNckQsNkNBWUU7O0lBRUYsNkNBZUU7Ozs7O0lBMVlVLGtDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5leHBvcnQgdHlwZSBQbGFjZW1lbnRUeXBlID1cclxuICB8IFwiVG9wTGVmdFwiXHJcbiAgfCBcIlRvcENlbnRlclwiXHJcbiAgfCBcIlRvcFJpZ2h0XCJcclxuICB8IFwiQm90dG9tTGVmdFwiXHJcbiAgfCBcIkJvdHRvbUNlbnRlclwiXHJcbiAgfCBcIkJvdHRvbVJpZ2h0XCJcclxuICB8IFwiTGVmdFRvcFwiXHJcbiAgfCBcIkxlZnRDZW50ZXJcIlxyXG4gIHwgXCJMZWZ0Qm90dG9tXCJcclxuICB8IFwiUmlnaHRUb3BcIlxyXG4gIHwgXCJSaWdodENlbnRlclwiXHJcbiAgfCBcIlJpZ2h0Qm90dG9tXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJycy1zbWFydC1wb3B1cFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vaW5kZXguY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vaW5kZXguY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbWFydFBvcHVwQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xyXG57XHJcbiAgQElucHV0KFwicGxhY2VtZW50XCIpIF9wbGFjZW1lbnQ6IFBsYWNlbWVudFR5cGUgPSBcIkJvdHRvbUxlZnRcIjtcclxuICBASW5wdXQoXCJvZmZzZXRcIikgX29mZnNldDogbnVtYmVyID0gODtcclxuICBASW5wdXQoXCJhdXRvQWRqdXN0XCIpIF9hdXRvQWRqdXN0OiBcInllc1wiIHwgXCJub1wiID0gXCJ5ZXNcIjtcclxuICBASW5wdXQoXCJ0cmlnZ2VyRWxlbWVudFwiKSB0cmlnZ2VyRWxlbWVudFJlZjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoXCJsb2FkaW5nXCIpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoXCJvcGVuXCIpIF9vcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KFwid2lkdGhcIikgX3dpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoXCJoZWlnaHRcIikgX2hlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOino+aekHBsYWNlbWVudOagvOW8j1xyXG4gIGdldCBwbGFjZW1lbnRJbmZvKCk6IHtcclxuICAgIHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIjtcclxuICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIjtcclxuICB9IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudE1hcDoge1xyXG4gICAgICBba2V5OiBzdHJpbmddOiB7XHJcbiAgICAgICAgcGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiO1xyXG4gICAgICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIjtcclxuICAgICAgfTtcclxuICAgIH0gPSB7XHJcbiAgICAgIFRvcExlZnQ6IHsgcGxhY2VtZW50OiBcInRvcFwiLCBwb3NpdGlvbjogXCJzdGFydFwiIH0sXHJcbiAgICAgIFRvcENlbnRlcjogeyBwbGFjZW1lbnQ6IFwidG9wXCIsIHBvc2l0aW9uOiBcImNlbnRlclwiIH0sXHJcbiAgICAgIFRvcFJpZ2h0OiB7IHBsYWNlbWVudDogXCJ0b3BcIiwgcG9zaXRpb246IFwiZW5kXCIgfSxcclxuICAgICAgQm90dG9tTGVmdDogeyBwbGFjZW1lbnQ6IFwiYm90dG9tXCIsIHBvc2l0aW9uOiBcInN0YXJ0XCIgfSxcclxuICAgICAgQm90dG9tQ2VudGVyOiB7IHBsYWNlbWVudDogXCJib3R0b21cIiwgcG9zaXRpb246IFwiY2VudGVyXCIgfSxcclxuICAgICAgQm90dG9tUmlnaHQ6IHsgcGxhY2VtZW50OiBcImJvdHRvbVwiLCBwb3NpdGlvbjogXCJlbmRcIiB9LFxyXG4gICAgICBMZWZ0VG9wOiB7IHBsYWNlbWVudDogXCJsZWZ0XCIsIHBvc2l0aW9uOiBcInN0YXJ0XCIgfSxcclxuICAgICAgTGVmdENlbnRlcjogeyBwbGFjZW1lbnQ6IFwibGVmdFwiLCBwb3NpdGlvbjogXCJjZW50ZXJcIiB9LFxyXG4gICAgICBMZWZ0Qm90dG9tOiB7IHBsYWNlbWVudDogXCJsZWZ0XCIsIHBvc2l0aW9uOiBcImVuZFwiIH0sXHJcbiAgICAgIFJpZ2h0VG9wOiB7IHBsYWNlbWVudDogXCJyaWdodFwiLCBwb3NpdGlvbjogXCJzdGFydFwiIH0sXHJcbiAgICAgIFJpZ2h0Q2VudGVyOiB7IHBsYWNlbWVudDogXCJyaWdodFwiLCBwb3NpdGlvbjogXCJjZW50ZXJcIiB9LFxyXG4gICAgICBSaWdodEJvdHRvbTogeyBwbGFjZW1lbnQ6IFwicmlnaHRcIiwgcG9zaXRpb246IFwiZW5kXCIgfSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBwbGFjZW1lbnRNYXBbdGhpcy5fcGxhY2VtZW50XSB8fCB7XHJcbiAgICAgICAgcGxhY2VtZW50OiBcImJvdHRvbVwiLFxyXG4gICAgICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgb2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX29mZnNldCB8fCA4O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1dG9BZGp1c3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXV0b0FkanVzdCA9PT0gXCJ5ZXNcIjtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoXCJvcGVuQ2hhbmdlXCIpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQE91dHB1dChcImNvbnRlbnRMb2FkXCIpIGNvbnRlbnRMb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFwidHJpZ2dlclwiLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnRlcm5hbFRyaWdnZXJFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKFwicG9wdXBcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcG9wdXBFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgY3VycmVudFRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuZml4ZWRDb250YWluZXJFbCA9IHRoaXMuZ2V0Rml4ZWRDb250YWluZXIoKTtcclxuICAgIHRoaXMuZml4ZWRDb250YWluZXJFbC5hcHBlbmQodGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcblxyXG4gICAgLy8g5aaC5p6c5o+Q5L6b5LqG5Zu65a6a5bC65a+477yM56uL5Y2z5bqU55SoXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3dpZHRoICE9PSBudWxsICYmXHJcbiAgICAgIHRoaXMuX2hlaWdodCAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudCAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICApIHtcclxuICAgICAgY29uc3QgcG9wdXBFbCA9IHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUud2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgcG9wdXBFbC5zdHlsZS5oZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUubWluV2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgcG9wdXBFbC5zdHlsZS5tYXhXaWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICBwb3B1cEVsLnN0eWxlLm1pbkhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgcG9wdXBFbC5zdHlsZS5tYXhIZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5aSW6YOo5Lyg5YWlIG9wZW4g5bGe5oCn5Li6IHRydWXvvIzoh6rliqjmiZPlvIBcclxuICAgIGlmICh0aGlzLl9vcGVuKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vcGVuKCksIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgLy8g5aSE55CG5Zu65a6a5bC65a+45Y+Y5YyWXHJcbiAgICBpZiAoXHJcbiAgICAgIChjaGFuZ2VzLl93aWR0aCB8fCBjaGFuZ2VzLl9oZWlnaHQpICYmXHJcbiAgICAgIHRoaXMucG9wdXBFbGVtZW50ICYmXHJcbiAgICAgIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICBjb25zdCBwb3B1cEVsID0gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgaWYgKHRoaXMuX3dpZHRoICE9PSBudWxsKSB7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS53aWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUubWluV2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1heFdpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX2hlaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUubWluSGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUubWF4SGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5YWI5aSE55CG6Kem5Y+R5YWD57Sg5Y+Y5YyW77yI56Gu5L+d5Zyo5omT5byA5YmN5pu05paw6Kem5Y+R5YWD57Sg77yJXHJcbiAgICBpZiAoY2hhbmdlcy50cmlnZ2VyRWxlbWVudFJlZikge1xyXG4gICAgICBjb25zdCBwcmV2aW91c1RyaWdnZXIgPSB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudDtcclxuICAgICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG5cclxuICAgICAgLy8g5aaC5p6c5by556qX5bey57uP5omT5byA77yM5LiU6Kem5Y+R5YWD57Sg5Y+R55Sf5LqG5Y+Y5YyW77yM56uL5Y2z5pu05paw5L2N572uXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLm9wZW5lZCA9PT0gXCJ5ZXNcIiAmJlxyXG4gICAgICAgIHByZXZpb3VzVHJpZ2dlciAhPT0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQgJiZcclxuICAgICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudFxyXG4gICAgICApIHtcclxuICAgICAgICAvLyDkvb/nlKjmlrDnmoTmiZPlvIDmlrnlvI/mm7TmlrDkvY3nva5cclxuICAgICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJ5ZXNcIjtcclxuICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3B1cFBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcIm5vXCI7XHJcbiAgICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlpITnkIYgb3BlbiDlj5jljJbvvIjnoa7kv53lnKjop6blj5HlhYPntKDmm7TmlrDlkI7lpITnkIbvvIlcclxuICAgIGlmIChjaGFuZ2VzLl9vcGVuKSB7XHJcbiAgICAgIGlmICh0aGlzLl9vcGVuICYmIHRoaXMub3BlbmVkID09PSBcIm5vXCIpIHtcclxuICAgICAgICAvLyDnoa7kv53op6blj5HlhYPntKDlt7Lmm7TmlrBcclxuICAgICAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICAgICAgLy8g5L2/55SoIHNldFRpbWVvdXQg56Gu5L+d5omA5pyJ5Y+Y5pu06YO95bey5aSE55CGXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyDlho3mrKHnoa7kv53op6blj5HlhYPntKDlt7Lmm7TmlrBcclxuICAgICAgICAgIHRoaXMudXBkYXRlVHJpZ2dlckVsZW1lbnQoKTtcclxuICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9vcGVuICYmIHRoaXMub3BlbmVkID09PSBcInllc1wiKSB7XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5b2T5Yqg6L295a6M5oiQ5pe277yM5pu05paw5L2N572u77yI5aaC5p6c5o+Q5L6b5LqG5Zu65a6a5bC65a+477yM5LiN6ZyA6KaB5pu05paw5L2N572u77yJXHJcbiAgICBpZiAoXHJcbiAgICAgIGNoYW5nZXMubG9hZGluZyAmJlxyXG4gICAgICAhY2hhbmdlcy5sb2FkaW5nLmN1cnJlbnRWYWx1ZSAmJlxyXG4gICAgICBjaGFuZ2VzLmxvYWRpbmcucHJldmlvdXNWYWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wZW5lZCA9PT0gXCJ5ZXNcIikge1xyXG4gICAgICAgIC8vIOWmguaenOaPkOS+m+S6huWbuuWumuWwuuWvuO+8jOS9jee9ruW3sue7j+iuoeeul+WlveS6hu+8jOS4jemcgOimgeabtOaWsFxyXG4gICAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gbnVsbCAmJiB0aGlzLl9oZWlnaHQgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuY29udGVudExvYWQuZW1pdCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlpoLmnpzmraPlnKjlrprkvY3vvIzkuI3pnIDopoHmm7TmlrDkvY3nva5cclxuICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uaW5nID09PSBcIm5vXCIpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvcHVwUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkLmVtaXQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyDlpoLmnpzmraPlnKjlrprkvY3vvIznrYnlvoXlrprkvY3lrozmiJDlkI7lho3op6blj5Hkuovku7ZcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tQb3NpdGlvbmluZyA9ICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbmluZyA9PT0gXCJub1wiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkLmVtaXQoKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVja1Bvc2l0aW9uaW5nLCAxMCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjaGVja1Bvc2l0aW9uaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25DbGlja091dHNpZGUpO1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vbldpbmRvd1Njcm9sbCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUcmlnZ2VyRWxlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLnRyaWdnZXJFbGVtZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50ID0gdGhpcy50cmlnZ2VyRWxlbWVudFJlZjtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuaW50ZXJuYWxUcmlnZ2VyRWxlbWVudCAmJlxyXG4gICAgICB0aGlzLmludGVybmFsVHJpZ2dlckVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50ID0gdGhpcy5pbnRlcm5hbFRyaWdnZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBGSVhFRF9DT05UQUlORVJfSUQgPSBcInJzLXNtYXJ0LXBvcHVwLWZpeGVkLWNvbnRhaW5lclwiO1xyXG4gIGZpeGVkQ29udGFpbmVyRWw6IEhUTUxFbGVtZW50O1xyXG4gIGdldEZpeGVkQ29udGFpbmVyKCkge1xyXG4gICAgbGV0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZJWEVEX0NPTlRBSU5FUl9JRCk7XHJcbiAgICBpZiAoIWNvbnRhaW5lckVsZW1lbnQpIHtcclxuICAgICAgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgIGNvbnRhaW5lckVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5GSVhFRF9DT05UQUlORVJfSUQpO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChjb250YWluZXJFbGVtZW50KTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250YWluZXJFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgb3BlbmVkOiBcInllc1wiIHwgXCJub1wiID0gXCJub1wiO1xyXG4gIHBvc2l0aW9uaW5nOiBcInllc1wiIHwgXCJub1wiID0gXCJub1wiO1xyXG4gIGFjdHVhbFBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIiA9IFwiYm90dG9tXCI7XHJcbiAgYWN0dWFsUG9zaXRpb246IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiO1xyXG5cclxuICBvcGVuKHRyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQpIHtcclxuICAgIC8vIOWmguaenOS8oOWFpeS6huinpuWPkeWFg+e0oO+8jOS9v+eUqOWug1xyXG4gICAgaWYgKHRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50ID0gdHJpZ2dlckVsZW1lbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJTbWFydFBvcHVwQ29tcG9uZW50OiBObyB0cmlnZ2VyIGVsZW1lbnQgZm91bmRcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzlt7Lnu4/miZPlvIDvvIzlhYjlhbPpl63lho3miZPlvIDvvIjmm7TmlrDkvY3nva7vvIlcclxuICAgIGlmICh0aGlzLm9wZW5lZCA9PT0gXCJ5ZXNcIikge1xyXG4gICAgICAvLyDlhYjlhbPpl63lvLnnqpdcclxuICAgICAgdGhpcy5vcGVuZWQgPSBcIm5vXCI7XHJcbiAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcIm5vXCI7XHJcbiAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAvLyDnq4vljbPlnKjmlrDkvY3nva7miZPlvIBcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAvLyDlho3mrKHnoa7kv53op6blj5HlhYPntKDlt7Lmm7TmlrBcclxuICAgICAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnoa7kv53op6blj5HlhYPntKDlt7Lmm7TmlrBcclxuICAgIHRoaXMudXBkYXRlVHJpZ2dlckVsZW1lbnQoKTtcclxuICAgIHRoaXMub3BlblBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5Qb3B1cCgpIHtcclxuICAgIC8vIOWGjeasoeehruS/neinpuWPkeWFg+e0oOW3suabtOaWsFxyXG4gICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG5cclxuICAgIGlmICghdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiU21hcnRQb3B1cENvbXBvbmVudDogTm8gdHJpZ2dlciBlbGVtZW50IGZvdW5kIHdoZW4gb3BlbmluZyBwb3B1cFwiXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmj5Dkvpvkuoblm7rlrprlsLrlr7jvvIzlj6/ku6XlnKjmiZPlvIDliY3lsLHorqHnrpflpb3kvY3nva5cclxuICAgIGlmICh0aGlzLl93aWR0aCAhPT0gbnVsbCAmJiB0aGlzLl9oZWlnaHQgIT09IG51bGwpIHtcclxuICAgICAgLy8g5YWI6K6h566X5L2N572u77yI5LiN5L6d6LWWRE9N5riy5p+T77yM55u05o6l5qC55o2udHJpZ2dlckVsZW1lbnTorqHnrpfvvIlcclxuICAgICAgY29uc3QgdHJpZ2dlclJlY3QgPSB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcbiAgICAgIGNvbnN0IHBvcHVwU2l6ZSA9IHtcclxuICAgICAgICB3aWR0aDogdGhpcy5fd2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBwb3B1cFJlY3Q6IERPTVJlY3QgPSB7XHJcbiAgICAgICAgd2lkdGg6IHBvcHVwU2l6ZS53aWR0aCxcclxuICAgICAgICBoZWlnaHQ6IHBvcHVwU2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgcmlnaHQ6IHBvcHVwU2l6ZS53aWR0aCxcclxuICAgICAgICBib3R0b206IHBvcHVwU2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgeDogMCxcclxuICAgICAgICB5OiAwLFxyXG4gICAgICAgIHRvSlNPTjogKCkgPT4gKHt9KSxcclxuICAgICAgfSBhcyBET01SZWN0O1xyXG5cclxuICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMucGxhY2VtZW50SW5mbztcclxuICAgICAgbGV0IGZpbmFsUGxhY2VtZW50ID0gdGFyZ2V0SW5mby5wbGFjZW1lbnQ7XHJcbiAgICAgIGxldCBmaW5hbFBvc2l0aW9uID0gdGFyZ2V0SW5mby5wb3NpdGlvbjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF1dG9BZGp1c3QpIHtcclxuICAgICAgICBjb25zdCBvcHRpbWFsID0gdGhpcy5jYWxjdWxhdGVPcHRpbWFsUGxhY2VtZW50KFxyXG4gICAgICAgICAgdHJpZ2dlclJlY3QsXHJcbiAgICAgICAgICBwb3B1cFJlY3QsXHJcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoLFxyXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHRcclxuICAgICAgICApO1xyXG4gICAgICAgIGZpbmFsUGxhY2VtZW50ID0gb3B0aW1hbC5wbGFjZW1lbnQ7XHJcbiAgICAgICAgZmluYWxQb3NpdGlvbiA9IG9wdGltYWwucG9zaXRpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYWN0dWFsUGxhY2VtZW50ID0gZmluYWxQbGFjZW1lbnQ7XHJcbiAgICAgIHRoaXMuYWN0dWFsUG9zaXRpb24gPSBmaW5hbFBvc2l0aW9uO1xyXG5cclxuICAgICAgLy8g6K6h566X5L2N572u5Z2Q5qCH77yI5LiN5L6d6LWWRE9N77yM55u05o6l6K6h566X77yJXHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKFxyXG4gICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgIGZpbmFsUGxhY2VtZW50LFxyXG4gICAgICAgIGZpbmFsUG9zaXRpb24sXHJcbiAgICAgICAgcG9wdXBTaXplXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyDlhYjorr7nva7miZPlvIDnirbmgIHvvIzkvYbkv53mjIHpmpDol4/vvIhwb3NpdGlvbmluZyA9IHllc++8iVxyXG4gICAgICB0aGlzLm9wZW5lZCA9IFwieWVzXCI7XHJcbiAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcInllc1wiO1xyXG4gICAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAvLyDlvLrliLbmm7TmlrDop4blm77vvIznoa7kv51ET03lt7Lmm7TmlrBcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgLy8g5aaC5p6c5YWD57Sg5bey57uP5a2Y5Zyo77yM56uL5Y2z6K6+572u5L2N572u77yI5LiN562J5b6FIHJlcXVlc3RBbmltYXRpb25GcmFtZe+8iVxyXG4gICAgICBpZiAodGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHBvcHVwRWwgPSB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyDnq4vljbPorr7nva7lsLrlr7jlkozkvY3nva5cclxuICAgICAgICBwb3B1cEVsLnN0eWxlLndpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS5oZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS5taW5XaWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUubWF4V2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1pbkhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1heEhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLnRvcCA9IHBvc2l0aW9uLnRvcDtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLmxlZnQgPSBwb3NpdGlvbi5sZWZ0O1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3Bvc2l0aW9uLnRyYW5zbGF0ZVh9LCAke3Bvc2l0aW9uLnRyYW5zbGF0ZVl9KWA7XHJcblxyXG4gICAgICAgIC8vIOW8uuWItuWQjOatpeW6lOeUqOagt+W8j1xyXG4gICAgICAgIHBvcHVwRWwub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyDkvY3nva7orr7nva7lrozmiJDlkI7vvIznq4vljbPmmL7npLrlvLnnqpdcclxuICAgICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWmguaenOWFg+e0oOi/mOS4jeWtmOWcqO+8jOetieW+hea4suafk1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBwb3B1cEVsID0gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIOeri+WNs+iuvue9ruWwuuWvuOWSjOS9jee9rlxyXG4gICAgICAgICAgICBwb3B1cEVsLnN0eWxlLndpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgICAgICBwb3B1cEVsLnN0eWxlLm1pbldpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUubWF4V2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUubWF4SGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgICAgICBwb3B1cEVsLnN0eWxlLnRvcCA9IHBvc2l0aW9uLnRvcDtcclxuICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ubGVmdDtcclxuICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7cG9zaXRpb24udHJhbnNsYXRlWH0sICR7cG9zaXRpb24udHJhbnNsYXRlWX0pYDtcclxuXHJcbiAgICAgICAgICAgIC8vIOW8uuWItuWQjOatpeW6lOeUqOagt+W8j1xyXG4gICAgICAgICAgICBwb3B1cEVsLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIC8vIOS9jee9ruiuvue9ruWujOaIkOWQju+8jOeri+WNs+aYvuekuuW8ueeql1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5rKh5pyJ5Zu65a6a5bC65a+477yM6ZyA6KaB562J5b6FRE9N5riy5p+TXHJcbiAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcInllc1wiO1xyXG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICAgIC8vIOeri+WNs+W8uuWItuabtOaWsOinhuWbvu+8jOehruS/nURPTeW3suabtOaWsFxyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAvLyDkvb/nlKggcmVxdWVzdEFuaW1hdGlvbkZyYW1lIOehruS/neWcqOa1j+iniOWZqOa4suafk+S5i+WJjeabtOaWsOS9jee9rlxyXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIC8vIOehruS/neWFg+e0oOW3sua4suafk+W5tuiOt+WPluWwuuWvuFxyXG4gICAgICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAvLyDlvLrliLbph43mlrDorqHnrpfluIPlsYDvvIznoa7kv53lhYPntKDlsLrlr7jlt7LorqHnrpdcclxuICAgICAgICAgIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgIC8vIOiuoeeul+W5tuiuvue9ruS9jee9rlxyXG4gICAgICAgICAgdGhpcy51cGRhdGVQb3B1cFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgICAgLy8g5L2N572u6K6+572u5a6M5oiQ5ZCO77yM56e76Zmk5a6a5L2N54q25oCB77yM5pi+56S65by556qXXHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25DbGlja091dHNpZGUpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vbldpbmRvd1Njcm9sbCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZCA9PT0gXCJub1wiKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wZW5lZCA9IFwibm9cIjtcclxuICAgIHRoaXMucG9zaXRpb25pbmcgPSBcIm5vXCI7XHJcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25DbGlja091dHNpZGUpO1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vbldpbmRvd1Njcm9sbCwgdHJ1ZSk7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZSgpIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZCA9PT0gXCJ5ZXNcIikge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xpY2tUcmlnZ2VyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMudG9nZ2xlKCk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrT3V0c2lkZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XHJcbiAgICBjb25zdCBpc0NsaWNrT25UcmlnZ2VyID1cclxuICAgICAgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQgJiYgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQuY29udGFpbnModGFyZ2V0KTtcclxuICAgIGNvbnN0IGlzQ2xpY2tPblBvcHVwID1cclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQgJiZcclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCk7XHJcblxyXG4gICAgaWYgKCFpc0NsaWNrT25UcmlnZ2VyICYmICFpc0NsaWNrT25Qb3B1cCkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgb25XaW5kb3dTY3JvbGwgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgLy8g5qOA5p+l5rua5Yqo5piv5ZCm5Y+R55Sf5Zyo5by556qX5YaF6YOoXHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xyXG4gICAgICBjb25zdCBpc1Njcm9sbE9uUG9wdXAgPVxyXG4gICAgICAgIHRoaXMucG9wdXBFbGVtZW50ICYmXHJcbiAgICAgICAgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxyXG4gICAgICAgIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KTtcclxuXHJcbiAgICAgIC8vIOWmguaenOa7muWKqOWPkeeUn+WcqOW8ueeql+WGhemDqO+8jOS4jeabtOaWsOS9jee9ru+8iOmBv+WFjeS4jeW/heimgeeahOiuoeeul++8iVxyXG4gICAgICAvLyDlpoLmnpzmu5rliqjlj5HnlJ/lnKjlpJbpg6jvvIzmm7TmlrDkvY3nva7vvIjlm6DkuLrop6blj5HlhYPntKDkvY3nva7lj6/og73mlLnlj5jvvIlcclxuICAgICAgaWYgKCFpc1Njcm9sbE9uUG9wdXApIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVBvcHVwUG9zaXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIOWkhOeQhuW8ueeql+WGhemDqOeahOa7mui9ruS6i+S7tlxyXG4gIG9uUG9wdXBXaGVlbChldmVudDogV2hlZWxFdmVudCkge1xyXG4gICAgLy8g6Zi75q2i5rua6L2u5LqL5Lu25YaS5rOh77yM6YG/5YWN6Kem5Y+R5aSW6YOo5rua5Yqo5aSE55CGXHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhuW8ueeql+WGhemDqOeahOa7muWKqOS6i+S7tlxyXG4gIG9uUG9wdXBTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAvLyDpmLvmraLmu5rliqjkuovku7blhpLms6HvvIzpgb/lhY3op6blj5HlpJbpg6jmu5rliqjlpITnkIZcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5bm26K6+572u5L2N572u77yI5pSv5oyB5Zu65a6a5bC65a+477yM5Y+v5Zyo5omT5byA5YmN6LCD55So77yJXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVBbmRTZXRQb3NpdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcbiAgICAvLyDojrflj5blvLnnqpflsLrlr7jvvIjkvJjlhYjkvb/nlKjlm7rlrprlsLrlr7jvvIlcclxuICAgIGNvbnN0IHBvcHVwU2l6ZSA9IHtcclxuICAgICAgd2lkdGg6XHJcbiAgICAgICAgdGhpcy5fd2lkdGggIT09IG51bGxcclxuICAgICAgICAgID8gdGhpcy5fd2lkdGhcclxuICAgICAgICAgIDogdGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgICAgPyB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgICA6IDMwMCxcclxuICAgICAgaGVpZ2h0OlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCAhPT0gbnVsbFxyXG4gICAgICAgICAgPyB0aGlzLl9oZWlnaHRcclxuICAgICAgICAgIDogdGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgICAgPyB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgOiAyMDAsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIOWIm+W7uuiZmuaLn+eahCBwb3B1cFJlY3TvvIjnlKjkuo7orqHnrpfvvIlcclxuICAgIGNvbnN0IHBvcHVwUmVjdDogRE9NUmVjdCA9IHtcclxuICAgICAgd2lkdGg6IHBvcHVwU2l6ZS53aWR0aCxcclxuICAgICAgaGVpZ2h0OiBwb3B1cFNpemUuaGVpZ2h0LFxyXG4gICAgICB0b3A6IDAsXHJcbiAgICAgIGxlZnQ6IDAsXHJcbiAgICAgIHJpZ2h0OiBwb3B1cFNpemUud2lkdGgsXHJcbiAgICAgIGJvdHRvbTogcG9wdXBTaXplLmhlaWdodCxcclxuICAgICAgeDogMCxcclxuICAgICAgeTogMCxcclxuICAgICAgdG9KU09OOiAoKSA9PiAoe30pLFxyXG4gICAgfSBhcyBET01SZWN0O1xyXG5cclxuICAgIC8vIOiOt+WPluebruagh+S9jee9ruS/oeaBr1xyXG4gICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMucGxhY2VtZW50SW5mbztcclxuICAgIGxldCBmaW5hbFBsYWNlbWVudCA9IHRhcmdldEluZm8ucGxhY2VtZW50O1xyXG4gICAgbGV0IGZpbmFsUG9zaXRpb24gPSB0YXJnZXRJbmZvLnBvc2l0aW9uO1xyXG5cclxuICAgIGlmICh0aGlzLmF1dG9BZGp1c3QpIHtcclxuICAgICAgY29uc3Qgb3B0aW1hbCA9IHRoaXMuY2FsY3VsYXRlT3B0aW1hbFBsYWNlbWVudChcclxuICAgICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgICBwb3B1cFJlY3QsXHJcbiAgICAgICAgdmlld3BvcnRXaWR0aCxcclxuICAgICAgICB2aWV3cG9ydEhlaWdodFxyXG4gICAgICApO1xyXG4gICAgICBmaW5hbFBsYWNlbWVudCA9IG9wdGltYWwucGxhY2VtZW50O1xyXG4gICAgICBmaW5hbFBvc2l0aW9uID0gb3B0aW1hbC5wb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdHVhbFBsYWNlbWVudCA9IGZpbmFsUGxhY2VtZW50O1xyXG4gICAgdGhpcy5hY3R1YWxQb3NpdGlvbiA9IGZpbmFsUG9zaXRpb247XHJcblxyXG4gICAgLy8g56uL5Y2z6K6+572u5L2N572u77yI5Y2z5L2/5YWD57Sg6L+Y5rKh5a6M5YWo5riy5p+T77yM5Lmf6KaB5YWI6K6+572u5L2N572u77yJXHJcbiAgICBpZiAodGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNldFBvcHVwUG9zaXRpb24oXHJcbiAgICAgICAgdHJpZ2dlclJlY3QsXHJcbiAgICAgICAgcG9wdXBSZWN0LFxyXG4gICAgICAgIGZpbmFsUGxhY2VtZW50LFxyXG4gICAgICAgIGZpbmFsUG9zaXRpb24sXHJcbiAgICAgICAgcG9wdXBTaXplXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIOW8uuWItuW6lOeUqOagt+W8j++8jOehruS/neS9jee9rueri+WNs+eUn+aViFxyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlpoLmnpzlhYPntKDov5jkuI3lrZjlnKjvvIzlu7bov5/orr7nva7kvY3nva5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMuc2V0UG9wdXBQb3NpdGlvbihcclxuICAgICAgICAgICAgdHJpZ2dlclJlY3QsXHJcbiAgICAgICAgICAgIHBvcHVwUmVjdCxcclxuICAgICAgICAgICAgZmluYWxQbGFjZW1lbnQsXHJcbiAgICAgICAgICAgIGZpbmFsUG9zaXRpb24sXHJcbiAgICAgICAgICAgIHBvcHVwU2l6ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUG9wdXBQb3NpdGlvbigpIHtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50IHx8XHJcbiAgICAgICF0aGlzLnBvcHVwRWxlbWVudCB8fFxyXG4gICAgICAhdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmj5Dkvpvkuoblm7rlrprlsLrlr7jvvIzkvb/nlKjlm7rlrprlsLrlr7jorqHnrpdcclxuICAgIGlmICh0aGlzLl93aWR0aCAhPT0gbnVsbCAmJiB0aGlzLl9oZWlnaHQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVBbmRTZXRQb3NpdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJpZ2dlclJlY3QgPSB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHBvcHVwUmVjdCA9IHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcbiAgICAvLyDojrflj5bnm67moIfkvY3nva7kv6Hmga9cclxuICAgIGNvbnN0IHRhcmdldEluZm8gPSB0aGlzLnBsYWNlbWVudEluZm87XHJcbiAgICBsZXQgZmluYWxQbGFjZW1lbnQgPSB0YXJnZXRJbmZvLnBsYWNlbWVudDtcclxuICAgIGxldCBmaW5hbFBvc2l0aW9uID0gdGFyZ2V0SW5mby5wb3NpdGlvbjtcclxuXHJcbiAgICBpZiAodGhpcy5hdXRvQWRqdXN0KSB7XHJcbiAgICAgIGNvbnN0IG9wdGltYWwgPSB0aGlzLmNhbGN1bGF0ZU9wdGltYWxQbGFjZW1lbnQoXHJcbiAgICAgICAgdHJpZ2dlclJlY3QsXHJcbiAgICAgICAgcG9wdXBSZWN0LFxyXG4gICAgICAgIHZpZXdwb3J0V2lkdGgsXHJcbiAgICAgICAgdmlld3BvcnRIZWlnaHRcclxuICAgICAgKTtcclxuICAgICAgZmluYWxQbGFjZW1lbnQgPSBvcHRpbWFsLnBsYWNlbWVudDtcclxuICAgICAgZmluYWxQb3NpdGlvbiA9IG9wdGltYWwucG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3R1YWxQbGFjZW1lbnQgPSBmaW5hbFBsYWNlbWVudDtcclxuICAgIHRoaXMuYWN0dWFsUG9zaXRpb24gPSBmaW5hbFBvc2l0aW9uO1xyXG4gICAgdGhpcy5zZXRQb3B1cFBvc2l0aW9uKFxyXG4gICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgcG9wdXBSZWN0LFxyXG4gICAgICBmaW5hbFBsYWNlbWVudCxcclxuICAgICAgZmluYWxQb3NpdGlvblxyXG4gICAgKTtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlT3B0aW1hbFBsYWNlbWVudChcclxuICAgIHRyaWdnZXJSZWN0OiBET01SZWN0IHwgQ2xpZW50UmVjdCxcclxuICAgIHBvcHVwUmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QsXHJcbiAgICB2aWV3cG9ydFdpZHRoOiBudW1iZXIsXHJcbiAgICB2aWV3cG9ydEhlaWdodDogbnVtYmVyXHJcbiAgKToge1xyXG4gICAgcGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiO1xyXG4gICAgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiO1xyXG4gIH0ge1xyXG4gICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMucGxhY2VtZW50SW5mbztcclxuICAgIGNvbnN0IHByZWZlcnJlZCA9IHRhcmdldEluZm8ucGxhY2VtZW50O1xyXG4gICAgY29uc3QgcHJlZmVycmVkUG9zaXRpb24gPSB0YXJnZXRJbmZvLnBvc2l0aW9uO1xyXG5cclxuICAgIGNvbnN0IHNwYWNlID0ge1xyXG4gICAgICB0b3A6IHRyaWdnZXJSZWN0LnRvcCxcclxuICAgICAgYm90dG9tOiB2aWV3cG9ydEhlaWdodCAtIHRyaWdnZXJSZWN0LmJvdHRvbSxcclxuICAgICAgbGVmdDogdHJpZ2dlclJlY3QubGVmdCxcclxuICAgICAgcmlnaHQ6IHZpZXdwb3J0V2lkdGggLSB0cmlnZ2VyUmVjdC5yaWdodCxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcG9wdXBTaXplID0ge1xyXG4gICAgICB3aWR0aDogcG9wdXBSZWN0LndpZHRoIHx8IDMwMCwgLy8g6buY6K6k5a695bqm77yM5aaC5p6c6L+Y5rKh5pyJ5riy5p+TXHJcbiAgICAgIGhlaWdodDogcG9wdXBSZWN0LmhlaWdodCB8fCAyMDAsIC8vIOm7mOiupOmrmOW6plxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDmo4Dmn6XpppbpgInkvY3nva7mmK/lkKbmnInotrPlpJ/nqbrpl7RcclxuICAgIGNvbnN0IGhhc0Vub3VnaFNwYWNlID0gKHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIikgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgIGNhc2UgXCJ0b3BcIjpcclxuICAgICAgICAgIHJldHVybiBzcGFjZS50b3AgPj0gcG9wdXBTaXplLmhlaWdodCArIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIGNhc2UgXCJib3R0b21cIjpcclxuICAgICAgICAgIHJldHVybiBzcGFjZS5ib3R0b20gPj0gcG9wdXBTaXplLmhlaWdodCArIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2UubGVmdCA+PSBwb3B1cFNpemUud2lkdGggKyB0aGlzLm9mZnNldDtcclxuICAgICAgICBjYXNlIFwicmlnaHRcIjpcclxuICAgICAgICAgIHJldHVybiBzcGFjZS5yaWdodCA+PSBwb3B1cFNpemUud2lkdGggKyB0aGlzLm9mZnNldDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDmo4Dmn6XmjIflrprkvY3nva7mmK/lkKbmnInotrPlpJ/nqbrpl7RcclxuICAgIGNvbnN0IGNoZWNrUG9zaXRpb25TcGFjZSA9IChcclxuICAgICAgcGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiLFxyXG4gICAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCJcclxuICAgICk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICBpZiAocGxhY2VtZW50ID09PSBcInRvcFwiIHx8IHBsYWNlbWVudCA9PT0gXCJib3R0b21cIikge1xyXG4gICAgICAgIC8vIOWvueS6juS4iuS4i+S9jee9ru+8jOajgOafpeawtOW5s+Wvuem9kOepuumXtFxyXG4gICAgICAgIGNvbnN0IHBvcHVwV2lkdGggPSBwb3B1cFNpemUud2lkdGg7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VMZWZ0ID0gdHJpZ2dlclJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBzcGFjZVJpZ2h0ID0gdmlld3BvcnRXaWR0aCAtIHRyaWdnZXJSZWN0LnJpZ2h0O1xyXG5cclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIHJldHVybiBzcGFjZUxlZnQgPj0gcG9wdXBXaWR0aCAvIDIgJiYgc3BhY2VSaWdodCA+PSBwb3B1cFdpZHRoIC8gMjtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuICAgICAgICAgIHJldHVybiBzcGFjZUxlZnQgPj0gcG9wdXBXaWR0aDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gZW5kXHJcbiAgICAgICAgICByZXR1cm4gc3BhY2VSaWdodCA+PSBwb3B1cFdpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDlr7nkuo7lt6blj7PkvY3nva7vvIzmo4Dmn6XlnoLnm7Tlr7npvZDnqbrpl7RcclxuICAgICAgICBjb25zdCBwb3B1cEhlaWdodCA9IHBvcHVwU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VUb3AgPSB0cmlnZ2VyUmVjdC50b3A7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VCb3R0b20gPSB2aWV3cG9ydEhlaWdodCAtIHRyaWdnZXJSZWN0LmJvdHRvbTtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcImNlbnRlclwiKSB7XHJcbiAgICAgICAgICByZXR1cm4gc3BhY2VUb3AgPj0gcG9wdXBIZWlnaHQgLyAyICYmIHNwYWNlQm90dG9tID49IHBvcHVwSGVpZ2h0IC8gMjtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuICAgICAgICAgIHJldHVybiBzcGFjZVRvcCA+PSBwb3B1cEhlaWdodDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gZW5kXHJcbiAgICAgICAgICByZXR1cm4gc3BhY2VCb3R0b20gPj0gcG9wdXBIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIOiuoeeul+S9jee9ruaYr+WQpuWQiOmAgu+8iOiAg+iZkeawtOW5sy/lnoLnm7Tlr7npvZDvvIlcclxuICAgIGNvbnN0IGNhbGN1bGF0ZVBvc2l0aW9uID0gKFxyXG4gICAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCJcclxuICAgICk6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0+IHtcclxuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gXCJ0b3BcIiB8fCBwbGFjZW1lbnQgPT09IFwiYm90dG9tXCIpIHtcclxuICAgICAgICAvLyDlr7nkuo7kuIrkuIvkvY3nva7vvIzmo4Dmn6XmsLTlubPlr7npvZBcclxuICAgICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXBTaXplLndpZHRoO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlTGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VSaWdodCA9IHZpZXdwb3J0V2lkdGggLSB0cmlnZ2VyUmVjdC5yaWdodDtcclxuXHJcbiAgICAgICAgLy8g5LyY5YWI5bCd6K+V5L2/55So55So5oi35oyH5a6a55qEcG9zaXRpb25cclxuICAgICAgICBpZiAoY2hlY2tQb3NpdGlvblNwYWNlKHBsYWNlbWVudCwgcHJlZmVycmVkUG9zaXRpb24pKSB7XHJcbiAgICAgICAgICByZXR1cm4gcHJlZmVycmVkUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDlpoLmnpzkuK3lv4Plr7npvZDmnInotrPlpJ/nqbrpl7TvvIzkvJjlhYjkvb/nlKjkuK3lv4NcclxuICAgICAgICBpZiAoc3BhY2VMZWZ0ID49IHBvcHVwV2lkdGggLyAyICYmIHNwYWNlUmlnaHQgPj0gcG9wdXBXaWR0aCAvIDIpIHtcclxuICAgICAgICAgIHJldHVybiBcImNlbnRlclwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlpoLmnpzlt6bkvqfnqbrpl7TkuI3otrPvvIzkvb/nlKjlj7Plr7npvZBcclxuICAgICAgICBpZiAoc3BhY2VMZWZ0IDwgcG9wdXBXaWR0aCAvIDIpIHtcclxuICAgICAgICAgIHJldHVybiBcImVuZFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlpoLmnpzlj7Pkvqfnqbrpl7TkuI3otrPvvIzkvb/nlKjlt6blr7npvZBcclxuICAgICAgICBpZiAoc3BhY2VSaWdodCA8IHBvcHVwV2lkdGggLyAyKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJzdGFydFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJlZmVycmVkUG9zaXRpb247XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8g5a+55LqO5bem5Y+z5L2N572u77yM5qOA5p+l5Z6C55u05a+56b2QXHJcbiAgICAgICAgY29uc3QgcG9wdXBIZWlnaHQgPSBwb3B1cFNpemUuaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHNwYWNlVG9wID0gdHJpZ2dlclJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlQm90dG9tID0gdmlld3BvcnRIZWlnaHQgLSB0cmlnZ2VyUmVjdC5ib3R0b207XHJcblxyXG4gICAgICAgIC8vIOS8mOWFiOWwneivleS9v+eUqOeUqOaIt+aMh+WumueahHBvc2l0aW9uXHJcbiAgICAgICAgaWYgKGNoZWNrUG9zaXRpb25TcGFjZShwbGFjZW1lbnQsIHByZWZlcnJlZFBvc2l0aW9uKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHByZWZlcnJlZFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5aaC5p6c5Lit5b+D5a+56b2Q5pyJ6Laz5aSf56m66Ze077yM5LyY5YWI5L2/55So5Lit5b+DXHJcbiAgICAgICAgaWYgKHNwYWNlVG9wID49IHBvcHVwSGVpZ2h0IC8gMiAmJiBzcGFjZUJvdHRvbSA+PSBwb3B1cEhlaWdodCAvIDIpIHtcclxuICAgICAgICAgIHJldHVybiBcImNlbnRlclwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlpoLmnpzkuIrmlrnnqbrpl7TkuI3otrPvvIzkvb/nlKjkuIvlr7npvZBcclxuICAgICAgICBpZiAoc3BhY2VUb3AgPCBwb3B1cEhlaWdodCAvIDIpIHtcclxuICAgICAgICAgIHJldHVybiBcImVuZFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDlpoLmnpzkuIvmlrnnqbrpl7TkuI3otrPvvIzkvb/nlKjkuIrlr7npvZBcclxuICAgICAgICBpZiAoc3BhY2VCb3R0b20gPCBwb3B1cEhlaWdodCAvIDIpIHtcclxuICAgICAgICAgIHJldHVybiBcInN0YXJ0XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcmVmZXJyZWRQb3NpdGlvbjtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDlpoLmnpzpppbpgInkvY3nva7mnInotrPlpJ/nqbrpl7TvvIzkvJjlhYjkvb/nlKjnlKjmiLfmjIflrprnmoRwb3NpdGlvblxyXG4gICAgaWYgKGhhc0Vub3VnaFNwYWNlKHByZWZlcnJlZCkpIHtcclxuICAgICAgLy8g5qOA5p+l55So5oi35oyH5a6a55qEcG9zaXRpb27mmK/lkKbmnInotrPlpJ/nqbrpl7RcclxuICAgICAgaWYgKGNoZWNrUG9zaXRpb25TcGFjZShwcmVmZXJyZWQsIHByZWZlcnJlZFBvc2l0aW9uKSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBwbGFjZW1lbnQ6IHByZWZlcnJlZCxcclxuICAgICAgICAgIHBvc2l0aW9uOiBwcmVmZXJyZWRQb3NpdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOaMh+WumueahHBvc2l0aW9u56m66Ze05LiN6Laz77yM6Ieq5Yqo6K6h566X5pyA5L2zcG9zaXRpb25cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBwbGFjZW1lbnQ6IHByZWZlcnJlZCxcclxuICAgICAgICBwb3NpdGlvbjogY2FsY3VsYXRlUG9zaXRpb24ocHJlZmVycmVkKSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDmoLnmja7pppbpgInkvY3nva7pgInmi6nlpIfpgInkvY3nva5cclxuICAgIGNvbnN0IGFsdGVybmF0aXZlczoge1xyXG4gICAgICBba2V5OiBzdHJpbmddOiAoXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIilbXTtcclxuICAgIH0gPSB7XHJcbiAgICAgIGJvdHRvbTogW1widG9wXCIsIFwicmlnaHRcIiwgXCJsZWZ0XCJdLFxyXG4gICAgICB0b3A6IFtcImJvdHRvbVwiLCBcInJpZ2h0XCIsIFwibGVmdFwiXSxcclxuICAgICAgcmlnaHQ6IFtcImxlZnRcIiwgXCJib3R0b21cIiwgXCJ0b3BcIl0sXHJcbiAgICAgIGxlZnQ6IFtcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwidG9wXCJdLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhbHRMaXN0ID0gYWx0ZXJuYXRpdmVzW3ByZWZlcnJlZF0gfHwgW107XHJcblxyXG4gICAgLy8g5bCd6K+V5om+5Yiw56ys5LiA5Liq5pyJ6Laz5aSf56m66Ze055qE5aSH6YCJ5L2N572uXHJcbiAgICBmb3IgKGNvbnN0IGFsdCBvZiBhbHRMaXN0KSB7XHJcbiAgICAgIGlmIChoYXNFbm91Z2hTcGFjZShhbHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHBsYWNlbWVudDogYWx0LFxyXG4gICAgICAgICAgcG9zaXRpb246IGNhbGN1bGF0ZVBvc2l0aW9uKGFsdCksXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOmDveayoeaciei2s+Wkn+epuumXtO+8jOmAieaLqeepuumXtOacgOWkp+eahOS9jee9rlxyXG4gICAgY29uc3QgbWF4U3BhY2UgPSBNYXRoLm1heChzcGFjZS50b3AsIHNwYWNlLmJvdHRvbSwgc3BhY2UubGVmdCwgc3BhY2UucmlnaHQpO1xyXG4gICAgbGV0IGJlc3RQbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCI7XHJcbiAgICBpZiAobWF4U3BhY2UgPT09IHNwYWNlLnRvcCkgYmVzdFBsYWNlbWVudCA9IFwidG9wXCI7XHJcbiAgICBlbHNlIGlmIChtYXhTcGFjZSA9PT0gc3BhY2UuYm90dG9tKSBiZXN0UGxhY2VtZW50ID0gXCJib3R0b21cIjtcclxuICAgIGVsc2UgaWYgKG1heFNwYWNlID09PSBzcGFjZS5sZWZ0KSBiZXN0UGxhY2VtZW50ID0gXCJsZWZ0XCI7XHJcbiAgICBlbHNlIGJlc3RQbGFjZW1lbnQgPSBcInJpZ2h0XCI7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGxhY2VtZW50OiBiZXN0UGxhY2VtZW50LFxyXG4gICAgICBwb3NpdGlvbjogY2FsY3VsYXRlUG9zaXRpb24oYmVzdFBsYWNlbWVudCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5L2N572u5Z2Q5qCH77yI57qv6K6h566X77yM5LiN5L6d6LWWRE9N77yM5YyF5ZCr6L6555WM57qm5p2f77yJXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKFxyXG4gICAgdHJpZ2dlclJlY3Q6IERPTVJlY3QgfCBDbGllbnRSZWN0LFxyXG4gICAgcGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiLFxyXG4gICAgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxyXG4gICAgcG9wdXBTaXplOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cclxuICApOiB7IHRvcDogc3RyaW5nOyBsZWZ0OiBzdHJpbmc7IHRyYW5zbGF0ZVg6IHN0cmluZzsgdHJhbnNsYXRlWTogc3RyaW5nIH0ge1xyXG4gICAgY29uc3QgdHJpZ2dlcldpZHRoID0gdHJpZ2dlclJlY3Qud2lkdGg7XHJcbiAgICBjb25zdCB0cmlnZ2VySGVpZ2h0ID0gdHJpZ2dlclJlY3QuaGVpZ2h0O1xyXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICBjb25zdCBzY3JvbGxYID0gd2luZG93LnNjcm9sbFg7XHJcbiAgICBjb25zdCBzY3JvbGxZID0gd2luZG93LnNjcm9sbFk7XHJcblxyXG4gICAgbGV0IHRvcCA9IDA7XHJcbiAgICBsZXQgbGVmdCA9IDA7XHJcbiAgICBsZXQgdHJhbnNsYXRlWCA9IFwiMFwiO1xyXG4gICAgbGV0IHRyYW5zbGF0ZVkgPSBcIjBcIjtcclxuXHJcbiAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICBjYXNlIFwidG9wXCI6XHJcbiAgICAgICAgdG9wID0gdHJpZ2dlclJlY3QudG9wICsgc2Nyb2xsWSAtIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIHRyYW5zbGF0ZVkgPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0ICsgc2Nyb2xsWDtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcImNlbnRlclwiKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QubGVmdCArIHNjcm9sbFggKyB0cmlnZ2VyV2lkdGggLyAyO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiLTUwJVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QubGVmdCArIHNjcm9sbFggKyB0cmlnZ2VyV2lkdGg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVYID0gXCItMTAwJVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDovrnnlYznuqbmnZ/vvJrnoa7kv53lvLnnqpfkuI3otoXlh7rop4blj6NcclxuICAgICAgICBpZiAodG9wIC0gcG9wdXBTaXplLmhlaWdodCA8IHNjcm9sbFkpIHtcclxuICAgICAgICAgIHRvcCA9IHNjcm9sbFkgKyA4OyAvLyDot53nprvpobbpg6joh7PlsJE4cHhcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlZnQgPCBzY3JvbGxYKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gc2Nyb2xsWCArIDg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVYID0gXCIwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0ICsgcG9wdXBTaXplLndpZHRoID4gc2Nyb2xsWCArIHZpZXdwb3J0V2lkdGgpIHtcclxuICAgICAgICAgIGxlZnQgPSBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCAtIHBvcHVwU2l6ZS53aWR0aCAtIDg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVYID0gXCIwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImJvdHRvbVwiOlxyXG4gICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LmJvdHRvbSArIHNjcm9sbFkgKyB0aGlzLm9mZnNldDtcclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xyXG4gICAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgKyBzY3JvbGxYO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0ICsgc2Nyb2xsWCArIHRyaWdnZXJXaWR0aCAvIDI7XHJcbiAgICAgICAgICB0cmFuc2xhdGVYID0gXCItNTAlXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0ICsgc2Nyb2xsWCArIHRyaWdnZXJXaWR0aDtcclxuICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOi+ueeVjOe6puadn++8muehruS/neW8ueeql+S4jei2heWHuuinhuWPo1xyXG4gICAgICAgIGlmICh0b3AgKyBwb3B1cFNpemUuaGVpZ2h0ID4gc2Nyb2xsWSArIHZpZXdwb3J0SGVpZ2h0KSB7XHJcbiAgICAgICAgICB0b3AgPSBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQgLSBwb3B1cFNpemUuaGVpZ2h0IC0gODsgLy8g6Led56a75bqV6YOo6Iez5bCROHB4XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsZWZ0IDwgc2Nyb2xsWCkge1xyXG4gICAgICAgICAgbGVmdCA9IHNjcm9sbFggKyA4O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHNjcm9sbFggKyB2aWV3cG9ydFdpZHRoKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gc2Nyb2xsWCArIHZpZXdwb3J0V2lkdGggLSBwb3B1cFNpemUud2lkdGggLSA4O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgKyBzY3JvbGxYIC0gdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgdHJhbnNsYXRlWCA9IFwiLTEwMCVcIjtcclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xyXG4gICAgICAgICAgdG9wID0gdHJpZ2dlclJlY3QudG9wICsgc2Nyb2xsWTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcImNlbnRlclwiKSB7XHJcbiAgICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgKyBzY3JvbGxZICsgdHJpZ2dlckhlaWdodCAvIDI7XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCItNTAlXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCArIHNjcm9sbFkgKyB0cmlnZ2VySGVpZ2h0O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTEwMCVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g6L6555WM57qm5p2f77ya56Gu5L+d5by556qX5LiN6LaF5Ye66KeG5Y+jXHJcbiAgICAgICAgaWYgKGxlZnQgLSBwb3B1cFNpemUud2lkdGggPCBzY3JvbGxYKSB7XHJcbiAgICAgICAgICBsZWZ0ID0gc2Nyb2xsWCArIDg7IC8vIOi3neemu+W3puS+p+iHs+WwkThweFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodG9wIDwgc2Nyb2xsWSkge1xyXG4gICAgICAgICAgdG9wID0gc2Nyb2xsWSArIDg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCIwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b3AgKyBwb3B1cFNpemUuaGVpZ2h0ID4gc2Nyb2xsWSArIHZpZXdwb3J0SGVpZ2h0KSB7XHJcbiAgICAgICAgICB0b3AgPSBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQgLSBwb3B1cFNpemUuaGVpZ2h0IC0gODtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwicmlnaHRcIjpcclxuICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QucmlnaHQgKyBzY3JvbGxYICsgdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuICAgICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCArIHNjcm9sbFk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJjZW50ZXJcIikge1xyXG4gICAgICAgICAgdG9wID0gdHJpZ2dlclJlY3QudG9wICsgc2Nyb2xsWSArIHRyaWdnZXJIZWlnaHQgLyAyO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTUwJVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgKyBzY3JvbGxZICsgdHJpZ2dlckhlaWdodDtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOi+ueeVjOe6puadn++8muehruS/neW8ueeql+S4jei2heWHuuinhuWPo1xyXG4gICAgICAgIGlmIChsZWZ0ICsgcG9wdXBTaXplLndpZHRoID4gc2Nyb2xsWCArIHZpZXdwb3J0V2lkdGgpIHtcclxuICAgICAgICAgIGxlZnQgPSBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCAtIHBvcHVwU2l6ZS53aWR0aCAtIDg7IC8vIOi3neemu+WPs+S+p+iHs+WwkThweFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodG9wIDwgc2Nyb2xsWSkge1xyXG4gICAgICAgICAgdG9wID0gc2Nyb2xsWSArIDg7XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCIwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0b3AgKyBwb3B1cFNpemUuaGVpZ2h0ID4gc2Nyb2xsWSArIHZpZXdwb3J0SGVpZ2h0KSB7XHJcbiAgICAgICAgICB0b3AgPSBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQgLSBwb3B1cFNpemUuaGVpZ2h0IC0gODtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9wOiB0b3AgKyBcInB4XCIsXHJcbiAgICAgIGxlZnQ6IGxlZnQgKyBcInB4XCIsXHJcbiAgICAgIHRyYW5zbGF0ZVgsXHJcbiAgICAgIHRyYW5zbGF0ZVksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc2V0UG9wdXBQb3NpdGlvbihcclxuICAgIHRyaWdnZXJSZWN0OiBET01SZWN0IHwgQ2xpZW50UmVjdCxcclxuICAgIHBvcHVwUmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QsXHJcbiAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIsXHJcbiAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXHJcbiAgICBwb3B1cFNpemU/OiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cclxuICApIHtcclxuICAgIGNvbnN0IHBvcHVwRWwgPVxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgPyB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgaWYgKCFwb3B1cEVsKSB7XHJcbiAgICAgIHJldHVybjsgLy8g5aaC5p6c5YWD57Sg6L+Y5LiN5a2Y5Zyo77yM5peg5rOV6K6+572u5L2N572uXHJcbiAgICB9XHJcblxyXG4gICAgLy8g5LyY5YWI5L2/55So5Lyg5YWl55qE5Zu65a6a5bC65a+477yM5ZCm5YiZ5LuORE9N6I635Y+WXHJcbiAgICBjb25zdCBwb3B1cFdpZHRoID1cclxuICAgICAgcG9wdXBTaXplICYmIHBvcHVwU2l6ZS53aWR0aCAhPT0gbnVsbCAmJiBwb3B1cFNpemUud2lkdGggIT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gcG9wdXBTaXplLndpZHRoXHJcbiAgICAgICAgOiBwb3B1cFJlY3Qud2lkdGggfHwgcG9wdXBFbC5vZmZzZXRXaWR0aCB8fCAzMDA7XHJcbiAgICBjb25zdCBwb3B1cEhlaWdodCA9XHJcbiAgICAgIHBvcHVwU2l6ZSAmJiBwb3B1cFNpemUuaGVpZ2h0ICE9PSBudWxsICYmIHBvcHVwU2l6ZS5oZWlnaHQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gcG9wdXBTaXplLmhlaWdodFxyXG4gICAgICAgIDogcG9wdXBSZWN0LmhlaWdodCB8fCBwb3B1cEVsLm9mZnNldEhlaWdodCB8fCAyMDA7XHJcblxyXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoXHJcbiAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICBwbGFjZW1lbnQsXHJcbiAgICAgIHBvc2l0aW9uLFxyXG4gICAgICB7IHdpZHRoOiBwb3B1cFdpZHRoLCBoZWlnaHQ6IHBvcHVwSGVpZ2h0IH1cclxuICAgICk7XHJcblxyXG4gICAgcG9wdXBFbC5zdHlsZS50b3AgPSBjb29yZGluYXRlcy50b3A7XHJcbiAgICBwb3B1cEVsLnN0eWxlLmxlZnQgPSBjb29yZGluYXRlcy5sZWZ0O1xyXG4gICAgcG9wdXBFbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7Y29vcmRpbmF0ZXMudHJhbnNsYXRlWH0sICR7Y29vcmRpbmF0ZXMudHJhbnNsYXRlWX0pYDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgdGhpcy51cGRhdGVQb3B1cFBvc2l0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
1386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zbWFydC1wb3B1cC9pbmRleC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQXFCdkIsTUFBTSxPQUFPLG1CQUFtQjs7OztJQThEOUIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEzRHRCLGVBQVUsR0FBa0IsWUFBWSxDQUFDO1FBQzVDLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDaEIsZ0JBQVcsR0FBaUIsS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUF1QixJQUFJLENBQUM7UUFDcEQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUM1QixVQUFLLEdBQVksS0FBSyxDQUFDO1FBQ3RCLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBQzVCLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBMEN6QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN4QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFPOUQsMEJBQXFCLEdBQXVCLElBQUksQ0FBQztRQW1OakQsdUJBQWtCLEdBQUcsZ0NBQWdDLENBQUM7UUFZdEQsV0FBTSxHQUFpQixJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBaUIsSUFBSSxDQUFDO1FBQ2pDLG9CQUFlLEdBQXdDLFFBQVEsQ0FBQztRQUNoRSxtQkFBYyxHQUErQixPQUFPLENBQUM7UUE2UXJELG1CQUFjOzs7O1FBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7O2tCQUMvQixNQUFNLEdBQUcsbUJBQUEsS0FBSyxDQUFDLE1BQU0sRUFBVzs7a0JBQ2hDLGdC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LEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs2QkEyb0NwQyxZQUFZLFNBQUMsZUFBZTs7OztJQWpzQzdCLHlDQUE2RDs7SUFDN0Qsc0NBQXFDOztJQUNyQywwQ0FBdUQ7O0lBQ3ZELGdEQUFzRTs7SUFDdEUsc0NBQTJDOztJQUMzQyxvQ0FBc0M7O0lBQ3RDLHFDQUE2Qzs7SUFDN0Msc0NBQStDOztJQTBDL0MseUNBQStEOztJQUMvRCwwQ0FBOEQ7O0lBRTlELHFEQUNnRDs7SUFDaEQsMkNBQ3lDOztJQUV6QyxvREFBaUQ7O0lBbU5qRCxpREFBc0Q7O0lBQ3RELCtDQUE4Qjs7SUFXOUIscUNBQTRCOztJQUM1QiwwQ0FBaUM7O0lBQ2pDLDhDQUFnRTs7SUFDaEUsNkNBQXFEOztJQTZRckQsNkNBWUU7O0lBRUYsNkNBZUU7Ozs7O0lBMWdCVSxrQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuZXhwb3J0IHR5cGUgUGxhY2VtZW50VHlwZSA9XHJcbiAgfCBcIlRvcExlZnRcIlxyXG4gIHwgXCJUb3BDZW50ZXJcIlxyXG4gIHwgXCJUb3BSaWdodFwiXHJcbiAgfCBcIkJvdHRvbUxlZnRcIlxyXG4gIHwgXCJCb3R0b21DZW50ZXJcIlxyXG4gIHwgXCJCb3R0b21SaWdodFwiXHJcbiAgfCBcIkxlZnRUb3BcIlxyXG4gIHwgXCJMZWZ0Q2VudGVyXCJcclxuICB8IFwiTGVmdEJvdHRvbVwiXHJcbiAgfCBcIlJpZ2h0VG9wXCJcclxuICB8IFwiUmlnaHRDZW50ZXJcIlxyXG4gIHwgXCJSaWdodEJvdHRvbVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwicnMtc21hcnQtcG9wdXBcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2luZGV4LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2luZGV4LmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRQb3B1cENvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcclxue1xyXG4gIEBJbnB1dChcInBsYWNlbWVudFwiKSBfcGxhY2VtZW50OiBQbGFjZW1lbnRUeXBlID0gXCJCb3R0b21MZWZ0XCI7XHJcbiAgQElucHV0KFwib2Zmc2V0XCIpIF9vZmZzZXQ6IG51bWJlciA9IDg7XHJcbiAgQElucHV0KFwiYXV0b0FkanVzdFwiKSBfYXV0b0FkanVzdDogXCJ5ZXNcIiB8IFwibm9cIiA9IFwieWVzXCI7XHJcbiAgQElucHV0KFwidHJpZ2dlckVsZW1lbnRcIikgdHJpZ2dlckVsZW1lbnRSZWY6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KFwibG9hZGluZ1wiKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KFwib3BlblwiKSBfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dChcIndpZHRoXCIpIF93aWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KFwiaGVpZ2h0XCIpIF9oZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDop6PmnpBwbGFjZW1lbnTmoLzlvI9cclxuICBnZXQgcGxhY2VtZW50SW5mbygpOiB7XHJcbiAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCI7XHJcbiAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCI7XHJcbiAgfSB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRNYXA6IHtcclxuICAgICAgW2tleTogc3RyaW5nXToge1xyXG4gICAgICAgIHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIjtcclxuICAgICAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCI7XHJcbiAgICAgIH07XHJcbiAgICB9ID0ge1xyXG4gICAgICBUb3BMZWZ0OiB7IHBsYWNlbWVudDogXCJ0b3BcIiwgcG9zaXRpb246IFwic3RhcnRcIiB9LFxyXG4gICAgICBUb3BDZW50ZXI6IHsgcGxhY2VtZW50OiBcInRvcFwiLCBwb3NpdGlvbjogXCJjZW50ZXJcIiB9LFxyXG4gICAgICBUb3BSaWdodDogeyBwbGFjZW1lbnQ6IFwidG9wXCIsIHBvc2l0aW9uOiBcImVuZFwiIH0sXHJcbiAgICAgIEJvdHRvbUxlZnQ6IHsgcGxhY2VtZW50OiBcImJvdHRvbVwiLCBwb3NpdGlvbjogXCJzdGFydFwiIH0sXHJcbiAgICAgIEJvdHRvbUNlbnRlcjogeyBwbGFjZW1lbnQ6IFwiYm90dG9tXCIsIHBvc2l0aW9uOiBcImNlbnRlclwiIH0sXHJcbiAgICAgIEJvdHRvbVJpZ2h0OiB7IHBsYWNlbWVudDogXCJib3R0b21cIiwgcG9zaXRpb246IFwiZW5kXCIgfSxcclxuICAgICAgTGVmdFRvcDogeyBwbGFjZW1lbnQ6IFwibGVmdFwiLCBwb3NpdGlvbjogXCJzdGFydFwiIH0sXHJcbiAgICAgIExlZnRDZW50ZXI6IHsgcGxhY2VtZW50OiBcImxlZnRcIiwgcG9zaXRpb246IFwiY2VudGVyXCIgfSxcclxuICAgICAgTGVmdEJvdHRvbTogeyBwbGFjZW1lbnQ6IFwibGVmdFwiLCBwb3NpdGlvbjogXCJlbmRcIiB9LFxyXG4gICAgICBSaWdodFRvcDogeyBwbGFjZW1lbnQ6IFwicmlnaHRcIiwgcG9zaXRpb246IFwic3RhcnRcIiB9LFxyXG4gICAgICBSaWdodENlbnRlcjogeyBwbGFjZW1lbnQ6IFwicmlnaHRcIiwgcG9zaXRpb246IFwiY2VudGVyXCIgfSxcclxuICAgICAgUmlnaHRCb3R0b206IHsgcGxhY2VtZW50OiBcInJpZ2h0XCIsIHBvc2l0aW9uOiBcImVuZFwiIH0sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgcGxhY2VtZW50TWFwW3RoaXMuX3BsYWNlbWVudF0gfHwge1xyXG4gICAgICAgIHBsYWNlbWVudDogXCJib3R0b21cIixcclxuICAgICAgICBwb3NpdGlvbjogXCJzdGFydFwiLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9vZmZzZXQgfHwgODtcclxuICB9XHJcblxyXG4gIGdldCBhdXRvQWRqdXN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3QgPT09IFwieWVzXCI7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KFwib3BlbkNoYW5nZVwiKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBPdXRwdXQoXCJjb250ZW50TG9hZFwiKSBjb250ZW50TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChcInRyaWdnZXJcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW50ZXJuYWxUcmlnZ2VyRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChcInBvcHVwXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHBvcHVwRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIGN1cnJlbnRUcmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmZpeGVkQ29udGFpbmVyRWwgPSB0aGlzLmdldEZpeGVkQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLmZpeGVkQ29udGFpbmVyRWwuYXBwZW5kKHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG5cclxuICAgIC8vIOWmguaenOaPkOS+m+S6huWbuuWumuWwuuWvuO+8jOeri+WNs+W6lOeUqFxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl93aWR0aCAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLl9oZWlnaHQgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQgJiZcclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHBvcHVwRWwgPSB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBwb3B1cEVsLnN0eWxlLndpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICBwb3B1cEVsLnN0eWxlLm1pbldpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUubWF4V2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgcG9wdXBFbC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgIHBvcHVwRWwuc3R5bGUubWF4SGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOWklumDqOS8oOWFpSBvcGVuIOWxnuaAp+S4uiB0cnVl77yM6Ieq5Yqo5omT5byAXHJcbiAgICBpZiAodGhpcy5fb3Blbikge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMub3BlbigpLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIC8vIOWkhOeQhuWbuuWumuWwuuWvuOWPmOWMllxyXG4gICAgaWYgKFxyXG4gICAgICAoY2hhbmdlcy5fd2lkdGggfHwgY2hhbmdlcy5faGVpZ2h0KSAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudCAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICApIHtcclxuICAgICAgY29uc3QgcG9wdXBFbCA9IHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBvcHVwRWwuc3R5bGUud2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1pbldpZHRoID0gdGhpcy5fd2lkdGggKyBcInB4XCI7XHJcbiAgICAgICAgcG9wdXBFbC5zdHlsZS5tYXhXaWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IG51bGwpIHtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLmhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1pbkhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICBwb3B1cEVsLnN0eWxlLm1heEhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWFiOWkhOeQhuinpuWPkeWFg+e0oOWPmOWMlu+8iOehruS/neWcqOaJk+W8gOWJjeabtOaWsOinpuWPkeWFg+e0oO+8iVxyXG4gICAgaWYgKGNoYW5nZXMudHJpZ2dlckVsZW1lbnRSZWYpIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNUcmlnZ2VyID0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQ7XHJcbiAgICAgIHRoaXMudXBkYXRlVHJpZ2dlckVsZW1lbnQoKTtcclxuXHJcbiAgICAgIC8vIOWmguaenOW8ueeql+W3sue7j+aJk+W8gO+8jOS4lOinpuWPkeWFg+e0oOWPkeeUn+S6huWPmOWMlu+8jOeri+WNs+abtOaWsOS9jee9rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5vcGVuZWQgPT09IFwieWVzXCIgJiZcclxuICAgICAgICBwcmV2aW91c1RyaWdnZXIgIT09IHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50ICYmXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnRcclxuICAgICAgKSB7XHJcbiAgICAgICAgLy8g5aaC5p6c5o+Q5L6b5LqG5Zu65a6a5bC65a+477yM55u05o6l6YeN5paw6K6h566X5L2N572u77yI6YG/5YWN5L2N572u6Lez5Yqo77yJXHJcbiAgICAgICAgaWYgKHRoaXMuX3dpZHRoICE9PSBudWxsICYmIHRoaXMuX2hlaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8g5YWI6ZqQ6JeP5by556qX77yIcG9zaXRpb25pbmcgPSB5ZXPvvIlcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcInllc1wiO1xyXG4gICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7IC8vIOeri+WNs+W6lOeUqOmakOiXj+eKtuaAgVxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyUmVjdCA9IHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBvcHVwU2l6ZSA9IHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCEsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2hlaWdodCEsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJbmZvID0gdGhpcy5wbGFjZW1lbnRJbmZvO1xyXG4gICAgICAgICAgICAgIGxldCBmaW5hbFBsYWNlbWVudCA9IHRhcmdldEluZm8ucGxhY2VtZW50O1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbmFsUG9zaXRpb24gPSB0YXJnZXRJbmZvLnBvc2l0aW9uO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvQWRqdXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3B1cFJlY3Q6IERPTVJlY3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBwb3B1cFNpemUud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogcG9wdXBTaXplLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgICAgICAgICByaWdodDogcG9wdXBTaXplLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICBib3R0b206IHBvcHVwU2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgIHRvSlNPTjogKCkgPT4gKHt9KSxcclxuICAgICAgICAgICAgICAgIH0gYXMgRE9NUmVjdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGltYWwgPSB0aGlzLmNhbGN1bGF0ZU9wdGltYWxQbGFjZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgICAgICAgICAgICBwb3B1cFJlY3QsXHJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFBsYWNlbWVudCA9IG9wdGltYWwucGxhY2VtZW50O1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5hY3R1YWxQbGFjZW1lbnQgPSBmaW5hbFBsYWNlbWVudDtcclxuICAgICAgICAgICAgICB0aGlzLmFjdHVhbFBvc2l0aW9uID0gZmluYWxQb3NpdGlvbjtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoXHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgICAgICAgICAgIGZpbmFsUGxhY2VtZW50LFxyXG4gICAgICAgICAgICAgICAgZmluYWxQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgIHBvcHVwU2l6ZVxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3B1cEVsID0gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUudG9wID0gcG9zaXRpb24udG9wO1xyXG4gICAgICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ubGVmdDtcclxuICAgICAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3Bvc2l0aW9uLnRyYW5zbGF0ZVh9LCAke3Bvc2l0aW9uLnRyYW5zbGF0ZVl9KWA7XHJcbiAgICAgICAgICAgICAgICBwb3B1cEVsLm9mZnNldEhlaWdodDsgLy8g5by65Yi25ZCM5q2l5bqU55So5qC35byPXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIOS9jee9ruiuvue9ruWujOaIkOWQju+8jOWGjeaYvuekuuW8ueeql1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbmluZyA9IFwibm9cIjtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDkvb/nlKjmlrDnmoTmiZPlvIDmlrnlvI/mm7TmlrDkvY3nva5cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcInllc1wiO1xyXG4gICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wdXBQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcIm5vXCI7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aSE55CGIG9wZW4g5Y+Y5YyW77yI56Gu5L+d5Zyo6Kem5Y+R5YWD57Sg5pu05paw5ZCO5aSE55CG77yJXHJcbiAgICBpZiAoY2hhbmdlcy5fb3Blbikge1xyXG4gICAgICBpZiAodGhpcy5fb3BlbiAmJiB0aGlzLm9wZW5lZCA9PT0gXCJub1wiKSB7XHJcbiAgICAgICAgLy8g56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICAgICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG4gICAgICAgIC8vIOS9v+eUqCBzZXRUaW1lb3V0IOehruS/neaJgOacieWPmOabtOmDveW3suWkhOeQhlxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy8g5YaN5qyh56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfSBlbHNlIGlmICghdGhpcy5fb3BlbiAmJiB0aGlzLm9wZW5lZCA9PT0gXCJ5ZXNcIikge1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOW9k+WKoOi9veWujOaIkOaXtu+8jOabtOaWsOS9jee9ru+8iOWmguaenOaPkOS+m+S6huWbuuWumuWwuuWvuO+8jOS4jemcgOimgeabtOaWsOS9jee9ru+8iVxyXG4gICAgaWYgKFxyXG4gICAgICBjaGFuZ2VzLmxvYWRpbmcgJiZcclxuICAgICAgIWNoYW5nZXMubG9hZGluZy5jdXJyZW50VmFsdWUgJiZcclxuICAgICAgY2hhbmdlcy5sb2FkaW5nLnByZXZpb3VzVmFsdWVcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgICAvLyDlpoLmnpzmj5Dkvpvkuoblm7rlrprlsLrlr7jvvIzkvY3nva7lt7Lnu4/orqHnrpflpb3kuobvvIzkuI3pnIDopoHmm7TmlrBcclxuICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IG51bGwgJiYgdGhpcy5faGVpZ2h0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkLmVtaXQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5aaC5p6c5q2j5Zyo5a6a5L2N77yM5LiN6ZyA6KaB5pu05paw5L2N572uXHJcbiAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbmluZyA9PT0gXCJub1wiKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3B1cFBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZC5lbWl0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8g5aaC5p6c5q2j5Zyo5a6a5L2N77yM562J5b6F5a6a5L2N5a6M5oiQ5ZCO5YaN6Kem5Y+R5LqL5Lu2XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrUG9zaXRpb25pbmcgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25pbmcgPT09IFwibm9cIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tQb3NpdGlvbmluZywgMTApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hlY2tQb3NpdGlvbmluZygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLm9uQ2xpY2tPdXRzaWRlKTtcclxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25XaW5kb3dTY3JvbGwsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVHJpZ2dlckVsZW1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy50cmlnZ2VyRWxlbWVudFJlZikge1xyXG4gICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlckVsZW1lbnRSZWY7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmludGVybmFsVHJpZ2dlckVsZW1lbnQgJiZcclxuICAgICAgdGhpcy5pbnRlcm5hbFRyaWdnZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCA9IHRoaXMuaW50ZXJuYWxUcmlnZ2VyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgRklYRURfQ09OVEFJTkVSX0lEID0gXCJycy1zbWFydC1wb3B1cC1maXhlZC1jb250YWluZXJcIjtcclxuICBmaXhlZENvbnRhaW5lckVsOiBIVE1MRWxlbWVudDtcclxuICBnZXRGaXhlZENvbnRhaW5lcigpIHtcclxuICAgIGxldCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GSVhFRF9DT05UQUlORVJfSUQpO1xyXG4gICAgaWYgKCFjb250YWluZXJFbGVtZW50KSB7XHJcbiAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICBjb250YWluZXJFbGVtZW50LnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuRklYRURfQ09OVEFJTkVSX0lEKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29udGFpbmVyRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG9wZW5lZDogXCJ5ZXNcIiB8IFwibm9cIiA9IFwibm9cIjtcclxuICBwb3NpdGlvbmluZzogXCJ5ZXNcIiB8IFwibm9cIiA9IFwibm9cIjtcclxuICBhY3R1YWxQbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIgPSBcImJvdHRvbVwiO1xyXG4gIGFjdHVhbFBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIjtcclxuXHJcbiAgb3Blbih0cmlnZ2VyRWxlbWVudD86IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyDlpoLmnpzkvKDlhaXkuobop6blj5HlhYPntKDvvIzkvb/nlKjlroNcclxuICAgIGlmICh0cmlnZ2VyRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCA9IHRyaWdnZXJFbGVtZW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiU21hcnRQb3B1cENvbXBvbmVudDogTm8gdHJpZ2dlciBlbGVtZW50IGZvdW5kXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5bey57uP5omT5byA77yM5LiU5o+Q5L6b5LqG5Zu65a6a5bC65a+477yM55u05o6l6YeN5paw6K6h566X5L2N572u77yI6YG/5YWN5YWz6Zet5YaN5omT5byA5a+86Ie055qE6Lez5Yqo77yJXHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgaWYgKHRoaXMuX3dpZHRoICE9PSBudWxsICYmIHRoaXMuX2hlaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIOacieWbuuWumuWwuuWvuO+8jOebtOaOpemHjeaWsOiuoeeul+S9jee9ru+8jOS4jeWFs+mXreW8ueeql1xyXG4gICAgICAgIC8vIOWFiOmakOiXj+W8ueeql++8iHBvc2l0aW9uaW5nID0geWVz77yJXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbmluZyA9IFwieWVzXCI7XHJcbiAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpOyAvLyDnq4vljbPlupTnlKjpmpDol4/nirbmgIFcclxuICAgICAgICBcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgLy8g5YaN5qyh56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlclJlY3QgPSB0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgcG9wdXBTaXplID0ge1xyXG4gICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCEsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQhLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJbmZvID0gdGhpcy5wbGFjZW1lbnRJbmZvO1xyXG4gICAgICAgICAgICBsZXQgZmluYWxQbGFjZW1lbnQgPSB0YXJnZXRJbmZvLnBsYWNlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgZmluYWxQb3NpdGlvbiA9IHRhcmdldEluZm8ucG9zaXRpb247XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvQWRqdXN0KSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcG9wdXBSZWN0OiBET01SZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHBvcHVwU2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcG9wdXBTaXplLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgICByaWdodDogcG9wdXBTaXplLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBwb3B1cFNpemUuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICB0b0pTT046ICgpID0+ICh7fSksXHJcbiAgICAgICAgICAgICAgfSBhcyBET01SZWN0O1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9wdGltYWwgPSB0aGlzLmNhbGN1bGF0ZU9wdGltYWxQbGFjZW1lbnQoXHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgICAgICAgICAgIHBvcHVwUmVjdCxcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgd2luZG93LmlubmVySGVpZ2h0XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBmaW5hbFBsYWNlbWVudCA9IG9wdGltYWwucGxhY2VtZW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbFBsYWNlbWVudCA9IGZpbmFsUGxhY2VtZW50O1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbFBvc2l0aW9uID0gZmluYWxQb3NpdGlvbjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgICAgICAgIGZpbmFsUGxhY2VtZW50LFxyXG4gICAgICAgICAgICAgIGZpbmFsUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgcG9wdXBTaXplXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBvcHVwRWwgPSB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUudG9wID0gcG9zaXRpb24udG9wO1xyXG4gICAgICAgICAgICAgIHBvcHVwRWwuc3R5bGUubGVmdCA9IHBvc2l0aW9uLmxlZnQ7XHJcbiAgICAgICAgICAgICAgcG9wdXBFbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7cG9zaXRpb24udHJhbnNsYXRlWH0sICR7cG9zaXRpb24udHJhbnNsYXRlWX0pYDtcclxuICAgICAgICAgICAgICBwb3B1cEVsLm9mZnNldEhlaWdodDsgLy8g5by65Yi25ZCM5q2l5bqU55So5qC35byPXHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgLy8g5L2N572u6K6+572u5a6M5oiQ5ZCO77yM5YaN5pi+56S65by556qXXHJcbiAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcIm5vXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDmsqHmnInlm7rlrprlsLrlr7jvvIzlhYjlhbPpl63lho3miZPlvIBcclxuICAgICAgICB0aGlzLm9wZW5lZCA9IFwibm9cIjtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcbiAgICAgICAgICB0aGlzLm9wZW5Qb3B1cCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOehruS/neinpuWPkeWFg+e0oOW3suabtOaWsFxyXG4gICAgdGhpcy51cGRhdGVUcmlnZ2VyRWxlbWVudCgpO1xyXG4gICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlblBvcHVwKCkge1xyXG4gICAgLy8g5YaN5qyh56Gu5L+d6Kem5Y+R5YWD57Sg5bey5pu05pawXHJcbiAgICB0aGlzLnVwZGF0ZVRyaWdnZXJFbGVtZW50KCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJTbWFydFBvcHVwQ29tcG9uZW50OiBObyB0cmlnZ2VyIGVsZW1lbnQgZm91bmQgd2hlbiBvcGVuaW5nIHBvcHVwXCJcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOaPkOS+m+S6huWbuuWumuWwuuWvuO+8jOWPr+S7peWcqOaJk+W8gOWJjeWwseiuoeeul+WlveS9jee9rlxyXG4gICAgaWYgKHRoaXMuX3dpZHRoICE9PSBudWxsICYmIHRoaXMuX2hlaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyDlhYjorqHnrpfkvY3nva7vvIjkuI3kvp3otZZET03muLLmn5PvvIznm7TmjqXmoLnmja50cmlnZ2VyRWxlbWVudOiuoeeul++8iVxyXG4gICAgICBjb25zdCB0cmlnZ2VyUmVjdCA9IHRoaXMuY3VycmVudFRyaWdnZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG5cclxuICAgICAgY29uc3QgcG9wdXBTaXplID0ge1xyXG4gICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMuX2hlaWdodCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHBvcHVwUmVjdDogRE9NUmVjdCA9IHtcclxuICAgICAgICB3aWR0aDogcG9wdXBTaXplLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogcG9wdXBTaXplLmhlaWdodCxcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgbGVmdDogMCxcclxuICAgICAgICByaWdodDogcG9wdXBTaXplLndpZHRoLFxyXG4gICAgICAgIGJvdHRvbTogcG9wdXBTaXplLmhlaWdodCxcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAsXHJcbiAgICAgICAgdG9KU09OOiAoKSA9PiAoe30pLFxyXG4gICAgICB9IGFzIERPTVJlY3Q7XHJcblxyXG4gICAgICBjb25zdCB0YXJnZXRJbmZvID0gdGhpcy5wbGFjZW1lbnRJbmZvO1xyXG4gICAgICBsZXQgZmluYWxQbGFjZW1lbnQgPSB0YXJnZXRJbmZvLnBsYWNlbWVudDtcclxuICAgICAgLy8g5aeL57uI5L2/55So55So5oi35oyH5a6a55qEIHBvc2l0aW9u77yMYXV0b0FkanVzdCDlj6rosIPmlbQgcGxhY2VtZW5077yI5pa55ZCR77yJ77yM5LiN5pS55Y+Y5a+56b2Q5pa55byPXHJcbiAgICAgIGNvbnN0IGZpbmFsUG9zaXRpb24gPSB0YXJnZXRJbmZvLnBvc2l0aW9uO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYXV0b0FkanVzdCkge1xyXG4gICAgICAgIGNvbnN0IG9wdGltYWwgPSB0aGlzLmNhbGN1bGF0ZU9wdGltYWxQbGFjZW1lbnQoXHJcbiAgICAgICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgICAgIHBvcHVwUmVjdCxcclxuICAgICAgICAgIHZpZXdwb3J0V2lkdGgsXHJcbiAgICAgICAgICB2aWV3cG9ydEhlaWdodFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gYXV0b0FkanVzdCDlj6rosIPmlbQgcGxhY2VtZW5077yI5LiK5LiL5bem5Y+z77yJ77yM5L+d5oyB55So5oi35oyH5a6a55qEIHBvc2l0aW9u77yI5a+56b2Q5pa55byP77yJXHJcbiAgICAgICAgZmluYWxQbGFjZW1lbnQgPSBvcHRpbWFsLnBsYWNlbWVudDtcclxuICAgICAgICAvLyBmaW5hbFBvc2l0aW9uIOS/neaMgeeUqOaIt+aMh+WumueahOWAvO+8jOS4jeaUueWPmFxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmFjdHVhbFBsYWNlbWVudCA9IGZpbmFsUGxhY2VtZW50O1xyXG4gICAgICB0aGlzLmFjdHVhbFBvc2l0aW9uID0gZmluYWxQb3NpdGlvbjtcclxuXHJcbiAgICAgIC8vIOiuoeeul+S9jee9ruWdkOagh++8iOS4jeS+nei1lkRPTe+8jOebtOaOpeiuoeeul++8iVxyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcyhcclxuICAgICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgICBmaW5hbFBsYWNlbWVudCxcclxuICAgICAgICBmaW5hbFBvc2l0aW9uLFxyXG4gICAgICAgIHBvcHVwU2l6ZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8g5YWI6K6+572u5omT5byA54q25oCB77yM5L2G5L+d5oyB6ZqQ6JeP77yIcG9zaXRpb25pbmcgPSB5ZXPvvIlcclxuICAgICAgLy8g5rOo5oSP77ya5YWI6K6+572uIHBvc2l0aW9uaW5nID0geWVz77yM5YaN6K6+572uIG9wZW5lZCA9IHllc++8jOehruS/neW8ueeql+WcqOS9jee9ruiuoeeul+WujOaIkOWJjeWni+e7iOmakOiXj1xyXG4gICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJ5ZXNcIjtcclxuICAgICAgdGhpcy5vcGVuZWQgPSBcInllc1wiO1xyXG4gICAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAvLyDlvLrliLbmm7TmlrDop4blm77vvIznoa7kv51ET03lt7Lmm7TmlrDvvIzkvYblvLnnqpfku43nhLbpmpDol4/vvIjlm6DkuLogcG9zaXRpb25pbmcgPSB5ZXPvvIlcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgLy8g6K6+572u5L2N572u55qE5Ye95pWwXHJcbiAgICAgIGNvbnN0IHNldFBvc2l0aW9uID0gKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICBjb25zdCBwb3B1cEVsID0gdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAvLyDnq4vljbPorr7nva7lsLrlr7jlkozkvY3nva5cclxuICAgICAgICAgIHBvcHVwRWwuc3R5bGUud2lkdGggPSB0aGlzLl93aWR0aCArIFwicHhcIjtcclxuICAgICAgICAgIHBvcHVwRWwuc3R5bGUuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgICAgcG9wdXBFbC5zdHlsZS5taW5XaWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICAgICAgcG9wdXBFbC5zdHlsZS5tYXhXaWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xyXG4gICAgICAgICAgcG9wdXBFbC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XHJcbiAgICAgICAgICBwb3B1cEVsLnN0eWxlLm1heEhlaWdodCA9IHRoaXMuX2hlaWdodCArIFwicHhcIjtcclxuICAgICAgICAgIHBvcHVwRWwuc3R5bGUudG9wID0gcG9zaXRpb24udG9wO1xyXG4gICAgICAgICAgcG9wdXBFbC5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ubGVmdDtcclxuICAgICAgICAgIHBvcHVwRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3Bvc2l0aW9uLnRyYW5zbGF0ZVh9LCAke3Bvc2l0aW9uLnRyYW5zbGF0ZVl9KWA7XHJcblxyXG4gICAgICAgICAgLy8g5by65Yi25ZCM5q2l5bqU55So5qC35byP77yM56Gu5L+d5L2N572u5bey6K6+572uXHJcbiAgICAgICAgICBwb3B1cEVsLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAvLyDkvY3nva7orr7nva7lrozmiJDlkI7vvIzlho3mmL7npLrlvLnnqpfvvIjorr7nva4gcG9zaXRpb25pbmcgPSBub++8iVxyXG4gICAgICAgICAgLy8g5L2/55SoIHJlcXVlc3RBbmltYXRpb25GcmFtZSDnoa7kv53moLflvI/lt7LlupTnlKhcclxuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcIm5vXCI7XHJcbiAgICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8g5aaC5p6c5YWD57Sg5bey57uP5a2Y5Zyo77yM56uL5Y2z6K6+572u5L2N572uXHJcbiAgICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgc2V0UG9zaXRpb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDlpoLmnpzlhYPntKDov5jkuI3lrZjlnKjvvIznrYnlvoXmuLLmn5PlkI7lho3orr7nva7kvY3nva5cclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgc2V0UG9zaXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5rKh5pyJ5Zu65a6a5bC65a+477yM6ZyA6KaB562J5b6FRE9N5riy5p+TXHJcbiAgICAgIHRoaXMucG9zaXRpb25pbmcgPSBcInllc1wiO1xyXG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICAgIC8vIOeri+WNs+W8uuWItuabtOaWsOinhuWbvu+8jOehruS/nURPTeW3suabtOaWsFxyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAvLyDkvb/nlKggcmVxdWVzdEFuaW1hdGlvbkZyYW1lIOehruS/neWcqOa1j+iniOWZqOa4suafk+S5i+WJjeabtOaWsOS9jee9rlxyXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIC8vIOehruS/neWFg+e0oOW3sua4suafk+W5tuiOt+WPluWwuuWvuFxyXG4gICAgICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAvLyDlvLrliLbph43mlrDorqHnrpfluIPlsYDvvIznoa7kv53lhYPntKDlsLrlr7jlt7LorqHnrpdcclxuICAgICAgICAgIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgIC8vIOiuoeeul+W5tuiuvue9ruS9jee9rlxyXG4gICAgICAgICAgdGhpcy51cGRhdGVQb3B1cFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgICAgLy8g5L2N572u6K6+572u5a6M5oiQ5ZCO77yM56e76Zmk5a6a5L2N54q25oCB77yM5pi+56S65by556qXXHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uaW5nID0gXCJub1wiO1xyXG4gICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25DbGlja091dHNpZGUpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vbldpbmRvd1Njcm9sbCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZCA9PT0gXCJub1wiKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wZW5lZCA9IFwibm9cIjtcclxuICAgIHRoaXMucG9zaXRpb25pbmcgPSBcIm5vXCI7XHJcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25DbGlja091dHNpZGUpO1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vbldpbmRvd1Njcm9sbCwgdHJ1ZSk7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZSgpIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZCA9PT0gXCJ5ZXNcIikge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xpY2tUcmlnZ2VyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMudG9nZ2xlKCk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrT3V0c2lkZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XHJcbiAgICBjb25zdCBpc0NsaWNrT25UcmlnZ2VyID1cclxuICAgICAgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQgJiYgdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQuY29udGFpbnModGFyZ2V0KTtcclxuICAgIGNvbnN0IGlzQ2xpY2tPblBvcHVwID1cclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQgJiZcclxuICAgICAgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCk7XHJcblxyXG4gICAgaWYgKCFpc0NsaWNrT25UcmlnZ2VyICYmICFpc0NsaWNrT25Qb3B1cCkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgb25XaW5kb3dTY3JvbGwgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgLy8g5qOA5p+l5rua5Yqo5piv5ZCm5Y+R55Sf5Zyo5by556qX5YaF6YOoXHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xyXG4gICAgICBjb25zdCBpc1Njcm9sbE9uUG9wdXAgPVxyXG4gICAgICAgIHRoaXMucG9wdXBFbGVtZW50ICYmXHJcbiAgICAgICAgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxyXG4gICAgICAgIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KTtcclxuXHJcbiAgICAgIC8vIOWmguaenOa7muWKqOWPkeeUn+WcqOW8ueeql+WGhemDqO+8jOS4jeabtOaWsOS9jee9ru+8iOmBv+WFjeS4jeW/heimgeeahOiuoeeul++8iVxyXG4gICAgICAvLyDlpoLmnpzmu5rliqjlj5HnlJ/lnKjlpJbpg6jvvIzmm7TmlrDkvY3nva7vvIjlm6DkuLrop6blj5HlhYPntKDkvY3nva7lj6/og73mlLnlj5jvvIlcclxuICAgICAgaWYgKCFpc1Njcm9sbE9uUG9wdXApIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVBvcHVwUG9zaXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIOWkhOeQhuW8ueeql+WGhemDqOeahOa7mui9ruS6i+S7tlxyXG4gIG9uUG9wdXBXaGVlbChldmVudDogV2hlZWxFdmVudCkge1xyXG4gICAgLy8g6Zi75q2i5rua6L2u5LqL5Lu25YaS5rOh77yM6YG/5YWN6Kem5Y+R5aSW6YOo5rua5Yqo5aSE55CGXHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhuW8ueeql+WGhemDqOeahOa7muWKqOS6i+S7tlxyXG4gIG9uUG9wdXBTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAvLyDpmLvmraLmu5rliqjkuovku7blhpLms6HvvIzpgb/lhY3op6blj5HlpJbpg6jmu5rliqjlpITnkIZcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5bm26K6+572u5L2N572u77yI5pSv5oyB5Zu65a6a5bC65a+477yM5Y+v5Zyo5omT5byA5YmN6LCD55So77yJXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVBbmRTZXRQb3NpdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcbiAgICAvLyDojrflj5blvLnnqpflsLrlr7jvvIjkvJjlhYjkvb/nlKjlm7rlrprlsLrlr7jvvIlcclxuICAgIGNvbnN0IHBvcHVwU2l6ZSA9IHtcclxuICAgICAgd2lkdGg6XHJcbiAgICAgICAgdGhpcy5fd2lkdGggIT09IG51bGxcclxuICAgICAgICAgID8gdGhpcy5fd2lkdGhcclxuICAgICAgICAgIDogdGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgICAgPyB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgICA6IDMwMCxcclxuICAgICAgaGVpZ2h0OlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCAhPT0gbnVsbFxyXG4gICAgICAgICAgPyB0aGlzLl9oZWlnaHRcclxuICAgICAgICAgIDogdGhpcy5wb3B1cEVsZW1lbnQgJiYgdGhpcy5wb3B1cEVsZW1lbnQubmF0aXZlRWxlbWVudFxyXG4gICAgICAgICAgPyB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgOiAyMDAsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIOWIm+W7uuiZmuaLn+eahCBwb3B1cFJlY3TvvIjnlKjkuo7orqHnrpfvvIlcclxuICAgIGNvbnN0IHBvcHVwUmVjdDogRE9NUmVjdCA9IHtcclxuICAgICAgd2lkdGg6IHBvcHVwU2l6ZS53aWR0aCxcclxuICAgICAgaGVpZ2h0OiBwb3B1cFNpemUuaGVpZ2h0LFxyXG4gICAgICB0b3A6IDAsXHJcbiAgICAgIGxlZnQ6IDAsXHJcbiAgICAgIHJpZ2h0OiBwb3B1cFNpemUud2lkdGgsXHJcbiAgICAgIGJvdHRvbTogcG9wdXBTaXplLmhlaWdodCxcclxuICAgICAgeDogMCxcclxuICAgICAgeTogMCxcclxuICAgICAgdG9KU09OOiAoKSA9PiAoe30pLFxyXG4gICAgfSBhcyBET01SZWN0O1xyXG5cclxuICAgIC8vIOiOt+WPluebruagh+S9jee9ruS/oeaBr1xyXG4gICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMucGxhY2VtZW50SW5mbztcclxuICAgIGxldCBmaW5hbFBsYWNlbWVudCA9IHRhcmdldEluZm8ucGxhY2VtZW50O1xyXG4gICAgLy8g5aeL57uI5L2/55So55So5oi35oyH5a6a55qEIHBvc2l0aW9u77yMYXV0b0FkanVzdCDlj6rosIPmlbQgcGxhY2VtZW5077yI5pa55ZCR77yJ77yM5LiN5pS55Y+Y5a+56b2Q5pa55byPXHJcbiAgICBjb25zdCBmaW5hbFBvc2l0aW9uID0gdGFyZ2V0SW5mby5wb3NpdGlvbjtcclxuXHJcbiAgICBpZiAodGhpcy5hdXRvQWRqdXN0KSB7XHJcbiAgICAgIGNvbnN0IG9wdGltYWwgPSB0aGlzLmNhbGN1bGF0ZU9wdGltYWxQbGFjZW1lbnQoXHJcbiAgICAgICAgdHJpZ2dlclJlY3QsXHJcbiAgICAgICAgcG9wdXBSZWN0LFxyXG4gICAgICAgIHZpZXdwb3J0V2lkdGgsXHJcbiAgICAgICAgdmlld3BvcnRIZWlnaHRcclxuICAgICAgKTtcclxuICAgICAgLy8gYXV0b0FkanVzdCDlj6rosIPmlbQgcGxhY2VtZW5077yI5LiK5LiL5bem5Y+z77yJ77yM5L+d5oyB55So5oi35oyH5a6a55qEIHBvc2l0aW9u77yI5a+56b2Q5pa55byP77yJXHJcbiAgICAgIGZpbmFsUGxhY2VtZW50ID0gb3B0aW1hbC5wbGFjZW1lbnQ7XHJcbiAgICAgIC8vIGZpbmFsUG9zaXRpb24g5L+d5oyB55So5oi35oyH5a6a55qE5YC877yM5LiN5pS55Y+YXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3R1YWxQbGFjZW1lbnQgPSBmaW5hbFBsYWNlbWVudDtcclxuICAgIHRoaXMuYWN0dWFsUG9zaXRpb24gPSBmaW5hbFBvc2l0aW9uO1xyXG5cclxuICAgIC8vIOeri+WNs+iuvue9ruS9jee9ru+8iOWNs+S9v+WFg+e0oOi/mOayoeWujOWFqOa4suafk++8jOS5n+imgeWFiOiuvue9ruS9jee9ru+8iVxyXG4gICAgaWYgKHRoaXMucG9wdXBFbGVtZW50ICYmIHRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5zZXRQb3B1cFBvc2l0aW9uKFxyXG4gICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgIHBvcHVwUmVjdCxcclxuICAgICAgICBmaW5hbFBsYWNlbWVudCxcclxuICAgICAgICBmaW5hbFBvc2l0aW9uLFxyXG4gICAgICAgIHBvcHVwU2l6ZVxyXG4gICAgICApO1xyXG4gICAgICAvLyDlvLrliLblupTnlKjmoLflvI/vvIznoa7kv53kvY3nva7nq4vljbPnlJ/mlYhcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5aaC5p6c5YWD57Sg6L+Y5LiN5a2Y5Zyo77yM5bu26L+f6K6+572u5L2N572uXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLnNldFBvcHVwUG9zaXRpb24oXHJcbiAgICAgICAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICAgICAgICBwb3B1cFJlY3QsXHJcbiAgICAgICAgICAgIGZpbmFsUGxhY2VtZW50LFxyXG4gICAgICAgICAgICBmaW5hbFBvc2l0aW9uLFxyXG4gICAgICAgICAgICBwb3B1cFNpemVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVBvcHVwUG9zaXRpb24oKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmN1cnJlbnRUcmlnZ2VyRWxlbWVudCB8fFxyXG4gICAgICAhdGhpcy5wb3B1cEVsZW1lbnQgfHxcclxuICAgICAgIXRoaXMucG9wdXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5o+Q5L6b5LqG5Zu65a6a5bC65a+477yM5L2/55So5Zu65a6a5bC65a+46K6h566XXHJcbiAgICBpZiAodGhpcy5fd2lkdGggIT09IG51bGwgJiYgdGhpcy5faGVpZ2h0ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQW5kU2V0UG9zaXRpb24oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gdGhpcy5jdXJyZW50VHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBwb3B1cFJlY3QgPSB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcblxyXG4gICAgLy8g6I635Y+W55uu5qCH5L2N572u5L+h5oGvXHJcbiAgICBjb25zdCB0YXJnZXRJbmZvID0gdGhpcy5wbGFjZW1lbnRJbmZvO1xyXG4gICAgbGV0IGZpbmFsUGxhY2VtZW50ID0gdGFyZ2V0SW5mby5wbGFjZW1lbnQ7XHJcbiAgICAvLyDlp4vnu4jkvb/nlKjnlKjmiLfmjIflrprnmoQgcG9zaXRpb27vvIxhdXRvQWRqdXN0IOWPquiwg+aVtCBwbGFjZW1lbnTvvIjmlrnlkJHvvInvvIzkuI3mlLnlj5jlr7npvZDmlrnlvI9cclxuICAgIGNvbnN0IGZpbmFsUG9zaXRpb24gPSB0YXJnZXRJbmZvLnBvc2l0aW9uO1xyXG5cclxuICAgIGlmICh0aGlzLmF1dG9BZGp1c3QpIHtcclxuICAgICAgY29uc3Qgb3B0aW1hbCA9IHRoaXMuY2FsY3VsYXRlT3B0aW1hbFBsYWNlbWVudChcclxuICAgICAgICB0cmlnZ2VyUmVjdCxcclxuICAgICAgICBwb3B1cFJlY3QsXHJcbiAgICAgICAgdmlld3BvcnRXaWR0aCxcclxuICAgICAgICB2aWV3cG9ydEhlaWdodFxyXG4gICAgICApO1xyXG4gICAgICAvLyBhdXRvQWRqdXN0IOWPquiwg+aVtCBwbGFjZW1lbnTvvIjkuIrkuIvlt6blj7PvvInvvIzkv53mjIHnlKjmiLfmjIflrprnmoQgcG9zaXRpb27vvIjlr7npvZDmlrnlvI/vvIlcclxuICAgICAgZmluYWxQbGFjZW1lbnQgPSBvcHRpbWFsLnBsYWNlbWVudDtcclxuICAgICAgLy8gZmluYWxQb3NpdGlvbiDkv53mjIHnlKjmiLfmjIflrprnmoTlgLzvvIzkuI3mlLnlj5hcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdHVhbFBsYWNlbWVudCA9IGZpbmFsUGxhY2VtZW50O1xyXG4gICAgdGhpcy5hY3R1YWxQb3NpdGlvbiA9IGZpbmFsUG9zaXRpb247XHJcbiAgICB0aGlzLnNldFBvcHVwUG9zaXRpb24oXHJcbiAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICBwb3B1cFJlY3QsXHJcbiAgICAgIGZpbmFsUGxhY2VtZW50LFxyXG4gICAgICBmaW5hbFBvc2l0aW9uXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVPcHRpbWFsUGxhY2VtZW50KFxyXG4gICAgdHJpZ2dlclJlY3Q6IERPTVJlY3QgfCBDbGllbnRSZWN0LFxyXG4gICAgcG9wdXBSZWN0OiBET01SZWN0IHwgQ2xpZW50UmVjdCxcclxuICAgIHZpZXdwb3J0V2lkdGg6IG51bWJlcixcclxuICAgIHZpZXdwb3J0SGVpZ2h0OiBudW1iZXJcclxuICApOiB7XHJcbiAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCI7XHJcbiAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCI7XHJcbiAgfSB7XHJcbiAgICBjb25zdCB0YXJnZXRJbmZvID0gdGhpcy5wbGFjZW1lbnRJbmZvO1xyXG4gICAgY29uc3QgcHJlZmVycmVkID0gdGFyZ2V0SW5mby5wbGFjZW1lbnQ7XHJcbiAgICBjb25zdCBwcmVmZXJyZWRQb3NpdGlvbiA9IHRhcmdldEluZm8ucG9zaXRpb247XHJcblxyXG4gICAgY29uc3Qgc3BhY2UgPSB7XHJcbiAgICAgIHRvcDogdHJpZ2dlclJlY3QudG9wLFxyXG4gICAgICBib3R0b206IHZpZXdwb3J0SGVpZ2h0IC0gdHJpZ2dlclJlY3QuYm90dG9tLFxyXG4gICAgICBsZWZ0OiB0cmlnZ2VyUmVjdC5sZWZ0LFxyXG4gICAgICByaWdodDogdmlld3BvcnRXaWR0aCAtIHRyaWdnZXJSZWN0LnJpZ2h0LFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBwb3B1cFNpemUgPSB7XHJcbiAgICAgIHdpZHRoOiBwb3B1cFJlY3Qud2lkdGggfHwgMzAwLCAvLyDpu5jorqTlrr3luqbvvIzlpoLmnpzov5jmsqHmnInmuLLmn5NcclxuICAgICAgaGVpZ2h0OiBwb3B1cFJlY3QuaGVpZ2h0IHx8IDIwMCwgLy8g6buY6K6k6auY5bqmXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIOajgOafpemmlumAieS9jee9ruaYr+WQpuaciei2s+Wkn+epuumXtFxyXG4gICAgY29uc3QgaGFzRW5vdWdoU3BhY2UgPSAocGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlLnRvcCA+PSBwb3B1cFNpemUuaGVpZ2h0ICsgdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlLmJvdHRvbSA+PSBwb3B1cFNpemUuaGVpZ2h0ICsgdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgIHJldHVybiBzcGFjZS5sZWZ0ID49IHBvcHVwU2l6ZS53aWR0aCArIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlLnJpZ2h0ID49IHBvcHVwU2l6ZS53aWR0aCArIHRoaXMub2Zmc2V0O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIOajgOafpeaMh+WumuS9jee9ruaYr+WQpuaciei2s+Wkn+epuumXtFxyXG4gICAgY29uc3QgY2hlY2tQb3NpdGlvblNwYWNlID0gKFxyXG4gICAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIsXHJcbiAgICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIlxyXG4gICAgKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIGlmIChwbGFjZW1lbnQgPT09IFwidG9wXCIgfHwgcGxhY2VtZW50ID09PSBcImJvdHRvbVwiKSB7XHJcbiAgICAgICAgLy8g5a+55LqO5LiK5LiL5L2N572u77yM5qOA5p+l5rC05bmz5a+56b2Q56m66Ze0XHJcbiAgICAgICAgY29uc3QgcG9wdXBXaWR0aCA9IHBvcHVwU2l6ZS53aWR0aDtcclxuICAgICAgICBjb25zdCBzcGFjZUxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0O1xyXG4gICAgICAgIGNvbnN0IHNwYWNlUmlnaHQgPSB2aWV3cG9ydFdpZHRoIC0gdHJpZ2dlclJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJjZW50ZXJcIikge1xyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlTGVmdCA+PSBwb3B1cFdpZHRoIC8gMiAmJiBzcGFjZVJpZ2h0ID49IHBvcHVwV2lkdGggLyAyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlTGVmdCA+PSBwb3B1cFdpZHRoO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBlbmRcclxuICAgICAgICAgIHJldHVybiBzcGFjZVJpZ2h0ID49IHBvcHVwV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWvueS6juW3puWPs+S9jee9ru+8jOajgOafpeWeguebtOWvuem9kOepuumXtFxyXG4gICAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXBTaXplLmhlaWdodDtcclxuICAgICAgICBjb25zdCBzcGFjZVRvcCA9IHRyaWdnZXJSZWN0LnRvcDtcclxuICAgICAgICBjb25zdCBzcGFjZUJvdHRvbSA9IHZpZXdwb3J0SGVpZ2h0IC0gdHJpZ2dlclJlY3QuYm90dG9tO1xyXG5cclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIHJldHVybiBzcGFjZVRvcCA+PSBwb3B1cEhlaWdodCAvIDIgJiYgc3BhY2VCb3R0b20gPj0gcG9wdXBIZWlnaHQgLyAyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xyXG4gICAgICAgICAgcmV0dXJuIHNwYWNlVG9wID49IHBvcHVwSGVpZ2h0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBlbmRcclxuICAgICAgICAgIHJldHVybiBzcGFjZUJvdHRvbSA+PSBwb3B1cEhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8g6K6h566X5L2N572u5piv5ZCm5ZCI6YCC77yI6ICD6JmR5rC05bmzL+WeguebtOWvuem9kO+8iVxyXG4gICAgY29uc3QgY2FsY3VsYXRlUG9zaXRpb24gPSAoXHJcbiAgICAgIHBsYWNlbWVudDogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIlxyXG4gICAgKTogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPT4ge1xyXG4gICAgICBpZiAocGxhY2VtZW50ID09PSBcInRvcFwiIHx8IHBsYWNlbWVudCA9PT0gXCJib3R0b21cIikge1xyXG4gICAgICAgIC8vIOWvueS6juS4iuS4i+S9jee9ru+8jOajgOafpeawtOW5s+Wvuem9kFxyXG4gICAgICAgIGNvbnN0IHBvcHVwV2lkdGggPSBwb3B1cFNpemUud2lkdGg7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VMZWZ0ID0gdHJpZ2dlclJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBzcGFjZVJpZ2h0ID0gdmlld3BvcnRXaWR0aCAtIHRyaWdnZXJSZWN0LnJpZ2h0O1xyXG5cclxuICAgICAgICAvLyDkvJjlhYjlsJ3or5Xkvb/nlKjnlKjmiLfmjIflrprnmoRwb3NpdGlvblxyXG4gICAgICAgIGlmIChjaGVja1Bvc2l0aW9uU3BhY2UocGxhY2VtZW50LCBwcmVmZXJyZWRQb3NpdGlvbikpIHtcclxuICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRQb3NpdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOWmguaenOS4reW/g+Wvuem9kOaciei2s+Wkn+epuumXtO+8jOS8mOWFiOS9v+eUqOS4reW/g1xyXG4gICAgICAgIGlmIChzcGFjZUxlZnQgPj0gcG9wdXBXaWR0aCAvIDIgJiYgc3BhY2VSaWdodCA+PSBwb3B1cFdpZHRoIC8gMikge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY2VudGVyXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWmguaenOW3puS+p+epuumXtOS4jei2s++8jOS9v+eUqOWPs+Wvuem9kFxyXG4gICAgICAgIGlmIChzcGFjZUxlZnQgPCBwb3B1cFdpZHRoIC8gMikge1xyXG4gICAgICAgICAgcmV0dXJuIFwiZW5kXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWmguaenOWPs+S+p+epuumXtOS4jei2s++8jOS9v+eUqOW3puWvuem9kFxyXG4gICAgICAgIGlmIChzcGFjZVJpZ2h0IDwgcG9wdXBXaWR0aCAvIDIpIHtcclxuICAgICAgICAgIHJldHVybiBcInN0YXJ0XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcmVmZXJyZWRQb3NpdGlvbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDlr7nkuo7lt6blj7PkvY3nva7vvIzmo4Dmn6XlnoLnm7Tlr7npvZBcclxuICAgICAgICBjb25zdCBwb3B1cEhlaWdodCA9IHBvcHVwU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VUb3AgPSB0cmlnZ2VyUmVjdC50b3A7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VCb3R0b20gPSB2aWV3cG9ydEhlaWdodCAtIHRyaWdnZXJSZWN0LmJvdHRvbTtcclxuXHJcbiAgICAgICAgLy8g5LyY5YWI5bCd6K+V5L2/55So55So5oi35oyH5a6a55qEcG9zaXRpb25cclxuICAgICAgICBpZiAoY2hlY2tQb3NpdGlvblNwYWNlKHBsYWNlbWVudCwgcHJlZmVycmVkUG9zaXRpb24pKSB7XHJcbiAgICAgICAgICByZXR1cm4gcHJlZmVycmVkUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDlpoLmnpzkuK3lv4Plr7npvZDmnInotrPlpJ/nqbrpl7TvvIzkvJjlhYjkvb/nlKjkuK3lv4NcclxuICAgICAgICBpZiAoc3BhY2VUb3AgPj0gcG9wdXBIZWlnaHQgLyAyICYmIHNwYWNlQm90dG9tID49IHBvcHVwSGVpZ2h0IC8gMikge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY2VudGVyXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWmguaenOS4iuaWueepuumXtOS4jei2s++8jOS9v+eUqOS4i+Wvuem9kFxyXG4gICAgICAgIGlmIChzcGFjZVRvcCA8IHBvcHVwSGVpZ2h0IC8gMikge1xyXG4gICAgICAgICAgcmV0dXJuIFwiZW5kXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWmguaenOS4i+aWueepuumXtOS4jei2s++8jOS9v+eUqOS4iuWvuem9kFxyXG4gICAgICAgIGlmIChzcGFjZUJvdHRvbSA8IHBvcHVwSGVpZ2h0IC8gMikge1xyXG4gICAgICAgICAgcmV0dXJuIFwic3RhcnRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByZWZlcnJlZFBvc2l0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIOWmguaenOmmlumAieS9jee9ruaciei2s+Wkn+epuumXtO+8jOS8mOWFiOS9v+eUqOeUqOaIt+aMh+WumueahHBvc2l0aW9uXHJcbiAgICBpZiAoaGFzRW5vdWdoU3BhY2UocHJlZmVycmVkKSkge1xyXG4gICAgICAvLyDljbPkvb/mjIflrprnmoRwb3NpdGlvbuepuumXtOS4jei2s++8jOS5n+WwvemHj+S/neaMgeeUqOaIt+aMh+WumueahHBvc2l0aW9uXHJcbiAgICAgIC8vIOi+ueeVjOe6puadn+mAu+i+keS8muWcqCBjYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzIOS4reWkhOeQhuS9jee9ruiwg+aVtFxyXG4gICAgICAvLyDov5nmoLflj6/ku6Xkv53mjIHnlKjmiLfmnJ/mnJvnmoTlr7npvZDmlrnlvI9cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBwbGFjZW1lbnQ6IHByZWZlcnJlZCxcclxuICAgICAgICBwb3NpdGlvbjogcHJlZmVycmVkUG9zaXRpb24sXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5qC55o2u6aaW6YCJ5L2N572u6YCJ5oup5aSH6YCJ5L2N572uXHJcbiAgICBjb25zdCBhbHRlcm5hdGl2ZXM6IHtcclxuICAgICAgW2tleTogc3RyaW5nXTogKFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIpW107XHJcbiAgICB9ID0ge1xyXG4gICAgICBib3R0b206IFtcInRvcFwiLCBcInJpZ2h0XCIsIFwibGVmdFwiXSxcclxuICAgICAgdG9wOiBbXCJib3R0b21cIiwgXCJyaWdodFwiLCBcImxlZnRcIl0sXHJcbiAgICAgIHJpZ2h0OiBbXCJsZWZ0XCIsIFwiYm90dG9tXCIsIFwidG9wXCJdLFxyXG4gICAgICBsZWZ0OiBbXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcInRvcFwiXSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYWx0TGlzdCA9IGFsdGVybmF0aXZlc1twcmVmZXJyZWRdIHx8IFtdO1xyXG5cclxuICAgIC8vIOWwneivleaJvuWIsOesrOS4gOS4quaciei2s+Wkn+epuumXtOeahOWkh+mAieS9jee9rlxyXG4gICAgZm9yIChjb25zdCBhbHQgb2YgYWx0TGlzdCkge1xyXG4gICAgICBpZiAoaGFzRW5vdWdoU3BhY2UoYWx0KSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBwbGFjZW1lbnQ6IGFsdCxcclxuICAgICAgICAgIHBvc2l0aW9uOiBjYWxjdWxhdGVQb3NpdGlvbihhbHQpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzpg73msqHmnInotrPlpJ/nqbrpl7TvvIzpgInmi6nnqbrpl7TmnIDlpKfnmoTkvY3nva5cclxuICAgIGNvbnN0IG1heFNwYWNlID0gTWF0aC5tYXgoc3BhY2UudG9wLCBzcGFjZS5ib3R0b20sIHNwYWNlLmxlZnQsIHNwYWNlLnJpZ2h0KTtcclxuICAgIGxldCBiZXN0UGxhY2VtZW50OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiO1xyXG4gICAgaWYgKG1heFNwYWNlID09PSBzcGFjZS50b3ApIGJlc3RQbGFjZW1lbnQgPSBcInRvcFwiO1xyXG4gICAgZWxzZSBpZiAobWF4U3BhY2UgPT09IHNwYWNlLmJvdHRvbSkgYmVzdFBsYWNlbWVudCA9IFwiYm90dG9tXCI7XHJcbiAgICBlbHNlIGlmIChtYXhTcGFjZSA9PT0gc3BhY2UubGVmdCkgYmVzdFBsYWNlbWVudCA9IFwibGVmdFwiO1xyXG4gICAgZWxzZSBiZXN0UGxhY2VtZW50ID0gXCJyaWdodFwiO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBsYWNlbWVudDogYmVzdFBsYWNlbWVudCxcclxuICAgICAgcG9zaXRpb246IGNhbGN1bGF0ZVBvc2l0aW9uKGJlc3RQbGFjZW1lbnQpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+S9jee9ruWdkOagh++8iOe6r+iuoeeul++8jOS4jeS+nei1lkRPTe+8jOWMheWQq+i+ueeVjOe6puadn++8iVxyXG4gIC8vIOazqOaEj++8muW8ueeql+S9v+eUqCBwb3NpdGlvbjogZml4ZWTvvIzmiYDku6XlnZDmoIflupTor6XmmK/nm7jlr7nkuo7op4blj6PnmoTvvIzkuI3pnIDopoHliqDkuIrmu5rliqjlgY/np7tcclxuICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoXHJcbiAgICB0cmlnZ2VyUmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QsXHJcbiAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIsXHJcbiAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXHJcbiAgICBwb3B1cFNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxyXG4gICk6IHsgdG9wOiBzdHJpbmc7IGxlZnQ6IHN0cmluZzsgdHJhbnNsYXRlWDogc3RyaW5nOyB0cmFuc2xhdGVZOiBzdHJpbmcgfSB7XHJcbiAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSB0cmlnZ2VyUmVjdC53aWR0aDtcclxuICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSB0cmlnZ2VyUmVjdC5oZWlnaHQ7XHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcbiAgICBsZXQgdG9wID0gMDtcclxuICAgIGxldCBsZWZ0ID0gMDtcclxuICAgIGxldCB0cmFuc2xhdGVYID0gXCIwXCI7XHJcbiAgICBsZXQgdHJhbnNsYXRlWSA9IFwiMFwiO1xyXG5cclxuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgIGNhc2UgXCJ0b3BcIjpcclxuICAgICAgICAvLyDlvLnnqpflnKjop6blj5HlhYPntKDkuIrmlrlcclxuICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgLSB0aGlzLm9mZnNldDtcclxuICAgICAgICB0cmFuc2xhdGVZID0gXCItMTAwJVwiO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICAvLyDlt6blr7npvZBcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIC8vIOWxheS4reWvuem9kFxyXG4gICAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgKyB0cmlnZ2VyV2lkdGggLyAyO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiLTUwJVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlj7Plr7npvZDvvIhlbmTvvIlcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5yaWdodDtcclxuICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOi+ueeVjOe6puadn++8muehruS/neW8ueeql+S4jei2heWHuuinhuWPo1xyXG4gICAgICAgIGNvbnN0IHBvcHVwVG9wID0gdG9wIC0gcG9wdXBTaXplLmhlaWdodDtcclxuICAgICAgICBpZiAocG9wdXBUb3AgPCAwKSB7XHJcbiAgICAgICAgICB0b3AgPSBwb3B1cFNpemUuaGVpZ2h0ICsgODsgLy8g6Led56a76aG26YOo6Iez5bCROHB4XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCIwXCI7IC8vIOWPlua2iOWQkeS4iuWBj+enu1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDmsLTlubPovrnnlYznuqbmnZ/vvJrlsL3ph4/kv53mjIHljp/lp4vlr7npvZDmlrnlvI9cclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xyXG4gICAgICAgICAgLy8g5bem5a+56b2Q77ya5aaC5p6c6LaF5Ye65Y+z6L6555WM77yM6LCD5pW05Yiw5Y+z6L6555WM77yb5aaC5p6c6LaF5Ye65bem6L6555WM77yM6LCD5pW05Yiw5bem6L6555WMXHJcbiAgICAgICAgICBpZiAobGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdCA9IHZpZXdwb3J0V2lkdGggLSBwb3B1cFNpemUud2lkdGggLSA4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGxlZnQgPCA4KSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSA4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIC8vIOWxheS4reWvuem9kO+8muiuoeeul+WunumZheW3pui+ueeVjFxyXG4gICAgICAgICAgY29uc3QgYWN0dWFsTGVmdCA9IGxlZnQgLSBwb3B1cFNpemUud2lkdGggLyAyO1xyXG4gICAgICAgICAgaWYgKGFjdHVhbExlZnQgPCA4KSB7XHJcbiAgICAgICAgICAgIC8vIOW3pui+ueeVjOS4jei2s++8jOWwvemHj+S/neaMgeWxheS4re+8jOS9huiwg+aVtOWIsOS4jei2heWHuuW3pui+ueeVjFxyXG4gICAgICAgICAgICBsZWZ0ID0gOCArIHBvcHVwU2l6ZS53aWR0aCAvIDI7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi01MCVcIjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsTGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHZpZXdwb3J0V2lkdGggLSA4KSB7XHJcbiAgICAgICAgICAgIC8vIOWPs+i+ueeVjOS4jei2s++8jOWwvemHj+S/neaMgeWxheS4re+8jOS9huiwg+aVtOWIsOS4jei2heWHuuWPs+i+ueeVjFxyXG4gICAgICAgICAgICBsZWZ0ID0gdmlld3BvcnRXaWR0aCAtIDggLSBwb3B1cFNpemUud2lkdGggLyAyO1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVYID0gXCItNTAlXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWPs+Wvuem9kO+8iGVuZO+8ie+8muW8ueeql+WPs+i+uee8mOS4juinpuWPkeWFg+e0oOWPs+i+uee8mOWvuem9kFxyXG4gICAgICAgICAgLy8gbGVmdCDmmK/lvLnnqpfnmoTlj7PovrnnvJjkvY3nva7vvIjlm6DkuLogdHJhbnNsYXRlWCA9IFwiLTEwMCVcIu+8iVxyXG4gICAgICAgICAgLy8g5by556qX55qE5bem6L6557yY5ZyoIGxlZnQgLSBwb3B1cFNpemUud2lkdGhcclxuICAgICAgICAgIGNvbnN0IHBvcHVwTGVmdEVkZ2UgPSBsZWZ0IC0gcG9wdXBTaXplLndpZHRoO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyDlpoLmnpzlvLnnqpflt6bovrnnvJjotoXlh7rlt6bovrnnlYzvvIzosIPmlbTkvY3nva7kvYbkv53mjIHlj7Plr7npvZBcclxuICAgICAgICAgIGlmIChwb3B1cExlZnRFZGdlIDwgOCkge1xyXG4gICAgICAgICAgICBsZWZ0ID0gOCArIHBvcHVwU2l6ZS53aWR0aDtcclxuICAgICAgICAgICAgdHJhbnNsYXRlWCA9IFwiLTEwMCVcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIOWmguaenOW8ueeql+WPs+i+uee8mOi2heWHuuWPs+i+ueeVjO+8jOiwg+aVtOS9jee9ruS9huS/neaMgeWPs+Wvuem9kFxyXG4gICAgICAgICAgaWYgKGxlZnQgPiB2aWV3cG9ydFdpZHRoIC0gOCkge1xyXG4gICAgICAgICAgICBsZWZ0ID0gdmlld3BvcnRXaWR0aCAtIDg7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImJvdHRvbVwiOlxyXG4gICAgICAgIC8vIOW8ueeql+WcqOinpuWPkeWFg+e0oOS4i+aWuVxyXG4gICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LmJvdHRvbSArIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICAvLyDlt6blr7npvZBcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0O1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIC8vIOWxheS4reWvuem9kFxyXG4gICAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgKyB0cmlnZ2VyV2lkdGggLyAyO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiLTUwJVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlj7Plr7npvZDvvIhlbmTvvIlcclxuICAgICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5yaWdodDtcclxuICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOi+ueeVjOe6puadn++8muehruS/neW8ueeql+S4jei2heWHuuinhuWPo1xyXG4gICAgICAgIGlmICh0b3AgKyBwb3B1cFNpemUuaGVpZ2h0ID4gdmlld3BvcnRIZWlnaHQpIHtcclxuICAgICAgICAgIHRvcCA9IHZpZXdwb3J0SGVpZ2h0IC0gcG9wdXBTaXplLmhlaWdodCAtIDg7IC8vIOi3neemu+W6lemDqOiHs+WwkThweFxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDmsLTlubPovrnnlYznuqbmnZ/vvJrlsL3ph4/kv53mjIHljp/lp4vlr7npvZDmlrnlvI9cclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xyXG4gICAgICAgICAgLy8g5bem5a+56b2Q77ya5aaC5p6c6LaF5Ye65Y+z6L6555WM77yM6LCD5pW05Yiw5Y+z6L6555WM77yb5aaC5p6c6LaF5Ye65bem6L6555WM77yM6LCD5pW05Yiw5bem6L6555WMXHJcbiAgICAgICAgICBpZiAobGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdCA9IHZpZXdwb3J0V2lkdGggLSBwb3B1cFNpemUud2lkdGggLSA4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGxlZnQgPCA4KSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSA4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgICAgIC8vIOWxheS4reWvuem9kO+8muiuoeeul+WunumZheW3pui+ueeVjFxyXG4gICAgICAgICAgY29uc3QgYWN0dWFsTGVmdCA9IGxlZnQgLSBwb3B1cFNpemUud2lkdGggLyAyO1xyXG4gICAgICAgICAgaWYgKGFjdHVhbExlZnQgPCA4KSB7XHJcbiAgICAgICAgICAgIC8vIOW3pui+ueeVjOS4jei2s++8jOWwvemHj+S/neaMgeWxheS4re+8jOS9huiwg+aVtOWIsOS4jei2heWHuuW3pui+ueeVjFxyXG4gICAgICAgICAgICBsZWZ0ID0gOCArIHBvcHVwU2l6ZS53aWR0aCAvIDI7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi01MCVcIjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsTGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHZpZXdwb3J0V2lkdGggLSA4KSB7XHJcbiAgICAgICAgICAgIC8vIOWPs+i+ueeVjOS4jei2s++8jOWwvemHj+S/neaMgeWxheS4re+8jOS9huiwg+aVtOWIsOS4jei2heWHuuWPs+i+ueeVjFxyXG4gICAgICAgICAgICBsZWZ0ID0gdmlld3BvcnRXaWR0aCAtIDggLSBwb3B1cFNpemUud2lkdGggLyAyO1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVYID0gXCItNTAlXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWPs+Wvuem9kO+8iGVuZO+8ie+8muW8ueeql+WPs+i+uee8mOS4juinpuWPkeWFg+e0oOWPs+i+uee8mOWvuem9kFxyXG4gICAgICAgICAgLy8gbGVmdCDmmK/lvLnnqpfnmoTlj7PovrnnvJjkvY3nva7vvIjlm6DkuLogdHJhbnNsYXRlWCA9IFwiLTEwMCVcIu+8iVxyXG4gICAgICAgICAgLy8g5by556qX55qE5bem6L6557yY5ZyoIGxlZnQgLSBwb3B1cFNpemUud2lkdGhcclxuICAgICAgICAgIGNvbnN0IHBvcHVwTGVmdEVkZ2UgPSBsZWZ0IC0gcG9wdXBTaXplLndpZHRoO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyDkvJjlhYjkv53mjIHkuI7op6blj5HlhYPntKDlj7Plr7npvZDvvIzlj6rlnKjlv4XopoHml7bosIPmlbRcclxuICAgICAgICAgIC8vIOWmguaenOW8ueeql+WPs+i+uee8mOi2heWHuuWPs+i+ueeVjO+8jOiwg+aVtOS9jee9ruS9huS/neaMgeWPs+Wvuem9kFxyXG4gICAgICAgICAgaWYgKGxlZnQgPiB2aWV3cG9ydFdpZHRoIC0gOCkge1xyXG4gICAgICAgICAgICBsZWZ0ID0gdmlld3BvcnRXaWR0aCAtIDg7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVggPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyDlpoLmnpzlvLnnqpflt6bovrnnvJjotoXlh7rlt6bovrnnlYzvvIzkuJTlvLnnqpflj6/ku6XlrozlhajmmL7npLrlnKjop4blj6PlhoXvvIzmiY3osIPmlbTkvY3nva5cclxuICAgICAgICAgIC8vIOi/meagt+WPr+S7peehruS/neWcqOWPr+iDveeahOaDheWGteS4i++8jOW8ueeql+Wni+e7iOS4juinpuWPkeWFg+e0oOWPs+Wvuem9kFxyXG4gICAgICAgICAgaWYgKHBvcHVwTGVmdEVkZ2UgPCA4ICYmIHBvcHVwU2l6ZS53aWR0aCA8IHZpZXdwb3J0V2lkdGggLSAxNikge1xyXG4gICAgICAgICAgICAvLyDlj6rmnInlvZPlvLnnqpflj6/ku6XlrozlhajmmL7npLrlnKjop4blj6PlhoXml7bvvIzmiY3osIPmlbTkvY3nva5cclxuICAgICAgICAgICAgLy8g5ZCm5YiZ5L+d5oyB5LiO6Kem5Y+R5YWD57Sg5Y+z5a+56b2Q77yM5Y2z5L2/6YOo5YiG6LaF5Ye65bem6L6555WMXHJcbiAgICAgICAgICAgIGxlZnQgPSA4ICsgcG9wdXBTaXplLndpZHRoO1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVYID0gXCItMTAwJVwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgLy8g5by556qX5Zyo6Kem5Y+R5YWD57Sg5bem5L6nXHJcbiAgICAgICAgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgLSB0aGlzLm9mZnNldDtcclxuICAgICAgICB0cmFuc2xhdGVYID0gXCItMTAwJVwiO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICAvLyDkuIrlr7npvZBcclxuICAgICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LnRvcDtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIjBcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcImNlbnRlclwiKSB7XHJcbiAgICAgICAgICAvLyDlsYXkuK3lr7npvZBcclxuICAgICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCArIHRyaWdnZXJIZWlnaHQgLyAyO1xyXG4gICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTUwJVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDkuIvlr7npvZDvvIhlbmTvvIlcclxuICAgICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LmJvdHRvbTtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOi+ueeVjOe6puadn++8muehruS/neW8ueeql+S4jei2heWHuuinhuWPo1xyXG4gICAgICAgIGNvbnN0IHBvcHVwTGVmdFNpZGUgPSBsZWZ0IC0gcG9wdXBTaXplLndpZHRoO1xyXG4gICAgICAgIGlmIChwb3B1cExlZnRTaWRlIDwgMCkge1xyXG4gICAgICAgICAgbGVmdCA9IDg7IC8vIOi3neemu+W3puS+p+iHs+WwkThweFxyXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IFwiMFwiOyAvLyDlj5bmtojlkJHlt6blgY/np7tcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5Z6C55u06L6555WM57qm5p2f77ya5bC96YeP5L+d5oyB5Y6f5aeL5a+56b2Q5pa55byPXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcclxuICAgICAgICAgIC8vIOS4iuWvuem9kO+8muWmguaenOi2heWHuuS4i+i+ueeVjO+8jOiwg+aVtOWIsOS4i+i+ueeVjO+8m+WmguaenOi2heWHuuS4iui+ueeVjO+8jOiwg+aVtOWIsOS4iui+ueeVjFxyXG4gICAgICAgICAgaWYgKHRvcCArIHBvcHVwU2l6ZS5oZWlnaHQgPiB2aWV3cG9ydEhlaWdodCkge1xyXG4gICAgICAgICAgICB0b3AgPSB2aWV3cG9ydEhlaWdodCAtIHBvcHVwU2l6ZS5oZWlnaHQgLSA4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRvcCA8IDgpIHtcclxuICAgICAgICAgICAgdG9wID0gODtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcImNlbnRlclwiKSB7XHJcbiAgICAgICAgICAvLyDlsYXkuK3lr7npvZDvvJrorqHnrpflrp7pmYXkuIrovrnnlYxcclxuICAgICAgICAgIGNvbnN0IGFjdHVhbFRvcCA9IHRvcCAtIHBvcHVwU2l6ZS5oZWlnaHQgLyAyO1xyXG4gICAgICAgICAgaWYgKGFjdHVhbFRvcCA8IDgpIHtcclxuICAgICAgICAgICAgLy8g5LiK6L6555WM5LiN6Laz77yM5bC96YeP5L+d5oyB5bGF5Lit77yM5L2G6LCD5pW05Yiw5LiN6LaF5Ye65LiK6L6555WMXHJcbiAgICAgICAgICAgIHRvcCA9IDggKyBwb3B1cFNpemUuaGVpZ2h0IC8gMjtcclxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTUwJVwiO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxUb3AgKyBwb3B1cFNpemUuaGVpZ2h0ID4gdmlld3BvcnRIZWlnaHQgLSA4KSB7XHJcbiAgICAgICAgICAgIC8vIOS4i+i+ueeVjOS4jei2s++8jOWwvemHj+S/neaMgeWxheS4re+8jOS9huiwg+aVtOWIsOS4jei2heWHuuS4i+i+ueeVjFxyXG4gICAgICAgICAgICB0b3AgPSB2aWV3cG9ydEhlaWdodCAtIDggLSBwb3B1cFNpemUuaGVpZ2h0IC8gMjtcclxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTUwJVwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDkuIvlr7npvZDvvIhlbmTvvInvvJrlpoLmnpzotoXlh7rkuIrovrnnlYzvvIzosIPmlbTliLDkuIrovrnnlYzvvJvlpoLmnpzotoXlh7rkuIvovrnnlYzvvIzosIPmlbTliLDkuIvovrnnlYxcclxuICAgICAgICAgIGNvbnN0IGFjdHVhbFRvcCA9IHRvcCAtIHBvcHVwU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgICBpZiAoYWN0dWFsVG9wIDwgOCkge1xyXG4gICAgICAgICAgICB0b3AgPSA4ICsgcG9wdXBTaXplLmhlaWdodDtcclxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTEwMCVcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0b3AgPiB2aWV3cG9ydEhlaWdodCAtIDgpIHtcclxuICAgICAgICAgICAgdG9wID0gdmlld3BvcnRIZWlnaHQgLSA4O1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVZID0gXCItMTAwJVwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgIC8vIOW8ueeql+WcqOinpuWPkeWFg+e0oOWPs+S+p1xyXG4gICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5yaWdodCArIHRoaXMub2Zmc2V0O1xyXG4gICAgICAgIHRyYW5zbGF0ZVggPSBcIjBcIjtcclxuICAgICAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xyXG4gICAgICAgICAgLy8g5LiK5a+56b2QXHJcbiAgICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3A7XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCIwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJjZW50ZXJcIikge1xyXG4gICAgICAgICAgLy8g5bGF5Lit5a+56b2QXHJcbiAgICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgKyB0cmlnZ2VySGVpZ2h0IC8gMjtcclxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi01MCVcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5LiL5a+56b2Q77yIZW5k77yJXHJcbiAgICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC5ib3R0b207XHJcbiAgICAgICAgICB0cmFuc2xhdGVZID0gXCItMTAwJVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyDovrnnlYznuqbmnZ/vvJrnoa7kv53lvLnnqpfkuI3otoXlh7rop4blj6NcclxuICAgICAgICBpZiAobGVmdCArIHBvcHVwU2l6ZS53aWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcclxuICAgICAgICAgIGxlZnQgPSB2aWV3cG9ydFdpZHRoIC0gcG9wdXBTaXplLndpZHRoIC0gODsgLy8g6Led56a75Y+z5L6n6Iez5bCROHB4XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWeguebtOi+ueeVjOe6puadn++8muWwvemHj+S/neaMgeWOn+Wni+Wvuem9kOaWueW8j1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICAvLyDkuIrlr7npvZDvvJrlpoLmnpzotoXlh7rkuIvovrnnlYzvvIzosIPmlbTliLDkuIvovrnnlYzvvJvlpoLmnpzotoXlh7rkuIrovrnnlYzvvIzosIPmlbTliLDkuIrovrnnlYxcclxuICAgICAgICAgIGlmICh0b3AgKyBwb3B1cFNpemUuaGVpZ2h0ID4gdmlld3BvcnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdG9wID0gdmlld3BvcnRIZWlnaHQgLSBwb3B1cFNpemUuaGVpZ2h0IC0gODtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0b3AgPCA4KSB7XHJcbiAgICAgICAgICAgIHRvcCA9IDg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJjZW50ZXJcIikge1xyXG4gICAgICAgICAgLy8g5bGF5Lit5a+56b2Q77ya6K6h566X5a6e6ZmF5LiK6L6555WMXHJcbiAgICAgICAgICBjb25zdCBhY3R1YWxUb3AgPSB0b3AgLSBwb3B1cFNpemUuaGVpZ2h0IC8gMjtcclxuICAgICAgICAgIGlmIChhY3R1YWxUb3AgPCA4KSB7XHJcbiAgICAgICAgICAgIC8vIOS4iui+ueeVjOS4jei2s++8jOWwvemHj+S/neaMgeWxheS4re+8jOS9huiwg+aVtOWIsOS4jei2heWHuuS4iui+ueeVjFxyXG4gICAgICAgICAgICB0b3AgPSA4ICsgcG9wdXBTaXplLmhlaWdodCAvIDI7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi01MCVcIjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsVG9wICsgcG9wdXBTaXplLmhlaWdodCA+IHZpZXdwb3J0SGVpZ2h0IC0gOCkge1xyXG4gICAgICAgICAgICAvLyDkuIvovrnnlYzkuI3otrPvvIzlsL3ph4/kv53mjIHlsYXkuK3vvIzkvYbosIPmlbTliLDkuI3otoXlh7rkuIvovrnnlYxcclxuICAgICAgICAgICAgdG9wID0gdmlld3BvcnRIZWlnaHQgLSA4IC0gcG9wdXBTaXplLmhlaWdodCAvIDI7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi01MCVcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5LiL5a+56b2Q77yIZW5k77yJ77ya5aaC5p6c6LaF5Ye65LiK6L6555WM77yM6LCD5pW05Yiw5LiK6L6555WM77yb5aaC5p6c6LaF5Ye65LiL6L6555WM77yM6LCD5pW05Yiw5LiL6L6555WMXHJcbiAgICAgICAgICBjb25zdCBhY3R1YWxUb3AgPSB0b3AgLSBwb3B1cFNpemUuaGVpZ2h0O1xyXG4gICAgICAgICAgaWYgKGFjdHVhbFRvcCA8IDgpIHtcclxuICAgICAgICAgICAgdG9wID0gOCArIHBvcHVwU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVkgPSBcIi0xMDAlXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodG9wID4gdmlld3BvcnRIZWlnaHQgLSA4KSB7XHJcbiAgICAgICAgICAgIHRvcCA9IHZpZXdwb3J0SGVpZ2h0IC0gODtcclxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IFwiLTEwMCVcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9wOiB0b3AgKyBcInB4XCIsXHJcbiAgICAgIGxlZnQ6IGxlZnQgKyBcInB4XCIsXHJcbiAgICAgIHRyYW5zbGF0ZVgsXHJcbiAgICAgIHRyYW5zbGF0ZVksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc2V0UG9wdXBQb3NpdGlvbihcclxuICAgIHRyaWdnZXJSZWN0OiBET01SZWN0IHwgQ2xpZW50UmVjdCxcclxuICAgIHBvcHVwUmVjdDogRE9NUmVjdCB8IENsaWVudFJlY3QsXHJcbiAgICBwbGFjZW1lbnQ6IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIsXHJcbiAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXHJcbiAgICBwb3B1cFNpemU/OiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cclxuICApIHtcclxuICAgIGNvbnN0IHBvcHVwRWwgPVxyXG4gICAgICB0aGlzLnBvcHVwRWxlbWVudCAmJiB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgPyB0aGlzLnBvcHVwRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgaWYgKCFwb3B1cEVsKSB7XHJcbiAgICAgIHJldHVybjsgLy8g5aaC5p6c5YWD57Sg6L+Y5LiN5a2Y5Zyo77yM5peg5rOV6K6+572u5L2N572uXHJcbiAgICB9XHJcblxyXG4gICAgLy8g5LyY5YWI5L2/55So5Lyg5YWl55qE5Zu65a6a5bC65a+477yM5ZCm5YiZ5LuORE9N6I635Y+WXHJcbiAgICBjb25zdCBwb3B1cFdpZHRoID1cclxuICAgICAgcG9wdXBTaXplICYmIHBvcHVwU2l6ZS53aWR0aCAhPT0gbnVsbCAmJiBwb3B1cFNpemUud2lkdGggIT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gcG9wdXBTaXplLndpZHRoXHJcbiAgICAgICAgOiBwb3B1cFJlY3Qud2lkdGggfHwgcG9wdXBFbC5vZmZzZXRXaWR0aCB8fCAzMDA7XHJcbiAgICBjb25zdCBwb3B1cEhlaWdodCA9XHJcbiAgICAgIHBvcHVwU2l6ZSAmJiBwb3B1cFNpemUuaGVpZ2h0ICE9PSBudWxsICYmIHBvcHVwU2l6ZS5oZWlnaHQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gcG9wdXBTaXplLmhlaWdodFxyXG4gICAgICAgIDogcG9wdXBSZWN0LmhlaWdodCB8fCBwb3B1cEVsLm9mZnNldEhlaWdodCB8fCAyMDA7XHJcblxyXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoXHJcbiAgICAgIHRyaWdnZXJSZWN0LFxyXG4gICAgICBwbGFjZW1lbnQsXHJcbiAgICAgIHBvc2l0aW9uLFxyXG4gICAgICB7IHdpZHRoOiBwb3B1cFdpZHRoLCBoZWlnaHQ6IHBvcHVwSGVpZ2h0IH1cclxuICAgICk7XHJcblxyXG4gICAgcG9wdXBFbC5zdHlsZS50b3AgPSBjb29yZGluYXRlcy50b3A7XHJcbiAgICBwb3B1cEVsLnN0eWxlLmxlZnQgPSBjb29yZGluYXRlcy5sZWZ0O1xyXG4gICAgcG9wdXBFbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7Y29vcmRpbmF0ZXMudHJhbnNsYXRlWH0sICR7Y29vcmRpbmF0ZXMudHJhbnNsYXRlWX0pYDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuZWQgPT09IFwieWVzXCIpIHtcclxuICAgICAgdGhpcy51cGRhdGVQb3B1cFBvc2l0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==