@seniorsistemas/angular-components 17.1.2 → 17.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/bundles/seniorsistemas-angular-components.umd.js +179 -72
  2. package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
  3. package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
  4. package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
  5. package/components/gantt/components/gantt/bar.d.ts +1 -0
  6. package/components/gantt/components/gantt/gantt.d.ts +1 -1
  7. package/components/gantt/components/gantt/popup.d.ts +4 -1
  8. package/components/gantt/gantt.component.d.ts +9 -1
  9. package/components/gantt/models/options.d.ts +5 -0
  10. package/components/gantt/models/view-mode.d.ts +2 -2
  11. package/esm2015/components/dynamic-form/components/fields/chips/chips-field.component.js +1 -1
  12. package/esm2015/components/gantt/components/gantt/bar.js +61 -33
  13. package/esm2015/components/gantt/components/gantt/gantt-options.js +5 -1
  14. package/esm2015/components/gantt/components/gantt/gantt.js +44 -31
  15. package/esm2015/components/gantt/components/gantt/popup.js +37 -5
  16. package/esm2015/components/gantt/components/side-table/side-table.component.js +3 -3
  17. package/esm2015/components/gantt/gantt.component.js +41 -4
  18. package/esm2015/components/gantt/gantt.module.js +3 -2
  19. package/esm2015/components/gantt/models/options.js +1 -1
  20. package/esm2015/components/gantt/models/view-mode.js +2 -2
  21. package/esm5/components/dynamic-form/components/fields/chips/chips-field.component.js +1 -1
  22. package/esm5/components/gantt/components/gantt/bar.js +62 -34
  23. package/esm5/components/gantt/components/gantt/gantt-options.js +5 -1
  24. package/esm5/components/gantt/components/gantt/gantt.js +43 -30
  25. package/esm5/components/gantt/components/gantt/popup.js +30 -5
  26. package/esm5/components/gantt/components/side-table/side-table.component.js +3 -3
  27. package/esm5/components/gantt/gantt.component.js +41 -4
  28. package/esm5/components/gantt/gantt.module.js +3 -2
  29. package/esm5/components/gantt/models/options.js +1 -1
  30. package/esm5/components/gantt/models/view-mode.js +2 -2
  31. package/fesm2015/seniorsistemas-angular-components.js +187 -73
  32. package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
  33. package/fesm5/seniorsistemas-angular-components.js +179 -72
  34. package/fesm5/seniorsistemas-angular-components.js.map +1 -1
  35. package/package.json +1 -1
  36. package/seniorsistemas-angular-components.metadata.json +1 -1
@@ -12,5 +12,9 @@ export var defaultOptions = {
12
12
  popupTrigger: "click",
13
13
  customPopupHtml: null,
14
14
  language: "en",
15
+ allowMovement: true,
16
+ hasPopup: true,
17
+ showOnlyHours: false,
18
+ showOnlyDays: false,
15
19
  };
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2dhbnR0L2NvbXBvbmVudHMvZ2FudHQvZ2FudHQtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsTUFBTSxDQUFDLElBQU0sY0FBYyxHQUFZO0lBQ25DLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsSUFBSSxFQUFFLEVBQUU7SUFDUixTQUFTLEVBQUUsRUFBRTtJQUNiLGVBQWUsRUFBRSxDQUFDO0lBQ2xCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsT0FBTyxFQUFFLEVBQUU7SUFDWCxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUc7SUFDdEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsWUFBWSxFQUFFLE9BQU87SUFDckIsZUFBZSxFQUFFLElBQUk7SUFDckIsUUFBUSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL29wdGlvbnNcIjtcbmltcG9ydCB7IFZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uL21vZGVscy92aWV3LW1vZGVcIjtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICAgIGhlYWRlckhlaWdodDogOTQsXG4gICAgY29sdW1uV2lkdGg6IDMwLFxuICAgIHN0ZXA6IDI0LFxuICAgIGJhckhlaWdodDogMjAsXG4gICAgYmFyQ29ybmVyUmFkaXVzOiAwLFxuICAgIGFycm93Q3VydmU6IDQsXG4gICAgcGFkZGluZzogMjQsXG4gICAgdmlld01vZGU6IFZpZXdNb2RlLkRheSxcbiAgICBkYXRlRm9ybWF0OiBcIllZWVktTU0tRERcIixcbiAgICBwb3B1cFRyaWdnZXI6IFwiY2xpY2tcIixcbiAgICBjdXN0b21Qb3B1cEh0bWw6IG51bGwsXG4gICAgbGFuZ3VhZ2U6IFwiZW5cIixcbn07XG4iXX0=
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2dhbnR0L2NvbXBvbmVudHMvZ2FudHQvZ2FudHQtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsTUFBTSxDQUFDLElBQU0sY0FBYyxHQUFZO0lBQ25DLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsSUFBSSxFQUFFLEVBQUU7SUFDUixTQUFTLEVBQUUsRUFBRTtJQUNiLGVBQWUsRUFBRSxDQUFDO0lBQ2xCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsT0FBTyxFQUFFLEVBQUU7SUFDWCxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUc7SUFDdEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsWUFBWSxFQUFFLE9BQU87SUFDckIsZUFBZSxFQUFFLElBQUk7SUFDckIsUUFBUSxFQUFFLElBQUk7SUFDZCxhQUFhLEVBQUUsSUFBSTtJQUNuQixRQUFRLEVBQUUsSUFBSTtJQUNkLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLFlBQVksRUFBRSxLQUFLO0NBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb25zIH0gZnJvbSBcIi4uLy4uL21vZGVscy9vcHRpb25zXCI7XG5pbXBvcnQgeyBWaWV3TW9kZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvdmlldy1tb2RlXCI7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgICBoZWFkZXJIZWlnaHQ6IDk0LFxuICAgIGNvbHVtbldpZHRoOiAzMCxcbiAgICBzdGVwOiAyNCxcbiAgICBiYXJIZWlnaHQ6IDIwLFxuICAgIGJhckNvcm5lclJhZGl1czogMCxcbiAgICBhcnJvd0N1cnZlOiA0LFxuICAgIHBhZGRpbmc6IDI0LFxuICAgIHZpZXdNb2RlOiBWaWV3TW9kZS5EYXksXG4gICAgZGF0ZUZvcm1hdDogXCJZWVlZLU1NLUREXCIsXG4gICAgcG9wdXBUcmlnZ2VyOiBcImNsaWNrXCIsXG4gICAgY3VzdG9tUG9wdXBIdG1sOiBudWxsLFxuICAgIGxhbmd1YWdlOiBcImVuXCIsXG4gICAgYWxsb3dNb3ZlbWVudDogdHJ1ZSxcbiAgICBoYXNQb3B1cDogdHJ1ZSxcbiAgICBzaG93T25seUhvdXJzOiBmYWxzZSxcbiAgICBzaG93T25seURheXM6IGZhbHNlLFxufTtcbiJdfQ==
@@ -8,8 +8,8 @@ import { defaultOptions } from "./gantt-options";
8
8
  import { ViewMode } from "../../models/view-mode";
