@sbb-esta/lyne-elements-experimental-dev 4.6.0-dev.1772444909 → 4.6.0-dev.1772446531

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 (57) hide show
  1. package/custom-elements.json +404 -209
  2. package/development/seat-reservation/common/mapper/icon-mapper.d.ts.map +1 -1
  3. package/development/seat-reservation/common/mapper/icon-mapper.js +2 -1
  4. package/development/seat-reservation/common/mapper/mapper.js +6 -4
  5. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.d.ts +69 -0
  6. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.d.ts.map +1 -0
  7. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +559 -0
  8. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.d.ts +123 -0
  9. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.d.ts.map +1 -0
  10. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +972 -0
  11. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.d.ts +114 -0
  12. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.d.ts.map +1 -0
  13. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.js +20368 -0
  14. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.d.ts +85 -0
  15. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.d.ts.map +1 -0
  16. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1739 -0
  17. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.d.ts +69 -0
  18. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.d.ts.map +1 -0
  19. package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9783 -0
  20. package/development/seat-reservation/common/svgs.js +7 -7
  21. package/development/seat-reservation/common/translations/i18n.d.ts.map +1 -1
  22. package/development/seat-reservation/common/translations/i18n.js +32 -1
  23. package/development/seat-reservation/common/types.d.ts +8 -3
  24. package/development/seat-reservation/common/types.d.ts.map +1 -1
  25. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +13 -3
  26. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
  27. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +68 -15
  28. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +1 -0
  29. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
  30. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +64 -29
  31. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts +4 -15
  32. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
  33. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +75 -155
  34. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts +2 -0
  35. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts.map +1 -1
  36. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +21 -5
  37. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts +7 -1
  38. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -1
  39. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +154 -9
  40. package/package.json +2 -2
  41. package/seat-reservation/common/mapper/icon-mapper.js +1 -0
  42. package/seat-reservation/common/mapper/mapper.js +25 -23
  43. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +558 -0
  44. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +970 -0
  45. package/seat-reservation/common/mapper/{seat-reservation-sample-data.js → sample-data/seat-reservation-sample-data-giruno.js} +3 -11304
  46. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1738 -0
  47. package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9782 -0
  48. package/seat-reservation/common/svgs.js +51 -51
  49. package/seat-reservation/common/translations/i18n.js +31 -0
  50. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +128 -88
  51. package/seat-reservation/seat-reservation/seat-reservation.component.js +137 -125
  52. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +141 -186
  53. package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +54 -44
  54. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +106 -71
  55. package/development/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts +0 -372
  56. package/development/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts.map +0 -1
  57. package/development/seat-reservation/common/mapper/seat-reservation-sample-data.js +0 -31673
@@ -27,12 +27,15 @@ const ALLOWED_SERVICE_ICONS = [
27
27
  "sa-rz"
28
28
  ];