9
9
  var Gantt = /** @class */ (function () {
10
10
  function Gantt(wrapper, tasks, options) {
11
- this.setup_wrapper(wrapper);
12
11
  this.setup_options(options);
12
+ this.setup_wrapper(wrapper);
13
13
  this.setup_tasks(tasks);
14
14
  // initialize with default view mode
15
15
  this.change_view_mode();
@@ -61,6 +61,9 @@ var Gantt = /** @class */ (function () {
61
61
  // wrapper element
62
62
  this.$container = document.createElement("div");
63
63
  this.$container.classList.add("gantt-container");
64
+ if (this.options.containerWidth) {
65
+ this.$container.style.width = this.options.containerWidth + 'px';
66
+ }
64
67
  var parent_element = this.$svg.parentElement;
65
68
  parent_element.appendChild(this.$container);
66
69
  this.$container.appendChild(this.$svg);
@@ -166,6 +169,7 @@ var Gantt = /** @class */ (function () {
166
169
  };
167
170
  Gantt.prototype.change_view_mode = function (mode) {
168
171
  if (mode === void 0) { mode = this.options.viewMode; }
172
+ this.setup_gantt_dates();
169
173
  this.update_view_scale(mode);
170
174
  this.setup_dates();
171
175
  this.render();
@@ -178,7 +182,6 @@ var Gantt = /** @class */ (function () {
178
182
  if (view_mode === ViewMode.Hour) {
179
183
  this.options.step = 24 / 24;
180
184
  this.options.columnWidth = 50;
181
- // this.isHourView = true;
182
185
  }
183
186
  else if (view_mode === ViewMode.Day) {
184
187
  this.options.step = 24;
@@ -206,7 +209,6 @@ var Gantt = /** @class */ (function () {
206
209
  }
207
210
  };
208
211
  Gantt.prototype.setup_dates = function () {
209
- this.setup_gantt_dates();
210
212
  this.setup_date_values();
211
213
  };
212
214
  Gantt.prototype.setup_gantt_dates = function () {
@@ -219,7 +221,7 @@ var Gantt = /** @class */ (function () {
219
221
  var task = _s.value;
220
222
  // set global start and end date
221
223
  if (!this.minDate || task.start < this.minDate) {
222
- this._minDate = task.start;
224
+ this._minDate = DateUtils.startOf(task.start, 'day');
223
225
  }
224
226
  if (!this.maxDate || task.end > this.maxDate) {
225
227
  this._maxDate = task.end;
@@ -241,28 +243,28 @@ var Gantt = /** @class */ (function () {
241
243
  this._maxDate = DateUtils.add(this.maxDate, (_c = this.options.marginAfterEnd) !== null && _c !== void 0 ? _c : 1, "hour");
242
244
  break;
243
245
  case ViewMode.QuarterDay:
244
- this._minDate = DateUtils.add(this.minDate, -((_d = this.options.marginBeforeStart) !== null && _d !== void 0 ? _d : 12), "hour");
245
- this._maxDate = DateUtils.add(this.maxDate, (_e = this.options.marginAfterEnd) !== null && _e !== void 0 ? _e : 12, "hour");
246
+ this._minDate = DateUtils.add(this.minDate, -((_d = this.options.marginBeforeStart) !== null && _d !== void 0 ? _d : 6), "hour");
247
+ this._maxDate = DateUtils.add(this.maxDate, (_e = this.options.marginAfterEnd) !== null && _e !== void 0 ? _e : 6, "hour");
246
248
  break;
247
249
  case ViewMode.HalfDay:
248
- this._minDate = DateUtils.add(this.minDate, -((_f = this.options.marginBeforeStart) !== null && _f !== void 0 ? _f : 1), "day");
249
- this._maxDate = DateUtils.add(this.maxDate, (_g = this.options.marginAfterEnd) !== null && _g !== void 0 ? _g : 1, "day");
250
+ this._minDate = DateUtils.add(this.minDate, -((_f = this.options.marginBeforeStart) !== null && _f !== void 0 ? _f : 12), "hour");
251
+ this._maxDate = DateUtils.add(this.maxDate, (_g = this.options.marginAfterEnd) !== null && _g !== void 0 ? _g : 12, "hour");
250
252
  break;
251
253
  case ViewMode.Day:
252
- this._minDate = DateUtils.add(this.minDate, -((_h = this.options.marginBeforeStart) !== null && _h !== void 0 ? _h : 3), "day");
253
- this._maxDate = DateUtils.add(this.maxDate, (_j = this.options.marginAfterEnd) !== null && _j !== void 0 ? _j : 3, "day");
254
+ this._minDate = DateUtils.add(this.minDate, -((_h = this.options.marginBeforeStart) !== null && _h !== void 0 ? _h : 1), "day");
255
+ this._maxDate = DateUtils.add(this.maxDate, (_j = this.options.marginAfterEnd) !== null && _j !== void 0 ? _j : 1, "day");
254
256
  break;
255
257
  case ViewMode.Week:
256
- this._minDate = DateUtils.add(this.minDate, -((_k = this.options.marginBeforeStart) !== null && _k !== void 0 ? _k : 1), "month");
257
- this._maxDate = DateUtils.add(this.maxDate, (_l = this.options.marginAfterEnd) !== null && _l !== void 0 ? _l : 1, "month");
258
+ this._minDate = DateUtils.add(this.minDate, -((_k = this.options.marginBeforeStart) !== null && _k !== void 0 ? _k : 1), "week");
259
+ this._maxDate = DateUtils.add(this.maxDate, (_l = this.options.marginAfterEnd) !== null && _l !== void 0 ? _l : 1, "week");
258
260
  break;
259
261
  case ViewMode.Month:
260
- this._minDate = DateUtils.add(this.minDate, -((_m = this.options.marginBeforeStart) !== null && _m !== void 0 ? _m : 1), "year");
261
- this._maxDate = DateUtils.add(this.maxDate, (_o = this.options.marginAfterEnd) !== null && _o !== void 0 ? _o : 1, "year");
262
+ this._minDate = DateUtils.add(this.minDate, -((_m = this.options.marginBeforeStart) !== null && _m !== void 0 ? _m : 1), "month");
263
+ this._maxDate = DateUtils.add(this.maxDate, (_o = this.options.marginAfterEnd) !== null && _o !== void 0 ? _o : 1, "month");
262
264
  break;
263
265
  case ViewMode.Year:
264
- this._minDate = DateUtils.add(this.minDate, -((_p = this.options.marginBeforeStart) !== null && _p !== void 0 ? _p : 2), "year");
265
- this._maxDate = DateUtils.add(this.maxDate, (_q = this.options.marginAfterEnd) !== null && _q !== void 0 ? _q : 2, "year");
266
+ this._minDate = DateUtils.add(this.minDate, -((_p = this.options.marginBeforeStart) !== null && _p !== void 0 ? _p : 1), "year");
267
+ this._maxDate = DateUtils.add(this.maxDate, (_q = this.options.marginAfterEnd) !== null && _q !== void 0 ? _q : 1, "year");
266
268
  break;
267
269
  }
268
270
  };
@@ -286,6 +288,10 @@ var Gantt = /** @class */ (function () {
286
288
  }
287
289
  this.dates.push(cur_date);
288
290
  }
291
+ if (this.options.containerWidth) {
292
+ var columnWidth = (this.options.containerWidth - 1) / this.dates.length;
293
+ this.options.columnWidth = columnWidth < 45 ? 45 : columnWidth;
294
+ }
289
295
  console.log("cur_date", cur_date);
290
296
  console.log("dates", this.dates);
291
297
  };
@@ -335,6 +341,9 @@ var Gantt = /** @class */ (function () {
335
341
  };
336
342
  Gantt.prototype.make_grid_background = function () {
337
343
  var grid_width = this.dates.length * this.options.columnWidth;
344
+ if (this.options.containerWidth) {
345
+ grid_width = this.options.containerWidth;
346
+ }
338
347
  var distinct_rows = __spread(new Set(this.tasks.map(function (x) { return x._row_id; })));
339
348
  var grid_height = this.options.headerHeight +
340
349
  this.options.padding / 2 +
@@ -418,6 +427,11 @@ var Gantt = /** @class */ (function () {
418
427
  if (this.view_is(ViewMode.Month) && date.getMonth() % 3 === 0) {
419
428
  tick_class += " thick";
420
429
  }
430
+ // Thick ticks for hours
431
+ if (this.view_is(ViewMode.Hour) &&
432
+ date.getHours() == 0) {
433
+ tick_class += " thick";
434
+ }
421
435
  createSVG("path", {
422
436
  d: "M " + tick_x + " " + tick_y + " v " + tick_height,
423
437
  class: tick_class,
@@ -546,9 +560,7 @@ var Gantt = /** @class */ (function () {
546
560
  hourLower: DateUtils.format(date, "HH:mm", this.options.language),
547
561
  quarterDayLower: DateUtils.format(date, "HH:mm", this.options.language),
548
562
  halfDayLower: DateUtils.format(date, "HH:mm", this.options.language),
549
- dayLower: date.getDate() !== last_date.getDate()
550
- ? DateUtils.format(date, "D", this.options.language)
551
- : "",
563
+ dayLower: DateUtils.format(date, "D", this.options.language),
552
564
  weekLower: date.getMonth() !== last_date.getMonth()
553
565
  ? DateUtils.format(date, "D MMM", this.options.language)
554
566
  : DateUtils.format(date, "D", this.options.language),
@@ -557,12 +569,12 @@ var Gantt = /** @class */ (function () {
557
569
  quarterDayUpper: date.getDate() !== last_date.getDate()
558
570
  ? DateUtils.format(date, "D MMM", this.options.language)
559
571
  : "",
560
- halfDayUpper: date.getDate() !== last_date.getDate()
561
- ? date.getMonth() !== last_date.getMonth()
572
+ halfDayUpper: (date.getDate() !== last_date.getDate())
573
+ ? (((date.getMonth() !== last_date.getMonth()) || i < 2)
562
574
  ? DateUtils.format(date, "D MMM", this.options.language)
563
- : DateUtils.format(date, "D", this.options.language)
575
+ : DateUtils.format(date, "D", this.options.language))
564
576
  : "",
565
- dayUpper: date.getMonth() !== last_date.getMonth()
577
+ dayUpper: ((date.getMonth() !== last_date.getMonth()) || i === 0)
566
578
  ? DateUtils.format(date, "MMMM", this.options.language)
567
579
  : "",
568
580
  weekUpper: date.getMonth() !== last_date.getMonth()
@@ -574,8 +586,8 @@ var Gantt = /** @class */ (function () {
574
586
  yearUpper: date.getFullYear() !== last_date.getFullYear()
575
587
  ? DateUtils.format(date, "YYYY", this.options.language)
576
588
  : "",
577
- hour: date.getHours() !== last_date.getHours()
578
- ? DateUtils.format(date, "HH:mm", this.options.language)
589
+ hourUpper: date.getDate() !== last_date.getDate()
590
+ ? DateUtils.format(date, "D MMM", this.options.language)
579
591
  : "",
580
592
  };
581
593
  // Descontando 20 para adcionar uma segunda linha de informação no cabeçalho
@@ -584,15 +596,16 @@ var Gantt = /** @class */ (function () {
584
596
  lower_y: this.options.headerHeight - 20,
585
597
  upper_y: this.options.headerHeight - 20 - 25,
586
598
  };
599
+ debugger;
587
600
  var x_pos = {
588
601
  hourLower: this.options.columnWidth / 2,
589
- hourUpper: this.options.columnWidth * 24 / 2,
602
+ hourUpper: (this.dates.length < 14) ? (this.options.columnWidth) : (this.options.columnWidth * 24 / 2),
590
603
  quarterDayLower: this.options.columnWidth / 2,
591
604
  quarterDayUpper: this.options.columnWidth * 4 / 2,
592
605
  halfDayLower: this.options.columnWidth / 2,
593
606
  halfDayUpper: this.options.columnWidth * 2 / 2,
594
607
  dayLower: this.options.columnWidth / 2,
595
- dayUpper: (this.options.columnWidth * 30) / 2,
608
+ dayUpper: (this.dates.length < 15) ? (this.options.columnWidth) : ((this.options.columnWidth * 30) / 2),
596
609
  weekLower: 0,
597
610
  weekUpper: (this.options.columnWidth * 4) / 2,
598
611
  monthLower: this.options.columnWidth / 2,
@@ -722,7 +735,7 @@ var Gantt = /** @class */ (function () {
722
735
  else if (element.classList.contains("right")) {
723
736
  is_resizing_right = true;
724
737
  }
725
- else if (element.classList.contains("bar-wrapper")) {
738
+ else if (element.classList.contains("bar-wrapper") && _this.options.allowMovement) {
726
739
  is_dragging = true;
727
740
  }
728
741
  bar_wrapper.classList.add("active");
@@ -776,7 +789,7 @@ var Gantt = /** @class */ (function () {
776
789
  });
777
790
  }, null);
778
791
  document.addEventListener("mouseup", function (e) {
779
- if (is_dragging || is_resizing_left || is_resizing_right) {
792
+ if (is_dragging || is_resizing_left || is_resizing_right || !_this.options.allowMovement) {
780
793
  bars.forEach(function (bar) { return bar.group.classList.remove("active"); });
781
794
  }
782
795
  is_dragging = false;
@@ -880,4 +893,4 @@ export { Gantt };
880
893
  function generate_id(task) {
881
894
  return task.name + "_" + Math.random().toString(36).slice(2, 12);
882
895
  }
883
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2dhbnR0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR2xEO0lBNEJJLGVBQVksT0FBWSxFQUFFLEtBQWEsRUFBRSxPQUFpQjtRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFmRCxzQkFBVywwQkFBTzthQUFsQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUVELHNCQUFXLDBCQUFPO2FBQWxCO1lBQ0ksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBV08sNkJBQWEsR0FBckIsVUFBc0IsT0FBWTtRQUM5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RyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMzQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDcEc7YUFBTTtZQUNILEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7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SUFBUztJQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSBcIi4vdXRpbHMvZGF0ZS11dGlsc1wiO1xuaW1wb3J0IHsgJCwgY3JlYXRlU1ZHIH0gZnJvbSBcIi4vdXRpbHMvc3ZnLXV0aWxzXCI7XG5pbXBvcnQgeyBCYXIgfSBmcm9tIFwiLi9iYXJcIjtcbmltcG9ydCB7IFBvcHVwIH0gZnJvbSBcIi4vcG9wdXBcIjtcbmltcG9ydCB7IEFycm93IH0gZnJvbSBcIi4vYXJyb3dcIjtcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL29wdGlvbnNcIjtcbmltcG9ydCB7IGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vZ2FudHQtb3B0aW9uc1wiO1xuaW1wb3J0IHsgVmlld01vZGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3ZpZXctbW9kZVwiO1xuaW1wb3J0IHsgVGFzaywgRW5yaWNoZWRUYXNrIH0gZnJvbSBcIi4uLy4uL21vZGVsc1wiO1xuXG5leHBvcnQgY2xhc3MgR2FudHQge1xuICAgIHB1YmxpYyBvcHRpb25zOiBPcHRpb25zO1xuICAgIHB1YmxpYyB0YXNrczogRW5yaWNoZWRUYXNrW107XG4gICAgcHVibGljIGRlcGVuZGVuY3lfbWFwOiBhbnk7XG5cbiAgICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX21heERhdGU6IERhdGU7XG4gICAgcHJpdmF0ZSBfcmVhbE1pbkRhdGU6IERhdGU7XG4gICAgcHJpdmF0ZSBfcmVhbE1heERhdGU6IERhdGU7XG5cbiAgICBwdWJsaWMgZGF0ZXM6IGFueTtcbiAgICBwdWJsaWMgbGF5ZXJzOiBhbnk7XG4gICAgcHVibGljIGJhcnM6IEJhcltdO1xuICAgIHB1YmxpYyBhcnJvd3M6IEFycm93W107XG4gICAgcHVibGljIGJhcl9iZWluZ19kcmFnZ2VkOiBhbnk7XG4gICAgcHVibGljICRzdmc6IGFueTtcbiAgICBwdWJsaWMgJGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHVibGljIHBvcHVwX3dyYXBwZXI6IEhUTUxEaXZFbGVtZW50O1xuICAgIHB1YmxpYyBwb3B1cDogYW55O1xuXG4gICAgcHVibGljIGdldCBtaW5EYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heERhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHdyYXBwZXI6IGFueSwgdGFza3M6IFRhc2tbXSwgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zZXR1cF93cmFwcGVyKHdyYXBwZXIpO1xuICAgICAgICB0aGlzLnNldHVwX29wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICAvLyBpbml0aWFsaXplIHdpdGggZGVmYXVsdCB2aWV3IG1vZGVcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgICAgIHRoaXMuYmluZF9ldmVudHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX3dyYXBwZXIoZWxlbWVudDogYW55KSB7XG4gICAgICAgIGxldCBzdmdfZWxlbWVudCwgd3JhcHBlcl9lbGVtZW50O1xuXG4gICAgICAgIC8vIENTUyBTZWxlY3RvciBpcyBwYXNzZWRcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCB0aGUgU1ZHRWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB3cmFwcGVyX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgc3ZnX2VsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdmdcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHN2Z19lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGcmFwcMOpIEdhbnR0IG9ubHkgc3VwcG9ydHMgdXNhZ2Ugb2YgYSBzdHJpbmcgQ1NTIHNlbGVjdG9yLCBIVE1MIERPTSBlbGVtZW50IG9yIFNWRyBET00gZWxlbWVudCBmb3IgdGhlIFxcJ2VsZW1lbnRcXCcgcGFyYW1ldGVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdmcgZWxlbWVudFxuICAgICAgICBpZiAoIXN2Z19lbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgaXRcbiAgICAgICAgICAgIHRoaXMuJHN2ZyA9IGNyZWF0ZVNWRyhcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB3cmFwcGVyX2VsZW1lbnQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiZ2FudHRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kc3ZnID0gc3ZnX2VsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLiRzdmcuY2xhc3NMaXN0LmFkZChcImdhbnR0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd3JhcHBlciBlbGVtZW50XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZ2FudHQtY29udGFpbmVyXCIpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudF9lbGVtZW50ID0gdGhpcy4kc3ZnLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHBhcmVudF9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuJGNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRzdmcpO1xuXG4gICAgICAgIC8vIHBvcHVwIHdyYXBwZXJcbiAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cC13cmFwcGVyXCIpO1xuICAgICAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wb3B1cF93cmFwcGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX29wdGlvbnMob3B0aW9uczogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0dXBfdGFza3ModGFza3M6IGFueSkge1xuICAgICAgICAvLyBwcmVwYXJlIHRhc2tzXG4gICAgICAgIHRoaXMudGFza3MgPSB0YXNrcy5tYXAoKHRhc2s6IGFueSwgaTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL3N0YW5kYXJkIGNvbG9ycyBpZiBuZWVkZWRcbiAgICAgICAgICAgIHRhc2suY29sb3IgPSB0YXNrLmNvbG9yIHx8ICcjNzg5MkExJztcblxuICAgICAgICAgICAgLy8gY29udmVydCB0byBEYXRlIG9iamVjdHNcbiAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gRGF0ZVV0aWxzLnBhcnNlKHRhc2suc3RhcnQpO1xuICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLnBhcnNlKHRhc2suZW5kKTtcblxuICAgICAgICAgICAgLy8gbWFrZSB0YXNrIGludmFsaWQgaWYgZHVyYXRpb24gdG9vIGxhcmdlXG4gICAgICAgICAgICBpZiAoRGF0ZVV0aWxzLmRpZmYodGFzay5fZW5kLCB0YXNrLl9zdGFydCwgXCJ5ZWFyXCIpID4gMTApIHtcbiAgICAgICAgICAgICAgICB0YXNrLmVuZCA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIGluZGV4XG4gICAgICAgICAgICB0YXNrLl9pbmRleCA9IGk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFzay5fcm93X2lkID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgdGFzay5faW5kZXggPSB0YXNrLl9yb3dfaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGludmFsaWQgZGF0ZXNcbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCAmJiAhdGFzay5lbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2RheSA9IERhdGVVdGlscy50b2RheSgpO1xuICAgICAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gdG9kYXk7XG4gICAgICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLmFkZCh0b2RheSwgMiwgXCJkYXlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCAmJiB0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gRGF0ZVV0aWxzLmFkZCh0YXNrLl9lbmQsIC0yLCAnZGF5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXNrLnN0YXJ0ICYmICF0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIHRhc2suX2VuZCA9IERhdGVVdGlscy5hZGQodGFzay5fc3RhcnQsIDIsIFwiZGF5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBob3VycyBpcyBub3Qgc2V0LCBhc3N1bWUgdGhlIGxhc3QgZGF5IGlzIGZ1bGwgZGF5XG4gICAgICAgICAgICAvLyBlLmc6IDIwMTgtMDktMDkgYmVjb21lcyAyMDE4LTA5LTA5IDIzOjU5OjU5XG4gICAgICAgICAgICBjb25zdCB0YXNrX2VuZF92YWx1ZXMgPSBEYXRlVXRpbHMuZ2V0RGF0ZVZhbHVlcyh0YXNrLl9lbmQpO1xuICAgICAgICAgICAgaWYgKHRhc2tfZW5kX3ZhbHVlcy5zbGljZSgzKS5ldmVyeSgoZCkgPT4gZCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMuYWRkKHRhc2suX2VuZCwgMjQsIFwiaG91clwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW52YWxpZCBmbGFnXG4gICAgICAgICAgICBpZiAoIXRhc2suc3RhcnQgfHwgIXRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRhc2suZGVwZW5kZW5jaWVzID09PSBcInN0cmluZ1wiIHx8ICF0YXNrLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgIGxldCBkZXBzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHRhc2suZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHMgPSB0YXNrLmRlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGQ6IGFueSkgPT4gZC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+IGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrLmRlcGVuZGVuY2llcyA9IGRlcHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVpZHNcbiAgICAgICAgICAgIGlmICghdGFzay5pZCkge1xuICAgICAgICAgICAgICAgIHRhc2suaWQgPSBnZW5lcmF0ZV9pZCh0YXNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0dXBfZGVwZW5kZW5jaWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jeV9tYXAgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIHQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcFtkXSA9IHRoaXMuZGVwZW5kZW5jeV9tYXBbZF0gfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcFtkXS5wdXNoKHQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2godGFza3M6IFRhc2tbXSkge1xuICAgICAgICB0aGlzLnNldHVwX3Rhc2tzKHRhc2tzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZV92aWV3X21vZGUobW9kZSA9IHRoaXMub3B0aW9ucy52aWV3TW9kZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZV92aWV3X3NjYWxlKG1vZGUpO1xuICAgICAgICB0aGlzLnNldHVwX2RhdGVzKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIC8vIGZpcmUgdmlld21vZGVfY2hhbmdlIGV2ZW50XG4gICAgICAgIHRoaXMudHJpZ2dlcl9ldmVudChcIm9uVmlld0NoYW5nZVwiLCBbbW9kZV0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlX3ZpZXdfc2NhbGUodmlld19tb2RlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnZpZXdNb2RlID0gdmlld19tb2RlO1xuICAgICAgICAvLyB0aGlzLmlzSG91clZpZXcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuSG91cikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgICAgICAvLyB0aGlzLmlzSG91clZpZXcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5IYWxmRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuUXVhcnRlckRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDQ7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLldlZWspIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiA3O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gMTQwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuTW9udGgpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzMDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDEyMDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlllYXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzNjU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSAxMjA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RhdGVzKCkge1xuICAgICAgICB0aGlzLnNldHVwX2dhbnR0X2RhdGVzKCk7XG4gICAgICAgIHRoaXMuc2V0dXBfZGF0ZV92YWx1ZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2dhbnR0X2RhdGVzKCkge1xuICAgICAgICB0aGlzLl9taW5EYXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgdGFzayBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICAvLyBzZXQgZ2xvYmFsIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1pbkRhdGUgfHwgdGFzay5zdGFydCA8IHRoaXMubWluRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSB0YXNrLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1heERhdGUgfHwgdGFzay5lbmQgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGFzay5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWFsTWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgdGhpcy5fcmVhbE1heERhdGUgPSB0aGlzLm1heERhdGU7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudmlld01vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSG91cjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5RdWFydGVyRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMTIpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMTIsIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSGFsZkRheTpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMyksIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDMsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5XZWVrOlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMSksIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuTW9udGg6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuWWVhcjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDIpLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMiwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kYXRlX3ZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5kYXRlcyA9IFtdO1xuICAgICAgICBsZXQgY3VyX2RhdGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJfZGF0ZSA9PT0gbnVsbCB8fCBjdXJfZGF0ZSA8IHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFjdXJfZGF0ZSkge1xuICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmNsb25lKHRoaXMubWluRGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuWWVhcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuYWRkKGN1cl9kYXRlLCAxLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmFkZChjdXJfZGF0ZSwgMSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2hvdXInXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRlcy5wdXNoKGN1cl9kYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY3VyX2RhdGVcIiwgY3VyX2RhdGUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcImRhdGVzXCIsIHRoaXMuZGF0ZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ldmVudHMoKSB7XG4gICAgICAgIHRoaXMuYmluZF9ncmlkX2NsaWNrKCk7XG4gICAgICAgIHRoaXMuYmluZF9iYXJfZXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZXR1cF9sYXllcnMoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2RhdGVzKCk7XG4gICAgICAgIHRoaXMubWFrZV9iYXJzKCk7XG4gICAgICAgIHRoaXMubWFrZV9hcnJvd3MoKTtcbiAgICAgICAgdGhpcy5tYXBfYXJyb3dzX29uX2JhcnMoKTtcbiAgICAgICAgdGhpcy5zZXRfd2lkdGgoKTtcbiAgICAgICAgdGhpcy5zZXRfc2Nyb2xsX3Bvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9sYXllcnMoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzID0ge307XG4gICAgICAgIGNvbnN0IGxheWVycyA9IFtcImdyaWRcIiwgXCJkYXRlXCIsIFwiYXJyb3dcIiwgXCJwcm9ncmVzc1wiLCBcImJhclwiLCBcImRldGFpbHNcIl07XG4gICAgICAgIC8vIG1ha2UgZ3JvdXAgbGF5ZXJzXG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5sYXllcnNbbGF5ZXJdID0gY3JlYXRlU1ZHKCdnJywge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBsYXllcixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMuJHN2ZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWQoKSB7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX2JhY2tncm91bmQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfcm93cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF9oZWFkZXIoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfaGlnaGxpZ2h0cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF90aWNrcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX2JhY2tncm91bmQoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRfd2lkdGggPSB0aGlzLmRhdGVzLmxlbmd0aCAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgZGlzdGluY3Rfcm93cyA9IFsuLi5uZXcgU2V0KHRoaXMudGFza3MubWFwKCh4OiBhbnkpID0+IHguX3Jvd19pZCkpXTtcbiAgICAgICAgY29uc3QgZ3JpZF9oZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMiArXG4gICAgICAgICAgICAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICBkaXN0aW5jdF9yb3dzLmxlbmd0aDtcblxuICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgd2lkdGg6IGdyaWRfd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGdyaWRfaGVpZ2h0LFxuICAgICAgICAgICAgY2xhc3M6IFwiZ3JpZC1iYWNrZ3JvdW5kXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQuYXR0cih0aGlzLiRzdmcsIHtcbiAgICAgICAgICAgIGhlaWdodDogZ3JpZF9oZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIH0sIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX3Jvd3MoKSB7XG4gICAgICAgIGNvbnN0IHJvd3NfbGF5ZXIgPSBjcmVhdGVTVkcoXCJnXCIsIHsgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkIH0pO1xuICAgICAgICBjb25zdCBsaW5lc19sYXllciA9IGNyZWF0ZVNWRyhcImdcIiwgeyBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQgfSk7XG5cbiAgICAgICAgY29uc3Qgcm93X3dpZHRoID0gdGhpcy5kYXRlcy5sZW5ndGggKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgIGNvbnN0IHJvd19oZWlnaHQgPSB0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgICAgIC8vVE9ETzogIGFqdXN0YXIgbyBwb3NpY2lvbmFtZW50byBkYXMgbGluaGFzXG4gICAgICAgIGxldCByb3dfeSA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDI7XG5cbiAgICAgICAgdGhpcy50YXNrcy5mb3JFYWNoKF8gPT4ge1xuICAgICAgICAgICAgY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiByb3dfeSxcbiAgICAgICAgICAgICAgICB3aWR0aDogcm93X3dpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJncmlkLXJvd1wiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogcm93c19sYXllcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjcmVhdGVTVkcoXCJsaW5lXCIsIHtcbiAgICAgICAgICAgICAgICB4MTogMCxcbiAgICAgICAgICAgICAgICB5MTogcm93X3kgKyByb3dfaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHgyOiByb3dfd2lkdGgsXG4gICAgICAgICAgICAgICAgeTI6IHJvd195ICsgcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJyb3ctbGluZVwiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogbGluZXNfbGF5ZXIsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcm93X3kgKz0gdGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF9oZWFkZXIoKSB7XG4gICAgICAgIC8vIGNvbnN0IGFkZElzSG91clZpZXcgPSB0aGlzLmlzSG91clZpZXcgPyAyNSA6IDEwXG4gICAgICAgIGNvbnN0IGhlYWRlcl93aWR0aCA9IHRoaXMuZGF0ZXMubGVuZ3RoICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBoZWFkZXJfaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIDEwO1xuICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgd2lkdGg6IGhlYWRlcl93aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVhZGVyX2hlaWdodCxcbiAgICAgICAgICAgIGNsYXNzOiBcImdyaWQtaGVhZGVyXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX3RpY2tzKCkge1xuICAgICAgICBsZXQgdGlja194ID0gMDtcbiAgICAgICAgbGV0IHRpY2tfeSA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDI7XG4gICAgICAgIGxldCB0aWNrX2hlaWdodCA9XG4gICAgICAgICAgICAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICB0aGlzLnRhc2tzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWNrX2NsYXNzID0gXCJ0aWNrXCI7XG4gICAgICAgICAgICAvLyB0aGljayB0aWNrIGZvciBtb25kYXlcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSAmJiBkYXRlLmdldERhdGUoKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIGZpcnN0IHdlZWtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdfaXMoVmlld01vZGUuV2VlaykgJiZcbiAgICAgICAgICAgICAgICBkYXRlLmdldERhdGUoKSA+PSAxICYmXG4gICAgICAgICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPCA4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGljayB0aWNrcyBmb3IgcXVhcnRlcnNcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpICYmIGRhdGUuZ2V0TW9udGgoKSAlIDMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgIGQ6IGBNICR7dGlja194fSAke3RpY2tfeX0gdiAke3RpY2tfaGVpZ2h0fWAsXG4gICAgICAgICAgICAgICAgY2xhc3M6IHRpY2tfY2xhc3MsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgdGlja194ICs9XG4gICAgICAgICAgICAgICAgICAgIChEYXRlVXRpbHMuZ2V0RGF5c0luTW9udGgoZGF0ZSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKSAvXG4gICAgICAgICAgICAgICAgICAgIDMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWNrX3ggKz0gdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZV9ncmlkX2hpZ2hsaWdodHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcblxuICAgICAgICAgICAgbGV0IHggPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcblxuICAgICAgICAgICAgICAgIGxldCB5ID0gKHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgLyAyO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzVG9kYXkgPSBkYXRlLnRvU3RyaW5nKCkgPT0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzV2Vla2VuZCA9IChkYXRlLmdldERheSgpID09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gXCJ0b2RheS1oaWdobGlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICh0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBcIndlZWtlbmQtaGlnaGxpZ2h0XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcnggPSAzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gMztcblxuICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5IHx8IGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcngsXG4gICAgICAgICAgICAgICAgICAgICAgICByeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4ICs9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9kYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmdldF9kYXRlc190b19kcmF3KCk7XG4gICAgICAgIGNvbnN0IGlzSG91clZpZXcgPSB0aGlzLnZpZXdfaXMoW1ZpZXdNb2RlLkhvdXIsIFZpZXdNb2RlLlF1YXJ0ZXJEYXksIFZpZXdNb2RlLkhhbGZEYXldKTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkYXRlc1tpXTtcblxuICAgICAgICAgICAgaWYgKGlzSG91clZpZXcgJiYgZGF0ZS5kYXRlID49IHRoaXMuX3JlYWxNaW5EYXRlICYmIGRhdGUuZGF0ZSA8PSB0aGlzLl9yZWFsTWF4RGF0ZSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLmxvd2VyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUubG93ZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBgSCR7Y291bnRlcisrICogdGhpcy5vcHRpb25zLnN0ZXB9YCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFwidGl0bGUtMVwiLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmRhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgIHg6IGRhdGUubG93ZXJfeCxcbiAgICAgICAgICAgICAgICB5OiBkYXRlLmxvd2VyX3kgKyAyMCxcbiAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUubG93ZXJfdGV4dCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJ0aXRsZS0yXCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRlLnVwcGVyX3RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkdXBwZXJfdGV4dCA9IGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLnVwcGVyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUudXBwZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBkYXRlLnVwcGVyX3RleHQsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcInVwcGVyLXRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG91dC1vZi1ib3VuZCBkYXRlc1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQuZ2V0QkJveCgpLngyID4gdGhpcy5sYXllcnMuZ3JpZC5nZXRCQm94KCkud2lkdGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfZGF0ZXNfdG9fZHJhdygpIHtcbiAgICAgICAgbGV0IGxhc3RfZGF0ZTogYW55ID0gbnVsbDtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmRhdGVzLm1hcCgoZGF0ZTogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmdldF9kYXRlX2luZm8oZGF0ZSwgbGFzdF9kYXRlLCBpKTtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9kYXRlX2luZm8oZGF0ZTogRGF0ZSwgbGFzdF9kYXRlOiBEYXRlLCBpOiBhbnkpIHtcbiAgICAgICAgaWYgKCFsYXN0X2RhdGUpIHtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IERhdGVVdGlscy5hZGQoZGF0ZSwgMSwgXCJ5ZWFyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGVfdGV4dCA9IHtcbiAgICAgICAgICAgIGhvdXJMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGRheUxvd2VyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgd2Vla0xvd2VyOiBkYXRlLmdldE1vbnRoKCkgIT09IGxhc3RfZGF0ZS5nZXRNb250aCgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgbW9udGhMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgeWVhckxvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICBxdWFydGVyRGF5VXBwZXI6IGRhdGUuZ2V0RGF0ZSgpICE9PSBsYXN0X2RhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgaGFsZkRheVVwcGVyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKVxuICAgICAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgZGF5VXBwZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJNTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIHdlZWtVcHBlcjogZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgbW9udGhVcHBlcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBsYXN0X2RhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgeWVhclVwcGVyOiBkYXRlLmdldEZ1bGxZZWFyKCkgIT09IGxhc3RfZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICBob3VyOiBkYXRlLmdldEhvdXJzKCkgIT09IGxhc3RfZGF0ZS5nZXRIb3VycygpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiSEg6bW1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBEZXNjb250YW5kbyAyMCBwYXJhIGFkY2lvbmFyIHVtYSBzZWd1bmRhIGxpbmhhIGRlIGluZm9ybWHDp8OjbyBubyBjYWJlw6dhbGhvXG4gICAgICAgIGNvbnN0IGJhc2VfcG9zID0ge1xuICAgICAgICAgICAgeDogaSAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCxcbiAgICAgICAgICAgIGxvd2VyX3k6IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgLSAyMCxcbiAgICAgICAgICAgIHVwcGVyX3k6IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgLSAyMCAtIDI1LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHhfcG9zID0ge1xuICAgICAgICAgICAgaG91ckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgaG91clVwcGVyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAyNCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5VXBwZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDQgLyAyLFxuICAgICAgICAgICAgaGFsZkRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgaGFsZkRheVVwcGVyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAyIC8gMixcbiAgICAgICAgICAgIGRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgZGF5VXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAzMCkgLyAyLFxuICAgICAgICAgICAgd2Vla0xvd2VyOiAwLFxuICAgICAgICAgICAgd2Vla1VwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCkgLyAyLFxuICAgICAgICAgICAgbW9udGhMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIG1vbnRoVXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAxMikgLyAyLFxuICAgICAgICAgICAgeWVhckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgeWVhclVwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMzApIC8gMixcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBwZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgbG93ZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeTogYmFzZV9wb3MudXBwZXJfeSxcbiAgICAgICAgICAgIGxvd2VyX3g6IGJhc2VfcG9zLnggKyB4X3Bvc1tgJHt0aGlzLm9wdGlvbnMudmlld01vZGV9TG93ZXJgXSxcbiAgICAgICAgICAgIGxvd2VyX3k6IGJhc2VfcG9zLmxvd2VyX3ksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9iYXJzKCkge1xuICAgICAgICB0aGlzLmJhcnMgPSB0aGlzLnRhc2tzLm1hcCgodGFzazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBuZXcgQmFyKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgdGhpcy5sYXllcnMuYmFyLmFwcGVuZENoaWxkKGJhci5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gYmFyO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfYXJyb3dzKCkge1xuICAgICAgICB0aGlzLmFycm93cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGxldCBhcnJvd3MgPSBbXTtcbiAgICAgICAgICAgIGFycm93cyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgLm1hcCgodGFza19pZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSB0aGlzLmdldF90YXNrKHRhc2tfaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyb3cgPSBuZXcgQXJyb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJzW2RlcGVuZGVuY3kuX2luZGV4XSwgLy8gZnJvbV90YXNrXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnNbdGFzay5faW5kZXhdIC8vIHRvX3Rhc2tcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMuYXJyb3cuYXBwZW5kQ2hpbGQoYXJyb3cuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJvdztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7IC8vIGZpbHRlciBmYWxzeSB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuYXJyb3dzID0gdGhpcy5hcnJvd3MuY29uY2F0KGFycm93cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcF9hcnJvd3Nfb25fYmFycygpIHtcbiAgICAgICAgZm9yIChsZXQgYmFyIG9mIHRoaXMuYmFycykge1xuICAgICAgICAgICAgYmFyLmFycm93cyA9IHRoaXMuYXJyb3dzLmZpbHRlcigoYXJyb3c6IEFycm93KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cuZnJvbVRhc2sudGFzay5pZCA9PT0gYmFyLnRhc2suaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cudG9UYXNrLnRhc2suaWQgPT09IGJhci50YXNrLmlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRfd2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cl93aWR0aCA9IHRoaXMuJHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgYWN0dWFsX3dpZHRoID0gdGhpcy4kc3ZnXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIi5ncmlkIC5ncmlkLXJvd1wiKVxuICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShcIndpZHRoXCIpO1xuICAgICAgICBpZiAoY3VyX3dpZHRoIDwgYWN0dWFsX3dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYWN0dWFsX3dpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0X3Njcm9sbF9wb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKCFwYXJlbnRfZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzX2JlZm9yZV9maXJzdF90YXNrID0gRGF0ZVV0aWxzLmRpZmYoXG4gICAgICAgICAgICB0aGlzLmdldF9vbGRlc3Rfc3RhcnRpbmdfZGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5taW5EYXRlLFxuICAgICAgICAgICAgXCJob3VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxfcG9zID1cbiAgICAgICAgICAgIChob3Vyc19iZWZvcmVfZmlyc3RfdGFzayAvIHRoaXMub3B0aW9ucy5zdGVwKSAqXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuXG4gICAgICAgIHBhcmVudF9lbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxfcG9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ncmlkX2NsaWNrKCkge1xuICAgICAgICAkLm9uKFxuICAgICAgICAgICAgdGhpcy4kc3ZnLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvcHVwVHJpZ2dlcixcbiAgICAgICAgICAgIFwiLmdyaWQtcm93LCAuZ3JpZC1oZWFkZXJcIixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0X2FsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9iYXJfZXZlbnRzKCkge1xuICAgICAgICBsZXQgaXNfZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHhfb25fc3RhcnQgPSAwO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhcmVudF9iYXJfaWQ6IGFueSA9IG51bGw7XG4gICAgICAgIGxldCBiYXJzOiBCYXJbXSA9IFtdO1xuICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcblxuICAgICAgICBmdW5jdGlvbiBhY3Rpb25faW5fcHJvZ3Jlc3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfZHJhZ2dpbmcgfHwgaXNfcmVzaXppbmdfbGVmdCB8fCBpc19yZXNpemluZ19yaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlZG93blwiLCBcIi5iYXItd3JhcHBlciwgLmhhbmRsZVwiLCAoZTogYW55LCBlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhcl93cmFwcGVyID0gJC5jbG9zZXN0KFwiLmJhci13cmFwcGVyXCIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJsZWZ0XCIpKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmlnaHRcIikpIHtcbiAgICAgICAgICAgICAgICBpc19yZXNpemluZ19yaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYmFyLXdyYXBwZXJcIikpIHtcbiAgICAgICAgICAgICAgICBpc19kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhcl93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG5cbiAgICAgICAgICAgIHhfb25fc3RhcnQgPSBlLm9mZnNldFg7XG5cbiAgICAgICAgICAgIHBhcmVudF9iYXJfaWQgPSBiYXJfd3JhcHBlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gW1xuICAgICAgICAgICAgICAgIHBhcmVudF9iYXJfaWQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRfYWxsX2RlcGVuZGVudF90YXNrcyhwYXJlbnRfYmFyX2lkKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBiYXJzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0X2JhcihpZCkpO1xuXG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gcGFyZW50X2Jhcl9pZDtcblxuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgJGJhci5veCA9ICRiYXIuZ2V0WCgpO1xuICAgICAgICAgICAgICAgICRiYXIub3kgPSAkYmFyLmdldFkoKTtcbiAgICAgICAgICAgICAgICAkYmFyLm93aWR0aCA9ICRiYXIuZ2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAkYmFyLmZpbmFsZHggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlbW92ZVwiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFjdGlvbl9pbl9wcm9ncmVzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkeCA9IGUub2Zmc2V0WCAtIHhfb25fc3RhcnQ7XG5cbiAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGJhciA9IGJhci5lbGVtZW50O1xuICAgICAgICAgICAgICAgICRiYXIuZmluYWxkeCA9IHRoaXMuZ2V0X3NuYXBfcG9zaXRpb24oZHgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgICAgIGlmIChpc19yZXNpemluZ19sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfYmFyX2lkID09PSBiYXIudGFzay5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAkYmFyLm93aWR0aCAtICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3Jlc2l6aW5nX3JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfYmFyX2lkID09PSBiYXIudGFzay5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJGJhci5vd2lkdGggKyAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHsgeDogJGJhci5veCArICRiYXIuZmluYWxkeCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgbnVsbCk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzX2RyYWdnaW5nIHx8IGlzX3Jlc2l6aW5nX2xlZnQgfHwgaXNfcmVzaXppbmdfcmlnaHQpIHtcbiAgICAgICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4gYmFyLmdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpc19kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICAgICAgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC5vbih0aGlzLiRzdmcsIFwibW91c2V1cFwiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcbiAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGJhciA9IGJhci5lbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghJGJhci5maW5hbGR4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgYmFyLmRhdGVDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgYmFyLnNldEFjdGlvbkNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X2FsbF9kZXBlbmRlbnRfdGFza3ModGFza19pZDogYW55KSB7XG4gICAgICAgIGxldCBvdXQ6IGFueVtdID0gW107XG4gICAgICAgIGxldCB0b19wcm9jZXNzID0gW3Rhc2tfaWRdO1xuICAgICAgICB3aGlsZSAodG9fcHJvY2Vzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcHMgPSB0b19wcm9jZXNzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjID0gYWNjLmNvbmNhdCh0aGlzLmRlcGVuZGVuY3lfbWFwW2N1cnJdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KGRlcHMpO1xuICAgICAgICAgICAgdG9fcHJvY2VzcyA9IGRlcHMuZmlsdGVyKChkOiBhbnkpID0+ICF0b19wcm9jZXNzLmluY2x1ZGVzKGQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X3NuYXBfcG9zaXRpb24oZHg6IGFueSkge1xuICAgICAgICBsZXQgb2R4ID0gZHgsXG4gICAgICAgICAgICByZW0sXG4gICAgICAgICAgICBwb3NpdGlvbjtcblxuICAgICAgICBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLkhvdXIpKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2KTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDEyID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDYpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5XZWVrKSkge1xuICAgICAgICAgICAgcmVtID0gZHggJSAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNyk7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAxNCA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA3KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAzMCk7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2MCA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAzMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHVuc2VsZWN0X2FsbCgpIHtcbiAgICAgICAgWy4uLnRoaXMuJHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLmJhci13cmFwcGVyXCIpXS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHZpZXdfaXMobW9kZXM6IFZpZXdNb2RlIHwgVmlld01vZGVbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBtb2Rlcy5zb21lKChtb2RlKSA9PiB0aGlzLm9wdGlvbnMudmlld01vZGUgPT09IG1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy52aWV3TW9kZSA9PT0gbW9kZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfdGFzayhpZDogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tzLmZpbmQoKHRhc2s6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhc2suaWQgPT09IGlkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0X2JhcihpZDogYW55KTogQmFyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFycy5maW5kKChiYXI6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJhci50YXNrLmlkID09PSBpZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dfcG9wdXAob3B0aW9uczogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5wb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cCA9IG5ldyBQb3B1cChcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVBvcHVwSHRtbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcHVwLnNob3cob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlX3BvcHVwKCkge1xuICAgICAgICB0aGlzLnBvcHVwICYmIHRoaXMucG9wdXAuaGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyX2V2ZW50KGV2ZW50OiBzdHJpbmcsIGFyZ3M6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zW2V2ZW50XSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zW2V2ZW50XS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X29sZGVzdF9zdGFydGluZ19kYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrc1xuICAgICAgICAgICAgLm1hcCgodGFzazogYW55KSA9PiB0YXNrLl9zdGFydClcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZfZGF0ZTogYW55LCBjdXJfZGF0ZTogYW55KSA9PlxuICAgICAgICAgICAgICAgIGN1cl9kYXRlIDw9IHByZXZfZGF0ZSA/IGN1cl9kYXRlIDogcHJldl9kYXRlXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuJHN2Zy5pbm5lckhUTUwgPSAnJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlX2lkKHRhc2s6IGFueSkge1xuICAgIHJldHVybiB0YXNrLm5hbWUgKyBcIl9cIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEyKTtcbn1cbiJdfQ==
896
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2dhbnR0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR2xEO0lBNEJJLGVBQVksT0FBWSxFQUFFLEtBQWEsRUFBRSxPQUFpQjtRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFmRCxzQkFBVywwQkFBTzthQUFsQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUVELHNCQUFXLDBCQUFPO2FBQWxCO1lBQ0ksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBV08sNkJBQWEsR0FBckIsVUFBc0IsT0FBWTtRQUM5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RWIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25HO2FBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25HO2FBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0MsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFD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O0lBQzdCLENBQUM7SUFDTCxZQUFDO0FBQUQsQ0FBQyxBQTU1QkQsSUE0NUJDOztBQUVELFNBQVMsV0FBVyxDQUFDLElBQVM7SUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gXCIuL3V0aWxzL2RhdGUtdXRpbHNcIjtcbmltcG9ydCB7ICQsIGNyZWF0ZVNWRyB9IGZyb20gXCIuL3V0aWxzL3N2Zy11dGlsc1wiO1xuaW1wb3J0IHsgQmFyIH0gZnJvbSBcIi4vYmFyXCI7XG5pbXBvcnQgeyBQb3B1cCB9IGZyb20gXCIuL3BvcHVwXCI7XG5pbXBvcnQgeyBBcnJvdyB9IGZyb20gXCIuL2Fycm93XCI7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSBcIi4uLy4uL21vZGVscy9vcHRpb25zXCI7XG5pbXBvcnQgeyBkZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL2dhbnR0LW9wdGlvbnNcIjtcbmltcG9ydCB7IFZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uL21vZGVscy92aWV3LW1vZGVcIjtcbmltcG9ydCB7IFRhc2ssIEVucmljaGVkVGFzayB9IGZyb20gXCIuLi8uLi9tb2RlbHNcIjtcblxuZXhwb3J0IGNsYXNzIEdhbnR0IHtcbiAgICBwdWJsaWMgb3B0aW9uczogT3B0aW9ucztcbiAgICBwdWJsaWMgdGFza3M6IEVucmljaGVkVGFza1tdO1xuICAgIHB1YmxpYyBkZXBlbmRlbmN5X21hcDogYW55O1xuXG4gICAgcHJpdmF0ZSBfbWluRGF0ZTogRGF0ZTtcbiAgICBwcml2YXRlIF9tYXhEYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX3JlYWxNaW5EYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX3JlYWxNYXhEYXRlOiBEYXRlO1xuXG4gICAgcHVibGljIGRhdGVzOiBhbnk7XG4gICAgcHVibGljIGxheWVyczogYW55O1xuICAgIHB1YmxpYyBiYXJzOiBCYXJbXTtcbiAgICBwdWJsaWMgYXJyb3dzOiBBcnJvd1tdO1xuICAgIHB1YmxpYyBiYXJfYmVpbmdfZHJhZ2dlZDogYW55O1xuICAgIHB1YmxpYyAkc3ZnOiBhbnk7XG4gICAgcHVibGljICRjb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xuICAgIHB1YmxpYyBwb3B1cF93cmFwcGVyOiBIVE1MRGl2RWxlbWVudDtcbiAgICBwdWJsaWMgcG9wdXA6IGFueTtcblxuICAgIHB1YmxpYyBnZXQgbWluRGF0ZSgpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXhEYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcih3cmFwcGVyOiBhbnksIHRhc2tzOiBUYXNrW10sIG9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfb3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zZXR1cF93cmFwcGVyKHdyYXBwZXIpO1xuICAgICAgICB0aGlzLnNldHVwX3Rhc2tzKHRhc2tzKTtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgdmlldyBtb2RlXG4gICAgICAgIHRoaXMuY2hhbmdlX3ZpZXdfbW9kZSgpO1xuICAgICAgICB0aGlzLmJpbmRfZXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF93cmFwcGVyKGVsZW1lbnQ6IGFueSkge1xuICAgICAgICBsZXQgc3ZnX2VsZW1lbnQsIHdyYXBwZXJfZWxlbWVudDtcblxuICAgICAgICAvLyBDU1MgU2VsZWN0b3IgaXMgcGFzc2VkXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgdGhlIFNWR0VsZW1lbnRcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgd3JhcHBlcl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIHN2Z19lbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgICAgICAgICBzdmdfZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiRnJhcHDDqSBHYW50dCBvbmx5IHN1cHBvcnRzIHVzYWdlIG9mIGEgc3RyaW5nIENTUyBzZWxlY3RvciwgSFRNTCBET00gZWxlbWVudCBvciBTVkcgRE9NIGVsZW1lbnQgZm9yIHRoZSBcXCdlbGVtZW50XFwnIHBhcmFtZXRlclwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3ZnIGVsZW1lbnRcbiAgICAgICAgaWYgKCFzdmdfZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0XG4gICAgICAgICAgICB0aGlzLiRzdmcgPSBjcmVhdGVTVkcoXCJzdmdcIiwge1xuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogd3JhcHBlcl9lbGVtZW50LFxuICAgICAgICAgICAgICAgIGNsYXNzOiBcImdhbnR0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJHN2ZyA9IHN2Z19lbGVtZW50O1xuICAgICAgICAgICAgdGhpcy4kc3ZnLmNsYXNzTGlzdC5hZGQoXCJnYW50dFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdyYXBwZXIgZWxlbWVudFxuICAgICAgICB0aGlzLiRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLiRjb250YWluZXIuY2xhc3NMaXN0LmFkZChcImdhbnR0LWNvbnRhaW5lclwiKTtcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRjb250YWluZXIuc3R5bGUud2lkdGggPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGggKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgcGFyZW50X2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy4kY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJHN2Zyk7XG5cbiAgICAgICAgLy8gcG9wdXAgd3JhcHBlclxuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwLXdyYXBwZXJcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnBvcHVwX3dyYXBwZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfb3B0aW9ucyhvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXR1cF90YXNrcyh0YXNrczogYW55KSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGFza3NcbiAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzLm1hcCgodGFzazogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vc3RhbmRhcmQgY29sb3JzIGlmIG5lZWRlZFxuICAgICAgICAgICAgdGFzay5jb2xvciA9IHRhc2suY29sb3IgfHwgJyM3ODkyQTEnO1xuXG4gICAgICAgICAgICAvLyBjb252ZXJ0IHRvIERhdGUgb2JqZWN0c1xuICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5zdGFydCk7XG4gICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5lbmQpO1xuXG4gICAgICAgICAgICAvLyBtYWtlIHRhc2sgaW52YWxpZCBpZiBkdXJhdGlvbiB0b28gbGFyZ2VcbiAgICAgICAgICAgIGlmIChEYXRlVXRpbHMuZGlmZih0YXNrLl9lbmQsIHRhc2suX3N0YXJ0LCBcInllYXJcIikgPiAxMCkge1xuICAgICAgICAgICAgICAgIHRhc2suZW5kID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FjaGUgaW5kZXhcbiAgICAgICAgICAgIHRhc2suX2luZGV4ID0gaTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXNrLl9yb3dfaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0YXNrLl9pbmRleCA9IHRhc2suX3Jvd19pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW52YWxpZCBkYXRlc1xuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmICF0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSB0b2RheTtcbiAgICAgICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMuYWRkKHRvZGF5LCAyLCBcImRheVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmIHRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMuYWRkKHRhc2suX2VuZCwgLTIsICdkYXknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhc2suc3RhcnQgJiYgIXRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLmFkZCh0YXNrLl9zdGFydCwgMiwgXCJkYXlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIGhvdXJzIGlzIG5vdCBzZXQsIGFzc3VtZSB0aGUgbGFzdCBkYXkgaXMgZnVsbCBkYXlcbiAgICAgICAgICAgIC8vIGUuZzogMjAxOC0wOS0wOSBiZWNvbWVzIDIwMTgtMDktMDkgMjM6NTk6NTlcbiAgICAgICAgICAgIGNvbnN0IHRhc2tfZW5kX3ZhbHVlcyA9IERhdGVVdGlscy5nZXREYXRlVmFsdWVzKHRhc2suX2VuZCk7XG4gICAgICAgICAgICBpZiAodGFza19lbmRfdmFsdWVzLnNsaWNlKDMpLmV2ZXJ5KChkKSA9PiBkID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHRhc2suX2VuZCA9IERhdGVVdGlscy5hZGQodGFzay5fZW5kLCAyNCwgXCJob3VyXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnZhbGlkIGZsYWdcbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCB8fCAhdGFzay5lbmQpIHtcbiAgICAgICAgICAgICAgICB0YXNrLmludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFzay5kZXBlbmRlbmNpZXMgPT09IFwic3RyaW5nXCIgfHwgIXRhc2suZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGFzay5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBkLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kZW5jaWVzID0gZGVwcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdWlkc1xuICAgICAgICAgICAgaWYgKCF0YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgdGFzay5pZCA9IGdlbmVyYXRlX2lkKHRhc2spO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXR1cF9kZXBlbmRlbmNpZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RlcGVuZGVuY2llcygpIHtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcCA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdID0gdGhpcy5kZXBlbmRlbmN5X21hcFtkXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdLnB1c2godC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaCh0YXNrczogVGFza1tdKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICB0aGlzLmNoYW5nZV92aWV3X21vZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlX3ZpZXdfbW9kZShtb2RlID0gdGhpcy5vcHRpb25zLnZpZXdNb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfZ2FudHRfZGF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVfdmlld19zY2FsZShtb2RlKTtcbiAgICAgICAgdGhpcy5zZXR1cF9kYXRlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAvLyBmaXJlIHZpZXdtb2RlX2NoYW5nZSBldmVudFxuICAgICAgICB0aGlzLnRyaWdnZXJfZXZlbnQoXCJvblZpZXdDaGFuZ2VcIiwgW21vZGVdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZV92aWV3X3NjYWxlKHZpZXdfbW9kZTogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy52aWV3TW9kZSA9IHZpZXdfbW9kZTtcbiAgICAgICAgLy8gdGhpcy5pc0hvdXJWaWV3ID0gZmFsc2U7XG4gICAgICAgIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLkhvdXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgLyAyNDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5IYWxmRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuUXVhcnRlckRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDQ7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLldlZWspIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiA3O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gMTQwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuTW9udGgpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzMDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDEyMDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlllYXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzNjU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSAxMjA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RhdGVzKCkge1xuICAgICAgICB0aGlzLnNldHVwX2RhdGVfdmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9nYW50dF9kYXRlcygpIHtcbiAgICAgICAgdGhpcy5fbWluRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21heERhdGUgPSBudWxsO1xuXG4gICAgICAgIGZvciAobGV0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgLy8gc2V0IGdsb2JhbCBzdGFydCBhbmQgZW5kIGRhdGVcbiAgICAgICAgICAgIGlmICghdGhpcy5taW5EYXRlIHx8IHRhc2suc3RhcnQgPCB0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLnN0YXJ0T2YodGFzay5zdGFydCwgJ2RheScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1heERhdGUgfHwgdGFzay5lbmQgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGFzay5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWFsTWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgdGhpcy5fcmVhbE1heERhdGUgPSB0aGlzLm1heERhdGU7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudmlld01vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSG91cjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5RdWFydGVyRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gNiksIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyA2LCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLkhhbGZEYXk6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxMiksIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxMiwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5EYXk6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLldlZWs6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwid2Vla1wiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuTW9udGg6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5ZZWFyOlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMSksIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RhdGVfdmFsdWVzKCkge1xuICAgICAgICB0aGlzLmRhdGVzID0gW107XG4gICAgICAgIGxldCBjdXJfZGF0ZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKGN1cl9kYXRlID09PSBudWxsIHx8IGN1cl9kYXRlIDwgdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICBpZiAoIWN1cl9kYXRlKSB7XG4gICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuY2xvbmUodGhpcy5taW5EYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5ZZWFyKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5hZGQoY3VyX2RhdGUsIDEsIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuYWRkKGN1cl9kYXRlLCAxLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAnaG91cidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGVzLnB1c2goY3VyX2RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSAodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoIC0gMSkgLyB0aGlzLmRhdGVzLmxlbmd0aFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gY29sdW1uV2lkdGggPCA0NSA/IDQ1IDogY29sdW1uV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcImN1cl9kYXRlXCIsIGN1cl9kYXRlKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJkYXRlc1wiLCB0aGlzLmRhdGVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRfZXZlbnRzKCkge1xuICAgICAgICB0aGlzLmJpbmRfZ3JpZF9jbGljaygpO1xuICAgICAgICB0aGlzLmJpbmRfYmFyX2V2ZW50cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2V0dXBfbGF5ZXJzKCk7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkKCk7XG4gICAgICAgIHRoaXMubWFrZV9kYXRlcygpO1xuICAgICAgICB0aGlzLm1ha2VfYmFycygpO1xuICAgICAgICB0aGlzLm1ha2VfYXJyb3dzKCk7XG4gICAgICAgIHRoaXMubWFwX2Fycm93c19vbl9iYXJzKCk7XG4gICAgICAgIHRoaXMuc2V0X3dpZHRoKCk7XG4gICAgICAgIHRoaXMuc2V0X3Njcm9sbF9wb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfbGF5ZXJzKCkge1xuICAgICAgICB0aGlzLmxheWVycyA9IHt9O1xuICAgICAgICBjb25zdCBsYXllcnMgPSBbXCJncmlkXCIsIFwiZGF0ZVwiLCBcImFycm93XCIsIFwicHJvZ3Jlc3NcIiwgXCJiYXJcIiwgXCJkZXRhaWxzXCJdO1xuICAgICAgICAvLyBtYWtlIGdyb3VwIGxheWVyc1xuICAgICAgICBmb3IgKGxldCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzW2xheWVyXSA9IGNyZWF0ZVNWRygnZycsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogbGF5ZXIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLiRzdmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkKCkge1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF9iYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX3Jvd3MoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfaGVhZGVyKCk7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX2hpZ2hsaWdodHMoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfdGlja3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF9iYWNrZ3JvdW5kKCkge1xuICAgICAgICBsZXQgZ3JpZF93aWR0aCA9IHRoaXMuZGF0ZXMubGVuZ3RoICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAgIGdyaWRfd2lkdGggPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXN0aW5jdF9yb3dzID0gWy4uLm5ldyBTZXQodGhpcy50YXNrcy5tYXAoKHg6IGFueSkgPT4geC5fcm93X2lkKSldO1xuICAgICAgICBjb25zdCBncmlkX2hlaWdodCA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyICtcbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpICpcbiAgICAgICAgICAgIGRpc3RpbmN0X3Jvd3MubGVuZ3RoO1xuXG4gICAgICAgIGNyZWF0ZVNWRyhcInJlY3RcIiwge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICB3aWR0aDogZ3JpZF93aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogZ3JpZF9oZWlnaHQsXG4gICAgICAgICAgICBjbGFzczogXCJncmlkLWJhY2tncm91bmRcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC5hdHRyKHRoaXMuJHN2Zywge1xuICAgICAgICAgICAgaGVpZ2h0OiBncmlkX2hlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgfSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWRfcm93cygpIHtcbiAgICAgICAgY29uc3Qgcm93c19sYXllciA9IGNyZWF0ZVNWRyhcImdcIiwgeyBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQgfSk7XG4gICAgICAgIGNvbnN0IGxpbmVzX2xheWVyID0gY3JlYXRlU1ZHKFwiZ1wiLCB7IGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCB9KTtcblxuICAgICAgICBjb25zdCByb3dfd2lkdGggPSB0aGlzLmRhdGVzLmxlbmd0aCAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3Qgcm93X2hlaWdodCA9IHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZztcbiAgICAgICAgLy9UT0RPOiAgYWp1c3RhciBvIHBvc2ljaW9uYW1lbnRvIGRhcyBsaW5oYXNcbiAgICAgICAgbGV0IHJvd195ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcblxuICAgICAgICB0aGlzLnRhc2tzLmZvckVhY2goXyA9PiB7XG4gICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IHJvd195LFxuICAgICAgICAgICAgICAgIHdpZHRoOiByb3dfd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiByb3dfaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNsYXNzOiBcImdyaWQtcm93XCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiByb3dzX2xheWVyLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcImxpbmVcIiwge1xuICAgICAgICAgICAgICAgIHgxOiAwLFxuICAgICAgICAgICAgICAgIHkxOiByb3dfeSArIHJvd19oZWlnaHQsXG4gICAgICAgICAgICAgICAgeDI6IHJvd193aWR0aCxcbiAgICAgICAgICAgICAgICB5Mjogcm93X3kgKyByb3dfaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNsYXNzOiBcInJvdy1saW5lXCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiBsaW5lc19sYXllcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByb3dfeSArPSB0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX2hlYWRlcigpIHtcbiAgICAgICAgLy8gY29uc3QgYWRkSXNIb3VyVmlldyA9IHRoaXMuaXNIb3VyVmlldyA/IDI1IDogMTBcbiAgICAgICAgY29uc3QgaGVhZGVyX3dpZHRoID0gdGhpcy5kYXRlcy5sZW5ndGggKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgIGNvbnN0IGhlYWRlcl9oZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgMTA7XG4gICAgICAgIGNyZWF0ZVNWRyhcInJlY3RcIiwge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICB3aWR0aDogaGVhZGVyX3dpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWFkZXJfaGVpZ2h0LFxuICAgICAgICAgICAgY2xhc3M6IFwiZ3JpZC1oZWFkZXJcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWRfdGlja3MoKSB7XG4gICAgICAgIGxldCB0aWNrX3ggPSAwO1xuICAgICAgICBsZXQgdGlja195ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcbiAgICAgICAgbGV0IHRpY2tfaGVpZ2h0ID1cbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpICpcbiAgICAgICAgICAgIHRoaXMudGFza3MubGVuZ3RoO1xuXG4gICAgICAgIGZvciAobGV0IGRhdGUgb2YgdGhpcy5kYXRlcykge1xuICAgICAgICAgICAgbGV0IHRpY2tfY2xhc3MgPSBcInRpY2tcIjtcbiAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIG1vbmRheVxuICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5EYXkpICYmIGRhdGUuZ2V0RGF0ZSgpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGlja19jbGFzcyArPSBcIiB0aGlja1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpY2sgdGljayBmb3IgZmlyc3Qgd2Vla1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMudmlld19pcyhWaWV3TW9kZS5XZWVrKSAmJlxuICAgICAgICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpID49IDEgJiZcbiAgICAgICAgICAgICAgICBkYXRlLmdldERhdGUoKSA8IDhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaWNrIHRpY2tzIGZvciBxdWFydGVyc1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkgJiYgZGF0ZS5nZXRNb250aCgpICUgMyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaWNrIHRpY2tzIGZvciBob3Vyc1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMudmlld19pcyhWaWV3TW9kZS5Ib3VyKSAmJlxuICAgICAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSA9PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgIGQ6IGBNICR7dGlja194fSAke3RpY2tfeX0gdiAke3RpY2tfaGVpZ2h0fWAsXG4gICAgICAgICAgICAgICAgY2xhc3M6IHRpY2tfY2xhc3MsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgdGlja194ICs9XG4gICAgICAgICAgICAgICAgICAgIChEYXRlVXRpbHMuZ2V0RGF5c0luTW9udGgoZGF0ZSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKSAvXG4gICAgICAgICAgICAgICAgICAgIDMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWNrX3ggKz0gdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZV9ncmlkX2hpZ2hsaWdodHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcblxuICAgICAgICAgICAgbGV0IHggPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcblxuICAgICAgICAgICAgICAgIGxldCB5ID0gKHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgLyAyO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzVG9kYXkgPSBkYXRlLnRvU3RyaW5nKCkgPT0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzV2Vla2VuZCA9IChkYXRlLmdldERheSgpID09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gXCJ0b2RheS1oaWdobGlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICh0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBcIndlZWtlbmQtaGlnaGxpZ2h0XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcnggPSAzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gMztcblxuICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5IHx8IGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcngsXG4gICAgICAgICAgICAgICAgICAgICAgICByeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4ICs9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9kYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmdldF9kYXRlc190b19kcmF3KCk7XG4gICAgICAgIGNvbnN0IGlzSG91clZpZXcgPSB0aGlzLnZpZXdfaXMoW1ZpZXdNb2RlLkhvdXIsIFZpZXdNb2RlLlF1YXJ0ZXJEYXksIFZpZXdNb2RlLkhhbGZEYXldKTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkYXRlc1tpXTtcblxuICAgICAgICAgICAgaWYgKGlzSG91clZpZXcgJiYgZGF0ZS5kYXRlID49IHRoaXMuX3JlYWxNaW5EYXRlICYmIGRhdGUuZGF0ZSA8PSB0aGlzLl9yZWFsTWF4RGF0ZSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLmxvd2VyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUubG93ZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBgSCR7Y291bnRlcisrICogdGhpcy5vcHRpb25zLnN0ZXB9YCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFwidGl0bGUtMVwiLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmRhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgIHg6IGRhdGUubG93ZXJfeCxcbiAgICAgICAgICAgICAgICB5OiBkYXRlLmxvd2VyX3kgKyAyMCxcbiAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUubG93ZXJfdGV4dCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJ0aXRsZS0yXCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRlLnVwcGVyX3RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkdXBwZXJfdGV4dCA9IGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLnVwcGVyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUudXBwZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBkYXRlLnVwcGVyX3RleHQsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcInVwcGVyLXRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG91dC1vZi1ib3VuZCBkYXRlc1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQuZ2V0QkJveCgpLngyID4gdGhpcy5sYXllcnMuZ3JpZC5nZXRCQm94KCkud2lkdGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfZGF0ZXNfdG9fZHJhdygpIHtcbiAgICAgICAgbGV0IGxhc3RfZGF0ZTogYW55ID0gbnVsbDtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmRhdGVzLm1hcCgoZGF0ZTogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmdldF9kYXRlX2luZm8oZGF0ZSwgbGFzdF9kYXRlLCBpKTtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9kYXRlX2luZm8oZGF0ZTogRGF0ZSwgbGFzdF9kYXRlOiBEYXRlLCBpOiBhbnkpIHtcbiAgICAgICAgaWYgKCFsYXN0X2RhdGUpIHtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IERhdGVVdGlscy5hZGQoZGF0ZSwgMSwgXCJ5ZWFyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGVfdGV4dCA9IHtcbiAgICAgICAgICAgIGhvdXJMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGRheUxvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICB3ZWVrTG93ZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICBtb250aExvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiTU1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICB5ZWFyTG93ZXI6IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJZWVlZXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlVcHBlcjogZGF0ZS5nZXREYXRlKCkgIT09IGxhc3RfZGF0ZS5nZXREYXRlKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IChkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKSlcbiAgICAgICAgICAgICAgICA/ICgoKGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKCkpIHx8IGkgPCAyKVxuICAgICAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIGRheVVwcGVyOiAoKGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKCkpIHx8IGkgPT09IDApXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiTU1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICB3ZWVrVXBwZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJNTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIG1vbnRoVXBwZXI6IGRhdGUuZ2V0RnVsbFllYXIoKSAhPT0gbGFzdF9kYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJZWVlZXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIHllYXJVcHBlcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBsYXN0X2RhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgaG91clVwcGVyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkQgTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRGVzY29udGFuZG8gMjAgcGFyYSBhZGNpb25hciB1bWEgc2VndW5kYSBsaW5oYSBkZSBpbmZvcm1hw6fDo28gbm8gY2FiZcOnYWxob1xuICAgICAgICBjb25zdCBiYXNlX3BvcyA9IHtcbiAgICAgICAgICAgIHg6IGkgKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgsXG4gICAgICAgICAgICBsb3dlcl95OiB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0IC0gMjAsXG4gICAgICAgICAgICB1cHBlcl95OiB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0IC0gMjAgLSAyNSxcbiAgICAgICAgfTtcbmRlYnVnZ2VyO1xuICAgICAgICBjb25zdCB4X3BvcyA9IHtcbiAgICAgICAgICAgIGhvdXJMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIGhvdXJVcHBlcjogKHRoaXMuZGF0ZXMubGVuZ3RoIDwgMTQpID8gKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCkgOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMjQgLyAyKSxcbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlVcHBlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCAvIDIsXG4gICAgICAgICAgICBoYWxmRGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDIgLyAyLFxuICAgICAgICAgICAgZGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBkYXlVcHBlcjogKHRoaXMuZGF0ZXMubGVuZ3RoIDwgMTUpID8gKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCkgOiAoKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDMwKSAvIDIpLFxuICAgICAgICAgICAgd2Vla0xvd2VyOiAwLFxuICAgICAgICAgICAgd2Vla1VwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCkgLyAyLFxuICAgICAgICAgICAgbW9udGhMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIG1vbnRoVXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAxMikgLyAyLFxuICAgICAgICAgICAgeWVhckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgeWVhclVwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMzApIC8gMixcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBwZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgbG93ZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeTogYmFzZV9wb3MudXBwZXJfeSxcbiAgICAgICAgICAgIGxvd2VyX3g6IGJhc2VfcG9zLnggKyB4X3Bvc1tgJHt0aGlzLm9wdGlvbnMudmlld01vZGV9TG93ZXJgXSxcbiAgICAgICAgICAgIGxvd2VyX3k6IGJhc2VfcG9zLmxvd2VyX3ksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9iYXJzKCkge1xuICAgICAgICB0aGlzLmJhcnMgPSB0aGlzLnRhc2tzLm1hcCgodGFzazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBuZXcgQmFyKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgdGhpcy5sYXllcnMuYmFyLmFwcGVuZENoaWxkKGJhci5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gYmFyO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfYXJyb3dzKCkge1xuICAgICAgICB0aGlzLmFycm93cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGxldCBhcnJvd3MgPSBbXTtcbiAgICAgICAgICAgIGFycm93cyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgLm1hcCgodGFza19pZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSB0aGlzLmdldF90YXNrKHRhc2tfaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyb3cgPSBuZXcgQXJyb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJzW2RlcGVuZGVuY3kuX2luZGV4XSwgLy8gZnJvbV90YXNrXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnNbdGFzay5faW5kZXhdIC8vIHRvX3Rhc2tcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMuYXJyb3cuYXBwZW5kQ2hpbGQoYXJyb3cuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJvdztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7IC8vIGZpbHRlciBmYWxzeSB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuYXJyb3dzID0gdGhpcy5hcnJvd3MuY29uY2F0KGFycm93cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcF9hcnJvd3Nfb25fYmFycygpIHtcbiAgICAgICAgZm9yIChsZXQgYmFyIG9mIHRoaXMuYmFycykge1xuICAgICAgICAgICAgYmFyLmFycm93cyA9IHRoaXMuYXJyb3dzLmZpbHRlcigoYXJyb3c6IEFycm93KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cuZnJvbVRhc2sudGFzay5pZCA9PT0gYmFyLnRhc2suaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cudG9UYXNrLnRhc2suaWQgPT09IGJhci50YXNrLmlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRfd2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cl93aWR0aCA9IHRoaXMuJHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgYWN0dWFsX3dpZHRoID0gdGhpcy4kc3ZnXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIi5ncmlkIC5ncmlkLXJvd1wiKVxuICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShcIndpZHRoXCIpO1xuICAgICAgICBpZiAoY3VyX3dpZHRoIDwgYWN0dWFsX3dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYWN0dWFsX3dpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0X3Njcm9sbF9wb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKCFwYXJlbnRfZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzX2JlZm9yZV9maXJzdF90YXNrID0gRGF0ZVV0aWxzLmRpZmYoXG4gICAgICAgICAgICB0aGlzLmdldF9vbGRlc3Rfc3RhcnRpbmdfZGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5taW5EYXRlLFxuICAgICAgICAgICAgXCJob3VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxfcG9zID1cbiAgICAgICAgICAgIChob3Vyc19iZWZvcmVfZmlyc3RfdGFzayAvIHRoaXMub3B0aW9ucy5zdGVwKSAqXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuXG4gICAgICAgIHBhcmVudF9lbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxfcG9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ncmlkX2NsaWNrKCkge1xuICAgICAgICAkLm9uKFxuICAgICAgICAgICAgdGhpcy4kc3ZnLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvcHVwVHJpZ2dlcixcbiAgICAgICAgICAgIFwiLmdyaWQtcm93LCAuZ3JpZC1oZWFkZXJcIixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0X2FsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9iYXJfZXZlbnRzKCkge1xuICAgICAgICBsZXQgaXNfZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHhfb25fc3RhcnQgPSAwO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhcmVudF9iYXJfaWQ6IGFueSA9IG51bGw7XG4gICAgICAgIGxldCBiYXJzOiBCYXJbXSA9IFtdO1xuICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcblxuICAgICAgICBmdW5jdGlvbiBhY3Rpb25faW5fcHJvZ3Jlc3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfZHJhZ2dpbmcgfHwgaXNfcmVzaXppbmdfbGVmdCB8fCBpc19yZXNpemluZ19yaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlZG93blwiLCBcIi5iYXItd3JhcHBlciwgLmhhbmRsZVwiLCAoZTogYW55LCBlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhcl93cmFwcGVyID0gJC5jbG9zZXN0KFwiLmJhci13cmFwcGVyXCIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJsZWZ0XCIpKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmlnaHRcIikpIHtcbiAgICAgICAgICAgICAgICBpc19yZXNpemluZ19yaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYmFyLXdyYXBwZXJcIikgJiYgdGhpcy5vcHRpb25zLmFsbG93TW92ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpc19kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhcl93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG5cbiAgICAgICAgICAgIHhfb25fc3RhcnQgPSBlLm9mZnNldFg7XG5cbiAgICAgICAgICAgIHBhcmVudF9iYXJfaWQgPSBiYXJfd3JhcHBlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gW1xuICAgICAgICAgICAgICAgIHBhcmVudF9iYXJfaWQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRfYWxsX2RlcGVuZGVudF90YXNrcyhwYXJlbnRfYmFyX2lkKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBiYXJzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0X2JhcihpZCkpO1xuXG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gcGFyZW50X2Jhcl9pZDtcblxuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgJGJhci5veCA9ICRiYXIuZ2V0WCgpO1xuICAgICAgICAgICAgICAgICRiYXIub3kgPSAkYmFyLmdldFkoKTtcbiAgICAgICAgICAgICAgICAkYmFyLm93aWR0aCA9ICRiYXIuZ2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAkYmFyLmZpbmFsZHggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgJC5vbih0aGlzLiRzdmcsIFwibW91c2Vtb3ZlXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghYWN0aW9uX2luX3Byb2dyZXNzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGR4ID0gZS5vZmZzZXRYIC0geF9vbl9zdGFydDtcblxuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgJGJhci5maW5hbGR4ID0gdGhpcy5nZXRfc25hcF9wb3NpdGlvbihkeCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlX3BvcHVwKCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzX3Jlc2l6aW5nX2xlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudF9iYXJfaWQgPT09IGJhci50YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6ICRiYXIub3ggKyAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICRiYXIub3dpZHRoIC0gJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6ICRiYXIub3ggKyAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfcmVzaXppbmdfcmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudF9iYXJfaWQgPT09IGJhci50YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAkYmFyLm93aWR0aCArICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc19kcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oeyB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBudWxsKTtcblxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChpc19kcmFnZ2luZyB8fCBpc19yZXNpemluZ19sZWZ0IHx8IGlzX3Jlc2l6aW5nX3JpZ2h0IHx8ICF0aGlzLm9wdGlvbnMuYWxsb3dNb3ZlbWVudCkge1xuICAgICAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiBiYXIuZ3JvdXAuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlzX2RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpc19yZXNpemluZ19sZWZ0ID0gZmFsc2U7XG4gICAgICAgICAgICBpc19yZXNpemluZ19yaWdodCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICAkLm9uKHRoaXMuJHN2ZywgXCJtb3VzZXVwXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmFyX2JlaW5nX2RyYWdnZWQgPSBudWxsO1xuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCEkYmFyLmZpbmFsZHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICBiYXIuZGF0ZUNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICBiYXIuc2V0QWN0aW9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfYWxsX2RlcGVuZGVudF90YXNrcyh0YXNrX2lkOiBhbnkpIHtcbiAgICAgICAgbGV0IG91dDogYW55W10gPSBbXTtcbiAgICAgICAgbGV0IHRvX3Byb2Nlc3MgPSBbdGFza19pZF07XG4gICAgICAgIHdoaWxlICh0b19wcm9jZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVwcyA9IHRvX3Byb2Nlc3MucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICBhY2MgPSBhY2MuY29uY2F0KHRoaXMuZGVwZW5kZW5jeV9tYXBbY3Vycl0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgIG91dCA9IG91dC5jb25jYXQoZGVwcyk7XG4gICAgICAgICAgICB0b19wcm9jZXNzID0gZGVwcy5maWx0ZXIoKGQ6IGFueSkgPT4gIXRvX3Byb2Nlc3MuaW5jbHVkZXMoZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dC5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfc25hcF9wb3NpdGlvbihkeDogYW55KSB7XG4gICAgICAgIGxldCBvZHggPSBkeCxcbiAgICAgICAgICAgIHJlbSxcbiAgICAgICAgICAgIHBvc2l0aW9uO1xuXG4gICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuSG91cikpIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDYpO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMTIgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLldlZWspKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA3KTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDE0ID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDMwKTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDYwID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDMwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMiA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZWxlY3RfYWxsKCkge1xuICAgICAgICBbLi4udGhpcy4kc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmFyLXdyYXBwZXJcIildLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmlld19pcyhtb2RlczogVmlld01vZGUgfCBWaWV3TW9kZVtdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vZGVzLnNvbWUoKG1vZGUpID0+IHRoaXMub3B0aW9ucy52aWV3TW9kZSA9PT0gbW9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnZpZXdNb2RlID09PSBtb2RlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF90YXNrKGlkOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza3MuZmluZCgodGFzazogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGFzay5pZCA9PT0gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRfYmFyKGlkOiBhbnkpOiBCYXIge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXJzLmZpbmQoKGJhcjogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYmFyLnRhc2suaWQgPT09IGlkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd19wb3B1cChvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwID0gbmV3IFBvcHVwKFxuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBfd3JhcHBlcixcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tUG9wdXBIdG1sXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9wdXAuc2hvdyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZV9wb3B1cCgpIHtcbiAgICAgICAgdGhpcy5wb3B1cCAmJiB0aGlzLnBvcHVwLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlcl9ldmVudChldmVudDogc3RyaW5nLCBhcmdzOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1tldmVudF0pIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1tldmVudF0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9vbGRlc3Rfc3RhcnRpbmdfZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza3NcbiAgICAgICAgICAgIC5tYXAoKHRhc2s6IGFueSkgPT4gdGFzay5fc3RhcnQpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2X2RhdGU6IGFueSwgY3VyX2RhdGU6IGFueSkgPT5cbiAgICAgICAgICAgICAgICBjdXJfZGF0ZSA8PSBwcmV2X2RhdGUgPyBjdXJfZGF0ZSA6IHByZXZfZGF0ZVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyKCkge1xuICAgICAgICB0aGlzLiRzdmcuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZV9pZCh0YXNrOiBhbnkpIHtcbiAgICByZXR1cm4gdGFzay5uYW1lICsgXCJfXCIgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMik7XG59XG4iXX0=