29
29
  let SeatReservationBaseElement = (() => {
30
- var _seatReservations_accessor_storage, _hasNavigation_accessor_storage, _alignVertical_accessor_storage, _baseGridSize_accessor_storage, _height_accessor_storage, _maxSeatReservations_accessor_storage, _maxBicycleReservations_accessor_storage, _preventPlaceClick_accessor_storage, _preselectCoachIndex_accessor_storage, _selectedCoachIndex_accessor_storage, _focusedCoachIndex_accessor_storage, _hoveredCoachIndex_accessor_storage, _a;
30
+ var _seatReservations_accessor_storage, _travelDirection_accessor_storage, _hasNavigation_accessor_storage, _alignVertical_accessor_storage, _baseGridSize_accessor_storage, _height_accessor_storage, _maxSeatReservations_accessor_storage, _maxBicycleReservations_accessor_storage, _preventPlaceClick_accessor_storage, _preselectCoachIndex_accessor_storage, _showTitleInfo_accessor_storage, _selectedCoachIndex_accessor_storage, _focusedCoachIndex_accessor_storage, _hoveredCoachIndex_accessor_storage, _a;
31
31
  let _classSuper = LitElement;
32
32
  let _instanceExtraInitializers = [];
33
33
  let _seatReservations_decorators;
34
34
  let _seatReservations_initializers = [];
35
35
  let _seatReservations_extraInitializers = [];
36
+ let _travelDirection_decorators;
37
+ let _travelDirection_initializers = [];
38
+ let _travelDirection_extraInitializers = [];
36
39
  let _hasNavigation_decorators;
37
40
  let _hasNavigation_initializers = [];
38
41
  let _hasNavigation_extraInitializers = [];
@@ -57,6 +60,9 @@ let SeatReservationBaseElement = (() => {
57
60
  let _preselectCoachIndex_decorators;
58
61
  let _preselectCoachIndex_initializers = [];
59
62
  let _preselectCoachIndex_extraInitializers = [];
63
+ let _showTitleInfo_decorators;
64
+ let _showTitleInfo_initializers = [];
65
+ let _showTitleInfo_extraInitializers = [];
60
66
  let _selectedCoachIndex_decorators;
61
67
  let _selectedCoachIndex_initializers = [];
62
68
  let _selectedCoachIndex_extraInitializers = [];
@@ -71,6 +77,7 @@ let SeatReservationBaseElement = (() => {
71
77
  constructor() {
72
78
  super();
73
79
  __privateAdd(this, _seatReservations_accessor_storage);
80
+ __privateAdd(this, _travelDirection_accessor_storage);
74
81
  __privateAdd(this, _hasNavigation_accessor_storage);
75
82
  __privateAdd(this, _alignVertical_accessor_storage);
76
83
  __privateAdd(this, _baseGridSize_accessor_storage);
@@ -79,11 +86,13 @@ let SeatReservationBaseElement = (() => {
79
86
  __privateAdd(this, _maxBicycleReservations_accessor_storage);
80
87
  __privateAdd(this, _preventPlaceClick_accessor_storage);
81
88
  __privateAdd(this, _preselectCoachIndex_accessor_storage);
89
+ __privateAdd(this, _showTitleInfo_accessor_storage);
82
90
  __privateAdd(this, _selectedCoachIndex_accessor_storage);
83
91
  __privateAdd(this, _focusedCoachIndex_accessor_storage);
84
92
  __privateAdd(this, _hoveredCoachIndex_accessor_storage);
85
93
  __privateSet(this, _seatReservations_accessor_storage, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _seatReservations_initializers, null)));
86
- __privateSet(this, _hasNavigation_accessor_storage, (__runInitializers(this, _seatReservations_extraInitializers), __runInitializers(this, _hasNavigation_initializers, true)));
94
+ __privateSet(this, _travelDirection_accessor_storage, (__runInitializers(this, _seatReservations_extraInitializers), __runInitializers(this, _travelDirection_initializers, "NONE")));
95
+ __privateSet(this, _hasNavigation_accessor_storage, (__runInitializers(this, _travelDirection_extraInitializers), __runInitializers(this, _hasNavigation_initializers, true)));
87
96
  __privateSet(this, _alignVertical_accessor_storage, (__runInitializers(this, _hasNavigation_extraInitializers), __runInitializers(this, _alignVertical_initializers, false)));
88
97
  __privateSet(this, _baseGridSize_accessor_storage, (__runInitializers(this, _alignVertical_extraInitializers), __runInitializers(this, _baseGridSize_initializers, 16)));
89
98
  __privateSet(this, _height_accessor_storage, (__runInitializers(this, _baseGridSize_extraInitializers), __runInitializers(this, _height_initializers, null)));
@@ -91,7 +100,8 @@ let SeatReservationBaseElement = (() => {
91
100
  __privateSet(this, _maxBicycleReservations_accessor_storage, (__runInitializers(this, _maxSeatReservations_extraInitializers), __runInitializers(this, _maxBicycleReservations_initializers, -1)));
92
101
  __privateSet(this, _preventPlaceClick_accessor_storage, (__runInitializers(this, _maxBicycleReservations_extraInitializers), __runInitializers(this, _preventPlaceClick_initializers, false)));
93
102
  __privateSet(this, _preselectCoachIndex_accessor_storage, (__runInitializers(this, _preventPlaceClick_extraInitializers), __runInitializers(this, _preselectCoachIndex_initializers, -1)));
94
- __privateSet(this, _selectedCoachIndex_accessor_storage, (__runInitializers(this, _preselectCoachIndex_extraInitializers), __runInitializers(this, _selectedCoachIndex_initializers, -1)));
103
+ __privateSet(this, _showTitleInfo_accessor_storage, (__runInitializers(this, _preselectCoachIndex_extraInitializers), __runInitializers(this, _showTitleInfo_initializers, false)));
104
+ __privateSet(this, _selectedCoachIndex_accessor_storage, (__runInitializers(this, _showTitleInfo_extraInitializers), __runInitializers(this, _selectedCoachIndex_initializers, -1)));
95
105
  __privateSet(this, _focusedCoachIndex_accessor_storage, (__runInitializers(this, _selectedCoachIndex_extraInitializers), __runInitializers(this, _focusedCoachIndex_initializers, -1)));
96
106
  __privateSet(this, _hoveredCoachIndex_accessor_storage, (__runInitializers(this, _focusedCoachIndex_extraInitializers), __runInitializers(this, _hoveredCoachIndex_initializers, -1)));
97
107
  this.coachBorderPadding = (__runInitializers(this, _hoveredCoachIndex_extraInitializers), 6);
@@ -99,7 +109,7 @@ let SeatReservationBaseElement = (() => {
99
109
  this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
100
110
  this.gapBetweenCoachDecks = 48;
101
111
  this.coachNavButtonDim = 0;
102
- this.coachNavData = [];
112
+ this.coachItemDetailsElements = [];
103
113
  this.currScrollDirection = ScrollDirection.right;
104
114
  this.maxCalcCoachesWidth = 0;
105
115
  this.scrollCoachesAreaWidth = 0;
@@ -132,6 +142,7 @@ let SeatReservationBaseElement = (() => {
132
142
  };
133
143
  this.notAreaElements = [
134
144
  "DRIVER_AREA",
145
+ "DRIVER_AREA_NO_VERTICAL_WALL",
135
146
  "COACH_PASSAGE",
136
147
  "COACH_WALL_NO_PASSAGE",
137
148
  "COMPARTMENT_PASSAGE",
@@ -163,6 +174,13 @@ let SeatReservationBaseElement = (() => {
163
174
  set seatReservations(value) {
164
175
  __privateSet(this, _seatReservations_accessor_storage, value);
165
176
  }
177
+ /** Displays an arrow showing what direction does train drive*/
178
+ get travelDirection() {
179
+ return __privateGet(this, _travelDirection_accessor_storage);
180
+ }
181
+ set travelDirection(value) {
182
+ __privateSet(this, _travelDirection_accessor_storage, value);
183
+ }
166
184
  /** The seat reservation navigation can be toggled by this property */
167
185
  get hasNavigation() {
168
186
  return __privateGet(this, _hasNavigation_accessor_storage);
@@ -218,6 +236,13 @@ let SeatReservationBaseElement = (() => {
218
236
  set preselectCoachIndex(value) {
219
237
  __privateSet(this, _preselectCoachIndex_accessor_storage, value);
220
238
  }
239
+ /** The seat reservation title information at place-controls, navigation-coaches and navigation-services can be toggled by this property */
240
+ get showTitleInfo() {
241
+ return __privateGet(this, _showTitleInfo_accessor_storage);
242
+ }
243
+ set showTitleInfo(value) {
244
+ __privateSet(this, _showTitleInfo_accessor_storage, value);
245
+ }
221
246
  get selectedCoachIndex() {
222
247
  return __privateGet(this, _selectedCoachIndex_accessor_storage);
223
248
  }
@@ -286,7 +311,7 @@ let SeatReservationBaseElement = (() => {
286
311
  if (this.hasMultipleDecks) {
287
312
  this._initEmptyCoachDeckOffsets();
288
313
  }
289
- this._prepareNavigationCoachData();
314
+ this._prepareCoachItemDetailsData();
290
315
  }
291
316
  /** Init scroll event handling for coach navigation */
292
317
  initNavigationSelectionByScrollEvent() {
@@ -371,7 +396,7 @@ let SeatReservationBaseElement = (() => {
371
396
  if (pressedKey === this.keyboardNavigationEvents.Tab) {
372
397
  if (eventArea == "navigation") {
373
398
  if (currTabIndex == this.currSelectedCoachIndex) {
374
- if (!this.currSelectedPlace || !pressedShiftTab || this.coachNavData[currTabIndex].isDriverArea || this.focusedCoachIndex == -1) {
399
+ if (!this.currSelectedPlace || !pressedShiftTab || this.coachItemDetailsElements[currTabIndex].isDriverArea || this.focusedCoachIndex == -1) {
375
400
  this.focusedCoachIndex = currTabIndex;
376
401
  } else if (pressedShiftTab && this.currSelectedPlace) {
377
402
  this.focusedCoachIndex = -1;
@@ -398,7 +423,7 @@ let SeatReservationBaseElement = (() => {
398
423
  keyboardSeatmapEventHandling(event) {
399
424
  const isTabNext = event.key === this.keyboardNavigationEvents.Tab;
400
425
  const isTabPrev = event.shiftKey && isTabNext;
401
- if (!this.hasNavigation && this.currSelectedCoachIndex === 0 && isTabPrev || this.currSelectedCoachIndex === this.coachNavData.length - 1 && isTabNext) {
426
+ if (!this.hasNavigation && this.currSelectedCoachIndex === 0 && isTabPrev || this.currSelectedCoachIndex === this.coachItemDetailsElements.length - 1 && isTabNext) {
402
427
  return;
403
428
  }
404
429
  const pressedKey = event.key;
@@ -451,7 +476,7 @@ let SeatReservationBaseElement = (() => {
451
476
  this._isRunningInitPreselectCoachIndex = false;
452
477
  return;
453
478
  }
454
- if (this.coachNavData[this.currSelectedCoachIndex] && this.coachNavData[this.currSelectedCoachIndex].isDriverArea) {
479
+ if (this.coachItemDetailsElements[this.currSelectedCoachIndex] && this.coachItemDetailsElements[this.currSelectedCoachIndex].isDriverArea) {
455
480
  this._setFocusToSelectedCoachGrid();
456
481
  return;
457
482
  }
@@ -774,7 +799,7 @@ let SeatReservationBaseElement = (() => {
774
799
  }
775
800
  } else if (newFocusableIndex !== this.currSelectedCoachIndex) {
776
801
  this.focusedCoachIndex = newFocusableIndex;
777
- } else if (tabDirection === "NEXT_TAB" && newFocusableIndex === this.coachNavData.length - 1) {
802
+ } else if (tabDirection === "NEXT_TAB" && newFocusableIndex === this.coachItemDetailsElements.length - 1) {
778
803
  this._refocusCurrentFocusedNavCoach(currFocusIndex);
779
804
  } else {
780
805
  this.focusedCoachIndex = -1;
@@ -995,10 +1020,10 @@ let SeatReservationBaseElement = (() => {
995
1020
  * - class (first, second, any)
996
1021
  * - whether there is a driver area left or right
997
1022
  * */
998
- _prepareNavigationCoachData() {
1023
+ _prepareCoachItemDetailsData() {
999
1024
  if (this.seatReservations) {
1000
1025
  const lowerDeck = this.seatReservations[this.seatReservations.length - 1].coachItems;
1001
- this.coachNavData = [];
1026
+ this.coachItemDetailsElements = [];
1002
1027
  lowerDeck.forEach((coach, index) => {
1003
1028
  const travelClasses = [];
1004
1029
  const propertyIds = [];
@@ -1010,13 +1035,14 @@ let SeatReservationBaseElement = (() => {
1010
1035
  propertyIds.push(...coach2.propertyIds ? coach2.propertyIds : []);
1011
1036
  places.push(...coach2.places ? coach2.places : []);
1012
1037
  });
1013
- this.coachNavData.push({
1038
+ this.coachItemDetailsElements.push({
1014
1039
  id: coach.id,
1015
1040
  travelClass: this._prepareTravelClassNavigation(travelClasses),
1016
1041
  propertyIds: this._prepareServiceIconsNavigation(propertyIds),
1017
1042
  isDriverArea: coach.places ? coach.places.length === 0 : true,
1018
1043
  driverAreaSide: this._prepareDriverAreaSideNavigation(coach),
1019
- freePlaces: this.getAvailableFreePlacesNumFromCoach(places)
1044
+ freePlaces: this.getAvailableFreePlacesNumFromCoach(places),
1045
+ driverAreaElements: this._setDriverAreasElements(coach)
1020
1046
  });
1021
1047
  });
1022
1048
  }
@@ -1110,6 +1136,25 @@ let SeatReservationBaseElement = (() => {
1110
1136
  _isOverhangingElementsPresent(coachItemWidth, elements) {
1111
1137
  return elements?.some((element) => element.position.x === 0 || element.position.x + element.dimension.w >= coachItemWidth) ?? false;
1112
1138
  }
1139
+ /**
1140
+ * collect information about the driverAreas for one coach
1141
+ * @param coachItem
1142
+ * @private
1143
+ */
1144
+ _setDriverAreasElements(coachItem) {
1145
+ if (coachItem) {
1146
+ const driverArea = coachItem.graphicElements?.find((element) => element.icon === "DRIVER_AREA");
1147
+ const driverAreaNoVerticalWall = coachItem.type === "LOCOMOTIVE_COACH" ? coachItem.graphicElements?.find((element) => element.icon === "DRIVER_AREA_NO_VERTICAL_WALL") : void 0;
1148
+ return {
1149
+ driverArea,
1150
+ driverAreaNoVerticalWall
1151
+ };
1152
+ }
1153
+ return {
1154
+ driverArea: void 0,
1155
+ driverAreaNoVerticalWall: void 0
1156
+ };
1157
+ }
1113
1158
  /**
1114
1159
  * Is called when the SeatReservation loses focus, what happens when the user tabs out or clicks somewhere else.
1115
1160
  * Then we reset the focused elements.
@@ -1120,9 +1165,10 @@ let SeatReservationBaseElement = (() => {
1120
1165
  }
1121
1166
  this.unfocusPlaceElement();
1122
1167
  }
1123
- }, _seatReservations_accessor_storage = new WeakMap(), _hasNavigation_accessor_storage = new WeakMap(), _alignVertical_accessor_storage = new WeakMap(), _baseGridSize_accessor_storage = new WeakMap(), _height_accessor_storage = new WeakMap(), _maxSeatReservations_accessor_storage = new WeakMap(), _maxBicycleReservations_accessor_storage = new WeakMap(), _preventPlaceClick_accessor_storage = new WeakMap(), _preselectCoachIndex_accessor_storage = new WeakMap(), _selectedCoachIndex_accessor_storage = new WeakMap(), _focusedCoachIndex_accessor_storage = new WeakMap(), _hoveredCoachIndex_accessor_storage = new WeakMap(), (() => {
1168
+ }, _seatReservations_accessor_storage = new WeakMap(), _travelDirection_accessor_storage = new WeakMap(), _hasNavigation_accessor_storage = new WeakMap(), _alignVertical_accessor_storage = new WeakMap(), _baseGridSize_accessor_storage = new WeakMap(), _height_accessor_storage = new WeakMap(), _maxSeatReservations_accessor_storage = new WeakMap(), _maxBicycleReservations_accessor_storage = new WeakMap(), _preventPlaceClick_accessor_storage = new WeakMap(), _preselectCoachIndex_accessor_storage = new WeakMap(), _showTitleInfo_accessor_storage = new WeakMap(), _selectedCoachIndex_accessor_storage = new WeakMap(), _focusedCoachIndex_accessor_storage = new WeakMap(), _hoveredCoachIndex_accessor_storage = new WeakMap(), (() => {
1124
1169
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1125
1170
  _seatReservations_decorators = [property({ attribute: "seat-reservations", type: Array })];
1171
+ _travelDirection_decorators = [property({ attribute: "travel-direction", type: String })];
1126
1172
  _hasNavigation_decorators = [forceType(), property({ attribute: "has-navigation", type: Boolean })];
1127
1173
  _alignVertical_decorators = [forceType(), property({ attribute: "align-vertical", type: Boolean, reflect: true, useDefault: true })];
1128
1174
  _baseGridSize_decorators = [forceType(), property({ attribute: "base-grid-size", type: Number })];
@@ -1131,6 +1177,7 @@ let SeatReservationBaseElement = (() => {
1131
1177
  _maxBicycleReservations_decorators = [forceType(), property({ attribute: "max-bicycle-reservations", type: Number })];
1132
1178
  _preventPlaceClick_decorators = [forceType(), property({ attribute: "prevent-place-click", type: Boolean })];
1133
1179
  _preselectCoachIndex_decorators = [forceType(), property({ attribute: "preselect-coach-index", type: Number })];
1180
+ _showTitleInfo_decorators = [forceType(), property({ attribute: "show-title-info", type: Boolean })];
1134
1181
  _selectedCoachIndex_decorators = [state()];
1135
1182
  _focusedCoachIndex_decorators = [state()];
1136
1183
  _hoveredCoachIndex_decorators = [state()];
@@ -1138,6 +1185,9 @@ let SeatReservationBaseElement = (() => {
1138
1185
  __esDecorate(_a, null, _seatReservations_decorators, { kind: "accessor", name: "seatReservations", static: false, private: false, access: { has: (obj) => "seatReservations" in obj, get: (obj) => obj.seatReservations, set: (obj, value) => {
1139
1186
  obj.seatReservations = value;
1140
1187
  } }, metadata: _metadata }, _seatReservations_initializers, _seatReservations_extraInitializers);
1188
+ __esDecorate(_a, null, _travelDirection_decorators, { kind: "accessor", name: "travelDirection", static: false, private: false, access: { has: (obj) => "travelDirection" in obj, get: (obj) => obj.travelDirection, set: (obj, value) => {
1189
+ obj.travelDirection = value;
1190
+ } }, metadata: _metadata }, _travelDirection_initializers, _travelDirection_extraInitializers);
1141
1191
  __esDecorate(_a, null, _hasNavigation_decorators, { kind: "accessor", name: "hasNavigation", static: false, private: false, access: { has: (obj) => "hasNavigation" in obj, get: (obj) => obj.hasNavigation, set: (obj, value) => {
1142
1192
  obj.hasNavigation = value;
1143
1193
  } }, metadata: _metadata }, _hasNavigation_initializers, _hasNavigation_extraInitializers);
@@ -1162,6 +1212,9 @@ let SeatReservationBaseElement = (() => {
1162
1212
  __esDecorate(_a, null, _preselectCoachIndex_decorators, { kind: "accessor", name: "preselectCoachIndex", static: false, private: false, access: { has: (obj) => "preselectCoachIndex" in obj, get: (obj) => obj.preselectCoachIndex, set: (obj, value) => {
1163
1213
  obj.preselectCoachIndex = value;
1164
1214
  } }, metadata: _metadata }, _preselectCoachIndex_initializers, _preselectCoachIndex_extraInitializers);
1215
+ __esDecorate(_a, null, _showTitleInfo_decorators, { kind: "accessor", name: "showTitleInfo", static: false, private: false, access: { has: (obj) => "showTitleInfo" in obj, get: (obj) => obj.showTitleInfo, set: (obj, value) => {
1216
+ obj.showTitleInfo = value;
1217
+ } }, metadata: _metadata }, _showTitleInfo_initializers, _showTitleInfo_extraInitializers);
1165
1218
  __esDecorate(_a, null, _selectedCoachIndex_decorators, { kind: "accessor", name: "selectedCoachIndex", static: false, private: false, access: { has: (obj) => "selectedCoachIndex" in obj, get: (obj) => obj.selectedCoachIndex, set: (obj, value) => {
1166
1219
  obj.selectedCoachIndex = value;
1167
1220
  } }, metadata: _metadata }, _selectedCoachIndex_initializers, _selectedCoachIndex_extraInitializers);
@@ -1181,4 +1234,4 @@ let SeatReservationBaseElement = (() => {
1181
1234
  export {
1182
1235
  SeatReservationBaseElement
1183
1236
  };
1184
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIExpdEVsZW1lbnQsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIE5hdmlnYXRpb25Db2FjaEl0ZW0sXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgUGxhY2VUcmF2ZWxDbGFzcyxcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCxcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMsXG59IGZyb20gJy4uL2NvbW1vbi50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gbmF2aWdhdGlvbiBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoYXMtbmF2aWdhdGlvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhhc05hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGlzIGFsaWduZWQgdmVydGljYWxseSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWxpZ24tdmVydGljYWwnLCB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlLCB1c2VEZWZhdWx0OiB0cnVlIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhbGlnblZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyBiYXNlIGdyaWQgc2l6ZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFzZS1ncmlkLXNpemUnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJhc2VHcmlkU2l6ZTogbnVtYmVyID0gMTY7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyB3aWR0aCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGVpZ2h0JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoZWlnaHQ6IG51bWJlciA9IG51bGwhO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgc2VhdHMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1zZWF0LXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4U2VhdFJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBiaWN5Y2xlIHBsYWNlcyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LWJpY3ljbGUtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhCaWN5Y2xlUmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogQW55IGNsaWNrIGZ1bmN0aW9uYWxpdHkgaXMgcHJldmVudGVkICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmV2ZW50LXBsYWNlLWNsaWNrJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJldmVudFBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJlc2VsZWN0LWNvYWNoLWluZGV4JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmVzZWxlY3RDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGhvdmVyZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBEZXNjcmliZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoZXMgPSA0O1xuICAvLyBUaGUgY2FsY3VsYXRlZCBjb2FjaEJvcmRlck9mZnNldCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBjb2FjaCBib3JkZXIgZ3JhcGhpYyxcbiAgLy8gYnV0IGFsc28gdG8gcG9zaXRpb24gb3RoZXIgZ3JhcGhpY3MgdGhhdCBhcmUgYWxpZ25lZCBkaXJlY3RseSB0byB0aGUgY29hY2ggYm9yZGVyLlxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGRlY2tzIGJ5IG11bHRpcGxlIGRlY2sgdmlzdWFsaXphdGlvblxuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSA0ODtcbiAgLy8gRGVzY3JpYmVzIHRoZSBmaXggd2lkdGggb2YgY29hY2ggbmF2aWdhdGlvbiBidXR0b25cbiAgcHJvdGVjdGVkIGNvYWNoTmF2QnV0dG9uRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgY29hY2hOYXZEYXRhOiBOYXZpZ2F0aW9uQ29hY2hJdGVtW10gPSBbXTtcbiAgcHJvdGVjdGVkIGN1cnJTY3JvbGxEaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbiA9IFNjcm9sbERpcmVjdGlvbi5yaWdodDtcbiAgcHJvdGVjdGVkIG1heENhbGNDb2FjaGVzV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxDb2FjaGVzQXJlYVdpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW06IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCB0cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uOiBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludFtdID0gW107XG4gIHByb3RlY3RlZCBuYXZpZ2F0aW9uU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGNvYWNoU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWREZWNrSW5kZXg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyA9IHtcbiAgICBzZWF0czogW10sXG4gICAgYmljeWNsZXM6IFtdLFxuICB9O1xuICBwcm90ZWN0ZWQgc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGhhc011bHRpcGxlRGVja3MgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBrZXlib2FyZE5hdmlnYXRpb25FdmVudHMgPSB7XG4gICAgQXJyb3dMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgICBBcnJvd1JpZ2h0OiAnQXJyb3dSaWdodCcsXG4gICAgQXJyb3dVcDogJ0Fycm93VXAnLFxuICAgIEFycm93RG93bjogJ0Fycm93RG93bicsXG4gICAgVGFiOiAnVGFiJyxcbiAgICBFbnRlcjogJ0VudGVyJyxcbiAgfSBhcyBjb25zdDtcblxuICAvLyBHcmFwaGljcyB0aGF0IHNob3VsZCBub3QgYmUgcmVuZGVyZWQgd2l0aCBhbiBhcmVhXG4gIHByb3RlY3RlZCBub3RBcmVhRWxlbWVudHMgPSBbXG4gICAgJ0RSSVZFUl9BUkVBJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgXTtcblxuICBwcm90ZWN0ZWQgb3ZlckhhbmdpbmdFbGVtZW50SW5mb3JtYXRpb246IHtcbiAgICBjb2FjaElkOiBzdHJpbmc7XG4gICAgb3ZlcmhhbmdpbmdQbGFjZXM6IGJvb2xlYW47XG4gICAgb3ZlcmhhbmdpbmdHcmFwaGljQXJlYXM6IGJvb2xlYW47XG4gIH1bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gIHByaXZhdGUgX3Njcm9sbFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9sYXN0U3RhcnRTY3JvbGxQb3MgPSAtMTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBBZGQgYmx1ciBldmVudCBsaXN0ZW5lciBvbiB0aGUgZW50aXJlIGNvbXBvbmVudCB0byBkZXRlY3Qgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlIGNvbXBvbmVudFxuICAgIC8vIGJ5IHVzaW5nIHRhYiBuYXZpZ2F0aW9uIG9yIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudC4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gcmVzZXQgdGhlIHNlbGVjdGVkIGNvYWNoIGFuZCBwbGFjZS5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB0aGlzLl9vbkxlYXZlU2VhdFJlc2VydmF0aW9uQ29tcG9uZW50KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzZWF0UmVzZXJ2YXRpb25zJykpIHtcbiAgICAgIHRoaXMuaGFzTXVsdGlwbGVEZWNrcyA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucz8ubGVuZ3RoID4gMTtcblxuICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICB0aGlzLl9wcmVwYXJlQ29hY2hXaWR0aEFuZEdhcENhbGN1bGF0aW9ucygpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2FsaWduVmVydGljYWwnKSAmJiB0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncHJlc2VsZWN0Q29hY2hJbmRleCcpKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdpdGhvdXQsIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpIHdvdWxkIGZhaWwgd2l0aCBOUEUgYmVjYXVzZVxuICAgICAgLy8gdGhlIGNvYWNoU2Nyb2xsQXJlYSBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHRoaXMucHJlc2VsZWN0Q29hY2hJbmRleCksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgbGV0IG5hdmlnYXRlVG9Db2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4IC0gMSA6IDA7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdPy5jb2FjaEl0ZW1zLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgMSA6IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmF2aWdhdGVUb0NvYWNoSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGEgY2FuIGJlIHByZXBhcmVkIG9uY2UgZm9yIHRoZSBlbnRpcmUgY29tcG9uZW50XG4gICAqIGluIG9yZGVyIHRvIGF2b2lkIHJlY3VycmluZyBpdGVyYXRpb24gcHJvY2Vzc2VzIGluIHJlbmRlcmluZy5cbiAgICovXG4gIHByaXZhdGUgX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTtcblxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlRGVja3MpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWNrcywgd2UgbmVlZCB0byBjaGVja1xuICAgICAgLy8gd2hldGhlciBlbXB0eSBjb2FjaGVzIG5lZWQgdG8gYmUgYWRkZWQgb24gZGlmZmVyZW50IGRlY2sgbGV2ZWxzXG4gICAgICB0aGlzLl9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGFyZU5hdmlnYXRpb25Db2FjaERhdGEoKTtcbiAgfVxuXG4gIC8qKiBJbml0IHNjcm9sbCBldmVudCBoYW5kbGluZyBmb3IgY29hY2ggbmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYScsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgPyB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdXG4gICAgICA6IG51bGw7XG4gICAgaWYgKHNlYXRSZXNlcnZhdGlvbkRlY2sgJiYgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGhlaWdodCBvZiBvbmUgY29hY2ggaW5jbHVkaW5nIGJvcmRlciBwYWRkaW5nXG4gICAgICBjb25zdCBjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nID1cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oICogdGhpcy5iYXNlR3JpZFNpemUgKyB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZztcblxuICAgICAgLy8gQ2FsY3VsYXRlIGVhY2ggZ2FwIGJldHdlZW4gbXVsdGlwbGUgY29hY2ggdGhlIGRlY2tzLlxuICAgICAgLy8gTm8gZ2FwIGV4aXN0IGlmIGp1c3Qgb25lIGNvYWNoIGRlY2sgZXhpc3QuXG4gICAgICBjb25zdCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9ICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkgKiB0aGlzLmdhcEJldHdlZW5Db2FjaERlY2tzO1xuXG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0JyxcbiAgICAgICAgYCR7Y29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyAqIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggKyBnYXBCZXR3ZWVuQ29hY2hEZWNrc31gLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzJywgYCR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gSW5pdCB0aGUgY29hY2hOYXZCdXR0b25EaW0gZGltZW5zaW9uLCB3aGljaCBpcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHNjcm9sbCBuYXZpZ2F0aW9uIGxhdGVyXG4gICAgICBjb25zdCBuYXZDb2FjaGVzTGlzdCA9IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEucXVlcnlTZWxlY3RvcigndWwgPiBsaScpIGFzIEhUTUxVTGlzdEVsZW1lbnQ7XG4gICAgICBpZiAobmF2Q29hY2hlc0xpc3QpIHtcbiAgICAgICAgY29uc3QgZmlyc3RMaUVsZURpbWVuc2lvbiA9IG5hdkNvYWNoZXNMaXN0Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgID8gZmlyc3RMaUVsZURpbWVuc2lvbi5oZWlnaHRcbiAgICAgICAgICA6IGZpcnN0TGlFbGVEaW1lbnNpb24ud2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29hY2hTY3JvbGxBcmVhICYmIHNlYXRSZXNlcnZhdGlvbkRlY2spIHtcbiAgICAgIC8vIEluaXQgdGhlIHN0YXJ0IG9mZnNldCBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBjb2FjaCBzY3JvbGwgdHJpZ2dlciBwb3NpdGlvbnNcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIFByZWNhbGN1bGF0ZSB0cmlnZ2VyIHNjcm9sbCBwb3NpdGlvbiBhcnJheSBkZXBlbmRzIG9uIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24gPSBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFBvc1ggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG4gICAgICAgIGNvbnN0IGNvYWNoV2lkdGggPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oY29hY2guZGltZW5zaW9uKS53O1xuXG4gICAgICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBlbmQgc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb24gb2YgYSBjb2FjaCwgaW5jbHVkaW5nIHRoZSBnYXAgYmV0d2VlbiB0aGUgY29hY2hlc1xuICAgICAgICAvLyBUaGUgZ2FwIGlzIG1heWJlIGFkanVzdGVkIGlmIG92ZXJoYW5naW5nIHBsYWNlcyBvciBncmFwaGljcyBleGlzdFxuICAgICAgICBjb25zdCBjdXJyZW50Q29hY2hPdmVyaGFuZ2luZ0luZm8gPSB0aGlzLm92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uLmZpbmQoXG4gICAgICAgICAgKGUpID0+IGUuY29hY2hJZCA9PT0gY29hY2guaWQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG92ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50ID1cbiAgICAgICAgICBjdXJyZW50Q29hY2hPdmVyaGFuZ2luZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICAgICAgY3VycmVudENvYWNoT3ZlcmhhbmdpbmdJbmZvPy5vdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcztcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hXaWR0aCArXG4gICAgICAgICAgKCFvdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudCA/IHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXMgOiAyICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRQb3NYLFxuICAgICAgICAgIGVuZDogY3VyckNhbGNUcmlnZ2VyUG9zLFxuICAgICAgICAgIHdpZHRoOiBjb2FjaFdpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaE5hdkRhdGFbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoTmF2RGF0YS5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSByZXR1cm47XG5cbiAgICAvLyBObyBhdXRvIHBsYWNlIHByZXNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBwcmVzZWxlY3QgY29hY2ggaW5kZXhcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIERyaXZlckFyZWEgb3IgRW1wdHkgY29hY2ggKG5vIHBsYWNlcyksIG5vIHBsYWNlIGlzIHNlbGVjdGFibGUsIHNvIHdlIHJldHVybiBkaXJlY3RseVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29hY2hOYXZEYXRhW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0gJiZcbiAgICAgIHRoaXMuY29hY2hOYXZEYXRhW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uaXNEcml2ZXJBcmVhXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHdoZW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIGFuZCBjb2FjaGVzIGFyZSBzY3JvbGxlZCBieSBhdXRvIHNjcm9sbGluZyxcbiAgICAvLyB0aGVuIHdlIGNhbiBzZXQgdGhlIGZvY3VzIG9uIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2guXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiYgdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgICAvL0lmIGNsb3Nlc3RQbGFjZSBleGlzdCwgd2UgaGF2ZSB0byB1bmZvY3VzIHByZXZpb3VzIGZvY3VzZWQgcGxhY2VcbiAgICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoY2xvc2VzdFBsYWNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgYSBjb2FjaCB3YXMgc2VsZWN0ZWQgd2l0aCBubyBwbGFjZXMsIHRoZW4gd2UgaGF2ZSB0byBmb2N1cyB0aGUgY29hY2hHcmlkXG4gICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcHJlc2VsZWN0aW9uIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBieSBub3JtYWwgY2xpY2tpbmcgb3IgdmlhIHNjcmVlbiByZWFkZXIgdmlhIHRhYixcbiAgICAvLyB3ZSBvbmx5IGZvY3VzIHRoZSB0YWJsZSB3aXRob3V0IGRpcmVjdGx5IGZvY3VzaW5nIHRoZSBwbGFjZS5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuXG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9pc1ZhbGlkQ29hY2hJbmRleChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpICYmXG4gICAgICBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICkge1xuICAgICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSB0aGlzLl9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk7XG4gICAgICB0aGlzLl9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTtcblxuICAgICAgY29uc3Qgc2Nyb2xsVG9Db2FjaFBvc1ggPSB0aGlzLl9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggIT09IC0xIHx8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IDA7XG5cbiAgICAgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBhbGxvd3Mgc2Nyb2xsaW5nIHRvIHRoZSBuZXh0IHdhZ29uIG9yIG5vdFxuICAgICAgaWYgKGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSAmJiB0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxUb0NvYWNoUG9zWCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbFRvQ29hY2hQb3NYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuXG4gICAgICAgIC8vVHJ5IHRvIHNjcm9sbCBmb2N1c2VkIHBsYWNlIGludG8gdGhlIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICAvLyBTaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSBjb2FjaCBoYXMgYmVlbiB2aXN1YWxseSBleHBhbmRlZCB0byBtYWludGFpbiBhIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMsXG4gICAgICAvLyBzb21lIGdyYXBoaWNzIG11c3QgYWxzbyBiZSBhZGFwdGVkIHRvIHRoZSBoZWlnaHQsIHdoaWNoIGVuZCB3aXRoIHRoZSBib3JkZXJzIG9mIHRoZSBjb2FjaFxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmV0Y2hIZWlnaHQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGdyYXBoaWNzIGFyZSBhc3NpZ25lZCBkaXJlY3RseSBhdCB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCxcbiAgICAgIC8vIHRoZXNlIGdyYXBoaWNzIG11c3QgYmUgZXhwYW5kZWQgaW4gaGVpZ2h0IGJ5IGEgY29hY2hCb3JkZXJPZmZzZXQgaW4gb3JkZXIgdG8gcmVhY2ggdGhlaXIgb3JpZ2luYWwgdmlzdWFsIHBvc2l0aW9uXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdzogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncsXG4gICAgICBoOiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICBlbGVtZW50UG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbixcbiAgICBlbGVtZW50RGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50UG9zaXRpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiBlbGVtZW50RGltZW5zaW9uKSB7XG4gICAgICBjb25zdCBlbmRQb3NIZWlnaHQgPSBpc09yaWdpbkhlaWdodFxuICAgICAgICA/IGNvYWNoRGltZW5zaW9uLmhcbiAgICAgICAgOiBjb2FjaERpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGRldGVjdHMgaWYgYSAoZ3JhcGhpY2FsKSBlbGVtZW50IGlzIG9uIHRoZSBib3JkZXIgd2l0aCBpdHMgcG9zaXRpb24gKHVwcGVyIG9yIGxvd2VyIGJvcmRlcikuXG4gICAqIEBwYXJhbSBiYXNlRWxlbWVudFxuICAgKiBAcGFyYW0gY29hY2hEaW1lbnNpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoXG4gICAgYmFzZUVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCB8fFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSArIGJhc2VFbGVtZW50LmRpbWVuc2lvbi5oID09PSBjb2FjaERpbWVuc2lvbi5oXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIGF2YWlsYWJsZSBzZWF0cyB0b2dldGhlciBkZXBlbmRpbmcgb24gdGhlIHNlYXQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VzXG4gICAqIEByZXR1cm5zIEFuIE9iamVjdCB3aXRoIGNvdW50IG9mIGZyZWUgc2VhdHMgYW5kIGZyZWUgYmljeWNsZSBwbGFjZXNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKFxuICAgIHBsYWNlczogUGxhY2VbXSB8IHVuZGVmaW5lZCxcbiAgKTogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMge1xuICAgIGNvbnN0IGFjY3VtdWxhdG9yOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHsgc2VhdHM6IDAsIGJpY3ljbGVzOiAwIH07XG4gICAgY29uc3QgZnJlZVBsYWNlcyA9IHBsYWNlcz8ucmVkdWNlKChhY2N1bXVsYXRvciwgY3VyclBsYWNlOiBQbGFjZSkgPT4ge1xuICAgICAgaWYgKGN1cnJQbGFjZS5zdGF0ZSAhPT0gJ0ZSRUUnKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICAgIC8vIENvdW50IHVwIGRlcGVuZGluZyBvbiBzZWF0IHR5cGVcbiAgICAgIGlmIChjdXJyUGxhY2UudHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLnNlYXRzKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bXVsYXRvci5iaWN5Y2xlcysrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIGFjY3VtdWxhdG9yKTtcbiAgICByZXR1cm4gZnJlZVBsYWNlcyA/IGZyZWVQbGFjZXMgOiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdCB0aGUgZW5kIG9mIGEgc2Nyb2xsIEV2ZW50IGZyb20gdGhlIGNvYWNoIHNjcm9sbGFibGUgYXJlYSxcbiAgICogdGhlIHJlYWNoZWQgY29hY2ggaXMgbWFya2VkIGFzIHNlbGVjdGVkXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgOiB0aGlzLl9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTtcblxuICAgIC8vIFRJTU8tNDM3MDVcbiAgICAvLyBJZiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBieSBtb3VzZSBjbGljayAocHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSBiZWZvcmUgdHJpZ2dlcmluZyB0aGlzIHNjcm9sbGVuZCBtZXRob2QsXG4gICAgLy8gdGhlbiB0aGlzIHNjcm9sbGluZyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZXRob2QgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydCwgYW5kIGl0IGlzIG9ubHkgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbCAoc2Nyb2xsSW50b1ZpZXcpLFxuICAgIC8vIHdoZXJlIGEgbGVzcyB2aXNpYmxlIHBsYWNlIGhhcyBiZWVuIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LiBJbiBjYXNlIG9mIGEgcGxhY2UgYWRqdXN0bWVudCBieSBjbGljaywgd2UgY2FuIHJldHVybiBoZXJlLlxuICAgIGlmICh0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZW5kc2Nyb2xsaW5nIGlzIGp1c3QgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbGluZyAocGxhY2UgaGFzIDIgZ3JpZCBzaXplIHVuaXRzKVxuICAgICAgY29uc3QgaXNDb2FjaFNjcm9sbGluZyA9XG4gICAgICAgIE1hdGguYWJzKHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyAtIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQpID5cbiAgICAgICAgdGhpcy5iYXNlR3JpZFNpemUgKiAyO1xuICAgICAgaWYgKGlzQ29hY2hTY3JvbGxpbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuXG4gICAgLy8gQWZ0ZXIgY29hY2ggc2Nyb2xsZW5kIGV2ZW50IHdlIGNhbiByZXNldCB0aGUgaG92ZXJlZCBjb2FjaCBpbmRleFxuICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSAtMTtcblxuICAgIC8vIEluIGNhc2UgdGhlIHVzZXIgdXNlcyB0aGUgc2Nyb2xsYmFyIHdpdGhvdXQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VhdCByZXNlcnZhdGlvbixcbiAgICAvLyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGluZGV4IGlzIC0xLCBhbmQgd2UgaGF2ZSB0byBzZXQgdGhpcyB2YWx1ZSB3aXRoIGZpbmRTY3JvbGxDb2FjaEluZGV4LlxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmaW5kU2Nyb2xsQ29hY2hJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICAvL1doZW4gdXNlciBpcyBzY3JvbGxpbmcgdmlhIHNjcm9sbGJhciwgaXQgYXV0b21hdGljYWxseSBzY3JvbGxzIHRvIHRoZSBmb2N1c2VkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKGZpbmRTY3JvbGxDb2FjaEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFuIGF1dG9tYXRpYyBtYWluIG5hdmlnYXRpb24gc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWROYXZDb2FjaEluZGV4LlxuICAgKiBDYWxjdWxhdGVzIHRoZSBjZW50cmFsIHNjcm9sbCBvZmZzZXQgb2YgdGhlIG5hdiBjb2FjaCB0byBiZSBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHNlbGVjdGVkTmF2Q29hY2hJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvL1RpbWUgZGVsYXkgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIGV4ZWN1dGluZyBjYWxsaW5nIHNjcm9sbFRvIGZ1bmN0aW9ucyAoY29hY2hlcyBzY3JvbGxpbmcpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggPSB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltIC8gMjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQnV0dG9uT2Zmc2V0WCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleCAqIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPVxuICAgICAgICAgIHNjcm9sbEJ1dHRvbk9mZnNldFggLSBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCArIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsT2Zmc2V0WCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbE9mZnNldFgsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmVudGx5IG5hdmlnYXRpbmcgdGhyb3VnaCBwbGFjZXMgYnkga2V5Ym9hcmQgYW5kIGdvZXMgdG8gcHJldmlvdXMgY29hY2gsXG4gICAqIHRoZW4gd2UgcmV0dXJuIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGNvYWNoIHRvIGdldCB0aGUgY2xvc2VzdCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb24gPVxuICAgICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJlxuICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgY29hY2hUcmlnZ2VyUG9pbnQud2lkdGggPiB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGg7XG5cbiAgICByZXR1cm4gaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvblxuICAgICAgPyBjb2FjaFRyaWdnZXJQb2ludC5lbmQgLSB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlICYmIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggLSBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoO1xuICAgIGNvbnN0IGN1cnJDb2FjaFRyaWdnZXIgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvcyA9XG4gICAgICBjdXJyU2Nyb2xsUG9zWCA9PT0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uc3RhcnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgKGN1cnJTY3JvbGxQb3NYIDwgbWF4U2Nyb2xsV2lkdGhBcmVhIHx8IGN1cnJTY3JvbGxQb3NYID4gY3VyckNvYWNoVHJpZ2dlci5zdGFydCkgJiZcbiAgICAgICFpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29hY2ggaW5kZXggd2hpY2ggaXMgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHNjcm9sbCBhcmVhXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvcFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPSBzY3JvbGxQb3MgKyB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggLyAyO1xuICAgIHJldHVybiB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24uZmluZEluZGV4KFxuICAgICAgKGNvYWNoVHJpZ2dlcikgPT4gc2Nyb2xsT2Zmc2V0WCA+PSBjb2FjaFRyaWdnZXIuc3RhcnQgJiYgc2Nyb2xsT2Zmc2V0WCA8PSBjb2FjaFRyaWdnZXIuZW5kLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaXJzdCBwbGFjZSBvZiBjdXJyZW50IHNlbGVjdGVkIGNvYWNoIGJ5IHRhYmxlIGNlbGwgY29vcmRpbmF0ZSAwLTAgaWQuXG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBmaXJzdENlbGxJZCA9XG4gICAgICAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAnLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLTAtMCc7XG4gICAgY29uc3QgcGxhY2VOdW1iZXIgPVxuICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxIVE1MVGFibGVDZWxsRWxlbWVudD4oJyMnICsgZmlyc3RDZWxsSWQpXG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50Pignc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbCcpXG4gICAgICAgID8uZ2V0QXR0cmlidXRlKCd0ZXh0JykgfHwgbnVsbDtcblxuICAgIGlmIChjb2FjaCAmJiBwbGFjZU51bWJlcikge1xuICAgICAgZmlyc3RQbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gcGxhY2VOdW1iZXIpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaXJzdFBsYWNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICBwcmVzc2VkS2V5OiBzdHJpbmcsXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgIClcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBET1dOXG4gICAgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgKyAyID09PSBjb2FjaC5kaW1lbnNpb24uaCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMTtcbiAgICB9XG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBVUFxuICAgIGVsc2UgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ID09PSAwICYmXG4gICAgICAhIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCAtIDFdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAodGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInICYmIG5ld0ZvY3VzYWJsZUluZGV4ID09PSB0aGlzLmNvYWNoTmF2RGF0YS5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3BsYWNlRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBwbGFjZURlY2tJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcblxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgLy8gVGltZSBkZWxheSB0byB3YWl0IGZvciBzdGF0dXMgdXBkYXRlIHByb2Nlc3MgYXQgY2xpY2tlZCBwbGFjZVxuICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk6IHZvaWQge1xuICAgIC8vT25seSBpZiB0aGUgc2VsZWN0ZWRDb2FjaEluZGV4IGhhcyBjaGFuZ2VkLCBhbiB1cGRhdGUgbmVlZHMgdG8gYmUgY2FycmllZCBvdXRcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSByZXR1cm47XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQWxsIHNlbGVjdGVkIHBsYWNlcyB3aWxsIGJlIHJlc2V0IG9yIHRoZSBjdXJyZW50U2VsZWN0ZWRQbGFjZSB3YXMgZ2l2ZW4sIHRoZW4gd2UgcmVzZXQgYWxsIGV4Y2VwdCBjdXJyZW50U2VsZWN0ZWRQbGFjZVxuICAgKiBAcGFyYW0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnNcbiAgICogQHBhcmFtIGN1cnJTZWxlY3RlZFBsYWNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZT86IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvL0ZpbmQgYWxsIHBsYWNlcyB0byBiZSBuZWVkZWQgdW5zZWxlY3RcbiAgICBmb3IgKGNvbnN0IHBsYWNlU2VsZWN0aW9uIG9mIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zKSB7XG4gICAgICBpZiAoIWN1cnJTZWxlY3RlZFBsYWNlIHx8IGN1cnJTZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCkge1xuICAgICAgICBjb25zdCBwbGFjZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHBsYWNlU2VsZWN0aW9uLmlkKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHBsYWNlRWxlbWVudCkge1xuICAgICAgICAgIHBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0YXRlJywgJ0ZSRUUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvL1JlbW92ZXMgYWxsIHNlbGVjdGVkIHBsYWNlcyBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgIGlmIChjdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgPT09IGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlU2VsZWN0aW9uLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIgfCBudWxsLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwge1xuICAgIGlmIChjb2FjaERlY2tJbmRleCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tjb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4XTtcbiAgICBjb25zdCBwbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gY3VyclNlbGVjdGVkUGxhY2UubnVtYmVyKTtcblxuICAgIHJldHVybiBwbGFjZVxuICAgICAgPyBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5kZWNrSW5kZXgsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleCxcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaChcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2ggfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaC5wbGFjZXMpO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCwgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBwbGFjZVxuICAgICAgPyB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJhdGlvbiBvZiB0aGUgdXNlZCBkb2N1bWVudHMgZm9udC1zaXplIHdoaWNoIG5lZWRzXG4gICAqIHRvIGJlIGRldGVybWluZWQgaW4gb3JkZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBDU1MgdmFsdWVzIHdpdGggcmVtXG4gICAqICovXG4gIHByaXZhdGUgX2RldGVybWluZUJhc2VGb250U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBjb25zdCBiYXNlRm9udFNpemUgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250U2l6ZSwgMTApO1xuICAgICAgLy9jYWxjdWxhdGUgcmVtIG9mIDFweFxuICAgICAgY29uc3Qgb25lUGl4ZWxJblJlbSA9IDEgLyBiYXNlRm9udFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtJywgYCR7b25lUGl4ZWxJblJlbSArICdyZW0nfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBkYXRhIGZvciBkaXNwbGF5aW5nIG5hdmlnYXRpb24gYXJlYS5cbiAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIHdoaWNoIGFyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGR1cmluZyB1c2Ugb2YgYSBjb21wb25lbnQ6XG4gICAqICAgIC0gY29hY2ggaWRcbiAgICogICAgLSBsaXN0IG9mIHNlcnZpY2UgaWNvbnNcbiAgICogICAgLSBjbGFzcyAoZmlyc3QsIHNlY29uZCwgYW55KVxuICAgKiAgICAtIHdoZXRoZXIgdGhlcmUgaXMgYSBkcml2ZXIgYXJlYSBsZWZ0IG9yIHJpZ2h0XG4gICAqICovXG4gIHByaXZhdGUgX3ByZXBhcmVOYXZpZ2F0aW9uQ29hY2hEYXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxvd2VyRGVjazogQ29hY2hJdGVtW10gPVxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXM7XG5cbiAgICAgIHRoaXMuY29hY2hOYXZEYXRhID0gW107XG5cbiAgICAgIGxvd2VyRGVjay5mb3JFYWNoKChjb2FjaCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBwbGFjZXM6IFBsYWNlW10gPSBbXTtcblxuICAgICAgICAvLyBDb2xsZWN0IGFsbCBpbXBvcnRhbnQgbmF2aWdhdGlvbiBkYXRhIHRvIGJlIHJlbmRlcmVkXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5tYXAoKHNyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3IuY29hY2hJdGVtc1tpbmRleF07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaCgoY29hY2g6IENvYWNoSXRlbSkgPT4ge1xuICAgICAgICAgICAgdHJhdmVsQ2xhc3Nlcy5wdXNoKC4uLmNvYWNoLnRyYXZlbENsYXNzKTtcbiAgICAgICAgICAgIHByb3BlcnR5SWRzLnB1c2goLi4uKGNvYWNoLnByb3BlcnR5SWRzID8gY29hY2gucHJvcGVydHlJZHMgOiBbXSkpO1xuICAgICAgICAgICAgcGxhY2VzLnB1c2goLi4uKGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcyA6IFtdKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2FjaE5hdkRhdGEucHVzaCh7XG4gICAgICAgICAgaWQ6IGNvYWNoLmlkLFxuICAgICAgICAgIHRyYXZlbENsYXNzOiB0aGlzLl9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXMpLFxuICAgICAgICAgIHByb3BlcnR5SWRzOiB0aGlzLl9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbihwcm9wZXJ0eUlkcyksXG4gICAgICAgICAgaXNEcml2ZXJBcmVhOiBjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMubGVuZ3RoID09PSAwIDogdHJ1ZSxcbiAgICAgICAgICBkcml2ZXJBcmVhU2lkZTogdGhpcy5fcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihjb2FjaCksXG4gICAgICAgICAgZnJlZVBsYWNlczogdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKHBsYWNlcyksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10pOiBQbGFjZVRyYXZlbENsYXNzIHtcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdGSVJTVCcpICE9PSAtMSkgcmV0dXJuICdGSVJTVCc7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignU0VDT05EJykgIT09IC0xKSByZXR1cm4gJ1NFQ09ORCc7XG4gICAgcmV0dXJuICdBTllfQ0xBU1MnO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvYWNoRHJpdmVyQXJlYXMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAoZ3JhcGhpY2FsRWxlbWVudHMpID0+IGdyYXBoaWNhbEVsZW1lbnRzLmljb24gPT09ICdEUklWRVJfQVJFQScsXG4gICAgKTtcblxuICAgIGlmIChjb2FjaERyaXZlckFyZWFzICYmIGNvYWNoRHJpdmVyQXJlYXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGRyaXZlciBhcmVhIHBvc2l0aW9uIHdoZXRoZXIgaXQgaXMgcHJlc2VudCBvbiB0aGUgbGVmdCBvciByaWdodCBzaWRlIGluIGEgY29hY2hcbiAgICAgIGNvbnN0IGhhc0xlZnREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCkgfHwgZmFsc2U7XG4gICAgICBjb25zdCBoYXNSaWdodERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID4gMCkgfHwgZmFsc2U7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICEhaGFzTGVmdERyaXZlckFyZWEsXG4gICAgICAgIHJpZ2h0OiAhIWhhc1JpZ2h0RHJpdmVyQXJlYSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbiA9IChwcm9wZXJ0eUlkczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKCFwcm9wZXJ0eUlkcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHNocnVua1Byb3BlcnR5SWRzID0gcHJvcGVydHlJZHNcbiAgICAgID8ubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eUlkOiBzdHJpbmcpOiB7XG4gICAgICAgIHBJZDogc3RyaW5nO1xuICAgICAgICBzdmdOYW1lOiBzdHJpbmc7XG4gICAgICB9IHtcbiAgICAgICAgLy8gcHJlcGFyZSB0ZW1wb3Jhcnkgb2JqZWN0IG1hcHBpbmcgcHJvcGVydHkgaWQgdG8gaXQncyBzdmdOYW1lIHNvIHRoYXQgd2UgY2FuIGNvbXBhcmUgaXQgdG8gdGhlIGxpc3Qgb2YgYWxsb3dlZCBpY29uc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBJZDogcHJvcGVydHlJZCxcbiAgICAgICAgICBzdmdOYW1lOiBtYXBJY29uVG9TdmdbcHJvcGVydHlJZF0/LnN2Z05hbWUgPyBtYXBJY29uVG9TdmdbcHJvcGVydHlJZF0/LnN2Z05hbWUgOiAnJyxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAvL2ZpbHRlciBvdXQgb2JqZWN0cyBzZXJ2aWNlIGljb25zIHdoaWNoIGFyZSBub3QgaW4gQUxMT1dFRF9TRVJWSUNFX0lDT05TXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eVRvU3ZnKSA9PiBBTExPV0VEX1NFUlZJQ0VfSUNPTlMuaW5kZXhPZihwcm9wZXJ0eVRvU3ZnLnN2Z05hbWUpICE9PSAtMSlcbiAgICAgIC8vbWFrZSBpdCBkaXN0aW5jdCBieSBzdmdOYW1lXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodmFsdWUsIGluZGV4LCBzZWxmKSA9PlxuICAgICAgICAgIHNlbGYubWFwKChwcm9wU3ZnKSA9PiBwcm9wU3ZnLnN2Z05hbWUpLmluZGV4T2YodmFsdWUuc3ZnTmFtZSkgPT09IGluZGV4LFxuICAgICAgKVxuICAgICAgLy8gZ28gYmFjayB0byBwcm9wZXJ0eUlkIHN0cmluZyBmcm9tIHRlbXBvcmFyeSBvYmplY3RcbiAgICAgIC5tYXAoKHByb3BlcnR5VG9TdmcpID0+IHByb3BlcnR5VG9TdmcucElkKVxuICAgICAgLy8gdGFrZSBmaXJzdCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IGZyb20gQmFja2VuZCwgb3RoZXJ3aXNlIHRoZSBsYXlvdXQgY291bGQgYmUgZGVzdHJveWVkXG4gICAgICAuc2xpY2UoMCwgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyk7XG4gICAgcmV0dXJuIHNocnVua1Byb3BlcnR5SWRzID8gc2hydW5rUHJvcGVydHlJZHMgOiBbXTtcbiAgfTtcblxuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hXaWR0aEFuZEdhcENhbGN1bGF0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBjb2FjaEl0ZW1zOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0/LmNvYWNoSXRlbXM7XG5cbiAgICAgIGNvYWNoSXRlbXM/LmZvckVhY2goKGNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc092ZXJoYW5naW5nUGxhY2VzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgY29hY2hJdGVtLnBsYWNlcyxcbiAgICAgICAgKTtcblxuICAgICAgICAvL011c3QgIGJlIGRvbmUgYWxzbyBmb3IgZ3JhcGhpY2FsIGVsZW1lbnRzLCBhcyB0aGV5IGNhbiBhbHNvIHByb3RydWRlIHRoZSBjb2FjaCBib3JkZXJcbiAgICAgICAgLy8gQ2hlY2sgb25seSBncmFwaGljYWwgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFyZWEgZWxlbWVudHNcbiAgICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAoZSkgPT4gZS5pY29uICYmICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhlLmljb24pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGhhc092ZXJoYW5naW5nR3JhcGhpY0FyZWFzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgZmlsdGVyZWRFbGVtZW50cyxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uLnB1c2goe1xuICAgICAgICAgIGNvYWNoSWQ6IGNvYWNoSXRlbS5pZCxcbiAgICAgICAgICBvdmVyaGFuZ2luZ1BsYWNlczogaGFzT3ZlcmhhbmdpbmdQbGFjZXMsXG4gICAgICAgICAgb3ZlcmhhbmdpbmdHcmFwaGljQXJlYXM6IGhhc092ZXJoYW5naW5nR3JhcGhpY0FyZWFzLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSXMgY2FsbGVkIHdoZW4gdGhlIFNlYXRSZXNlcnZhdGlvbiBsb3NlcyBmb2N1cywgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgdGFicyBvdXQgb3IgY2xpY2tzIHNvbWV3aGVyZSBlbHNlLlxuICAgKiBUaGVuIHdlIHJlc2V0IHRoZSBmb2N1c2VkIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiU2Nyb2xsRGlyZWN0aW9uIiwiYWNjdW11bGF0b3IiLCJwbGFjZSIsImNvYWNoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBNEJBLElBQUs7QUFBQSxDQUFMLFNBQUtBLGtCQUFlO0FBQ2xCQSxtQkFBQSxP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
1237
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIExpdEVsZW1lbnQsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgUGxhY2VUcmF2ZWxDbGFzcyxcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCxcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMsXG4gIFRyYXZlbERpcmVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uLnRzJztcbmltcG9ydCB0eXBlIHsgU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wuY29tcG9uZW50LnRzJztcblxuZW51bSBTY3JvbGxEaXJlY3Rpb24ge1xuICByaWdodCA9ICdyaWdodCcsXG4gIGxlZnQgPSAnbGVmdCcsXG59XG5cbmludGVyZmFjZSBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG5jb25zdCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTID0gMztcbmNvbnN0IEFMTE9XRURfU0VSVklDRV9JQ09OUzogc3RyaW5nW10gPSBbXG4gICdzYS12bycsXG4gICdzYS1ycycsXG4gICdzYS1hYnRlaWxraW5kZXJ3YWdlbicsXG4gICdzYS13cicsXG4gICdzYS1mYScsXG4gICdzYS1ieicsXG4gICdzYS1yeicsXG5dO1xuXG5leHBvcnQgY2xhc3MgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgc2VsZWN0ZWRwbGFjZXM6ICdzZWxlY3RlZHBsYWNlcycsXG4gICAgc2VsZWN0ZWRjb2FjaDogJ3NlbGVjdGVkY29hY2gnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbnMgYXJyYXkgY29udGFpbnMgYWxsIGNvYWNoZXMgYW5kIHBsYWNlcyAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzZWF0LXJlc2VydmF0aW9ucycsIHR5cGU6IEFycmF5IH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBzZWF0UmVzZXJ2YXRpb25zOiBTZWF0UmVzZXJ2YXRpb25bXSA9IG51bGwhO1xuXG4gIC8qKiBEaXNwbGF5cyBhbiBhcnJvdyBzaG93aW5nIHdoYXQgZGlyZWN0aW9uIGRvZXMgdHJhaW4gZHJpdmUqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd0cmF2ZWwtZGlyZWN0aW9uJywgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciB0cmF2ZWxEaXJlY3Rpb246IFRyYXZlbERpcmVjdGlvbiA9ICdOT05FJztcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gbmF2aWdhdGlvbiBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoYXMtbmF2aWdhdGlvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhhc05hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGlzIGFsaWduZWQgdmVydGljYWxseSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWxpZ24tdmVydGljYWwnLCB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlLCB1c2VEZWZhdWx0OiB0cnVlIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhbGlnblZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyBiYXNlIGdyaWQgc2l6ZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFzZS1ncmlkLXNpemUnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJhc2VHcmlkU2l6ZTogbnVtYmVyID0gMTY7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyB3aWR0aCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGVpZ2h0JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoZWlnaHQ6IG51bWJlciA9IG51bGwhO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgc2VhdHMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1zZWF0LXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4U2VhdFJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBiaWN5Y2xlIHBsYWNlcyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LWJpY3ljbGUtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhCaWN5Y2xlUmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogQW55IGNsaWNrIGZ1bmN0aW9uYWxpdHkgaXMgcHJldmVudGVkICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmV2ZW50LXBsYWNlLWNsaWNrJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJldmVudFBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJlc2VsZWN0LWNvYWNoLWluZGV4JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmVzZWxlY3RDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gdGl0bGUgaW5mb3JtYXRpb24gYXQgcGxhY2UtY29udHJvbHMsIG5hdmlnYXRpb24tY29hY2hlcyBhbmQgbmF2aWdhdGlvbi1zZXJ2aWNlcyBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzaG93LXRpdGxlLWluZm8nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBzaG93VGl0bGVJbmZvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIHNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBmb2N1c2VkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBob3ZlcmVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLy8gRGVzY3JpYmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJQYWRkaW5nID0gNjtcbiAgLy8gRGVzY3JpYmVzIHRoZSBnYXAgYmV0d2VlbiB0aGUgY29hY2hlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGdhcEJldHdlZW5Db2FjaGVzID0gNDtcbiAgLy8gVGhlIGNhbGN1bGF0ZWQgY29hY2hCb3JkZXJPZmZzZXQgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgY29hY2ggYm9yZGVyIGdyYXBoaWMsXG4gIC8vIGJ1dCBhbHNvIHRvIHBvc2l0aW9uIG90aGVyIGdyYXBoaWNzIHRoYXQgYXJlIGFsaWduZWQgZGlyZWN0bHkgdG8gdGhlIGNvYWNoIGJvcmRlci5cbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgLy8gRGVzY3JpYmVzIHRoZSBnYXAgYmV0d2VlbiB0aGUgY29hY2hlcyBkZWNrcyBieSBtdWx0aXBsZSBkZWNrIHZpc3VhbGl6YXRpb25cbiAgcHJvdGVjdGVkIGdhcEJldHdlZW5Db2FjaERlY2tzID0gNDg7XG4gIC8vIERlc2NyaWJlcyB0aGUgZml4IHdpZHRoIG9mIGNvYWNoIG5hdmlnYXRpb24gYnV0dG9uXG4gIHByb3RlY3RlZCBjb2FjaE5hdkJ1dHRvbkRpbTogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbm90QXJlYUVsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfSElHSCcsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTUlERExFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9MT1cnLFxuICBdO1xuXG4gIHByb3RlY3RlZCBvdmVySGFuZ2luZ0VsZW1lbnRJbmZvcm1hdGlvbjoge1xuICAgIGNvYWNoSWQ6IHN0cmluZztcbiAgICBvdmVyaGFuZ2luZ1BsYWNlczogYm9vbGVhbjtcbiAgICBvdmVyaGFuZ2luZ0dyYXBoaWNBcmVhczogYm9vbGVhbjtcbiAgfVtdID0gW107XG5cbiAgcHJpdmF0ZSBfaXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Nyb2xsVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xhc3RTdGFydFNjcm9sbFBvcyA9IC0xO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIEFkZCBibHVyIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBlbnRpcmUgY29tcG9uZW50IHRvIGRldGVjdCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgY29tcG9uZW50XG4gICAgLy8gYnkgdXNpbmcgdGFiIG5hdmlnYXRpb24gb3IgY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50LiBJbiB0aGlzIGNhc2UsIHdlIGNhbiByZXNldCB0aGUgc2VsZWN0ZWQgY29hY2ggYW5kIHBsYWNlLlxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHRoaXMuX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NlYXRSZXNlcnZhdGlvbnMnKSkge1xuICAgICAgdGhpcy5oYXNNdWx0aXBsZURlY2tzID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5sZW5ndGggPiAxO1xuXG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuX3ByZXBhcmVDb2FjaFdpZHRoQW5kR2FwQ2FsY3VsYXRpb25zKCk7XG4gICAgICB0aGlzLl9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnYmFzZUdyaWRTaXplJykpIHtcbiAgICAgIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgaGVpZ2h0IGlzIHVzZWQsIHRoZSBiYXNlR3JpZFNpemUgbXVzdCBiZSByZWNhbGN1bGF0ZWRcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoZWlnaHQnKSAmJiAhIXRoaXMuaGVpZ2h0KSB7XG4gICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25MYXllciA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0gfHwgbnVsbDtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25MYXllcj8uY29hY2hJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5iYXNlR3JpZFNpemUgPSB0aGlzLmhlaWdodCAvIHNlYXRSZXNlcnZhdGlvbkxheWVyLmNvYWNoSXRlbXNbMF0uZGltZW5zaW9uLmg7XG4gICAgICAgIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemUnLCBgJHt0aGlzLmJhc2VHcmlkU2l6ZX1weGApO1xuXG4gICAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnYWxpZ25WZXJ0aWNhbCcpICYmIHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwcmVzZWxlY3RDb2FjaEluZGV4JykpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0/LmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTtcbiAgfVxuXG4gIC8qKiBJbml0IHNjcm9sbCBldmVudCBoYW5kbGluZyBmb3IgY29hY2ggbmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYScsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgPyB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdXG4gICAgICA6IG51bGw7XG4gICAgaWYgKHNlYXRSZXNlcnZhdGlvbkRlY2sgJiYgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGhlaWdodCBvZiBvbmUgY29hY2ggaW5jbHVkaW5nIGJvcmRlciBwYWRkaW5nXG4gICAgICBjb25zdCBjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nID1cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oICogdGhpcy5iYXNlR3JpZFNpemUgKyB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZztcblxuICAgICAgLy8gQ2FsY3VsYXRlIGVhY2ggZ2FwIGJldHdlZW4gbXVsdGlwbGUgY29hY2ggdGhlIGRlY2tzLlxuICAgICAgLy8gTm8gZ2FwIGV4aXN0IGlmIGp1c3Qgb25lIGNvYWNoIGRlY2sgZXhpc3QuXG4gICAgICBjb25zdCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9ICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkgKiB0aGlzLmdhcEJldHdlZW5Db2FjaERlY2tzO1xuXG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0JyxcbiAgICAgICAgYCR7Y29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyAqIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggKyBnYXBCZXR3ZWVuQ29hY2hEZWNrc31gLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzJywgYCR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gSW5pdCB0aGUgY29hY2hOYXZCdXR0b25EaW0gZGltZW5zaW9uLCB3aGljaCBpcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHNjcm9sbCBuYXZpZ2F0aW9uIGxhdGVyXG4gICAgICBjb25zdCBuYXZDb2FjaGVzTGlzdCA9IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEucXVlcnlTZWxlY3RvcigndWwgPiBsaScpIGFzIEhUTUxVTGlzdEVsZW1lbnQ7XG4gICAgICBpZiAobmF2Q29hY2hlc0xpc3QpIHtcbiAgICAgICAgY29uc3QgZmlyc3RMaUVsZURpbWVuc2lvbiA9IG5hdkNvYWNoZXNMaXN0Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgID8gZmlyc3RMaUVsZURpbWVuc2lvbi5oZWlnaHRcbiAgICAgICAgICA6IGZpcnN0TGlFbGVEaW1lbnNpb24ud2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29hY2hTY3JvbGxBcmVhICYmIHNlYXRSZXNlcnZhdGlvbkRlY2spIHtcbiAgICAgIC8vIEluaXQgdGhlIHN0YXJ0IG9mZnNldCBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBjb2FjaCBzY3JvbGwgdHJpZ2dlciBwb3NpdGlvbnNcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIFByZWNhbGN1bGF0ZSB0cmlnZ2VyIHNjcm9sbCBwb3NpdGlvbiBhcnJheSBkZXBlbmRzIG9uIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24gPSBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFBvc1ggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG4gICAgICAgIGNvbnN0IGNvYWNoV2lkdGggPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oY29hY2guZGltZW5zaW9uKS53O1xuXG4gICAgICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBlbmQgc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb24gb2YgYSBjb2FjaCwgaW5jbHVkaW5nIHRoZSBnYXAgYmV0d2VlbiB0aGUgY29hY2hlc1xuICAgICAgICAvLyBUaGUgZ2FwIGlzIG1heWJlIGFkanVzdGVkIGlmIG92ZXJoYW5naW5nIHBsYWNlcyBvciBncmFwaGljcyBleGlzdFxuICAgICAgICBjb25zdCBjdXJyZW50Q29hY2hPdmVyaGFuZ2luZ0luZm8gPSB0aGlzLm92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uLmZpbmQoXG4gICAgICAgICAgKGUpID0+IGUuY29hY2hJZCA9PT0gY29hY2guaWQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG92ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50ID1cbiAgICAgICAgICBjdXJyZW50Q29hY2hPdmVyaGFuZ2luZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICAgICAgY3VycmVudENvYWNoT3ZlcmhhbmdpbmdJbmZvPy5vdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcztcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hXaWR0aCArXG4gICAgICAgICAgKCFvdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudCA/IHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXMgOiAyICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRQb3NYLFxuICAgICAgICAgIGVuZDogY3VyckNhbGNUcmlnZ2VyUG9zLFxuICAgICAgICAgIHdpZHRoOiBjb2FjaFdpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSByZXR1cm47XG5cbiAgICAvLyBObyBhdXRvIHBsYWNlIHByZXNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBwcmVzZWxlY3QgY29hY2ggaW5kZXhcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIERyaXZlckFyZWEgb3IgRW1wdHkgY29hY2ggKG5vIHBsYWNlcyksIG5vIHBsYWNlIGlzIHNlbGVjdGFibGUsIHNvIHdlIHJldHVybiBkaXJlY3RseVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0gJiZcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uaXNEcml2ZXJBcmVhXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHdoZW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIGFuZCBjb2FjaGVzIGFyZSBzY3JvbGxlZCBieSBhdXRvIHNjcm9sbGluZyxcbiAgICAvLyB0aGVuIHdlIGNhbiBzZXQgdGhlIGZvY3VzIG9uIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2guXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiYgdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgICAvL0lmIGNsb3Nlc3RQbGFjZSBleGlzdCwgd2UgaGF2ZSB0byB1bmZvY3VzIHByZXZpb3VzIGZvY3VzZWQgcGxhY2VcbiAgICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoY2xvc2VzdFBsYWNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgYSBjb2FjaCB3YXMgc2VsZWN0ZWQgd2l0aCBubyBwbGFjZXMsIHRoZW4gd2UgaGF2ZSB0byBmb2N1cyB0aGUgY29hY2hHcmlkXG4gICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcHJlc2VsZWN0aW9uIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBieSBub3JtYWwgY2xpY2tpbmcgb3IgdmlhIHNjcmVlbiByZWFkZXIgdmlhIHRhYixcbiAgICAvLyB3ZSBvbmx5IGZvY3VzIHRoZSB0YWJsZSB3aXRob3V0IGRpcmVjdGx5IGZvY3VzaW5nIHRoZSBwbGFjZS5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuXG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9pc1ZhbGlkQ29hY2hJbmRleChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpICYmXG4gICAgICBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICkge1xuICAgICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSB0aGlzLl9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk7XG4gICAgICB0aGlzLl9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTtcblxuICAgICAgY29uc3Qgc2Nyb2xsVG9Db2FjaFBvc1ggPSB0aGlzLl9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggIT09IC0xIHx8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IDA7XG5cbiAgICAgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBhbGxvd3Mgc2Nyb2xsaW5nIHRvIHRoZSBuZXh0IHdhZ29uIG9yIG5vdFxuICAgICAgaWYgKGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSAmJiB0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxUb0NvYWNoUG9zWCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbFRvQ29hY2hQb3NYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuXG4gICAgICAgIC8vVHJ5IHRvIHNjcm9sbCBmb2N1c2VkIHBsYWNlIGludG8gdGhlIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICAvLyBTaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSBjb2FjaCBoYXMgYmVlbiB2aXN1YWxseSBleHBhbmRlZCB0byBtYWludGFpbiBhIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMsXG4gICAgICAvLyBzb21lIGdyYXBoaWNzIG11c3QgYWxzbyBiZSBhZGFwdGVkIHRvIHRoZSBoZWlnaHQsIHdoaWNoIGVuZCB3aXRoIHRoZSBib3JkZXJzIG9mIHRoZSBjb2FjaFxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmV0Y2hIZWlnaHQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGdyYXBoaWNzIGFyZSBhc3NpZ25lZCBkaXJlY3RseSBhdCB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCxcbiAgICAgIC8vIHRoZXNlIGdyYXBoaWNzIG11c3QgYmUgZXhwYW5kZWQgaW4gaGVpZ2h0IGJ5IGEgY29hY2hCb3JkZXJPZmZzZXQgaW4gb3JkZXIgdG8gcmVhY2ggdGhlaXIgb3JpZ2luYWwgdmlzdWFsIHBvc2l0aW9uXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdzogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncsXG4gICAgICBoOiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICBlbGVtZW50UG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbixcbiAgICBlbGVtZW50RGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50UG9zaXRpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiBlbGVtZW50RGltZW5zaW9uKSB7XG4gICAgICBjb25zdCBlbmRQb3NIZWlnaHQgPSBpc09yaWdpbkhlaWdodFxuICAgICAgICA/IGNvYWNoRGltZW5zaW9uLmhcbiAgICAgICAgOiBjb2FjaERpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGRldGVjdHMgaWYgYSAoZ3JhcGhpY2FsKSBlbGVtZW50IGlzIG9uIHRoZSBib3JkZXIgd2l0aCBpdHMgcG9zaXRpb24gKHVwcGVyIG9yIGxvd2VyIGJvcmRlcikuXG4gICAqIEBwYXJhbSBiYXNlRWxlbWVudFxuICAgKiBAcGFyYW0gY29hY2hEaW1lbnNpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoXG4gICAgYmFzZUVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCB8fFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSArIGJhc2VFbGVtZW50LmRpbWVuc2lvbi5oID09PSBjb2FjaERpbWVuc2lvbi5oXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIGF2YWlsYWJsZSBzZWF0cyB0b2dldGhlciBkZXBlbmRpbmcgb24gdGhlIHNlYXQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VzXG4gICAqIEByZXR1cm5zIEFuIE9iamVjdCB3aXRoIGNvdW50IG9mIGZyZWUgc2VhdHMgYW5kIGZyZWUgYmljeWNsZSBwbGFjZXNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKFxuICAgIHBsYWNlczogUGxhY2VbXSB8IHVuZGVmaW5lZCxcbiAgKTogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMge1xuICAgIGNvbnN0IGFjY3VtdWxhdG9yOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHsgc2VhdHM6IDAsIGJpY3ljbGVzOiAwIH07XG4gICAgY29uc3QgZnJlZVBsYWNlcyA9IHBsYWNlcz8ucmVkdWNlKChhY2N1bXVsYXRvciwgY3VyclBsYWNlOiBQbGFjZSkgPT4ge1xuICAgICAgaWYgKGN1cnJQbGFjZS5zdGF0ZSAhPT0gJ0ZSRUUnKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICAgIC8vIENvdW50IHVwIGRlcGVuZGluZyBvbiBzZWF0IHR5cGVcbiAgICAgIGlmIChjdXJyUGxhY2UudHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLnNlYXRzKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bXVsYXRvci5iaWN5Y2xlcysrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIGFjY3VtdWxhdG9yKTtcbiAgICByZXR1cm4gZnJlZVBsYWNlcyA/IGZyZWVQbGFjZXMgOiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdCB0aGUgZW5kIG9mIGEgc2Nyb2xsIEV2ZW50IGZyb20gdGhlIGNvYWNoIHNjcm9sbGFibGUgYXJlYSxcbiAgICogdGhlIHJlYWNoZWQgY29hY2ggaXMgbWFya2VkIGFzIHNlbGVjdGVkXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgOiB0aGlzLl9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTtcblxuICAgIC8vIFRJTU8tNDM3MDVcbiAgICAvLyBJZiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBieSBtb3VzZSBjbGljayAocHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSBiZWZvcmUgdHJpZ2dlcmluZyB0aGlzIHNjcm9sbGVuZCBtZXRob2QsXG4gICAgLy8gdGhlbiB0aGlzIHNjcm9sbGluZyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZXRob2QgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydCwgYW5kIGl0IGlzIG9ubHkgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbCAoc2Nyb2xsSW50b1ZpZXcpLFxuICAgIC8vIHdoZXJlIGEgbGVzcyB2aXNpYmxlIHBsYWNlIGhhcyBiZWVuIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LiBJbiBjYXNlIG9mIGEgcGxhY2UgYWRqdXN0bWVudCBieSBjbGljaywgd2UgY2FuIHJldHVybiBoZXJlLlxuICAgIGlmICh0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZW5kc2Nyb2xsaW5nIGlzIGp1c3QgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbGluZyAocGxhY2UgaGFzIDIgZ3JpZCBzaXplIHVuaXRzKVxuICAgICAgY29uc3QgaXNDb2FjaFNjcm9sbGluZyA9XG4gICAgICAgIE1hdGguYWJzKHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyAtIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQpID5cbiAgICAgICAgdGhpcy5iYXNlR3JpZFNpemUgKiAyO1xuICAgICAgaWYgKGlzQ29hY2hTY3JvbGxpbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuXG4gICAgLy8gQWZ0ZXIgY29hY2ggc2Nyb2xsZW5kIGV2ZW50IHdlIGNhbiByZXNldCB0aGUgaG92ZXJlZCBjb2FjaCBpbmRleFxuICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSAtMTtcblxuICAgIC8vIEluIGNhc2UgdGhlIHVzZXIgdXNlcyB0aGUgc2Nyb2xsYmFyIHdpdGhvdXQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VhdCByZXNlcnZhdGlvbixcbiAgICAvLyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGluZGV4IGlzIC0xLCBhbmQgd2UgaGF2ZSB0byBzZXQgdGhpcyB2YWx1ZSB3aXRoIGZpbmRTY3JvbGxDb2FjaEluZGV4LlxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmaW5kU2Nyb2xsQ29hY2hJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICAvL1doZW4gdXNlciBpcyBzY3JvbGxpbmcgdmlhIHNjcm9sbGJhciwgaXQgYXV0b21hdGljYWxseSBzY3JvbGxzIHRvIHRoZSBmb2N1c2VkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKGZpbmRTY3JvbGxDb2FjaEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFuIGF1dG9tYXRpYyBtYWluIG5hdmlnYXRpb24gc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWROYXZDb2FjaEluZGV4LlxuICAgKiBDYWxjdWxhdGVzIHRoZSBjZW50cmFsIHNjcm9sbCBvZmZzZXQgb2YgdGhlIG5hdiBjb2FjaCB0byBiZSBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHNlbGVjdGVkTmF2Q29hY2hJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvL1RpbWUgZGVsYXkgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIGV4ZWN1dGluZyBjYWxsaW5nIHNjcm9sbFRvIGZ1bmN0aW9ucyAoY29hY2hlcyBzY3JvbGxpbmcpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggPSB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltIC8gMjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQnV0dG9uT2Zmc2V0WCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleCAqIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPVxuICAgICAgICAgIHNjcm9sbEJ1dHRvbk9mZnNldFggLSBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCArIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsT2Zmc2V0WCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbE9mZnNldFgsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmVudGx5IG5hdmlnYXRpbmcgdGhyb3VnaCBwbGFjZXMgYnkga2V5Ym9hcmQgYW5kIGdvZXMgdG8gcHJldmlvdXMgY29hY2gsXG4gICAqIHRoZW4gd2UgcmV0dXJuIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGNvYWNoIHRvIGdldCB0aGUgY2xvc2VzdCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb24gPVxuICAgICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJlxuICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgY29hY2hUcmlnZ2VyUG9pbnQud2lkdGggPiB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGg7XG5cbiAgICByZXR1cm4gaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvblxuICAgICAgPyBjb2FjaFRyaWdnZXJQb2ludC5lbmQgLSB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlICYmIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggLSBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoO1xuICAgIGNvbnN0IGN1cnJDb2FjaFRyaWdnZXIgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvcyA9XG4gICAgICBjdXJyU2Nyb2xsUG9zWCA9PT0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uc3RhcnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgKGN1cnJTY3JvbGxQb3NYIDwgbWF4U2Nyb2xsV2lkdGhBcmVhIHx8IGN1cnJTY3JvbGxQb3NYID4gY3VyckNvYWNoVHJpZ2dlci5zdGFydCkgJiZcbiAgICAgICFpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29hY2ggaW5kZXggd2hpY2ggaXMgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHNjcm9sbCBhcmVhXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvcFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPSBzY3JvbGxQb3MgKyB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggLyAyO1xuICAgIHJldHVybiB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24uZmluZEluZGV4KFxuICAgICAgKGNvYWNoVHJpZ2dlcikgPT4gc2Nyb2xsT2Zmc2V0WCA+PSBjb2FjaFRyaWdnZXIuc3RhcnQgJiYgc2Nyb2xsT2Zmc2V0WCA8PSBjb2FjaFRyaWdnZXIuZW5kLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaXJzdCBwbGFjZSBvZiBjdXJyZW50IHNlbGVjdGVkIGNvYWNoIGJ5IHRhYmxlIGNlbGwgY29vcmRpbmF0ZSAwLTAgaWQuXG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBmaXJzdENlbGxJZCA9XG4gICAgICAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAnLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLTAtMCc7XG4gICAgY29uc3QgcGxhY2VOdW1iZXIgPVxuICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxIVE1MVGFibGVDZWxsRWxlbWVudD4oJyMnICsgZmlyc3RDZWxsSWQpXG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50Pignc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbCcpXG4gICAgICAgID8uZ2V0QXR0cmlidXRlKCd0ZXh0JykgfHwgbnVsbDtcblxuICAgIGlmIChjb2FjaCAmJiBwbGFjZU51bWJlcikge1xuICAgICAgZmlyc3RQbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gcGxhY2VOdW1iZXIpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaXJzdFBsYWNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICBwcmVzc2VkS2V5OiBzdHJpbmcsXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgIClcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBET1dOXG4gICAgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgKyAyID09PSBjb2FjaC5kaW1lbnNpb24uaCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMTtcbiAgICB9XG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBVUFxuICAgIGVsc2UgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ID09PSAwICYmXG4gICAgICAhIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCAtIDFdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBnZXQgdGhlIGNvcnJlY3QgY2xvc2VzdCBwbGFjZSBvZiBjdXJyZW50IHByZXNzZWQga2V5IGFuZCB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSxcbiAgICogd2UgaGF2ZSB0byBpbnZlc3RpZ2F0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBwbGFjZSB0byBmaW5kIHRoZSBjbG9zZXN0IHBsYWNlIG9mIHRoZSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHBhcmFtIHByZXNzZWRLZXlcbiAgICogQHJldHVybnMgUGxhY2Ugb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleT86IHN0cmluZyk6IFBsYWNlIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgbGV0IGNsb3Nlc3RQbGFjZSA9IG51bGw7XG4gICAgbGV0IGNvYWNoUGxhY2VzID0gY29hY2gucGxhY2VzO1xuICAgIGxldCBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gbnVsbDtcblxuICAgIGlmIChjb2FjaFBsYWNlcykge1xuICAgICAgLy8gSWYgbm8gcGxhY2Ugc2V0LCB0aGVuIHdlIHVzZSBpbml0aWFsIHRoZSBsZWZ0LXRvcCBwbGFjZSBvbiB0aGUgY29hY2hcbiAgICAgIGlmICghdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Rmlyc3RQbGFjZUluU2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uID0geyAuLi50aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uIH07XG5cbiAgICAgICAgICBpZiAocHJlc3NlZEtleSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIHRvIHN3aXRjaCB0byBhbm90aGVyIGNvYWNoIGRlY2sgKFVwIC0+IERvd24gfCBEb3duIC0+IFVwKS5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgdGFrZSB0aGUgY29hY2ggcGxhY2VzIHdlIGhhdmUgdG8gY2hlY2tlZCBmcm9tIHRoZSB0YXJnZXQgZGVjayBub3cuXG4gICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gdGhpcy5fZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICAgICAgICAgICAgcHJlc3NlZEtleSxcbiAgICAgICAgICAgICAgY29hY2gsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQXNzaWduIGNoZWNrIHBsYWNlcyBmcm9tIHRoZSB0YXJnZXQgc3dpdGNoIGRlY2tcbiAgICAgICAgICAgICAgY29hY2hQbGFjZXMgPVxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tzd2l0Y2hlZENvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW1xuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgICAgICAgXS5wbGFjZXMgfHwgW107XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gdXBkYXRlIHkgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgPVxuICAgICAgICAgICAgICAgIHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA/IGNvYWNoLmRpbWVuc2lvbi5oIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaFBsYWNlcykge1xuICAgICAgICAgICAgLy8gSWYgbm8ga2V5IHByZXNzZWQsIHRoZW4gd2UgdHJ5IHRvIGZpbmQgdGhlIHBsYWNlIG9mIHRoZSBjdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb25cbiAgICAgICAgICAgIGlmICghcHJlc3NlZEtleSkge1xuICAgICAgICAgICAgICAvLyBGaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vRmluZCBwbGFjZSBmcm9tIHRoZSByaWdodCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIExFRlRcbiAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYSBwbGFjZSBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgY2hhbmdpbmcgc3dpdGNoIGNvYWNoLFxuICAgICAgICAgIC8vIHdlIGNhbiB1cGRhdGUgdGhlIGN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsICYmIGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBzd2l0Y2hlZENvYWNoRGVja0luZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGEgcGxhY2UgaXMgc2VsZWN0ZWQgaW5zaWRlIHRoZSBjb2FjaC5cbiAgLy8gVGhpcyBjb250cm9scyB0aGUgZm9jdXNlZCBjb2FjaCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoLlxuICBwcml2YXRlIF9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQodGFiRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRm9jdXNJbmRleCA9XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA6IHRoaXMuZm9jdXNlZENvYWNoSW5kZXg7XG5cbiAgICAvLyBDaGVjayBuZXh0IG9yIHByZXYgdGFiIGlzIHByZXNzZWQsIHRoZW4gd2UgbmVlZCB0byBmaW5kIHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleCB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBmb2N1c1xuICAgIGNvbnN0IG5ld0ZvY3VzYWJsZUluZGV4OiBudW1iZXIgPVxuICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInXG4gICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleClcbiAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KTtcblxuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgY29uc3QgcGxhY2VJbkNvYWNoSGFzRm9jdXMgPSBzZWxlY3RlZFBsYWNlRWxlbWVudFxuICAgICAgICA/IHNlbGVjdGVkUGxhY2VFbGVtZW50LmdldEF0dHJpYnV0ZSgna2V5Zm9jdXMnKSA9PT0gJ2ZvY3VzJ1xuICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAvLyBJZiB3ZSB0YWIgYmFjayAoUFJFVl9UQUIpIGFuZCB0aGUgZm9jdXMgaXMgY3VycmVudGx5IG9uIHBsYWNlLFxuICAgICAgLy8gd2UgcmVtb3ZlIHRoZSBzZWxlY3RlZCBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbmF2aWdhdGlvbiBjb2FjaCBhbmQgb25seSBzZXQgdGhlIGZvY3VzIHN0YXR1cyB0byBpdFxuICAgICAgaWYgKHRhYkRpcmVjdGlvbiA9PT0gJ1BSRVZfVEFCJyAmJiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gY3VyckZvY3VzSW5kZXgpIHtcbiAgICAgICAgLy8gSWYgd2UgVEFCIGJhY2sgYW5kIGhhdmUgYSBzZWxlY3RlZCBwbGFjZXMgaW5zaWRlIHRoZSBjdXJyZW50IGNvYWNoLCB0aGVuIHdlIG1vdmUgb3V0IGZyb20gdGhlIHNlYXRtYXAgYW5kIHNldCB0aGUgZm9jdXMgdG8gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2hcbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzIHx8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyckZvY3VzSW5kZXg7XG4gICAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIGZpcnN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIgYmFjaywgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgZmlyc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZvY3VzZWRJbmRleCBmcm9tIHRoZSBmaXJzdCBjb2FjaCBhbmQgc2V0IGl0IGFnYWluIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgICAgZWxzZSBpZiAoY3VyckZvY3VzSW5kZXggPT09IDApIHtcbiAgICAgICAgICAvLyBSZWZvY3VzIHRoZSBmaXJzdCBjb2FjaFxuICAgICAgICAgIHRoaXMuX3JlZm9jdXNDdXJyZW50Rm9jdXNlZE5hdkNvYWNoKGN1cnJGb2N1c0luZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlIGxhc3QgY29hY2ggaXMgc2VsZWN0ZWQgYW5kIHdlIFRBQiwgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgbGFzdCBjb2FjaCBpbiB0aGUgbmF2aWdhdGlvbiB0byBnZXQgYmFjayB0byB0aGUgbm9ybWFsIHRhYiBuYXZpZ2F0aW9uLlxuICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSAgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInICYmXG4gICAgICAgIG5ld0ZvY3VzYWJsZUluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgbGFzdCBjb2FjaFxuICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ5IFRhYiBOYXZpZ2F0aW9uLCBwZXJmb3JtIGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIGZvY3VzZWQgd2Fnb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCwgd2Ugc2Nyb2xsIGRpcmVjdGx5IHRvIHRoZSBuZXh0IHRhYmFibGUgY29hY2hcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWZvY3VzZWQgdGhlIGN1cnJlbnQgZm9jdXNlZCAodmlzdWFsKSBuYXYgY29hY2ggdG8gZ2V0IHRoZSBuYXRpdmUgZm9jdXMgYmFjayB0byB0aGUgbmF2aWdhdGlvblxuICBwcml2YXRlIF9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChmb2N1c0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGZvY3VzSW5kZXgpLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIGNvbnN0IGZpbmRDbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5KTtcblxuICAgICAgaWYgKGZpbmRDbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChmaW5kQ2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIGNsb3Nlc3QgcGxhY2UgZm91bmQgYnkga2V5IG5hdmlnYXRpb25cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCB8fFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCB8fFxuICAgICAgICAgICh0aGlzLmFsaWduVmVydGljYWwgJiZcbiAgICAgICAgICAgIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwIHx8XG4gICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bikpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHByZXNzZWQga2V5IHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXhcbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoKVxuICAgICAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoKTtcblxuICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld1NlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA8IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtcy5sZW5ndGggLSAxXG4gICAgICA/IHN0YXJ0SW5kZXggKyAxXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA+IDAgPyBzdGFydEluZGV4IC0gMSA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMocGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VUeXBlUHJvcCA9IHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gJ3NlYXRzJyA6ICdiaWN5Y2xlcyc7XG4gICAgY29uc3QgbWF4UmVzZXJ2YXRpb25zID1cbiAgICAgIHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gdGhpcy5tYXhTZWF0UmVzZXJ2YXRpb25zIDogdGhpcy5tYXhCaWN5Y2xlUmVzZXJ2YXRpb25zO1xuICAgIGNvbnN0IGN1cnJTZWxlY3RlZFBsYWNlcyA9IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNbcGxhY2VUeXBlUHJvcF07XG5cbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdID0gdGhpcy5fdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgICBjdXJyU2VsZWN0ZWRQbGFjZXMsXG4gICAgICBtYXhSZXNlcnZhdGlvbnMsXG4gICAgICBwbGFjZVNlbGVjdGlvbixcbiAgICApO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcz59XG4gICAgICogRW1pdHMgd2hlbiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIFBsYWNlIGFycmF5IHdpdGggYWxsIHNlbGVjdGVkIHBsYWNlcy5cbiAgICAgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+KCdzZWxlY3RlZHBsYWNlcycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBtYXhSZXNlcnZhdGlvbnM6IG51bWJlcixcbiAgICBwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vIEFkZCBzZWxlY3RlZCBwbGFjZSB0byBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGlmIChwbGFjZVNlbGVjdGlvbi5zdGF0ZSA9PT0gJ1NFTEVDVEVEJykge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgICAgIHNlbGVjdGVkUGxhY2VEZWNrSW5kZXgsXG4gICAgICApO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSBzZWxlY3RlZCBwbGFjZSBmcm9tIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgZWxzZSB7XG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDaGVja3Mgd2hldGhlciBtYXhSZXNlcnZhdGlvbiBpcyBhY3RpdmF0ZWQgYW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RlZCBwbGFjZXMgaXMgcmVhY2hlZFxuICAgIGlmIChtYXhSZXNlcnZhdGlvbnMgPiAtMSAmJiBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5sZW5ndGggPiBtYXhSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uID0gbWF4UmVzZXJ2YXRpb25zID4gMCA/IHBsYWNlU2VsZWN0aW9uIDogdW5kZWZpbmVkO1xuXG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHRoaXMuX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgICAgcmVzZXRXaXRoUGxhY2VTZWxlY3Rpb24sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlRGVja0luZGV4ID0gdGhpcy5fZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICBjb25zdCBjb2FjaEluZGV4ID0gcGxhY2VTZWxlY3Rpb24uY29hY2hJbmRleDtcblxuICAgIGlmIChwbGFjZURlY2tJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGxhY2UgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbcGxhY2VEZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF0ucGxhY2VzPy5maW5kKFxuICAgICAgKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT0gcGxhY2VTZWxlY3Rpb24ubnVtYmVyLFxuICAgICk7XG5cbiAgICBpZiAoIXBsYWNlKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHJldHVybjtcblxuICAgIC8vIElmIGEgZm9jdXNpbmRleCBoYXMgYmVlbiBzZXQgKCE9IC0xKSwgaXQgY2FuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzZWxlY3RlZENvYWNoSW5kZXhcbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPSAtMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG5cbiAgICBjb25zdCBjb2FjaFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2godGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgIGlmIChjb2FjaFNlbGVjdGlvbikge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD59XG4gICAgICAgKiBFbWl0cyB3aGVuIGEgY29hY2ggd2FzIHNlbGVjdGVkIGFuZCByZXR1cm5zIGEgQ29hY2hTZWxlY3Rpb25cbiAgICAgICAqL1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD4oJ3NlbGVjdGVkY29hY2gnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IGNvYWNoU2VsZWN0aW9uLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBsYWNlRWxlbWVudElkKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlTnVtYmVyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGNvYWNoRGVja0luZGV4ICsgJy0nICsgY29hY2hJbmRleCArICctJyArIHBsYWNlTnVtYmVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBjb2FjaCBsYXlvdXRzIHdpdGggZGlmZmVyZW50IGRlY2tzLFxuICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gZXh0ZW5kIHRoZSBvZmZzZXQgd2l0aCBlbXB0eSBjb2FjaGVzXG4gICAqIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHN0YWJsZSB2ZWhpY2xlIGxheW91dC5cbiAgICpcbiAgICogICAgICAgICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICovXG4gIHByaXZhdGUgX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTogdm9pZCB7XG4gICAgLy8gUHJlZmlsbCBvZmZzZXQgY291bnRlcnMgd2l0aCAwIHN0YXJ0IGluZGV4XG4gICAgY29uc3QgY29hY2hPZmZzZXRJbmRleENvdW50ZXIgPSBBcnJheSh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkuZmlsbCgwKTtcbiAgICAvLyBUYWtlcyB0aGUgbG93ZXIgZGVjayB3aGljaCBjb250YWlucyB0aGUgbWF4IG51bWJlcnMgb2YgY29hY2hlc1xuICAgIGNvbnN0IGxvd2VyRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV07XG5cbiAgICBsb3dlckRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChsb3dlckNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVja0NvYWNoSXRlbSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zW2NvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldXTtcbiAgICAgICAgaWYgKGxvd2VyQ29hY2hJdGVtLmlkICE9IGRlY2tDb2FjaEl0ZW0/LmlkKSB7XG4gICAgICAgICAgLy8gQWRkIEVtcHR5IG9mZnNldCBjb2FjaCB0byBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb25cbiAgICAgICAgICBjb25zdCBlbXB0eU9mZnNldENvYWNoID0ge1xuICAgICAgICAgICAgLi4ubG93ZXJDb2FjaEl0ZW0sXG4gICAgICAgICAgICBwbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3BlcnR5SWRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHJhdmVsQ2xhc3M6IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2ldLmNvYWNoSXRlbXMuc3BsaWNlKFxuICAgICAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0sXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZW1wdHlPZmZzZXRDb2FjaCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0rKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBvZiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiBBcnJheSBiYXNlZCBvbiB0aGUgdHJhbnNmZXJyZWQgcGxhY2VzXG4gICAqIHRoYXQgaGF2ZSB0aGUgc3RhdGUgU0VMRUNURUQgd2l0aGluIHRoZSBzZWF0UmVzZXJ2YXRpb24gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIF9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcGxhY2Ugc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzID0gW107XG5cbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/LmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PlxuICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29hY2gucGxhY2VzXG4gICAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgICBwbGFjZUlkLFxuICAgICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbiwgY29hY2hEZWNrSW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zXG4gICAqIEBwYXJhbSBjdXJyU2VsZWN0ZWRQbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgY3VyclNlbGVjdGVkUGxhY2U/OiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFjdXJyU2VsZWN0ZWRQbGFjZSB8fCBjdXJyU2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQpIHtcbiAgICAgICAgY29uc3QgcGxhY2VFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChwbGFjZVNlbGVjdGlvbi5pZCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChwbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9SZW1vdmVzIGFsbCBzZWxlY3RlZCBwbGFjZXMgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICBpZiAoY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoY29hY2hEZWNrSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbY29hY2hEZWNrSW5kZXhdLmNvYWNoSXRlbXNbY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleF07XG4gICAgY29uc3QgcGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IGN1cnJTZWxlY3RlZFBsYWNlLm51bWJlcik7XG5cbiAgICByZXR1cm4gcGxhY2VcbiAgICAgID8gbWFwUGxhY2VBbmRDb2FjaFRvU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgcGxhY2UsXG4gICAgICAgICAgY29hY2gsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuZGVja0luZGV4LFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXgsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2goXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF0pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2gucGxhY2VzKTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gcGxhY2VcbiAgICAgID8gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYXRpb24gb2YgdGhlIHVzZWQgZG9jdW1lbnRzIGZvbnQtc2l6ZSB3aGljaCBuZWVkc1xuICAgKiB0byBiZSBkZXRlcm1pbmVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgQ1NTIHZhbHVlcyB3aXRoIHJlbVxuICAgKiAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZm9udFNpemUsIDEwKTtcbiAgICAgIC8vY2FsY3VsYXRlIHJlbSBvZiAxcHhcbiAgICAgIGNvbnN0IG9uZVBpeGVsSW5SZW0gPSAxIC8gYmFzZUZvbnRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbScsIGAke29uZVBpeGVsSW5SZW0gKyAncmVtJ31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZGF0YSBmb3IgZGlzcGxheWluZyBuYXZpZ2F0aW9uIGFyZWEuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZSBkdXJpbmcgdXNlIG9mIGEgY29tcG9uZW50OlxuICAgKiAgICAtIGNvYWNoIGlkXG4gICAqICAgIC0gbGlzdCBvZiBzZXJ2aWNlIGljb25zXG4gICAqICAgIC0gY2xhc3MgKGZpcnN0LCBzZWNvbmQsIGFueSlcbiAgICogICAgLSB3aGV0aGVyIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgbGVmdCBvciByaWdodFxuICAgKiAqL1xuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgbG93ZXJEZWNrOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcztcblxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMgPSBbXTtcblxuICAgICAgbG93ZXJEZWNrLmZvckVhY2goKGNvYWNoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHBsYWNlczogUGxhY2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIENvbGxlY3QgYWxsIGltcG9ydGFudCBuYXZpZ2F0aW9uIGRhdGEgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLm1hcCgoc3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzci5jb2FjaEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKChjb2FjaDogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgICB0cmF2ZWxDbGFzc2VzLnB1c2goLi4uY29hY2gudHJhdmVsQ2xhc3MpO1xuICAgICAgICAgICAgcHJvcGVydHlJZHMucHVzaCguLi4oY29hY2gucHJvcGVydHlJZHMgPyBjb2FjaC5wcm9wZXJ0eUlkcyA6IFtdKSk7XG4gICAgICAgICAgICBwbGFjZXMucHVzaCguLi4oY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzIDogW10pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogY29hY2guaWQsXG4gICAgICAgICAgdHJhdmVsQ2xhc3M6IHRoaXMuX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlcyksXG4gICAgICAgICAgcHJvcGVydHlJZHM6IHRoaXMuX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uKHByb3BlcnR5SWRzKSxcbiAgICAgICAgICBpc0RyaXZlckFyZWE6IGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcy5sZW5ndGggPT09IDAgOiB0cnVlLFxuICAgICAgICAgIGRyaXZlckFyZWFTaWRlOiB0aGlzLl9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKGNvYWNoKSxcbiAgICAgICAgICBmcmVlUGxhY2VzOiB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2gocGxhY2VzKSxcbiAgICAgICAgICBkcml2ZXJBcmVhRWxlbWVudHM6IHRoaXMuX3NldERyaXZlckFyZWFzRWxlbWVudHMoY29hY2gpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdKTogUGxhY2VUcmF2ZWxDbGFzcyB7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignRklSU1QnKSAhPT0gLTEpIHJldHVybiAnRklSU1QnO1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ1NFQ09ORCcpICE9PSAtMSkgcmV0dXJuICdTRUNPTkQnO1xuICAgIHJldHVybiAnQU5ZX0NMQVNTJztcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2FjaERyaXZlckFyZWFzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgKGdyYXBoaWNhbEVsZW1lbnRzKSA9PiBncmFwaGljYWxFbGVtZW50cy5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICk7XG5cbiAgICBpZiAoY29hY2hEcml2ZXJBcmVhcyAmJiBjb2FjaERyaXZlckFyZWFzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBkcml2ZXIgYXJlYSBwb3NpdGlvbiB3aGV0aGVyIGl0IGlzIHByZXNlbnQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpbiBhIGNvYWNoXG4gICAgICBjb25zdCBoYXNMZWZ0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaGFzUmlnaHREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA+IDApIHx8IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAhIWhhc0xlZnREcml2ZXJBcmVhLFxuICAgICAgICByaWdodDogISFoYXNSaWdodERyaXZlckFyZWEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24gPSAocHJvcGVydHlJZHM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghcHJvcGVydHlJZHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaHJ1bmtQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJ1bmtQcm9wZXJ0eUlkcyA/IHNocnVua1Byb3BlcnR5SWRzIDogW107XG4gIH07XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZUNvYWNoV2lkdGhBbmRHYXBDYWxjdWxhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgY29hY2hJdGVtczogQ29hY2hJdGVtW10gPVxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdPy5jb2FjaEl0ZW1zO1xuXG4gICAgICBjb2FjaEl0ZW1zPy5mb3JFYWNoKChjb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ1BsYWNlcyA9IHRoaXMuX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgICAgICAgY29hY2hJdGVtLmRpbWVuc2lvbi53LFxuICAgICAgICAgIGNvYWNoSXRlbS5wbGFjZXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9NdXN0ICBiZSBkb25lIGFsc28gZm9yIGdyYXBoaWNhbCBlbGVtZW50cywgYXMgdGhleSBjYW4gYWxzbyBwcm90cnVkZSB0aGUgY29hY2ggYm9yZGVyXG4gICAgICAgIC8vIENoZWNrIG9ubHkgZ3JhcGhpY2FsIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBhcmVhIGVsZW1lbnRzXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgKGUpID0+IGUuaWNvbiAmJiAhdGhpcy5ub3RBcmVhRWxlbWVudHMuaW5jbHVkZXMoZS5pY29uKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcyA9IHRoaXMuX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgICAgICAgY29hY2hJdGVtLmRpbWVuc2lvbi53LFxuICAgICAgICAgIGZpbHRlcmVkRWxlbWVudHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vdmVySGFuZ2luZ0VsZW1lbnRJbmZvcm1hdGlvbi5wdXNoKHtcbiAgICAgICAgICBjb2FjaElkOiBjb2FjaEl0ZW0uaWQsXG4gICAgICAgICAgb3ZlcmhhbmdpbmdQbGFjZXM6IGhhc092ZXJoYW5naW5nUGxhY2VzLFxuICAgICAgICAgIG92ZXJoYW5naW5nR3JhcGhpY0FyZWFzOiBoYXNPdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEByZXR1cm5zIEhUTUxFbGVtZW50IG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldFBsYWNlSHRtbEVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZFxuICAgICAgPyB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHx8IG51bGxcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleHRyYWN0ZWQgY29hY2ggZGVjayBpbmRleCBmcm9tIHBsYWNlIGlkXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlSWQ6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGRlY2tJbmRleCA9IHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yKCcjJyArIHBsYWNlSWQpXG4gICAgICA/LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWNrLWluZGV4Jyk7XG4gICAgaWYgKGRlY2tJbmRleCAmJiAhaXNOYU4oK2RlY2tJbmRleCkpIHtcbiAgICAgIHJldHVybiArZGVja0luZGV4O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWRDb2FjaEluZGV4KGNvYWNoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2FjaEluZGV4ID49IDAgJiZcbiAgICAgIGNvYWNoSW5kZXggPD0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBleGlzdGluZyBjb2FjaCBkZWNrIGluZGV4IGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5lY2Vzc2FyeSB0byBnZXQgYW4gYXZhaWxhYmxlIGNvYWNoIGRlY2sgaW5kZXggZHVyaW5nIGtleWJvYXJkIG5hdmlnYXRpb24sIHdoaWNoIGNhbiB2YXJ5IGJldHdlZW4gY29hY2hlcyB3aXRoIGRpZmZlcmVudCBkZWNrcy5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgY29hY2ggd2l0aCB0d28gZGVja3MgdG8gYSBjb2FjaCB3aXRoIG9uZSBkZWNrLlxuICAgKlxuICAgKiAgICAgICBbb29vXS1bb29vXS1bb29vXVxuICAgKiBbb29vXS1bb29vXS1bb29vXS1bb29vXS1bb29vXVxuICAgKlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldEV4aXN0aW5nQ29hY2hEZWNrSW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XVxuICAgICAgICAucGxhY2VzICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleDtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG5leHQgcG9zc2libGUgY29hY2ggZGVjayBpbmRleCB3aGVyZSBwbGFjZXMgZXhpc3RcbiAgICBjb25zdCBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZmluZEluZGV4KFxuICAgICAgKHNlYXRSZXNlcnZhdGlvbikgPT5cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5wbGFjZXMgIT09IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA+PSBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXhcbiAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgIDogbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgc2VsZWN0ZWQgcGxhY2UgaXMgc2xpZ2h0bHkgaGlkZGVuIGJ5IHRoZSBvdmVyZmxvdyBzY3JvbGwgY29udGVudCBhbmQgaXMgc3RpbGwgY2xpY2tlZCxcbiAgICogdGhlIG1ldGhvZCB0cmllcyB0byBzY3JvbGwgdGhlIHNlbGVjdGVkIHBsYWNlIGludG8gdGhlIG5lYXJlc3Qgdmlld3BvcnQsIHNvIHRoYXQgaXQgaXMgY29tcGxldGVseSB2aXNpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5nZXRFbGVtZW50QnlJZChwbGFjZUlkKVxuICAgICAgPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JywgaW5saW5lOiAnbmVhcmVzdCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2tzIGlmIGFueSBwbGFjZXMgb3IgZ3JhcGhpY2FsIGVsZW1lbnRzIChlLmcuIHRvaWxldCBhcmVhLCBldGMuKSBhcmUgb3ZlcmhhbmdpbmcgdGhlIGNvYWNoIGJvcmRlcnNcbiAgICogQHBhcmFtIGNvYWNoSXRlbVdpZHRoXG4gICAqIEBwYXJhbSBlbGVtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBfaXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICBjb2FjaEl0ZW1XaWR0aDogbnVtYmVyLFxuICAgIGVsZW1lbnRzOiAoUGxhY2UgfCBCYXNlRWxlbWVudClbXSB8IHVuZGVmaW5lZCxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsZW1lbnRzPy5zb21lKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnBvc2l0aW9uLnggPT09IDAgfHwgZWxlbWVudC5wb3NpdGlvbi54ICsgZWxlbWVudC5kaW1lbnNpb24udyA+PSBjb2FjaEl0ZW1XaWR0aCxcbiAgICAgICkgPz8gZmFsc2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlckFyZWFzIGZvciBvbmUgY29hY2hcbiAgICogQHBhcmFtIGNvYWNoSXRlbVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0RHJpdmVyQXJlYXNFbGVtZW50cyhjb2FjaEl0ZW06IENvYWNoSXRlbSk6IHtcbiAgICBkcml2ZXJBcmVhOiBCYXNlRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGw6IEJhc2VFbGVtZW50IHwgdW5kZWZpbmVkO1xuICB9IHtcbiAgICBpZiAoY29hY2hJdGVtKSB7XG4gICAgICBjb25zdCBkcml2ZXJBcmVhID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmluZChcbiAgICAgICAgKGVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiBlbGVtZW50Lmljb24gPT09ICdEUklWRVJfQVJFQScsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGwgPVxuICAgICAgICBjb2FjaEl0ZW0udHlwZSA9PT0gJ0xPQ09NT1RJVkVfQ09BQ0gnXG4gICAgICAgICAgPyBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maW5kKFxuICAgICAgICAgICAgICAoZWxlbWVudDogQmFzZUVsZW1lbnQpID0+IGVsZW1lbnQuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkcml2ZXJBcmVhOiBkcml2ZXJBcmVhLFxuICAgICAgICBkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGw6IGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRyaXZlckFyZWE6IHVuZGVmaW5lZCxcbiAgICAgIGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSXMgY2FsbGVkIHdoZW4gdGhlIFNlYXRSZXNlcnZhdGlvbiBsb3NlcyBmb2N1cywgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgdGFicyBvdXQgb3IgY2xpY2tzIHNvbWV3aGVyZSBlbHNlLlxuICAgKiBUaGVuIHdlIHJlc2V0IHRoZSBmb2N1c2VkIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiU2Nyb2xsRGlyZWN0aW9uIiwiYWNjdW11bGF0b3IiLCJwbGFjZSIsImNvYWNoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBNkJBLElBQUs7QUFBQSxDQUFMLFNBQUtBLGtCQUFlO0FBQ2xCQSxtQkFBQSxPQUFBLElBQUE7QUFDQUEsbUJBQUEsTUFBQSxJQUFBO0FBQ0YsR0FISyxvQkFBQSxrQkFBZSxDQUFBLEVBQUE7QUFXcEIsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSx3QkFBa0M7QUFBQSxFQUN0QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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