raain-app 1.6.11 → 1.6.13

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.
@@ -1,5 +1,5 @@
1
1
  import { MapLatLng } from 'raain-ui';
2
- import { SpeedMatrixContainer, } from 'raain-model';
2
+ import { GaugeNode, SpeedMatrixContainer, } from 'raain-model';
3
3
  import { XYType } from '../xytype';
4
4
  export class CompareManager {
5
5
  constructor(profileService, onChanges = () => { }) {
@@ -54,15 +54,18 @@ export class CompareManager {
54
54
  this.onChanges();
55
55
  return;
56
56
  }
57
- const uiCompares = comparePerDate.compareTimeline.map((c) => {
57
+ const uiCompares = comparePerDate.compareTimeline
58
+ .map((c) => {
58
59
  return {
60
+ date: c.date,
59
61
  name: c.name,
60
62
  comparePoints: c.qualityPoints.map((p) => new XYType(p.getGaugeValue(), p.getRainValue(), 2, p.gaugeLabel, p.gaugeId)),
61
63
  comparePointsMax: new XYType(c.maxValue * 1.2, c.maxValue * 1.2),
62
64
  comparePointsHistory: c.qualityPointsLegacy,
63
65
  remarks: c.remarks,
64
66
  };
65
- });
67
+ })
68
+ .sort((a, b) => a.date?.getTime() - b.date?.getTime());
66
69
  this.currentQualityDoneDate = comparePerDate.rainComputationQuality.isDoneDate;
67
70
  this.currentQualityTimeSpentInMs = comparePerDate.rainComputationQuality.timeSpentInMs;
68
71
  this.currentQualityLaunchedBy = comparePerDate.rainComputationQuality.launchedBy;
@@ -82,8 +85,8 @@ export class CompareManager {
82
85
  return;
83
86
  }
84
87
  const countForAverage = targetsOrdered.length;
85
- const maxValue = (this.buildCompares.compareCumulative.maxValue / 12) * 1.2;
86
- this.globalComparePoints = this.buildCompares.compareCumulative.qualityPoints.map((qp) => new XYType(qp.getGaugeValue() / 12, qp.getRainValue() / 12, 2, qp.gaugeLabel, qp.gaugeId));
88
+ const maxValue = this.buildCompares.compareCumulative.maxValue * 1.2;
89
+ this.globalComparePoints = this.buildCompares.compareCumulative.qualityPoints.map((qp) => new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId));
87
90
  this.globalComparePointsMax = new XYType(maxValue, maxValue);
88
91
  }
89
92
  catch (e) {
@@ -98,7 +101,7 @@ export class CompareManager {
98
101
  b.approxDistanceFrom(this.rainNode.getCenter()));
99
102
  })
100
103
  .filter((v, index) => index < 200);
101
- const rainNodeGaugeIds = this.rainNode.getLinks('gauge').map((l) => l.getId());
104
+ const rainNodeGaugeIds = this.rainNode.getLinks(GaugeNode.TYPE).map((l) => l.getId());
102
105
  const visibleGauges = gaugesToFilter.filter((g) => rainNodeGaugeIds.indexOf(g.id) > -1);
103
106
  console.log('visibleGauges:', visibleGauges);
104
107
  const gaugesLatLng = [];
@@ -123,7 +126,6 @@ export class CompareManager {
123
126
  this.resetSelectedGauges();
124
127
  }
125
128
  async selectGauge(gaugeId, compareIndex) {
126
- // console.log('selectGauge', gaugeId, compareIndex);
127
129
  if (gaugeId) {
128
130
  const xys = this.getCurrentQualityPoints(compareIndex).filter((p) => p.gaugeId === gaugeId);
129
131
  this.selectedGauge = xys.length === 1 ? xys[0] : null;
@@ -132,7 +134,12 @@ export class CompareManager {
132
134
  this.selectedGauge = null;
133
135
  }
134
136
  if (!this.selectedGauge) {
135
- return this.resetSelectedGauges();
137
+ this.resetSelectedGauges();
138
+ const gaugesFiltered = this.gaugesInMap.filter((g) => g.id === gaugeId);
139
+ if (gaugesFiltered.length === 1) {
140
+ this.selectedGauges = [gaugesFiltered[0]];
141
+ }
142
+ return;
136
143
  }
137
144
  const selectedGaugeInPoints = this.getCurrentQualityPoints(compareIndex).filter((p) => p.gaugeId === this.selectedGauge.gaugeId);
138
145
  let pixelsSolutions = [];
@@ -282,4 +289,4 @@ export class CompareManager {
282
289
  return rainSpeed.getCenter();
283
290
  }
284
291
  }
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGFyZU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvdG9vbHMvQ29tcGFyZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBU0gsb0JBQW9CLEdBQ3ZCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFtQmpDLE1BQU0sT0FBTyxjQUFjO0lBNEJ2QixZQUNjLGNBQThCLEVBQ2pDLFlBQXdCLEdBQUcsRUFBRSxHQUFFLENBQUM7UUFEN0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2pDLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBRXZDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBSUQsSUFBVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxRQUFrQjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLFFBQVE7UUFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ2pCLGVBQWUsRUFBRSxF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LGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVPLHVCQUF1QixDQUMzQixTQUFvQixFQUNwQixNQUFjO1FBRWQsT0FBTyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXBMYXRMbmd9IGZyb20gJ3JhYWluLXVpJztcbmltcG9ydCB7XG4gICAgSUNvbXBhcmVQZXJEYXRlLFxuICAgIElDb21wYXJlcyxcbiAgICBMYXRMbmcsXG4gICAgUG9zaXRpb25WYWx1ZSxcbiAgICBRdWFsaXR5UG9pbnQsXG4gICAgUmFpbkNvbXB1dGF0aW9uUXVhbGl0eSxcbiAgICBSYWluTm9kZSxcbiAgICBSYWluU3BlZWQsXG4gICAgU3BlZWRNYXRyaXhDb250YWluZXIsXG59IGZyb20gJ3JhYWluLW1vZGVsJztcbmltcG9ydCB7WFlUeXBlfSBmcm9tICcuLi94eXR5cGUnO1xuaW1wb3J0IHtQcm9maWxlU2VydmljZX0gZnJvbSAnLi4vcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7RnJhbWVTZXR9IGZyb20gJy4vRnJhbWVTZXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wYXJlVGFyZ2V0IHtcbiAgICBkYXRlOiBEYXRlO1xuICAgIHJhaW5Db21wdXRhdGlvbklkPzogc3RyaW5nO1xuICAgIHJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZD86IHN0cmluZztcbiAgICAvLyByYWluQ29tcHV0YXRpb25RdWFsaXR5SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVJQ29tcGFyZSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNvbXBhcmVQb2ludHM6IFhZVHlwZVtdO1xuICAgIGNvbXBhcmVQb2ludHNNYXg6IFhZVHlwZTtcbiAgICBjb21wYXJlUG9pbnRzSGlzdG9yeTogUXVhbGl0eVBvaW50W107XG4gICAgcmVtYXJrczogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFyZU1hbmFnZXIge1xuICAgIHB1YmxpYyBnYXVnZXNJbk1hcDogTWFwTGF0TG5nW107XG4gICAgcHVibGljIGdhdWdlc0luQ29tcGFyZTogTWFwTGF0TG5nW107XG4gICAgcHVibGljIHNlbGVjdGVkR2F1Z2VzOiBNYXBMYXRMbmdbXTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRQaXhlbHM6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyBwaXhlbHNTb2x1dGlvbnM6IE1hcExhdExuZ1tdW107XG4gICAgcHVibGljIHNwZWVkczogTWFwTGF0TG5nW107XG5cbiAgICAvLyBmcm9tIGNvbXBhcmVzVGltZWxpbmVcbiAgICBwdWJsaWMgY29tcGFyZU5hbWVzOiBzdHJpbmdbXTtcbiAgICBwdWJsaWMgdWlDb21wYXJlczogSVVJQ29tcGFyZVtdO1xuICAgIHB1YmxpYyBjb21wYXJlU3BlZWRNYXRyaXg6IFBvc2l0aW9uVmFsdWVbXTtcbiAgICBwdWJsaWMgY29tcGFyZVZlcnNpb246IHN0cmluZztcbiAgICBwdWJsaWMgY29tcGFyZVRydXN0ZWRJbmRpY2F0b3I6IG51bWJlcjtcbiAgICBwdWJsaWMgY29tcGFyZURhdGVzOiBEYXRlW107XG5cbiAgICBwdWJsaWMgY3VycmVudFF1YWxpdHlEb25lRGF0ZTogRGF0ZTtcbiAgICBwdWJsaWMgY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5OiBzdHJpbmc7XG4gICAgcHVibGljIGN1cnJlbnRRdWFsaXR5VGltZVNwZW50SW5NczogbnVtYmVyO1xuICAgIHB1YmxpYyBnbG9iYWxDb21wYXJlUG9pbnRzOiBYWVR5cGVbXTtcbiAgICBwdWJsaWMgZ2xvYmFsQ29tcGFyZVBvaW50c01heDogWFlUeXBlO1xuICAgIHB1YmxpYyBjb21wYXJlU3BlZWQ6IHthbmdsZUluRGVncmVlczogbnVtYmVyOyBwaXhlbHNQZXJQZXJpb2Q6IG51bWJlcn07XG4gICAgcHJvdGVjdGVkIGJ1aWxkQ29tcGFyZXM6IElDb21wYXJlcztcbiAgICBwcm90ZWN0ZWQgc2VsZWN0ZWRHYXVnZTogUXVhbGl0eVBvaW50O1xuICAgIHByb3RlY3RlZCBzZWxlY3RlZEdhdWdlSW5Qb2ludHM6IFF1YWxpdHlQb2ludDtcbiAgICBwcm90ZWN0ZWQgc2VsZWN0ZWRHYXVnZUluUG9pbnRzRGV0YWlsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJhaW5Db21wdXRhdGlvblF1YWxpdGllc1BlckRhdGU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcHJvZmlsZVNlcnZpY2U6IFByb2ZpbGVTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgb25DaGFuZ2VzOiAoKSA9PiB2b2lkID0gKCkgPT4ge31cbiAgICApIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcmFpbk5vZGU6IFJhaW5Ob2RlO1xuXG4gICAgcHVibGljIGdldCByYWluTm9kZSgpOiBSYWluTm9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWluTm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJhaW5Ob2RlKHJhaW5Ob2RlOiBSYWluTm9kZSkge1xuICAgICAgICB0aGlzLl9yYWluTm9kZSA9IHJhaW5Ob2RlO1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuQWxsKCkge1xuICAgICAgICB0aGlzLmdhdWdlc0luTWFwID0gW107XG4gICAgICAgIHRoaXMuZ2F1Z2VzSW5Db21wYXJlID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBpeGVscyA9IFtdO1xuICAgICAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBhcmVEYXRlcyA9IFtdO1xuICAgICAgICB0aGlzLnNwZWVkcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuYnVpbGRDb21wYXJlcyA9IHtcbiAgICAgICAgICAgIGNvbXBhcmVzUGVyRGF0ZTogW10sXG4gICAgICAgICAgICBjb21wYXJlQ3VtdWxhdGl2ZTogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nbG9iYWxDb21wYXJlUG9pbnRzID0gW107XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50c01heCA9IG5ldyBYWVR5cGUoMCwgMCk7XG4gICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZSA9IHt9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbGVhbkNvbXBhcmVRdWFsaXR5KCdubyBjb21wYXJlIHlldCcpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hTcGVlZHMoZnJhbWVTZXQ6IEZyYW1lU2V0KSB7XG4gICAgICAgIGNvbnN0IHJhaW5TcGVlZE1hcCA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpblNwZWVkTWFwKFxuICAgICAgICAgICAgdGhpcy5yYWluTm9kZSxcbiAgICAgICAgICAgIGZyYW1lU2V0LnJhaW5Db21wdXRhdGlvbklkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJhaW5TcGVlZE1hcD8ucmFpblNwZWVkcykge1xuICAgICAgICAgICAgdGhpcy5zcGVlZHMgPSByYWluU3BlZWRNYXAucmFpblNwZWVkcy5tYXAoKHJhaW5TcGVlZDogUmFpblNwZWVkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyID0gcmFpblNwZWVkLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVUYXJnZXRQb3NpdGlvbihyYWluU3BlZWQsIGNlbnRlcik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hcExhdExuZyhcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24ubGF0LFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRQb3NpdGlvbi5sbmcsXG4gICAgICAgICAgICAgICAgICAgIHJhaW5TcGVlZC5hemltdXRoSW5EZWdyZWVzLFxuICAgICAgICAgICAgICAgICAgICBgYXoke3JhaW5TcGVlZC5hemltdXRoSW5EZWdyZWVzfSBzcCR7cmFpblNwZWVkLnNwZWVkSW5NZXRlcnNQZXJTZWN9IHRydXN0JHtyYWluU3BlZWQudHJ1c3RSYXRpb31gLFxuICAgICAgICAgICAgICAgICAgICBgYXoke3JhaW5TcGVlZC5hemltdXRoSW5EZWdyZWVzfSBzcCR7cmFpblNwZWVkLnNwZWVkSW5NZXRlcnNQZXJTZWN9IHRydXN0JHtyYWluU3BlZWQudHJ1c3RSYXRpb31gLFxuICAgICAgICAgICAgICAgICAgICByYWluU3BlZWQuc3BlZWRJbk1ldGVyc1BlclNlY1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3BlZWRzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoQ29tcGFyZVF1YWxpdHkoZnJhbWVTZXQ6IEZyYW1lU2V0KSB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmVQZXJEYXRlID0gdGhpcy5nZXRDb21wYXJlUGVyRGF0ZShmcmFtZVNldC5kYXRlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY29tcGFyZVBlckRhdGUgfHxcbiAgICAgICAgICAgICFjb21wYXJlUGVyRGF0ZS5yYWluQ29tcHV0YXRpb25RdWFsaXR5Py5xdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFuQ29tcGFyZVF1YWxpdHkoXG4gICAgICAgICAgICAgICAgJ25vIGN1cnJlbnQgcXVhbGl0eSAnICsgT2JqZWN0LmtleXModGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNQZXJEYXRlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1aUNvbXBhcmVzOiBJVUlDb21wYXJlW10gPSBjb21wYXJlUGVyRGF0ZS5jb21wYXJlVGltZWxpbmUubWFwKChjKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgICAgICAgICAgICBjb21wYXJlUG9pbnRzOiBjLnF1YWxpdHlQb2ludHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYWVR5cGUocC5nZXRHYXVnZVZhbHVlKCksIHAuZ2V0UmFpblZhbHVlKCksIDIsIHAuZ2F1Z2VMYWJlbCwgcC5nYXVnZUlkKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY29tcGFyZVBvaW50c01heDogbmV3IFhZVHlwZShjLm1heFZhbHVlICogMS4yLCBjLm1heFZhbHVlICogMS4yKSxcbiAgICAgICAgICAgICAgICBjb21wYXJlUG9pbnRzSGlzdG9yeTogYy5xdWFsaXR5UG9pbnRzTGVnYWN5LFxuICAgICAgICAgICAgICAgIHJlbWFya3M6IGMucmVtYXJrcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlEb25lRGF0ZSA9IGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkuaXNEb25lRGF0ZTtcbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eVRpbWVTcGVudEluTXMgPSBjb21wYXJlUGVyRGF0ZS5yYWluQ29tcHV0YXRpb25RdWFsaXR5LnRpbWVTcGVudEluTXM7XG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5ID0gY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eS5sYXVuY2hlZEJ5O1xuICAgICAgICB0aGlzLmNvbXBhcmVWZXJzaW9uID0gY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eS5nZXRWZXJzaW9uKCk7XG5cbiAgICAgICAgdGhpcy5jb21wYXJlU3BlZWQgPVxuICAgICAgICAgICAgY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eS5xdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIuZ2V0U3BlZWQoKTtcbiAgICAgICAgdGhpcy5jb21wYXJlTmFtZXMgPSB1aUNvbXBhcmVzLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgICAgdGhpcy51aUNvbXBhcmVzID0gdWlDb21wYXJlcztcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hHbG9iYWxDb21wYXJlUXVhbGl0eShcbiAgICAgICAgdGFyZ2V0c09yZGVyZWQ6IElDb21wYXJlVGFyZ2V0W10sXG4gICAgICAgIHdpdGhDb21wYXJlRHVwbGljYXRlOiBib29sZWFuXG4gICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoUmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzKHRhcmdldHNPcmRlcmVkKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZENvbXBhcmVzVGltZWxpbmUodGFyZ2V0c09yZGVyZWQsIHdpdGhDb21wYXJlRHVwbGljYXRlKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBFcnJvcignbmVlZHMgY3VtdWxhdGl2ZSBjb21wYXJlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb3VudEZvckF2ZXJhZ2UgPSB0YXJnZXRzT3JkZXJlZC5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtYXhWYWx1ZSA9ICh0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmUubWF4VmFsdWUgLyAxMikgKiAxLjI7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHMgPSB0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmUucXVhbGl0eVBvaW50cy5tYXAoXG4gICAgICAgICAgICAgICAgKHFwKSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgWFlUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcXAuZ2V0R2F1Z2VWYWx1ZSgpIC8gMTIsXG4gICAgICAgICAgICAgICAgICAgICAgICBxcC5nZXRSYWluVmFsdWUoKSAvIDEyLFxuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIHFwLmdhdWdlTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBxcC5nYXVnZUlkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHNNYXggPSBuZXcgWFlUeXBlKG1heFZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNldEdhdWdlc0luTWFwKCkge1xuICAgICAgICBsZXQgZ2F1Z2VzVG9GaWx0ZXIgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldEdhdWdlcyhcbiAgICAgICAgICAgIHRoaXMucmFpbk5vZGU/LmlkLFxuICAgICAgICAgICAgdGhpcy5yYWluTm9kZS5nZXRDZW50ZXIoKVxuICAgICAgICApO1xuICAgICAgICBnYXVnZXNUb0ZpbHRlciA9IGdhdWdlc1RvRmlsdGVyXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGEuYXBwcm94RGlzdGFuY2VGcm9tKHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKCkpIC1cbiAgICAgICAgICAgICAgICAgICAgYi5hcHByb3hEaXN0YW5jZUZyb20odGhpcy5yYWluTm9kZS5nZXRDZW50ZXIoKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHYsIGluZGV4KSA9PiBpbmRleCA8IDIwMCk7XG5cbiAgICAgICAgY29uc3QgcmFpbk5vZGVHYXVnZUlkcyA9IHRoaXMucmFpbk5vZGUuZ2V0TGlua3MoJ2dhdWdlJykubWFwKChsKSA9PiBsLmdldElkKCkpO1xuXG4gICAgICAgIGNvbnN0IHZpc2libGVHYXVnZXMgPSBnYXVnZXNUb0ZpbHRlci5maWx0ZXIoKGcpID0+IHJhaW5Ob2RlR2F1Z2VJZHMuaW5kZXhPZihnLmlkKSA+IC0xKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3Zpc2libGVHYXVnZXM6JywgdmlzaWJsZUdhdWdlcyk7XG5cbiAgICAgICAgY29uc3QgZ2F1Z2VzTGF0TG5nOiBNYXBMYXRMbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGdhdWdlIG9mIHZpc2libGVHYXVnZXMpIHtcbiAgICAgICAgICAgIGdhdWdlc0xhdExuZy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBNYXBMYXRMbmcoZ2F1Z2UubGF0aXR1ZGUsIGdhdWdlLmxvbmdpdHVkZSwgdW5kZWZpbmVkLCBnYXVnZS5pZCwgZ2F1Z2UubmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nYXVnZXNJbk1hcCA9IGdhdWdlc0xhdExuZztcbiAgICB9XG5cbiAgICBhc3luYyBzZXRHYXVnZXNJbkNvbXBhcmUoKSB7XG4gICAgICAgIGNvbnN0IHF1YWxpdHlQb2ludHM6IFF1YWxpdHlQb2ludFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29tcGFyZSBvZiB0aGlzLnVpQ29tcGFyZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcXVhbGl0eVBvaW50IG9mIGNvbXBhcmUuY29tcGFyZVBvaW50c0hpc3RvcnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5QWRkZWQgPSBxdWFsaXR5UG9pbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKHApID0+IHA/LmdhdWdlSWQgPT09IHF1YWxpdHlQb2ludC5nYXVnZUlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUFkZGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBxdWFsaXR5UG9pbnRzLnB1c2gocXVhbGl0eVBvaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdhdWdlc0luQ29tcGFyZSA9IHF1YWxpdHlQb2ludHMubWFwKChwKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hcExhdExuZyhcbiAgICAgICAgICAgICAgICBwLmdhdWdlQ2FydGVzaWFuVmFsdWUubGF0LFxuICAgICAgICAgICAgICAgIHAuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sbmcsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBwLmdhdWdlSWQsXG4gICAgICAgICAgICAgICAgcC5nYXVnZUxhYmVsICsgJz4nICsgcC5nZXRHYXVnZVZhbHVlKCksXG4gICAgICAgICAgICAgICAgcC5nZXRHYXVnZVZhbHVlKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEdhdWdlcygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbGVjdEdhdWdlKGdhdWdlSWQ6IHN0cmluZywgY29tcGFyZUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3NlbGVjdEdhdWdlJywgZ2F1Z2VJZCwgY29tcGFyZUluZGV4KTtcblxuICAgICAgICBpZiAoZ2F1Z2VJZCkge1xuICAgICAgICAgICAgY29uc3QgeHlzID0gdGhpcy5nZXRDdXJyZW50UXVhbGl0eVBvaW50cyhjb21wYXJlSW5kZXgpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocCkgPT4gcC5nYXVnZUlkID09PSBnYXVnZUlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlID0geHlzLmxlbmd0aCA9PT0gMSA/IHh5c1swXSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkR2F1Z2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2V0U2VsZWN0ZWRHYXVnZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IHRoaXMuZ2V0Q3VycmVudFF1YWxpdHlQb2ludHMoY29tcGFyZUluZGV4KS5maWx0ZXIoXG4gICAgICAgICAgICAocCkgPT4gcC5nYXVnZUlkID09PSB0aGlzLnNlbGVjdGVkR2F1Z2UuZ2F1Z2VJZFxuICAgICAgICApO1xuICAgICAgICBsZXQgcGl4ZWxzU29sdXRpb25zOiBNYXBMYXRMbmdbXVtdID0gW107XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkR2F1Z2VJblBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFya3MgPSBKU09OLnBhcnNlKHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5yZW1hcmspLnNvcnQoXG4gICAgICAgICAgICAgICAgKGEsIGIpID0+IGEuY3JpdGVyaWFBdHRlbXB0ZWRUb0JlTWluaW11bSAtIGIuY3JpdGVyaWFBdHRlbXB0ZWRUb0JlTWluaW11bVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlbWFya3MpO1xuICAgICAgICAgICAgcGl4ZWxzU29sdXRpb25zID0gcmVtYXJrcy5tYXAoKHJlbWFyaykgPT5cbiAgICAgICAgICAgICAgICByZW1hcmsuc29sdXRpb25Gb3JHYXVnZS5waXhlbHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYXBMYXRMbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC55ICsgMC4wMDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC54ICsgMC4wMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnICsgIXJlbWFyay5ub3RQb3NzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyArICFyZW1hcmsubm90UG9zc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWVEZWx0YUluTWludXRlcyA9IHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5nZXRUaW1lRGVsdGFJbk1pbnV0ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzRGV0YWlsID1cbiAgICAgICAgICAgICAgICAnJyArXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdhdWdlTGFiZWwgK1xuICAgICAgICAgICAgICAgICcgPiAnICtcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5nZXRHYXVnZVZhbHVlKCkgKiAxMDApIC8gMTAwICtcbiAgICAgICAgICAgICAgICAnIC8gJyArXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF0uZ2V0UmFpblZhbHVlKCkgKiAxMDApIC8gMTAwICtcbiAgICAgICAgICAgICAgICAnIGRUPScgK1xuICAgICAgICAgICAgICAgIHRpbWVEZWx0YUluTWludXRlcztcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW107XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGl4ZWxzID0gW107XG4gICAgICAgICAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtcbiAgICAgICAgICAgIG5ldyBNYXBMYXRMbmcoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sYXQsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sbmcsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VMYWJlbCArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlQ2FydGVzaWFuVmFsdWUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS52YWx1ZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNlbGVjdEdhdWdlSW5Db21wYXJlKCk7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzOiBNYXBMYXRMbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJhaW5DYXJ0ZXNpYW5WYWx1ZSBvZiB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5yYWluQ2FydGVzaWFuVmFsdWVzKSB7XG4gICAgICAgICAgICBwaXhlbHMucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgTWFwTGF0TG5nKHJhaW5DYXJ0ZXNpYW5WYWx1ZS5sYXQgKyAwLjAwNSwgcmFpbkNhcnRlc2lhblZhbHVlLmxuZyArIDAuMDEpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBwaXhlbHM7XG5cbiAgICAgICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBwaXhlbHNTb2x1dGlvbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkQ29tcGFyZXNUaW1lbGluZShcbiAgICAgICAgdGFyZ2V0c09yZGVyZWQ6IElDb21wYXJlVGFyZ2V0W10sXG4gICAgICAgIHdpdGhDb21wYXJlRHVwbGljYXRlOiBib29sZWFuXG4gICAgKTogUHJvbWlzZTxJQ29tcGFyZXM+IHtcbiAgICAgICAgY29uc3QgY29tcGFyZURhdGVzID0gdGFyZ2V0c09yZGVyZWQubWFwKCh0KSA9PiB0LmRhdGUpO1xuXG4gICAgICAgIGNvbnN0IHF1YWxpdGllczogUmFpbkNvbXB1dGF0aW9uUXVhbGl0eVtdID0gY29tcGFyZURhdGVzXG4gICAgICAgICAgICAuZmlsdGVyKChkKSA9PiAhIWQpXG4gICAgICAgICAgICAubWFwKChkKSA9PiB0aGlzLmdldFJhaW5Db21wdXRhdGlvblF1YWxpdHkoZCkpXG4gICAgICAgICAgICAuZmlsdGVyKChyY3EpID0+ICEhcmNxKTtcblxuICAgICAgICB0aGlzLmNvbXBhcmVEYXRlcyA9IGNvbXBhcmVEYXRlcy5zbGljZSgxLCAtMSk7XG5cbiAgICAgICAgdGhpcy5idWlsZENvbXBhcmVzID0gU3BlZWRNYXRyaXhDb250YWluZXIuQnVpbGRDb21wYXJlcyhxdWFsaXRpZXMsICF3aXRoQ29tcGFyZUR1cGxpY2F0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkQ29tcGFyZXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENvbXBhcmVQZXJEYXRlKGRhdGU6IERhdGUpOiBJQ29tcGFyZVBlckRhdGUge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlc1BlckRhdGUuZmlsdGVyKFxuICAgICAgICAgICAgKGMpID0+IGMuZGF0ZS5nZXRUaW1lKCkgPT09IGRhdGUuZ2V0VGltZSgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGlzdGluZy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q3VycmVudFF1YWxpdHlQb2ludHMoY29tcGFyZUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy51aUNvbXBhcmVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgY29tcGFyZUluZGV4IDwgMCB8fFxuICAgICAgICAgICAgdGhpcy5jb21wYXJlTmFtZXMubGVuZ3RoIDwgY29tcGFyZUluZGV4XG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudWlDb21wYXJlc1tjb21wYXJlSW5kZXhdLmNvbXBhcmVQb2ludHNIaXN0b3J5O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjbGVhbkNvbXBhcmVRdWFsaXR5KGRldGFpbHM/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jb21wYXJlVmVyc2lvbiA9IGRldGFpbHM7XG4gICAgICAgIHRoaXMuY29tcGFyZU5hbWVzID0gW107XG4gICAgICAgIHRoaXMudWlDb21wYXJlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBhcmVTcGVlZE1hdHJpeCA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBhcmVUcnVzdGVkSW5kaWNhdG9yID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlEb25lRGF0ZSA9IG5ldyBEYXRlKC0xKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eUxhdW5jaGVkQnkgPSAnJztcbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eVRpbWVTcGVudEluTXMgPSAtMTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hSYWluQ29tcHV0YXRpb25RdWFsaXRpZXModGFyZ2V0c09yZGVyZWQ6IElDb21wYXJlVGFyZ2V0W10pIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0c09yZGVyZWQpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNQZXJEYXRlW3RhcmdldC5kYXRlLnRvSVNPU3RyaW5nKCldXG4gICAgICAgICAgICAgICAgLy8gJiYgdGFyZ2V0LnJhaW5Db21wdXRhdGlvblF1YWxpdHlJZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhaW5Db21wdXRhdGlvblF1YWxpdHk6IFJhaW5Db21wdXRhdGlvblF1YWxpdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5Db21wdXRhdGlvblF1YWxpdHkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkN1bXVsYXRpdmVDb21wYXJlQnlEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhaW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5ID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluQ29tcGFyZUJ5RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhaW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yYWluQ29tcHV0YXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYWluQ29tcHV0YXRpb25RdWFsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNDb25zaXN0ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdHJpY2VzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5LnF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lci5nZXRNYXRyaWNlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRyaXggb2YgbWF0cmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdHJpeC5pc0NvbnNpc3RlbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbnNpc3RlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDb25zaXN0ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgT25lIG9mIHJhaW5Db21wdXRhdGlvblF1YWxpdHkgbWF0cmljZXMgaXMgbm90IGNvbnNpc3RlbnQgZm9yICR7dGFyZ2V0LmRhdGUudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNQZXJEYXRlW3RhcmdldC5kYXRlLnRvSVNPU3RyaW5nKCldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFJhaW5Db21wdXRhdGlvblF1YWxpdHkoZGF0ZTogRGF0ZSk6IFJhaW5Db21wdXRhdGlvblF1YWxpdHkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNQZXJEYXRlW2RhdGUudG9JU09TdHJpbmcoKV07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdEdhdWdlSW5Db21wYXJlKCkge1xuICAgICAgICBjb25zdCBnbG9iYWxDb21wYXJlUG9pbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmdsb2JhbENvbXBhcmVQb2ludHMpKTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGdsb2JhbENvbXBhcmVQb2ludHMpIHtcbiAgICAgICAgICAgIGlmIChwLmlkID09PSB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cz8uZ2F1Z2VJZCkge1xuICAgICAgICAgICAgICAgIHAuciA9IDEwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwLnIgPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50cyA9IGdsb2JhbENvbXBhcmVQb2ludHM7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb21wYXJlIG9mIHRoaXMudWlDb21wYXJlcykge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyZVBvaW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29tcGFyZS5jb21wYXJlUG9pbnRzKSk7XG4gICAgICAgICAgICBjb21wYXJlUG9pbnRzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocC5pZCA9PT0gdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHM/LmdhdWdlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcC5yID0gMTA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcC5yID0gMztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBhcmUuY29tcGFyZVBvaW50cyA9IGNvbXBhcmVQb2ludHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzZXRTZWxlY3RlZEdhdWdlcygpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3Jlc2V0U2VsZWN0ZWRHYXVnZXMgcmVzZXQnKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RHYXVnZUluQ29tcGFyZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlVGFyZ2V0UG9zaXRpb24oXG4gICAgICAgIHJhaW5TcGVlZDogUmFpblNwZWVkLFxuICAgICAgICBjZW50ZXI6IExhdExuZ1xuICAgICk6IHtsYXQ6IG51bWJlcjsgbG5nOiBudW1iZXJ9IHtcbiAgICAgICAgcmV0dXJuIHJhaW5TcGVlZC5nZXRDZW50ZXIoKTtcbiAgICB9XG59XG4iXX0=
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGFyZU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvdG9vbHMvQ29tcGFyZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQ0gsU0FBUyxFQVNULG9CQUFvQixHQUN2QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBb0JqQyxNQUFNLE9BQU8sY0FBYztJQTRCdkIsWUFDYyxjQUE4QixFQUNqQyxZQUF3QixHQUFHLEVBQUUsR0FBRSxDQUFDO1FBRDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNqQyxjQUFTLEdBQVQsU0FBUyxDQUF1QjtRQUV2QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxRQUFRLENBQUMsUUFBa0I7UUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNqQixl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QUFJLENBQUMscUJBQXFCLEVBQUUsT0FBTyxFQUFFO29CQUM5QyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDWjtxQkFBTTtvQkFDSCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDWDtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7U0FDekM7SUFDTCxDQUFDO0lBRVMsbUJBQW1CO1FBQ3pCLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyx1QkFBdUIsQ0FDM0IsU0FBb0IsRUFDcEIsTUFBYztRQUVkLE9BQU8sU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWFwTGF0TG5nfSBmcm9tICdyYWFpbi11aSc7XG5pbXBvcnQge1xuICAgIEdhdWdlTm9kZSxcbiAgICBJQ29tcGFyZVBlckRhdGUsXG4gICAgSUNvbXBhcmVzLFxuICAgIExhdExuZyxcbiAgICBQb3NpdGlvblZhbHVlLFxuICAgIFF1YWxpdHlQb2ludCxcbiAgICBSYWluQ29tcHV0YXRpb25RdWFsaXR5LFxuICAgIFJhaW5Ob2RlLFxuICAgIFJhaW5TcGVlZCxcbiAgICBTcGVlZE1hdHJpeENvbnRhaW5lcixcbn0gZnJvbSAncmFhaW4tbW9kZWwnO1xuaW1wb3J0IHtYWVR5cGV9IGZyb20gJy4uL3h5dHlwZSc7XG5pbXBvcnQge1Byb2ZpbGVTZXJ2aWNlfSBmcm9tICcuLi9wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHtGcmFtZVNldH0gZnJvbSAnLi9GcmFtZVNldCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBhcmVUYXJnZXQge1xuICAgIGRhdGU6IERhdGU7XG4gICAgcmFpbkNvbXB1dGF0aW9uSWQ/OiBzdHJpbmc7XG4gICAgcmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkPzogc3RyaW5nO1xuICAgIC8vIHJhaW5Db21wdXRhdGlvblF1YWxpdHlJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVUlDb21wYXJlIHtcbiAgICBkYXRlOiBEYXRlO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBjb21wYXJlUG9pbnRzOiBYWVR5cGVbXTtcbiAgICBjb21wYXJlUG9pbnRzTWF4OiBYWVR5cGU7XG4gICAgY29tcGFyZVBvaW50c0hpc3Rvcnk6IFF1YWxpdHlQb2ludFtdO1xuICAgIHJlbWFya3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhcmVNYW5hZ2VyIHtcbiAgICBwdWJsaWMgZ2F1Z2VzSW5NYXA6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyBnYXVnZXNJbkNvbXBhcmU6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyBzZWxlY3RlZEdhdWdlczogTWFwTGF0TG5nW107XG4gICAgcHVibGljIHNlbGVjdGVkUGl4ZWxzOiBNYXBMYXRMbmdbXTtcbiAgICBwdWJsaWMgcGl4ZWxzU29sdXRpb25zOiBNYXBMYXRMbmdbXVtdO1xuICAgIHB1YmxpYyBzcGVlZHM6IE1hcExhdExuZ1tdO1xuXG4gICAgLy8gZnJvbSBjb21wYXJlc1RpbWVsaW5lXG4gICAgcHVibGljIGNvbXBhcmVOYW1lczogc3RyaW5nW107XG4gICAgcHVibGljIHVpQ29tcGFyZXM6IElVSUNvbXBhcmVbXTtcbiAgICBwdWJsaWMgY29tcGFyZVNwZWVkTWF0cml4OiBQb3NpdGlvblZhbHVlW107XG4gICAgcHVibGljIGNvbXBhcmVWZXJzaW9uOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbXBhcmVUcnVzdGVkSW5kaWNhdG9yOiBudW1iZXI7XG4gICAgcHVibGljIGNvbXBhcmVEYXRlczogRGF0ZVtdO1xuXG4gICAgcHVibGljIGN1cnJlbnRRdWFsaXR5RG9uZURhdGU6IERhdGU7XG4gICAgcHVibGljIGN1cnJlbnRRdWFsaXR5TGF1bmNoZWRCeTogc3RyaW5nO1xuICAgIHB1YmxpYyBjdXJyZW50UXVhbGl0eVRpbWVTcGVudEluTXM6IG51bWJlcjtcbiAgICBwdWJsaWMgZ2xvYmFsQ29tcGFyZVBvaW50czogWFlUeXBlW107XG4gICAgcHVibGljIGdsb2JhbENvbXBhcmVQb2ludHNNYXg6IFhZVHlwZTtcbiAgICBwdWJsaWMgY29tcGFyZVNwZWVkOiB7YW5nbGVJbkRlZ3JlZXM6IG51bWJlcjsgcGl4ZWxzUGVyUGVyaW9kOiBudW1iZXJ9O1xuICAgIHByb3RlY3RlZCBidWlsZENvbXBhcmVzOiBJQ29tcGFyZXM7XG4gICAgcHJvdGVjdGVkIHNlbGVjdGVkR2F1Z2U6IFF1YWxpdHlQb2ludDtcbiAgICBwcm90ZWN0ZWQgc2VsZWN0ZWRHYXVnZUluUG9pbnRzOiBRdWFsaXR5UG9pbnQ7XG4gICAgcHJvdGVjdGVkIHNlbGVjdGVkR2F1Z2VJblBvaW50c0RldGFpbDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByYWluQ29tcHV0YXRpb25RdWFsaXRpZXNQZXJEYXRlOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcbiAgICAgICAgcHVibGljIG9uQ2hhbmdlczogKCkgPT4gdm9pZCA9ICgpID0+IHt9XG4gICAgKSB7XG4gICAgICAgIHRoaXMuY2xlYW5BbGwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JhaW5Ob2RlOiBSYWluTm9kZTtcblxuICAgIHB1YmxpYyBnZXQgcmFpbk5vZGUoKTogUmFpbk5vZGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFpbk5vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByYWluTm9kZShyYWluTm9kZTogUmFpbk5vZGUpIHtcbiAgICAgICAgdGhpcy5fcmFpbk5vZGUgPSByYWluTm9kZTtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkFsbCgpIHtcbiAgICAgICAgdGhpcy5nYXVnZXNJbk1hcCA9IFtdO1xuICAgICAgICB0aGlzLmdhdWdlc0luQ29tcGFyZSA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb21wYXJlRGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zcGVlZHMgPSBbXTtcblxuICAgICAgICB0aGlzLmJ1aWxkQ29tcGFyZXMgPSB7XG4gICAgICAgICAgICBjb21wYXJlc1BlckRhdGU6IFtdLFxuICAgICAgICAgICAgY29tcGFyZUN1bXVsYXRpdmU6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50cyA9IFtdO1xuICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHNNYXggPSBuZXcgWFlUeXBlKDAsIDApO1xuICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvblF1YWxpdGllc1BlckRhdGUgPSB7fTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2UgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xlYW5Db21wYXJlUXVhbGl0eSgnbm8gY29tcGFyZSB5ZXQnKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoU3BlZWRzKGZyYW1lU2V0OiBGcmFtZVNldCkge1xuICAgICAgICBjb25zdCByYWluU3BlZWRNYXAgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFJhaW5TcGVlZE1hcChcbiAgICAgICAgICAgIHRoaXMucmFpbk5vZGUsXG4gICAgICAgICAgICBmcmFtZVNldC5yYWluQ29tcHV0YXRpb25JZFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyYWluU3BlZWRNYXA/LnJhaW5TcGVlZHMpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlZWRzID0gcmFpblNwZWVkTWFwLnJhaW5TcGVlZHMubWFwKChyYWluU3BlZWQ6IFJhaW5TcGVlZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IHJhaW5TcGVlZC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRQb3NpdGlvbiA9IHRoaXMuY2FsY3VsYXRlVGFyZ2V0UG9zaXRpb24ocmFpblNwZWVkLCBjZW50ZXIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBMYXRMbmcoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFBvc2l0aW9uLmxhdCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24ubG5nLFxuICAgICAgICAgICAgICAgICAgICByYWluU3BlZWQuYXppbXV0aEluRGVncmVlcyxcbiAgICAgICAgICAgICAgICAgICAgYGF6JHtyYWluU3BlZWQuYXppbXV0aEluRGVncmVlc30gc3Ake3JhaW5TcGVlZC5zcGVlZEluTWV0ZXJzUGVyU2VjfSB0cnVzdCR7cmFpblNwZWVkLnRydXN0UmF0aW99YCxcbiAgICAgICAgICAgICAgICAgICAgYGF6JHtyYWluU3BlZWQuYXppbXV0aEluRGVncmVlc30gc3Ake3JhaW5TcGVlZC5zcGVlZEluTWV0ZXJzUGVyU2VjfSB0cnVzdCR7cmFpblNwZWVkLnRydXN0UmF0aW99YCxcbiAgICAgICAgICAgICAgICAgICAgcmFpblNwZWVkLnNwZWVkSW5NZXRlcnNQZXJTZWNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNwZWVkcyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaENvbXBhcmVRdWFsaXR5KGZyYW1lU2V0OiBGcmFtZVNldCkge1xuICAgICAgICBjb25zdCBjb21wYXJlUGVyRGF0ZSA9IHRoaXMuZ2V0Q29tcGFyZVBlckRhdGUoZnJhbWVTZXQuZGF0ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWNvbXBhcmVQZXJEYXRlIHx8XG4gICAgICAgICAgICAhY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eT8ucXVhbGl0eVNwZWVkTWF0cml4Q29udGFpbmVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbkNvbXBhcmVRdWFsaXR5KFxuICAgICAgICAgICAgICAgICdubyBjdXJyZW50IHF1YWxpdHkgJyArIE9iamVjdC5rZXlzKHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdWlDb21wYXJlczogSVVJQ29tcGFyZVtdID0gY29tcGFyZVBlckRhdGUuY29tcGFyZVRpbWVsaW5lXG4gICAgICAgICAgICAubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogYy5kYXRlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQb2ludHM6IGMucXVhbGl0eVBvaW50cy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWFlUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldEdhdWdlVmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRSYWluVmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nYXVnZUxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdhdWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQb2ludHNNYXg6IG5ldyBYWVR5cGUoYy5tYXhWYWx1ZSAqIDEuMiwgYy5tYXhWYWx1ZSAqIDEuMiksXG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQb2ludHNIaXN0b3J5OiBjLnF1YWxpdHlQb2ludHNMZWdhY3ksXG4gICAgICAgICAgICAgICAgICAgIHJlbWFya3M6IGMucmVtYXJrcyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmRhdGU/LmdldFRpbWUoKSAtIGIuZGF0ZT8uZ2V0VGltZSgpKTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5RG9uZURhdGUgPSBjb21wYXJlUGVyRGF0ZS5yYWluQ29tcHV0YXRpb25RdWFsaXR5LmlzRG9uZURhdGU7XG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlUaW1lU3BlbnRJbk1zID0gY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eS50aW1lU3BlbnRJbk1zO1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5TGF1bmNoZWRCeSA9IGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkubGF1bmNoZWRCeTtcbiAgICAgICAgdGhpcy5jb21wYXJlVmVyc2lvbiA9IGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkuZ2V0VmVyc2lvbigpO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZVNwZWVkID1cbiAgICAgICAgICAgIGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkucXVhbGl0eVNwZWVkTWF0cml4Q29udGFpbmVyLmdldFNwZWVkKCk7XG4gICAgICAgIHRoaXMuY29tcGFyZU5hbWVzID0gdWlDb21wYXJlcy5tYXAoKGMpID0+IGMubmFtZSk7XG4gICAgICAgIHRoaXMudWlDb21wYXJlcyA9IHVpQ29tcGFyZXM7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoR2xvYmFsQ29tcGFyZVF1YWxpdHkoXG4gICAgICAgIHRhcmdldHNPcmRlcmVkOiBJQ29tcGFyZVRhcmdldFtdLFxuICAgICAgICB3aXRoQ29tcGFyZUR1cGxpY2F0ZTogYm9vbGVhblxuICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFJhaW5Db21wdXRhdGlvblF1YWxpdGllcyh0YXJnZXRzT3JkZXJlZCk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRDb21wYXJlc1RpbWVsaW5lKHRhcmdldHNPcmRlcmVkLCB3aXRoQ29tcGFyZUR1cGxpY2F0ZSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5idWlsZENvbXBhcmVzLmNvbXBhcmVDdW11bGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhyb3cgRXJyb3IoJ25lZWRzIGN1bXVsYXRpdmUgY29tcGFyZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY291bnRGb3JBdmVyYWdlID0gdGFyZ2V0c09yZGVyZWQubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSB0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmUubWF4VmFsdWUgKiAxLjI7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHMgPSB0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmUucXVhbGl0eVBvaW50cy5tYXAoXG4gICAgICAgICAgICAgICAgKHFwKSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgWFlUeXBlKHFwLmdldEdhdWdlVmFsdWUoKSwgcXAuZ2V0UmFpblZhbHVlKCksIDIsIHFwLmdhdWdlTGFiZWwsIHFwLmdhdWdlSWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxDb21wYXJlUG9pbnRzTWF4ID0gbmV3IFhZVHlwZShtYXhWYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzZXRHYXVnZXNJbk1hcCgpIHtcbiAgICAgICAgbGV0IGdhdWdlc1RvRmlsdGVyID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRHYXVnZXMoXG4gICAgICAgICAgICB0aGlzLnJhaW5Ob2RlPy5pZCxcbiAgICAgICAgICAgIHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKClcbiAgICAgICAgKTtcbiAgICAgICAgZ2F1Z2VzVG9GaWx0ZXIgPSBnYXVnZXNUb0ZpbHRlclxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBhLmFwcHJveERpc3RhbmNlRnJvbSh0aGlzLnJhaW5Ob2RlLmdldENlbnRlcigpKSAtXG4gICAgICAgICAgICAgICAgICAgIGIuYXBwcm94RGlzdGFuY2VGcm9tKHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKCkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKCh2LCBpbmRleCkgPT4gaW5kZXggPCAyMDApO1xuXG4gICAgICAgIGNvbnN0IHJhaW5Ob2RlR2F1Z2VJZHMgPSB0aGlzLnJhaW5Ob2RlLmdldExpbmtzKEdhdWdlTm9kZS5UWVBFKS5tYXAoKGwpID0+IGwuZ2V0SWQoKSk7XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZUdhdWdlcyA9IGdhdWdlc1RvRmlsdGVyLmZpbHRlcigoZykgPT4gcmFpbk5vZGVHYXVnZUlkcy5pbmRleE9mKGcuaWQpID4gLTEpO1xuICAgICAgICBjb25zb2xlLmxvZygndmlzaWJsZUdhdWdlczonLCB2aXNpYmxlR2F1Z2VzKTtcblxuICAgICAgICBjb25zdCBnYXVnZXNMYXRMbmc6IE1hcExhdExuZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZ2F1Z2Ugb2YgdmlzaWJsZUdhdWdlcykge1xuICAgICAgICAgICAgZ2F1Z2VzTGF0TG5nLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IE1hcExhdExuZyhnYXVnZS5sYXRpdHVkZSwgZ2F1Z2UubG9uZ2l0dWRlLCB1bmRlZmluZWQsIGdhdWdlLmlkLCBnYXVnZS5uYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdhdWdlc0luTWFwID0gZ2F1Z2VzTGF0TG5nO1xuICAgIH1cblxuICAgIGFzeW5jIHNldEdhdWdlc0luQ29tcGFyZSgpIHtcbiAgICAgICAgY29uc3QgcXVhbGl0eVBvaW50czogUXVhbGl0eVBvaW50W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb21wYXJlIG9mIHRoaXMudWlDb21wYXJlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBxdWFsaXR5UG9pbnQgb2YgY29tcGFyZS5jb21wYXJlUG9pbnRzSGlzdG9yeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlBZGRlZCA9IHF1YWxpdHlQb2ludHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAocCkgPT4gcD8uZ2F1Z2VJZCA9PT0gcXVhbGl0eVBvaW50LmdhdWdlSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5QWRkZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1YWxpdHlQb2ludHMucHVzaChxdWFsaXR5UG9pbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2F1Z2VzSW5Db21wYXJlID0gcXVhbGl0eVBvaW50cy5tYXAoKHApID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWFwTGF0TG5nKFxuICAgICAgICAgICAgICAgIHAuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sYXQsXG4gICAgICAgICAgICAgICAgcC5nYXVnZUNhcnRlc2lhblZhbHVlLmxuZyxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHAuZ2F1Z2VJZCxcbiAgICAgICAgICAgICAgICBwLmdhdWdlTGFiZWwgKyAnPicgKyBwLmdldEdhdWdlVmFsdWUoKSxcbiAgICAgICAgICAgICAgICBwLmdldEdhdWdlVmFsdWUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkR2F1Z2VzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0R2F1Z2UoZ2F1Z2VJZDogc3RyaW5nLCBjb21wYXJlSW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoZ2F1Z2VJZCkge1xuICAgICAgICAgICAgY29uc3QgeHlzID0gdGhpcy5nZXRDdXJyZW50UXVhbGl0eVBvaW50cyhjb21wYXJlSW5kZXgpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocCkgPT4gcC5nYXVnZUlkID09PSBnYXVnZUlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlID0geHlzLmxlbmd0aCA9PT0gMSA/IHh5c1swXSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkR2F1Z2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEdhdWdlcygpO1xuICAgICAgICAgICAgY29uc3QgZ2F1Z2VzRmlsdGVyZWQgPSB0aGlzLmdhdWdlc0luTWFwLmZpbHRlcigoZykgPT4gZy5pZCA9PT0gZ2F1Z2VJZCk7XG4gICAgICAgICAgICBpZiAoZ2F1Z2VzRmlsdGVyZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtnYXVnZXNGaWx0ZXJlZFswXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSB0aGlzLmdldEN1cnJlbnRRdWFsaXR5UG9pbnRzKGNvbXBhcmVJbmRleCkuZmlsdGVyKFxuICAgICAgICAgICAgKHApID0+IHAuZ2F1Z2VJZCA9PT0gdGhpcy5zZWxlY3RlZEdhdWdlLmdhdWdlSWRcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHBpeGVsc1NvbHV0aW9uczogTWFwTGF0TG5nW11bXSA9IFtdO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEdhdWdlSW5Qb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCByZW1hcmtzID0gSlNPTi5wYXJzZShzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF0ucmVtYXJrKS5zb3J0KFxuICAgICAgICAgICAgICAgIChhLCBiKSA9PiBhLmNyaXRlcmlhQXR0ZW1wdGVkVG9CZU1pbmltdW0gLSBiLmNyaXRlcmlhQXR0ZW1wdGVkVG9CZU1pbmltdW1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZW1hcmtzKTtcbiAgICAgICAgICAgIHBpeGVsc1NvbHV0aW9ucyA9IHJlbWFya3MubWFwKChyZW1hcmspID0+XG4gICAgICAgICAgICAgICAgcmVtYXJrLnNvbHV0aW9uRm9yR2F1Z2UucGl4ZWxzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwTGF0TG5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAueSArIDAuMDA1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAueCArIDAuMDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyArICFyZW1hcmsubm90UG9zc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJycgKyAhcmVtYXJrLm5vdFBvc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB0aW1lRGVsdGFJbk1pbnV0ZXMgPSBzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF0uZ2V0VGltZURlbHRhSW5NaW51dGVzKCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50c0RldGFpbCA9XG4gICAgICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5nYXVnZUxhYmVsICtcbiAgICAgICAgICAgICAgICAnID4gJyArXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF0uZ2V0R2F1Z2VWYWx1ZSgpICogMTAwKSAvIDEwMCArXG4gICAgICAgICAgICAgICAgJyAvICcgK1xuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdldFJhaW5WYWx1ZSgpICogMTAwKSAvIDEwMCArXG4gICAgICAgICAgICAgICAgJyBkVD0nICtcbiAgICAgICAgICAgICAgICB0aW1lRGVsdGFJbk1pbnV0ZXM7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzID0gc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpeGVscyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZXMgPSBbXG4gICAgICAgICAgICBuZXcgTWFwTGF0TG5nKFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlQ2FydGVzaWFuVmFsdWUubGF0LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlQ2FydGVzaWFuVmFsdWUubG5nLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5nYXVnZUlkLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlTGFiZWwgK1xuICAgICAgICAgICAgICAgICAgICAnPicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5nYXVnZUNhcnRlc2lhblZhbHVlLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlQ2FydGVzaWFuVmFsdWUudmFsdWVcbiAgICAgICAgICAgICksXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5zZWxlY3RHYXVnZUluQ29tcGFyZSgpO1xuXG4gICAgICAgIGNvbnN0IHBpeGVsczogTWFwTGF0TG5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByYWluQ2FydGVzaWFuVmFsdWUgb2YgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMucmFpbkNhcnRlc2lhblZhbHVlcykge1xuICAgICAgICAgICAgcGl4ZWxzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IE1hcExhdExuZyhyYWluQ2FydGVzaWFuVmFsdWUubGF0ICsgMC4wMDUsIHJhaW5DYXJ0ZXNpYW5WYWx1ZS5sbmcgKyAwLjAxKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkUGl4ZWxzID0gcGl4ZWxzO1xuXG4gICAgICAgIHRoaXMucGl4ZWxzU29sdXRpb25zID0gcGl4ZWxzU29sdXRpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBidWlsZENvbXBhcmVzVGltZWxpbmUoXG4gICAgICAgIHRhcmdldHNPcmRlcmVkOiBJQ29tcGFyZVRhcmdldFtdLFxuICAgICAgICB3aXRoQ29tcGFyZUR1cGxpY2F0ZTogYm9vbGVhblxuICAgICk6IFByb21pc2U8SUNvbXBhcmVzPiB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmVEYXRlcyA9IHRhcmdldHNPcmRlcmVkLm1hcCgodCkgPT4gdC5kYXRlKTtcblxuICAgICAgICBjb25zdCBxdWFsaXRpZXM6IFJhaW5Db21wdXRhdGlvblF1YWxpdHlbXSA9IGNvbXBhcmVEYXRlc1xuICAgICAgICAgICAgLmZpbHRlcigoZCkgPT4gISFkKVxuICAgICAgICAgICAgLm1hcCgoZCkgPT4gdGhpcy5nZXRSYWluQ29tcHV0YXRpb25RdWFsaXR5KGQpKVxuICAgICAgICAgICAgLmZpbHRlcigocmNxKSA9PiAhIXJjcSk7XG5cbiAgICAgICAgdGhpcy5jb21wYXJlRGF0ZXMgPSBjb21wYXJlRGF0ZXMuc2xpY2UoMSwgLTEpO1xuXG4gICAgICAgIHRoaXMuYnVpbGRDb21wYXJlcyA9IFNwZWVkTWF0cml4Q29udGFpbmVyLkJ1aWxkQ29tcGFyZXMocXVhbGl0aWVzLCAhd2l0aENvbXBhcmVEdXBsaWNhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZENvbXBhcmVzO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDb21wYXJlUGVyRGF0ZShkYXRlOiBEYXRlKTogSUNvbXBhcmVQZXJEYXRlIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZXNQZXJEYXRlLmZpbHRlcihcbiAgICAgICAgICAgIChjKSA9PiBjLmRhdGUuZ2V0VGltZSgpID09PSBkYXRlLmdldFRpbWUoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpc3RpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEN1cnJlbnRRdWFsaXR5UG9pbnRzKGNvbXBhcmVJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudWlDb21wYXJlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIGNvbXBhcmVJbmRleCA8IDAgfHxcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZU5hbWVzLmxlbmd0aCA8IGNvbXBhcmVJbmRleFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnVpQ29tcGFyZXNbY29tcGFyZUluZGV4XS5jb21wYXJlUG9pbnRzSGlzdG9yeTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xlYW5Db21wYXJlUXVhbGl0eShkZXRhaWxzPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY29tcGFyZVZlcnNpb24gPSBkZXRhaWxzO1xuICAgICAgICB0aGlzLmNvbXBhcmVOYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLnVpQ29tcGFyZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jb21wYXJlU3BlZWRNYXRyaXggPSBbXTtcbiAgICAgICAgdGhpcy5jb21wYXJlVHJ1c3RlZEluZGljYXRvciA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5RG9uZURhdGUgPSBuZXcgRGF0ZSgtMSk7XG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5ID0gJyc7XG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlUaW1lU3BlbnRJbk1zID0gLTE7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGZldGNoUmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzKHRhcmdldHNPcmRlcmVkOiBJQ29tcGFyZVRhcmdldFtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHNPcmRlcmVkKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZVt0YXJnZXQuZGF0ZS50b0lTT1N0cmluZygpXVxuICAgICAgICAgICAgICAgIC8vICYmIHRhcmdldC5yYWluQ29tcHV0YXRpb25RdWFsaXR5SWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYWluQ29tcHV0YXRpb25RdWFsaXR5OiBSYWluQ29tcHV0YXRpb25RdWFsaXR5O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFJhaW5DdW11bGF0aXZlQ29tcGFyZUJ5RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYWluTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5yYWluQ29tcHV0YXRpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uUXVhbGl0eSA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkNvbXBhcmVCeURhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYWluTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmFpbkNvbXB1dGF0aW9uUXVhbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ29uc2lzdGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRyaWNlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uUXVhbGl0eS5xdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIuZ2V0TWF0cmljZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0cml4IG9mIG1hdHJpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRyaXguaXNDb25zaXN0ZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25zaXN0ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29uc2lzdGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE9uZSBvZiByYWluQ29tcHV0YXRpb25RdWFsaXR5IG1hdHJpY2VzIGlzIG5vdCBjb25zaXN0ZW50IGZvciAke3RhcmdldC5kYXRlLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZVt0YXJnZXQuZGF0ZS50b0lTT1N0cmluZygpXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uUXVhbGl0eTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRSYWluQ29tcHV0YXRpb25RdWFsaXR5KGRhdGU6IERhdGUpOiBSYWluQ29tcHV0YXRpb25RdWFsaXR5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZVtkYXRlLnRvSVNPU3RyaW5nKCldO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RHYXVnZUluQ29tcGFyZSgpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsQ29tcGFyZVBvaW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5nbG9iYWxDb21wYXJlUG9pbnRzKSk7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBnbG9iYWxDb21wYXJlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAocC5pZCA9PT0gdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHM/LmdhdWdlSWQpIHtcbiAgICAgICAgICAgICAgICBwLnIgPSAxMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcC5yID0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHMgPSBnbG9iYWxDb21wYXJlUG9pbnRzO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29tcGFyZSBvZiB0aGlzLnVpQ29tcGFyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVQb2ludHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbXBhcmUuY29tcGFyZVBvaW50cykpO1xuICAgICAgICAgICAgY29tcGFyZVBvaW50cy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHAuaWQgPT09IHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzPy5nYXVnZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHAuciA9IDEwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHAuciA9IDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb21wYXJlLmNvbXBhcmVQb2ludHMgPSBjb21wYXJlUG9pbnRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2V0U2VsZWN0ZWRHYXVnZXMoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXNldFNlbGVjdGVkR2F1Z2VzIHJlc2V0Jyk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUGl4ZWxzID0gW107XG4gICAgICAgIHRoaXMucGl4ZWxzU29sdXRpb25zID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0R2F1Z2VJbkNvbXBhcmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVRhcmdldFBvc2l0aW9uKFxuICAgICAgICByYWluU3BlZWQ6IFJhaW5TcGVlZCxcbiAgICAgICAgY2VudGVyOiBMYXRMbmdcbiAgICApOiB7bGF0OiBudW1iZXI7IGxuZzogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiByYWluU3BlZWQuZ2V0Q2VudGVyKCk7XG4gICAgfVxufVxuIl19
@@ -9,6 +9,7 @@ export class RefreshManager {
9
9
  this.compareManager = compareManager;
10
10
  this.provider = 'Raain';
11
11
  this.timeStepInMinutes = 10;
12
+ this.lastError = '';
12
13
  this._period = { begin: new Date(), end: new Date() };
13
14
  this.closeRefreshTimer = new Subject();
14
15
  this.cartesianTools = new CartesianTools();
@@ -29,15 +30,13 @@ export class RefreshManager {
29
30
  this._period.end = new Date(period.end);
30
31
  this.refreshCounts().then((ignored) => { });
31
32
  }
32
- static Delay(ms) {
33
- return new Promise((resolve) => setTimeout(resolve, ms));
34
- }
35
33
  setMethods(onRefreshInProgress, onRefreshDone, onFetchDone) {
36
34
  this.onRefreshInProgress = onRefreshInProgress;
37
35
  this.onRefreshDone = onRefreshDone;
38
36
  this.onFetchDone = onFetchDone;
39
37
  }
40
38
  cleanAll() {
39
+ this.lastError = '';
41
40
  this.countsPeriod = { percentImages: [], queueRunning: 0, progress: 0 };
42
41
  this.timeframesFromRadars = [];
43
42
  this.timeframesFromRadarsExtended = [];
@@ -72,6 +71,7 @@ export class RefreshManager {
72
71
  return this.timelineSelectedFrameSet;
73
72
  }
74
73
  async refresh(launchQualityAfter, dataInternal) {
74
+ this.lastError = '';
75
75
  this.checkPeriod();
76
76
  this.dataInternal = dataInternal;
77
77
  const asyncDone = (error) => {
@@ -112,7 +112,9 @@ export class RefreshManager {
112
112
  }
113
113
  checkPeriod() {
114
114
  if (this.period.begin.getTime() === this.period.end.getTime()) {
115
- throw new Error('need a period');
115
+ const message = 'need a period';
116
+ this.lastError += message;
117
+ throw new Error(message);
116
118
  }
117
119
  }
118
120
  async refreshCounts() {
@@ -150,6 +152,7 @@ export class RefreshManager {
150
152
  }
151
153
  catch (e) {
152
154
  console.warn(e);
155
+ this.lastError += e.message;
153
156
  }
154
157
  return false;
155
158
  }
@@ -173,8 +176,22 @@ export class RefreshManager {
173
176
  frameSet.date.getTime() <= this.period.end.getTime())
174
177
  .sort((a, b) => a.date.getTime() - b.date.getTime());
175
178
  this.timeframeDates = this.timeframesFromRadars.map((frameSet) => frameSet.date);
176
- // console.log('timeframesFromRadarsExtended:', this.timeframesFromRadarsExtended);
177
- // console.log('timeframeDates:', this.timeframeDates);
179
+ // Compute all expected dates from period.begin to period.end with timeStepInMinutes
180
+ const allExpectedDates = [];
181
+ const currentDate = new Date(this.period.begin);
182
+ while (currentDate.getTime() <= this.period.end.getTime()) {
183
+ allExpectedDates.push(new Date(currentDate));
184
+ currentDate.setMinutes(currentDate.getMinutes() + this.timeStepInMinutes);
185
+ }
186
+ // Check if all expected dates are present in timeframeDates
187
+ const timeframeDateTimes = new Set(this.timeframeDates.map((d) => d.getTime()));
188
+ const missingDates = allExpectedDates.filter((expectedDate) => !timeframeDateTimes.has(expectedDate.getTime()));
189
+ if (missingDates.length > 0) {
190
+ const message = `Missing ${missingDates.length} timeframe(s) out of ${allExpectedDates.length} expected: ` +
191
+ missingDates.map((d) => d.toISOString()).join(', ');
192
+ console.warn(message);
193
+ this.lastError += message;
194
+ }
178
195
  return this.timeframesFromRadars;
179
196
  }
180
197
  catch (e) {
@@ -202,7 +219,9 @@ export class RefreshManager {
202
219
  }
203
220
  async refreshMapTimeframeContainers(target) {
204
221
  if (!target?.rainComputationId && !target?.rainComputationCumulativeId) {
205
- console.warn(`Pb with refreshMapTimeframeContainers insights ${target?.date.toISOString()}`);
222
+ const message = `Pb with refreshMapTimeframeContainers insights ${target?.date.toISOString()}`;
223
+ console.warn(message);
224
+ this.lastError += message;
206
225
  return null;
207
226
  }
208
227
  const rainNode = this.rainNode;
@@ -237,7 +256,9 @@ export class RefreshManager {
237
256
  }
238
257
  }
239
258
  catch (e) {
240
- console.warn('Pb with computations for id:', target.rainComputationId, e);
259
+ const message = `Pb with computations for id: ${target.rainComputationId} ${e.message}`;
260
+ console.warn(message);
261
+ this.lastError += message;
241
262
  }
242
263
  return newCreatedTimeframeContainers;
243
264
  }
@@ -248,7 +269,9 @@ export class RefreshManager {
248
269
  }
249
270
  async getValues(target) {
250
271
  if (!target?.rainComputationId && !target?.rainComputationCumulativeId) {
251
- console.warn(`Pb with target insights ${target?.date.toISOString()}`);
272
+ const message = `Pb with target insights ${target?.date.toISOString()}`;
273
+ console.warn(message);
274
+ this.lastError += message;
252
275
  return [];
253
276
  }
254
277
  let values = [];
@@ -273,9 +296,11 @@ export class RefreshManager {
273
296
  }
274
297
  }
275
298
  catch (e) {
276
- console.warn('Pb with computations for id:', target.rainComputationId, target.rainComputationCumulativeId, e);
299
+ const message = `Pb with computations for id: ${target.rainComputationId} ${target.rainComputationCumulativeId} ${e.message}`;
300
+ console.warn(message);
301
+ this.lastError += message;
277
302
  }
278
303
  return values;
279
304
  }
280
305
  }
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVmcmVzaE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvdG9vbHMvUmVmcmVzaE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUNILHFCQUFxQixFQUNyQixjQUFjLEVBRWQsU0FBUyxHQUdaLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxpQkFBaUIsRUFBc0IsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFNcEYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFaEYsTUFBTSxPQUFPLGNBQWM7SUF3Q3ZCLFlBQ2MsWUFBMEIsRUFDMUIsY0FBOEIsRUFDOUIsY0FBOEI7UUFGOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTlCckMsYUFBUSxHQUFXLE9BQU8sQ0FBQztRQUMzQixzQkFBaUIsR0FBVyxFQUFFLENBQUM7UUErQmxDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ2hELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FB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QU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyw0Q0FBNEMsQ0FDbEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQ2hCLE1BQU0sQ0FBQywyQkFBMkIsQ0FDckMsQ0FBQztTQUNUO1FBRUQsSUFBSTtZQUNBLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3BCLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUMxQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUU7d0JBQ1QsQ0FBQyxDQUFDLE1BQW1DLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7NEJBQ2pELE1BQU0scUJBQXFCLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUM1RCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDbEIsaUJBQWlCLENBQUMsSUFBSSxDQUNsQixxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxFQUMxQyxJQUFJLENBQUMsY0FBYyxDQUN0QixDQUNKLENBQUM7d0JBQ04sQ0FBQyxDQUFDLENBQUM7cUJBQ047Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7YUFDTjtTQUNKO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixPQUFPLENBQUMsSUFBSSxDQUNSLDhCQUE4QixFQUM5QixNQUFNLENBQUMsaUJBQWlCLEVBQ3hCLE1BQU0sQ0FBQywyQkFBMkIsRUFDbEMsQ0FBQyxDQUNKLENBQUM7U0FDTDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RnJhbWVTZXR9IGZyb20gJy4vRnJhbWVTZXQnO1xuaW1wb3J0IHtmcm9tLCBtZXJnZU1hcCwgU3ViamVjdCwgdGFrZVVudGlsLCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIENhcnRlc2lhbk1lYXN1cmVWYWx1ZSxcbiAgICBDYXJ0ZXNpYW5Ub29scyxcbiAgICBJQ2FydGVzaWFuTWVhc3VyZVZhbHVlLFxuICAgIFJhZGFyTm9kZSxcbiAgICBSYWluQ29tcHV0YXRpb25NYXAsXG4gICAgUmFpbk5vZGUsXG59IGZyb20gJ3JhYWluLW1vZGVsJztcbmltcG9ydCB7Q2FydGVzaWFuTWFwVmFsdWUsIFRpbWVmcmFtZUNvbnRhaW5lciwgVGltZWZyYW1lQ29udGFpbmVyc30gZnJvbSAncmFhaW4tdWknO1xuaW1wb3J0IHtSYWRhclNlcnZpY2V9IGZyb20gJy4uL3JhZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHtQcm9maWxlU2VydmljZX0gZnJvbSAnLi4vcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7Q29tcGFyZU1hbmFnZXJ9IGZyb20gJy4vQ29tcGFyZU1hbmFnZXInO1xuaW1wb3J0IHtYWVR5cGV9IGZyb20gJy4uL3h5dHlwZSc7XG5cbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmV4cG9ydCBjbGFzcyBSZWZyZXNoTWFuYWdlciB7XG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcFZlcnNpb246IHN0cmluZztcbiAgICBwdWJsaWMgcmFpbkNvbXB1dGF0aW9uTWFwRGF0ZTogRGF0ZTtcbiAgICBwdWJsaWMgcmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGU6IERhdGU7XG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcExhdW5jaGVkQnk6IHN0cmluZztcbiAgICBwdWJsaWMgcmFpbkNvbXB1dGF0aW9uTWFwVGltZVNwZW50SW5NczogbnVtYmVyO1xuXG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWluOiBudW1iZXI7XG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWF4OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgc3VtRm46IChjYXJ0ZXNpYW5NYXBWYWx1ZXM6IENhcnRlc2lhbk1hcFZhbHVlW10pID0+IG51bWJlcjtcbiAgICBwdWJsaWMgc3VtVmFsdWVzOiBDYXJ0ZXNpYW5NYXBWYWx1ZVtdO1xuXG4gICAgcHVibGljIHByb3ZpZGVyOiBzdHJpbmcgPSAnUmFhaW4nO1xuICAgIHB1YmxpYyB0aW1lU3RlcEluTWludXRlczogbnVtYmVyID0gMTA7XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VSZWZyZXNoVGltZXI6IFN1YmplY3Q8dW5rbm93bj47XG4gICAgcHJvdGVjdGVkIGNvdW50c1BlcmlvZDoge1xuICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgfTtcbiAgICBwcm90ZWN0ZWQgdGltZWZyYW1lc0Zyb21SYWRhcnM6IEZyYW1lU2V0W107XG4gICAgcHJvdGVjdGVkIHRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQ6IEZyYW1lU2V0W107XG4gICAgcHJvdGVjdGVkIHRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldDogRnJhbWVTZXQ7XG4gICAgcHJvdGVjdGVkIHRpbWVmcmFtZURhdGVzOiBEYXRlW107XG4gICAgcHJvdGVjdGVkIGNhcnRlc2lhblRvb2xzOiBDYXJ0ZXNpYW5Ub29scztcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRHVwbGljYXRlOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBkYXRhSW50ZXJuYWw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIG9uUmVmcmVzaEluUHJvZ3Jlc3M6IChcbiAgICAgICAgY291bnRQZXJpb2RzOiB7XG4gICAgICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgICAgICBxdWV1ZVJ1bm5pbmc/OiBudW1iZXI7XG4gICAgICAgICAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgdGltZWZyYW1lRGF0ZXM6IERhdGVbXVxuICAgICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBwcm90ZWN0ZWQgb25SZWZyZXNoRG9uZTogKHRpbWVmcmFtZURhdGVzOiBEYXRlW10pID0+IFByb21pc2U8dm9pZD47XG4gICAgcHJvdGVjdGVkIG9uRmV0Y2hEb25lOiAodGltZWZyYW1lQ29udGFpbmVycz86IFRpbWVmcmFtZUNvbnRhaW5lcnMpID0+IFByb21pc2U8dm9pZD47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJhZGFyU2VydmljZTogUmFkYXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcHJvZmlsZVNlcnZpY2U6IFByb2ZpbGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29tcGFyZU1hbmFnZXI6IENvbXBhcmVNYW5hZ2VyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3BlcmlvZCA9IHtiZWdpbjogbmV3IERhdGUoKSwgZW5kOiBuZXcgRGF0ZSgpfTtcbiAgICAgICAgdGhpcy5jbG9zZVJlZnJlc2hUaW1lciA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG4gICAgICAgIHRoaXMuY2FydGVzaWFuVG9vbHMgPSBuZXcgQ2FydGVzaWFuVG9vbHMoKTtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcmFpbk5vZGU6IFJhaW5Ob2RlO1xuXG4gICAgcHVibGljIGdldCByYWluTm9kZSgpOiBSYWluTm9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWluTm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJhaW5Ob2RlKHJhaW5Ob2RlOiBSYWluTm9kZSkge1xuICAgICAgICB0aGlzLl9yYWluTm9kZSA9IHJhaW5Ob2RlO1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wZXJpb2Q6IHtiZWdpbjogRGF0ZTsgZW5kOiBEYXRlfTtcblxuICAgIGdldCBwZXJpb2QoKToge2JlZ2luOiBEYXRlOyBlbmQ6IERhdGV9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BlcmlvZDtcbiAgICB9XG5cbiAgICBzZXQgcGVyaW9kKHBlcmlvZDoge2JlZ2luOiBEYXRlOyBlbmQ6IERhdGV9KSB7XG4gICAgICAgIHRoaXMuX3BlcmlvZC5iZWdpbiA9IG5ldyBEYXRlKHBlcmlvZC5iZWdpbik7XG4gICAgICAgIHRoaXMuX3BlcmlvZC5lbmQgPSBuZXcgRGF0ZShwZXJpb2QuZW5kKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ291bnRzKCkudGhlbigoaWdub3JlZCkgPT4ge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgRGVsYXkobXM6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TWV0aG9kcyhcbiAgICAgICAgb25SZWZyZXNoSW5Qcm9ncmVzczogKFxuICAgICAgICAgICAgY291bnRQZXJpb2RzOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudEltYWdlcz86IFhZVHlwZVtdO1xuICAgICAgICAgICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lZnJhbWVEYXRlczogRGF0ZVtdXG4gICAgICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICAgICAgb25SZWZyZXNoRG9uZTogKHRpbWVmcmFtZURhdGVzOiBEYXRlW10pID0+IFByb21pc2U8dm9pZD4sXG4gICAgICAgIG9uRmV0Y2hEb25lOiAodGltZWZyYW1lQ29udGFpbmVycz86IFRpbWVmcmFtZUNvbnRhaW5lcnMpID0+IFByb21pc2U8dm9pZD5cbiAgICApIHtcbiAgICAgICAgdGhpcy5vblJlZnJlc2hJblByb2dyZXNzID0gb25SZWZyZXNoSW5Qcm9ncmVzcztcbiAgICAgICAgdGhpcy5vblJlZnJlc2hEb25lID0gb25SZWZyZXNoRG9uZTtcbiAgICAgICAgdGhpcy5vbkZldGNoRG9uZSA9IG9uRmV0Y2hEb25lO1xuICAgIH1cblxuICAgIGNsZWFuQWxsKCkge1xuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IHtwZXJjZW50SW1hZ2VzOiBbXSwgcXVldWVSdW5uaW5nOiAwLCBwcm9ncmVzczogMH07XG4gICAgICAgIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnMgPSBbXTtcbiAgICAgICAgdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFyc0V4dGVuZGVkID0gW107XG4gICAgICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yZW1vdmVEdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsb3NlUmVmcmVzaFRpbWVyPy5uZXh0KG51bGwpO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoKFxuICAgICAgICBkYXRlU2hvd246IERhdGUsXG4gICAgICAgIHdpdGhHYXVnZXNNZWFzdXJlczogYm9vbGVhbixcbiAgICAgICAgY3VtdWxhdGl2ZUhvdXJzID0gMFxuICAgICk6IFByb21pc2U8RnJhbWVTZXQ+IHtcbiAgICAgICAgLy8gc2V0IHRoZSB0YXJnZXRcbiAgICAgICAgY29uc3QgY3VycmVudHMgPSB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQuZmlsdGVyKFxuICAgICAgICAgICAgKHQpID0+IHQuZGF0ZS5nZXRUaW1lKCkgPT09IGRhdGVTaG93bi5nZXRUaW1lKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGN1cnJlbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYnVpbGQgY3VycmVudCBGcmFtZXNldFxuICAgICAgICBjb25zdCBjdXJyZW50OiBGcmFtZVNldCA9IGN1cnJlbnRzWzBdO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB7XG4gICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgd2l0aEdhdWdlOiB3aXRoR2F1Z2VzTWVhc3VyZXMsXG4gICAgICAgICAgICBjdW11bGF0aXZlSG91cnM6IGN1bXVsYXRpdmVIb3VycyxcbiAgICAgICAgICAgIC8vIHJhaW5Db21wdXRhdGlvblF1YWxpdHlJZDogdGhpcy5nZXRSYWluQ29tcHV0YXRpb25RdWFsaXR5VGFyZ2V0KGN1cnJlbnQpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRpbWVmcmFtZUNvbnRhaW5lcnMgPSBhd2FpdCB0aGlzLnJlZnJlc2hNYXBUaW1lZnJhbWVDb250YWluZXJzKHRhcmdldCk7XG5cbiAgICAgICAgdGhpcy5vbkZldGNoRG9uZSh0aW1lZnJhbWVDb250YWluZXJzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWZyZXNoQ29tcGFyZVF1YWxpdHkoY3VycmVudCkpXG4gICAgICAgICAgICAudGhlbigoaWdub3JlZCkgPT4ge30pOyAvLyBOTyBTeW5jXG5cbiAgICAgICAgdGhpcy50aW1lbGluZVNlbGVjdGVkRnJhbWVTZXQgPSBjdXJyZW50O1xuICAgIH1cblxuICAgIGdldFRpbWVsaW5lRnJhbWVTZXQoKTogRnJhbWVTZXRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzO1xuICAgIH1cblxuICAgIGdldFRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldCgpOiBGcmFtZVNldCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldDtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoKGxhdW5jaFF1YWxpdHlBZnRlcjogYm9vbGVhbiwgZGF0YUludGVybmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQZXJpb2QoKTtcblxuICAgICAgICB0aGlzLmRhdGFJbnRlcm5hbCA9IGRhdGFJbnRlcm5hbDtcblxuICAgICAgICBjb25zdCBhc3luY0RvbmUgPSAoZXJyb3I/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHJlZnJlc2gnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNsb3NlUmVmcmVzaFRpbWVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaERvbmUodGhpcy50aW1lZnJhbWVEYXRlcykudGhlbigoX2lnbm9yZWQpID0+IHt9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhc3luY1JlZnJlc2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaEluUHJvZ3Jlc3MoYXdhaXQgdGhpcy5yZWZyZXNoQ291bnRzKCksIHRoaXMudGltZWZyYW1lRGF0ZXMpLnRoZW4oXG4gICAgICAgICAgICAgICAgKF9pZ25vcmVkKSA9PiB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbmUgPSBhd2FpdCB0aGlzLnJlZnJlc2hQZXJpb2RJbnNpZGVQb2xsaW5nKCk7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jRG9uZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRpbWVyKDEwMDAsIDEwMDAwKSAvLyBXYWl0IDFzLCB0aGVuIGV2ZXJ5IDEwc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4gZnJvbShhc3luY1JlZnJlc2goKSkpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmNsb3NlUmVmcmVzaFRpbWVyKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4gYXN5bmNEb25lKEpTT04uc3RyaW5naWZ5KGVycm9yKSksXG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRSZW1vdmVEdXBsaWNhdGUoYjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZSA9IGI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldFJlcG9ydFBlcmlvZChkYXRlOiBEYXRlKSB7XG4gICAgICAgIGxldCB2YWx1ZXM6IENhcnRlc2lhbk1hcFZhbHVlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZVNldCBvZiB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzKSB7XG4gICAgICAgICAgICBpZiAoZnJhbWVTZXQuZGF0ZS5nZXRUaW1lKCkgIT09IGRhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KGF3YWl0IHRoaXMuZ2V0VmFsdWVzKGZyYW1lU2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1bUZuID0gKGNhcnRlc2lhbk1hcFZhbHVlczogQ2FydGVzaWFuTWFwVmFsdWVbXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNhcnRlc2lhbk1hcFZhbHVlcy5yZWR1Y2UoKHAsIHYpID0+IHAgKyAodi52YWx1ZSAqIDUpIC8gNjAsIDApO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1bVZhbHVlcyA9IHZhbHVlcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tQZXJpb2QoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlcmlvZC5iZWdpbi5nZXRUaW1lKCkgPT09IHRoaXMucGVyaW9kLmVuZC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbmVlZCBhIHBlcmlvZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlZnJlc2hDb3VudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5yYWluTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRzUGVyaW9kO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDb3VudHModGhpcy5yYWluTm9kZS5pZCwge1xuICAgICAgICAgICAgcmFuZ2U6ICdkYXknLFxuICAgICAgICAgICAgcGVyaW9kQmVnaW46IHRoaXMuX3BlcmlvZC5iZWdpbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHByb2dyZXNzID0gMDtcblxuICAgICAgICAvLyBWZXJpZnkgcHJvZ3Jlc3Mgb25seSBmb3IgU2ltcGxlWm9uZVxuICAgICAgICBpZiAodGhpcy5yYWluTm9kZS5nZXRMaW5rcyhSYWRhck5vZGUuVFlQRSkubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIHByb2dyZXNzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluUHJvZ3Jlc3ModGhpcy5yYWluTm9kZS5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IHtcbiAgICAgICAgICAgIC4uLmNvdW50cyxcbiAgICAgICAgICAgIHByb2dyZXNzLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvdW50c1BlcmlvZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0UmFpbkNvbXB1dGF0aW9uUXVhbGl0eVRhcmdldChmcmFtZXNldDogRnJhbWVTZXQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoZnJhbWVzZXQucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcmFtZXNldC5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNbMF0uaWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlZnJlc2hQZXJpb2RJbnNpZGVQb2xsaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZG9uZSA9IGF3YWl0IHRoaXMucmVmcmVzaENoZWNrSWZEb25lKCk7XG5cbiAgICAgICAgICAgIC8vIGJlaGluZCByZWZyZXNoXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUaW1lZnJhbWVzRnJvbVJhZGFycyhkb25lKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEdsb2JhbENvbXBhcmVSZXBvcnQoZG9uZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkb25lO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyByZWZyZXNoQ2hlY2tJZkRvbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDIwMDApO1xuICAgICAgICByZXR1cm4gdGhpcy5jb3VudHNQZXJpb2QucHJvZ3Jlc3MgPT09IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlZnJlc2hUaW1lZnJhbWVzRnJvbVJhZGFycyhkb25lOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghZG9uZSB8fCAhdGhpcy5yYWluTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJlZ2luRXh0ZW5kZWQgPSBuZXcgRGF0ZSh0aGlzLnBlcmlvZC5iZWdpbik7XG4gICAgICAgICAgICBjb25zdCBlbmRFeHRlbmRlZCA9IG5ldyBEYXRlKHRoaXMucGVyaW9kLmVuZCk7XG4gICAgICAgICAgICBiZWdpbkV4dGVuZGVkLnNldE1pbnV0ZXMoYmVnaW5FeHRlbmRlZC5nZXRNaW51dGVzKCkgLSA3KTtcbiAgICAgICAgICAgIGVuZEV4dGVuZGVkLnNldE1pbnV0ZXMoZW5kRXh0ZW5kZWQuZ2V0TWludXRlcygpICsgNyk7XG4gICAgICAgICAgICB0aGlzLnJhaW5Ob2RlID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluVGltZWZyYW1lKFxuICAgICAgICAgICAgICAgIHRoaXMucmFpbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgYmVnaW5FeHRlbmRlZCxcbiAgICAgICAgICAgICAgICBlbmRFeHRlbmRlZCxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFJbnRlcm5hbCxcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGltZVN0ZXBJbk1pbnV0ZXNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZCA9IGF3YWl0IHRoaXMucmFkYXJTZXJ2aWNlLmdldFRpbWVsaW5lKHRoaXMucmFpbk5vZGUpO1xuICAgICAgICAgICAgdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFycyA9IHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZFxuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChmcmFtZVNldCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kLmJlZ2luLmdldFRpbWUoKSA8PSBmcmFtZVNldC5kYXRlLmdldFRpbWUoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTZXQuZGF0ZS5nZXRUaW1lKCkgPD0gdGhpcy5wZXJpb2QuZW5kLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5kYXRlLmdldFRpbWUoKSAtIGIuZGF0ZS5nZXRUaW1lKCkpO1xuXG4gICAgICAgICAgICB0aGlzLnRpbWVmcmFtZURhdGVzID0gdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFycy5tYXAoKGZyYW1lU2V0KSA9PiBmcmFtZVNldC5kYXRlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0aW1lZnJhbWVzRnJvbVJhZGFyc0V4dGVuZGVkOicsIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndGltZWZyYW1lRGF0ZXM6JywgdGhpcy50aW1lZnJhbWVEYXRlcyk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdyZWZyZXNoVGltZWZyYW1lc0Zyb21SYWRhcnMnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcmVmcmVzaEdsb2JhbENvbXBhcmVSZXBvcnQoZG9uZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRzOiBGcmFtZVNldFtdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZyYW1lU2V0IG9mIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZnJhbWVTZXQpKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQuZGF0ZSA9IG5ldyBEYXRlKHRhcmdldC5kYXRlKTtcbiAgICAgICAgICAgICAgICAvLyB0YXJnZXQucmFpbkNvbXB1dGF0aW9uUXVhbGl0eUlkID0gdGhpcy5nZXRSYWluQ29tcHV0YXRpb25RdWFsaXR5VGFyZ2V0KGZyYW1lU2V0KTtcbiAgICAgICAgICAgICAgICB0YXJnZXRzLnB1c2godGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIucmVmcmVzaEdsb2JhbENvbXBhcmVRdWFsaXR5KHRhcmdldHMsICF0aGlzLnJlbW92ZUR1cGxpY2F0ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3JlZnJlc2hHbG9iYWxDb21wYXJlUmVwb3J0JywgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcmVmcmVzaE1hcFRpbWVmcmFtZUNvbnRhaW5lcnModGFyZ2V0OiB7XG4gICAgICAgIGRhdGU6IERhdGU7XG4gICAgICAgIHJhaW5Db21wdXRhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgIHJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZDogc3RyaW5nO1xuICAgICAgICB3aXRoR2F1Z2U6IGJvb2xlYW47XG4gICAgICAgIGN1bXVsYXRpdmVIb3VyczogbnVtYmVyO1xuICAgIH0pIHtcbiAgICAgICAgaWYgKCF0YXJnZXQ/LnJhaW5Db21wdXRhdGlvbklkICYmICF0YXJnZXQ/LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGBQYiB3aXRoIHJlZnJlc2hNYXBUaW1lZnJhbWVDb250YWluZXJzIGluc2lnaHRzICR7dGFyZ2V0Py5kYXRlLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFpbk5vZGUgPSB0aGlzLnJhaW5Ob2RlO1xuICAgICAgICBjb25zdCBjb250YWluZXJzOiBUaW1lZnJhbWVDb250YWluZXJbXSA9IFtdO1xuICAgICAgICBjb25zdCBuZXdDcmVhdGVkVGltZWZyYW1lQ29udGFpbmVycyA9IG5ldyBUaW1lZnJhbWVDb250YWluZXJzKGNvbnRhaW5lcnMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJhaW5Ob2RlQ2FydGVzaWFuTWFwOiBSYWluQ29tcHV0YXRpb25NYXA7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuY3VtdWxhdGl2ZUhvdXJzICYmIHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQpIHtcbiAgICAgICAgICAgICAgICByYWluTm9kZUNhcnRlc2lhbk1hcCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUN1bXVsYXRpdmVzTWFwQnlJZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5jdW11bGF0aXZlSG91cnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmN1bXVsYXRpdmVIb3VycyAmJiB0YXJnZXQucmFpbkNvbXB1dGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICByYWluTm9kZUNhcnRlc2lhbk1hcCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZXNNYXBCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFpbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuY3VtdWxhdGl2ZUhvdXJzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQpIHtcbiAgICAgICAgICAgICAgICByYWluTm9kZUNhcnRlc2lhbk1hcCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUNhcnRlc2lhbk1hcEJ5SWQoXG4gICAgICAgICAgICAgICAgICAgICAgICByYWluTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmFpbk5vZGVDYXJ0ZXNpYW5NYXAgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFJhaW5Db21wdXRhdGlvbkNhcnRlc2lhbk1hcEJ5SWQoXG4gICAgICAgICAgICAgICAgICAgIHJhaW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmFpbk5vZGVDYXJ0ZXNpYW5NYXApIHtcbiAgICAgICAgICAgICAgICBuZXdDcmVhdGVkVGltZWZyYW1lQ29udGFpbmVycy5hZGRGcm9tUmFpbkNvbXB1dGF0aW9uTWFwKFxuICAgICAgICAgICAgICAgICAgICByYWluTm9kZUNhcnRlc2lhbk1hcCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25NYXBWZXJzaW9uID0gcmFpbk5vZGVDYXJ0ZXNpYW5NYXAudmVyc2lvbjtcbiAgICAgICAgICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvbk1hcERhdGUgPSBuZXcgRGF0ZShyYWluTm9kZUNhcnRlc2lhbk1hcC5kYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvbk1hcERvbmVEYXRlID0gcmFpbk5vZGVDYXJ0ZXNpYW5NYXAuaXNEb25lRGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvbk1hcExhdW5jaGVkQnkgPSByYWluTm9kZUNhcnRlc2lhbk1hcC5sYXVuY2hlZEJ5O1xuICAgICAgICAgICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uTWFwVGltZVNwZW50SW5NcyA9IHJhaW5Ob2RlQ2FydGVzaWFuTWFwLnRpbWVTcGVudEluTXM7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWluID0gcmFpbk5vZGVDYXJ0ZXNpYW5NYXAub3JpZ2luYWxEQlpNaW47XG4gICAgICAgICAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25NYXBPcmlnaW5hbE1heCA9IHJhaW5Ob2RlQ2FydGVzaWFuTWFwLm9yaWdpbmFsREJaTWF4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BiIHdpdGggY29tcHV0YXRpb25zIGZvciBpZDonLCB0YXJnZXQucmFpbkNvbXB1dGF0aW9uSWQsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld0NyZWF0ZWRUaW1lZnJhbWVDb250YWluZXJzO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyByZWZyZXNoQ29tcGFyZVF1YWxpdHkoZnJhbWVTZXQ6IEZyYW1lU2V0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIucmVmcmVzaENvbXBhcmVRdWFsaXR5KGZyYW1lU2V0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZXRHYXVnZXNJbkNvbXBhcmUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5yZWZyZXNoU3BlZWRzKGZyYW1lU2V0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VmFsdWVzKHRhcmdldDogRnJhbWVTZXQpOiBQcm9taXNlPENhcnRlc2lhbk1hcFZhbHVlW10+IHtcbiAgICAgICAgaWYgKCF0YXJnZXQ/LnJhaW5Db21wdXRhdGlvbklkICYmICF0YXJnZXQ/LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBQYiB3aXRoIHRhcmdldCBpbnNpZ2h0cyAke3RhcmdldD8uZGF0ZS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlczogQ2FydGVzaWFuTWFwVmFsdWVbXSA9IFtdO1xuICAgICAgICBsZXQgcmFpbkNvbXB1dGF0aW9uTWFwOiBSYWluQ29tcHV0YXRpb25NYXA7XG5cbiAgICAgICAgaWYgKHRhcmdldC5yYWluQ29tcHV0YXRpb25JZCkge1xuICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uTWFwID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluQ29tcHV0YXRpb25DYXJ0ZXNpYW5NYXBCeUlkKFxuICAgICAgICAgICAgICAgIHRoaXMucmFpbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQpIHtcbiAgICAgICAgICAgIHJhaW5Db21wdXRhdGlvbk1hcCA9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluQ29tcHV0YXRpb25DdW11bGF0aXZlQ2FydGVzaWFuTWFwQnlJZChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yYWluTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJhaW5Db21wdXRhdGlvbk1hcCkge1xuICAgICAgICAgICAgICAgIHJhaW5Db21wdXRhdGlvbk1hcC5nZXRNYXBEYXRhKCkuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobS52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChtLnZhbHVlcyBhcyBJQ2FydGVzaWFuTWVhc3VyZVZhbHVlW10pLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUgPSBDYXJ0ZXNpYW5NZWFzdXJlVmFsdWUuRnJvbSh2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXJ0ZXNpYW5NYXBWYWx1ZS5Gcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FydGVzaWFuTWVhc3VyZVZhbHVlLmdldENhcnRlc2lhblZhbHVlcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0ZXNpYW5Ub29sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAnUGIgd2l0aCBjb21wdXRhdGlvbnMgZm9yIGlkOicsXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkLFxuICAgICAgICAgICAgICAgIHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQsXG4gICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxufVxuIl19
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVmcmVzaE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvdG9vbHMvUmVmcmVzaE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUNILHFCQUFxQixFQUNyQixjQUFjLEVBRWQsU0FBUyxHQUdaLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxpQkFBaUIsRUFBc0IsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFNcEYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFaEYsTUFBTSxPQUFPLGNBQWM7SUF5Q3ZCLFlBQ2MsWUFBMEIsRUFDMUIsY0FBOEIsRUFDOUIsY0FBOEI7UUFGOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQS9CckMsYUFBUSxHQUFXLE9BQU8sQ0FBQztRQUMzQixzQkFBaUIsR0FBVyxFQUFFLENBQUM7UUFDL0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQStCMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFDLEtBQUssRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FB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SSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUgsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQztTQUM3QjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RnJhbWVTZXR9IGZyb20gJy4vRnJhbWVTZXQnO1xuaW1wb3J0IHtmcm9tLCBtZXJnZU1hcCwgU3ViamVjdCwgdGFrZVVudGlsLCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIENhcnRlc2lhbk1lYXN1cmVWYWx1ZSxcbiAgICBDYXJ0ZXNpYW5Ub29scyxcbiAgICBJQ2FydGVzaWFuTWVhc3VyZVZhbHVlLFxuICAgIFJhZGFyTm9kZSxcbiAgICBSYWluQ29tcHV0YXRpb25NYXAsXG4gICAgUmFpbk5vZGUsXG59IGZyb20gJ3JhYWluLW1vZGVsJztcbmltcG9ydCB7Q2FydGVzaWFuTWFwVmFsdWUsIFRpbWVmcmFtZUNvbnRhaW5lciwgVGltZWZyYW1lQ29udGFpbmVyc30gZnJvbSAncmFhaW4tdWknO1xuaW1wb3J0IHtSYWRhclNlcnZpY2V9IGZyb20gJy4uL3JhZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHtQcm9maWxlU2VydmljZX0gZnJvbSAnLi4vcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7Q29tcGFyZU1hbmFnZXJ9IGZyb20gJy4vQ29tcGFyZU1hbmFnZXInO1xuaW1wb3J0IHtYWVR5cGV9IGZyb20gJy4uL3h5dHlwZSc7XG5cbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmV4cG9ydCBjbGFzcyBSZWZyZXNoTWFuYWdlciB7XG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcFZlcnNpb246IHN0cmluZztcbiAgICBwdWJsaWMgcmFpbkNvbXB1dGF0aW9uTWFwRGF0ZTogRGF0ZTtcbiAgICBwdWJsaWMgcmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGU6IERhdGU7XG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcExhdW5jaGVkQnk6IHN0cmluZztcbiAgICBwdWJsaWMgcmFpbkNvbXB1dGF0aW9uTWFwVGltZVNwZW50SW5NczogbnVtYmVyO1xuXG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWluOiBudW1iZXI7XG4gICAgcHVibGljIHJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWF4OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgc3VtRm46IChjYXJ0ZXNpYW5NYXBWYWx1ZXM6IENhcnRlc2lhbk1hcFZhbHVlW10pID0+IG51bWJlcjtcbiAgICBwdWJsaWMgc3VtVmFsdWVzOiBDYXJ0ZXNpYW5NYXBWYWx1ZVtdO1xuXG4gICAgcHVibGljIHByb3ZpZGVyOiBzdHJpbmcgPSAnUmFhaW4nO1xuICAgIHB1YmxpYyB0aW1lU3RlcEluTWludXRlczogbnVtYmVyID0gMTA7XG4gICAgcHVibGljIGxhc3RFcnJvcjogc3RyaW5nID0gJyc7XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VSZWZyZXNoVGltZXI6IFN1YmplY3Q8dW5rbm93bj47XG4gICAgcHJvdGVjdGVkIGNvdW50c1BlcmlvZDoge1xuICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgfTtcbiAgICBwcm90ZWN0ZWQgdGltZWZyYW1lc0Zyb21SYWRhcnM6IEZyYW1lU2V0W107XG4gICAgcHJvdGVjdGVkIHRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQ6IEZyYW1lU2V0W107XG4gICAgcHJvdGVjdGVkIHRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldDogRnJhbWVTZXQ7XG4gICAgcHJvdGVjdGVkIHRpbWVmcmFtZURhdGVzOiBEYXRlW107XG4gICAgcHJvdGVjdGVkIGNhcnRlc2lhblRvb2xzOiBDYXJ0ZXNpYW5Ub29scztcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRHVwbGljYXRlOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBkYXRhSW50ZXJuYWw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIG9uUmVmcmVzaEluUHJvZ3Jlc3M6IChcbiAgICAgICAgY291bnRQZXJpb2RzOiB7XG4gICAgICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgICAgICBxdWV1ZVJ1bm5pbmc/OiBudW1iZXI7XG4gICAgICAgICAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgdGltZWZyYW1lRGF0ZXM6IERhdGVbXVxuICAgICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBwcm90ZWN0ZWQgb25SZWZyZXNoRG9uZTogKHRpbWVmcmFtZURhdGVzOiBEYXRlW10pID0+IFByb21pc2U8dm9pZD47XG4gICAgcHJvdGVjdGVkIG9uRmV0Y2hEb25lOiAodGltZWZyYW1lQ29udGFpbmVycz86IFRpbWVmcmFtZUNvbnRhaW5lcnMpID0+IFByb21pc2U8dm9pZD47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJhZGFyU2VydmljZTogUmFkYXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcHJvZmlsZVNlcnZpY2U6IFByb2ZpbGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29tcGFyZU1hbmFnZXI6IENvbXBhcmVNYW5hZ2VyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3BlcmlvZCA9IHtiZWdpbjogbmV3IERhdGUoKSwgZW5kOiBuZXcgRGF0ZSgpfTtcbiAgICAgICAgdGhpcy5jbG9zZVJlZnJlc2hUaW1lciA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG4gICAgICAgIHRoaXMuY2FydGVzaWFuVG9vbHMgPSBuZXcgQ2FydGVzaWFuVG9vbHMoKTtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcmFpbk5vZGU6IFJhaW5Ob2RlO1xuXG4gICAgcHVibGljIGdldCByYWluTm9kZSgpOiBSYWluTm9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWluTm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJhaW5Ob2RlKHJhaW5Ob2RlOiBSYWluTm9kZSkge1xuICAgICAgICB0aGlzLl9yYWluTm9kZSA9IHJhaW5Ob2RlO1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wZXJpb2Q6IHtiZWdpbjogRGF0ZTsgZW5kOiBEYXRlfTtcblxuICAgIGdldCBwZXJpb2QoKToge2JlZ2luOiBEYXRlOyBlbmQ6IERhdGV9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BlcmlvZDtcbiAgICB9XG5cbiAgICBzZXQgcGVyaW9kKHBlcmlvZDoge2JlZ2luOiBEYXRlOyBlbmQ6IERhdGV9KSB7XG4gICAgICAgIHRoaXMuX3BlcmlvZC5iZWdpbiA9IG5ldyBEYXRlKHBlcmlvZC5iZWdpbik7XG4gICAgICAgIHRoaXMuX3BlcmlvZC5lbmQgPSBuZXcgRGF0ZShwZXJpb2QuZW5kKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ291bnRzKCkudGhlbigoaWdub3JlZCkgPT4ge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRNZXRob2RzKFxuICAgICAgICBvblJlZnJlc2hJblByb2dyZXNzOiAoXG4gICAgICAgICAgICBjb3VudFBlcmlvZHM6IHtcbiAgICAgICAgICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgICAgICAgICAgcXVldWVSdW5uaW5nPzogbnVtYmVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpbWVmcmFtZURhdGVzOiBEYXRlW11cbiAgICAgICAgKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgICAgICBvblJlZnJlc2hEb25lOiAodGltZWZyYW1lRGF0ZXM6IERhdGVbXSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICAgICAgb25GZXRjaERvbmU6ICh0aW1lZnJhbWVDb250YWluZXJzPzogVGltZWZyYW1lQ29udGFpbmVycykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICkge1xuICAgICAgICB0aGlzLm9uUmVmcmVzaEluUHJvZ3Jlc3MgPSBvblJlZnJlc2hJblByb2dyZXNzO1xuICAgICAgICB0aGlzLm9uUmVmcmVzaERvbmUgPSBvblJlZnJlc2hEb25lO1xuICAgICAgICB0aGlzLm9uRmV0Y2hEb25lID0gb25GZXRjaERvbmU7XG4gICAgfVxuXG4gICAgY2xlYW5BbGwoKSB7XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0gJyc7XG4gICAgICAgIHRoaXMuY291bnRzUGVyaW9kID0ge3BlcmNlbnRJbWFnZXM6IFtdLCBxdWV1ZVJ1bm5pbmc6IDAsIHByb2dyZXNzOiAwfTtcbiAgICAgICAgdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFycyA9IFtdO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQgPSBbXTtcbiAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IFtdO1xuICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xvc2VSZWZyZXNoVGltZXI/Lm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2goXG4gICAgICAgIGRhdGVTaG93bjogRGF0ZSxcbiAgICAgICAgd2l0aEdhdWdlc01lYXN1cmVzOiBib29sZWFuLFxuICAgICAgICBjdW11bGF0aXZlSG91cnMgPSAwXG4gICAgKTogUHJvbWlzZTxGcmFtZVNldD4ge1xuICAgICAgICAvLyBzZXQgdGhlIHRhcmdldFxuICAgICAgICBjb25zdCBjdXJyZW50cyA9IHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZC5maWx0ZXIoXG4gICAgICAgICAgICAodCkgPT4gdC5kYXRlLmdldFRpbWUoKSA9PT0gZGF0ZVNob3duLmdldFRpbWUoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoY3VycmVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidWlsZCBjdXJyZW50IEZyYW1lc2V0XG4gICAgICAgIGNvbnN0IGN1cnJlbnQ6IEZyYW1lU2V0ID0gY3VycmVudHNbMF07XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICB3aXRoR2F1Z2U6IHdpdGhHYXVnZXNNZWFzdXJlcyxcbiAgICAgICAgICAgIGN1bXVsYXRpdmVIb3VyczogY3VtdWxhdGl2ZUhvdXJzLFxuICAgICAgICAgICAgLy8gcmFpbkNvbXB1dGF0aW9uUXVhbGl0eUlkOiB0aGlzLmdldFJhaW5Db21wdXRhdGlvblF1YWxpdHlUYXJnZXQoY3VycmVudCksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdGltZWZyYW1lQ29udGFpbmVycyA9IGF3YWl0IHRoaXMucmVmcmVzaE1hcFRpbWVmcmFtZUNvbnRhaW5lcnModGFyZ2V0KTtcblxuICAgICAgICB0aGlzLm9uRmV0Y2hEb25lKHRpbWVmcmFtZUNvbnRhaW5lcnMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlZnJlc2hDb21wYXJlUXVhbGl0eShjdXJyZW50KSlcbiAgICAgICAgICAgIC50aGVuKChpZ25vcmVkKSA9PiB7fSk7IC8vIE5PIFN5bmNcblxuICAgICAgICB0aGlzLnRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldCA9IGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0VGltZWxpbmVGcmFtZVNldCgpOiBGcmFtZVNldFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnM7XG4gICAgfVxuXG4gICAgZ2V0VGltZWxpbmVTZWxlY3RlZEZyYW1lU2V0KCk6IEZyYW1lU2V0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZWxpbmVTZWxlY3RlZEZyYW1lU2V0O1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2gobGF1bmNoUXVhbGl0eUFmdGVyOiBib29sZWFuLCBkYXRhSW50ZXJuYWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5sYXN0RXJyb3IgPSAnJztcblxuICAgICAgICB0aGlzLmNoZWNrUGVyaW9kKCk7XG5cbiAgICAgICAgdGhpcy5kYXRhSW50ZXJuYWwgPSBkYXRhSW50ZXJuYWw7XG5cbiAgICAgICAgY29uc3QgYXN5bmNEb25lID0gKGVycm9yPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiByZWZyZXNoJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jbG9zZVJlZnJlc2hUaW1lci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5vblJlZnJlc2hEb25lKHRoaXMudGltZWZyYW1lRGF0ZXMpLnRoZW4oKF9pZ25vcmVkKSA9PiB7fSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXN5bmNSZWZyZXNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblJlZnJlc2hJblByb2dyZXNzKGF3YWl0IHRoaXMucmVmcmVzaENvdW50cygpLCB0aGlzLnRpbWVmcmFtZURhdGVzKS50aGVuKFxuICAgICAgICAgICAgICAgIChfaWdub3JlZCkgPT4ge31cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBkb25lID0gYXdhaXQgdGhpcy5yZWZyZXNoUGVyaW9kSW5zaWRlUG9sbGluZygpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBhc3luY0RvbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aW1lcigxMDAwLCAxMDAwMCkgLy8gV2FpdCAxcywgdGhlbiBldmVyeSAxMHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKCgpID0+IGZyb20oYXN5bmNSZWZyZXNoKCkpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5jbG9zZVJlZnJlc2hUaW1lcilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IGFzeW5jRG9uZShKU09OLnN0cmluZ2lmeShlcnJvcikpLFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0UmVtb3ZlRHVwbGljYXRlKGI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5yZW1vdmVEdXBsaWNhdGUgPSBiO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRSZXBvcnRQZXJpb2QoZGF0ZTogRGF0ZSkge1xuICAgICAgICBsZXQgdmFsdWVzOiBDYXJ0ZXNpYW5NYXBWYWx1ZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZnJhbWVTZXQgb2YgdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFycykge1xuICAgICAgICAgICAgaWYgKGZyYW1lU2V0LmRhdGUuZ2V0VGltZSgpICE9PSBkYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChhd2FpdCB0aGlzLmdldFZhbHVlcyhmcmFtZVNldCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdW1GbiA9IChjYXJ0ZXNpYW5NYXBWYWx1ZXM6IENhcnRlc2lhbk1hcFZhbHVlW10pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXJ0ZXNpYW5NYXBWYWx1ZXMucmVkdWNlKChwLCB2KSA9PiBwICsgKHYudmFsdWUgKiA1KSAvIDYwLCAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdW1WYWx1ZXMgPSB2YWx1ZXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrUGVyaW9kKCkge1xuICAgICAgICBpZiAodGhpcy5wZXJpb2QuYmVnaW4uZ2V0VGltZSgpID09PSB0aGlzLnBlcmlvZC5lbmQuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ25lZWQgYSBwZXJpb2QnO1xuICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3IgKz0gbWVzc2FnZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyByZWZyZXNoQ291bnRzKCkge1xuICAgICAgICBpZiAoIXRoaXMucmFpbk5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50c1BlcmlvZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdW50cyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0Q291bnRzKHRoaXMucmFpbk5vZGUuaWQsIHtcbiAgICAgICAgICAgIHJhbmdlOiAnZGF5JyxcbiAgICAgICAgICAgIHBlcmlvZEJlZ2luOiB0aGlzLl9wZXJpb2QuYmVnaW4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwcm9ncmVzcyA9IDA7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHByb2dyZXNzIG9ubHkgZm9yIFNpbXBsZVpvbmVcbiAgICAgICAgaWYgKHRoaXMucmFpbk5vZGUuZ2V0TGlua3MoUmFkYXJOb2RlLlRZUEUpLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICBwcm9ncmVzcyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpblByb2dyZXNzKHRoaXMucmFpbk5vZGUuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3VudHNQZXJpb2QgPSB7XG4gICAgICAgICAgICAuLi5jb3VudHMsXG4gICAgICAgICAgICBwcm9ncmVzcyxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb3VudHNQZXJpb2Q7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFJhaW5Db21wdXRhdGlvblF1YWxpdHlUYXJnZXQoZnJhbWVzZXQ6IEZyYW1lU2V0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGZyYW1lc2V0LnJhaW5Db21wdXRhdGlvblF1YWxpdGllcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJhbWVzZXQucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzWzBdLmlkO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyByZWZyZXNoUGVyaW9kSW5zaWRlUG9sbGluZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmUgPSBhd2FpdCB0aGlzLnJlZnJlc2hDaGVja0lmRG9uZSgpO1xuXG4gICAgICAgICAgICAvLyBiZWhpbmQgcmVmcmVzaFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVGltZWZyYW1lc0Zyb21SYWRhcnMoZG9uZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hHbG9iYWxDb21wYXJlUmVwb3J0KGRvbmUpO1xuXG4gICAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3IgKz0gZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcmVmcmVzaENoZWNrSWZEb25lKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBhd2FpdCBzbGVlcCgyMDAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnRzUGVyaW9kLnByb2dyZXNzID09PSAwO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyByZWZyZXNoVGltZWZyYW1lc0Zyb21SYWRhcnMoZG9uZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoIWRvbmUgfHwgIXRoaXMucmFpbk5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiZWdpbkV4dGVuZGVkID0gbmV3IERhdGUodGhpcy5wZXJpb2QuYmVnaW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kRXh0ZW5kZWQgPSBuZXcgRGF0ZSh0aGlzLnBlcmlvZC5lbmQpO1xuICAgICAgICAgICAgYmVnaW5FeHRlbmRlZC5zZXRNaW51dGVzKGJlZ2luRXh0ZW5kZWQuZ2V0TWludXRlcygpIC0gNyk7XG4gICAgICAgICAgICBlbmRFeHRlbmRlZC5zZXRNaW51dGVzKGVuZEV4dGVuZGVkLmdldE1pbnV0ZXMoKSArIDcpO1xuICAgICAgICAgICAgdGhpcy5yYWluTm9kZSA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpblRpbWVmcmFtZShcbiAgICAgICAgICAgICAgICB0aGlzLnJhaW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgIGJlZ2luRXh0ZW5kZWQsXG4gICAgICAgICAgICAgICAgZW5kRXh0ZW5kZWQsXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhSW50ZXJuYWwsXG4gICAgICAgICAgICAgICAgdGhpcy5wcm92aWRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVTdGVwSW5NaW51dGVzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQgPSBhd2FpdCB0aGlzLnJhZGFyU2VydmljZS5nZXRUaW1lbGluZSh0aGlzLnJhaW5Ob2RlKTtcbiAgICAgICAgICAgIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnMgPSB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWRcbiAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoZnJhbWVTZXQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZC5iZWdpbi5nZXRUaW1lKCkgPD0gZnJhbWVTZXQuZGF0ZS5nZXRUaW1lKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2V0LmRhdGUuZ2V0VGltZSgpIDw9IHRoaXMucGVyaW9kLmVuZC5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZGF0ZS5nZXRUaW1lKCkgLSBiLmRhdGUuZ2V0VGltZSgpKTtcblxuICAgICAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnMubWFwKChmcmFtZVNldCkgPT4gZnJhbWVTZXQuZGF0ZSk7XG5cbiAgICAgICAgICAgIC8vIENvbXB1dGUgYWxsIGV4cGVjdGVkIGRhdGVzIGZyb20gcGVyaW9kLmJlZ2luIHRvIHBlcmlvZC5lbmQgd2l0aCB0aW1lU3RlcEluTWludXRlc1xuICAgICAgICAgICAgY29uc3QgYWxsRXhwZWN0ZWREYXRlczogRGF0ZVtdID0gW107XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKHRoaXMucGVyaW9kLmJlZ2luKTtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50RGF0ZS5nZXRUaW1lKCkgPD0gdGhpcy5wZXJpb2QuZW5kLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIGFsbEV4cGVjdGVkRGF0ZXMucHVzaChuZXcgRGF0ZShjdXJyZW50RGF0ZSkpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLnNldE1pbnV0ZXMoY3VycmVudERhdGUuZ2V0TWludXRlcygpICsgdGhpcy50aW1lU3RlcEluTWludXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFsbCBleHBlY3RlZCBkYXRlcyBhcmUgcHJlc2VudCBpbiB0aW1lZnJhbWVEYXRlc1xuICAgICAgICAgICAgY29uc3QgdGltZWZyYW1lRGF0ZVRpbWVzID0gbmV3IFNldCh0aGlzLnRpbWVmcmFtZURhdGVzLm1hcCgoZCkgPT4gZC5nZXRUaW1lKCkpKTtcbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdEYXRlcyA9IGFsbEV4cGVjdGVkRGF0ZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChleHBlY3RlZERhdGUpID0+ICF0aW1lZnJhbWVEYXRlVGltZXMuaGFzKGV4cGVjdGVkRGF0ZS5nZXRUaW1lKCkpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAobWlzc2luZ0RhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgYE1pc3NpbmcgJHttaXNzaW5nRGF0ZXMubGVuZ3RofSB0aW1lZnJhbWUocykgb3V0IG9mICR7YWxsRXhwZWN0ZWREYXRlcy5sZW5ndGh9IGV4cGVjdGVkOiBgICtcbiAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0RhdGVzLm1hcCgoZCkgPT4gZC50b0lTT1N0cmluZygpKS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFcnJvciArPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFycztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigncmVmcmVzaFRpbWVmcmFtZXNGcm9tUmFkYXJzJywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlZnJlc2hHbG9iYWxDb21wYXJlUmVwb3J0KGRvbmU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0czogRnJhbWVTZXRbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmcmFtZVNldCBvZiB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZyYW1lU2V0KSk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmRhdGUgPSBuZXcgRGF0ZSh0YXJnZXQuZGF0ZSk7XG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0LnJhaW5Db21wdXRhdGlvblF1YWxpdHlJZCA9IHRoaXMuZ2V0UmFpbkNvbXB1dGF0aW9uUXVhbGl0eVRhcmdldChmcmFtZVNldCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXBhcmVNYW5hZ2VyLnJlZnJlc2hHbG9iYWxDb21wYXJlUXVhbGl0eSh0YXJnZXRzLCAhdGhpcy5yZW1vdmVEdXBsaWNhdGUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdyZWZyZXNoR2xvYmFsQ29tcGFyZVJlcG9ydCcsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlZnJlc2hNYXBUaW1lZnJhbWVDb250YWluZXJzKHRhcmdldDoge1xuICAgICAgICBkYXRlOiBEYXRlO1xuICAgICAgICByYWluQ29tcHV0YXRpb25JZDogc3RyaW5nO1xuICAgICAgICByYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQ6IHN0cmluZztcbiAgICAgICAgd2l0aEdhdWdlOiBib29sZWFuO1xuICAgICAgICBjdW11bGF0aXZlSG91cnM6IG51bWJlcjtcbiAgICB9KSB7XG4gICAgICAgIGlmICghdGFyZ2V0Py5yYWluQ29tcHV0YXRpb25JZCAmJiAhdGFyZ2V0Py5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGIgd2l0aCByZWZyZXNoTWFwVGltZWZyYW1lQ29udGFpbmVycyBpbnNpZ2h0cyAke3RhcmdldD8uZGF0ZS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RFcnJvciArPSBtZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYWluTm9kZSA9IHRoaXMucmFpbk5vZGU7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcnM6IFRpbWVmcmFtZUNvbnRhaW5lcltdID0gW107XG4gICAgICAgIGNvbnN0IG5ld0NyZWF0ZWRUaW1lZnJhbWVDb250YWluZXJzID0gbmV3IFRpbWVmcmFtZUNvbnRhaW5lcnMoY29udGFpbmVycyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmFpbk5vZGVDYXJ0ZXNpYW5NYXA6IFJhaW5Db21wdXRhdGlvbk1hcDtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5jdW11bGF0aXZlSG91cnMgJiYgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCkge1xuICAgICAgICAgICAgICAgIHJhaW5Ob2RlQ2FydGVzaWFuTWFwID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluQ29tcHV0YXRpb25DdW11bGF0aXZlQ3VtdWxhdGl2ZXNNYXBCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFpbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmN1bXVsYXRpdmVIb3Vyc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY3VtdWxhdGl2ZUhvdXJzICYmIHRhcmdldC5yYWluQ29tcHV0YXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHJhaW5Ob2RlQ2FydGVzaWFuTWFwID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluQ29tcHV0YXRpb25DdW11bGF0aXZlc01hcEJ5SWQoXG4gICAgICAgICAgICAgICAgICAgICAgICByYWluTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yYWluQ29tcHV0YXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5jdW11bGF0aXZlSG91cnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCkge1xuICAgICAgICAgICAgICAgIHJhaW5Ob2RlQ2FydGVzaWFuTWFwID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRSYWluQ29tcHV0YXRpb25DdW11bGF0aXZlQ2FydGVzaWFuTWFwQnlJZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByYWluTm9kZUNhcnRlc2lhbk1hcCA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkNvbXB1dGF0aW9uQ2FydGVzaWFuTWFwQnlJZChcbiAgICAgICAgICAgICAgICAgICAgcmFpbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5yYWluQ29tcHV0YXRpb25JZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyYWluTm9kZUNhcnRlc2lhbk1hcCkge1xuICAgICAgICAgICAgICAgIG5ld0NyZWF0ZWRUaW1lZnJhbWVDb250YWluZXJzLmFkZEZyb21SYWluQ29tcHV0YXRpb25NYXAoXG4gICAgICAgICAgICAgICAgICAgIHJhaW5Ob2RlQ2FydGVzaWFuTWFwLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvbk1hcFZlcnNpb24gPSByYWluTm9kZUNhcnRlc2lhbk1hcC52ZXJzaW9uO1xuICAgICAgICAgICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uTWFwRGF0ZSA9IG5ldyBEYXRlKHJhaW5Ob2RlQ2FydGVzaWFuTWFwLmRhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGUgPSByYWluTm9kZUNhcnRlc2lhbk1hcC5pc0RvbmVEYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uTWFwTGF1bmNoZWRCeSA9IHJhaW5Ob2RlQ2FydGVzaWFuTWFwLmxhdW5jaGVkQnk7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25NYXBUaW1lU3BlbnRJbk1zID0gcmFpbk5vZGVDYXJ0ZXNpYW5NYXAudGltZVNwZW50SW5NcztcblxuICAgICAgICAgICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uTWFwT3JpZ2luYWxNaW4gPSByYWluTm9kZUNhcnRlc2lhbk1hcC5vcmlnaW5hbERCWk1pbjtcbiAgICAgICAgICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWF4ID0gcmFpbk5vZGVDYXJ0ZXNpYW5NYXAub3JpZ2luYWxEQlpNYXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGIgd2l0aCBjb21wdXRhdGlvbnMgZm9yIGlkOiAke3RhcmdldC5yYWluQ29tcHV0YXRpb25JZH0gJHtlLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yICs9IG1lc3NhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3Q3JlYXRlZFRpbWVmcmFtZUNvbnRhaW5lcnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlZnJlc2hDb21wYXJlUXVhbGl0eShmcmFtZVNldDogRnJhbWVTZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5yZWZyZXNoQ29tcGFyZVF1YWxpdHkoZnJhbWVTZXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbXBhcmVNYW5hZ2VyLnNldEdhdWdlc0luQ29tcGFyZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbXBhcmVNYW5hZ2VyLnJlZnJlc2hTcGVlZHMoZnJhbWVTZXQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBnZXRWYWx1ZXModGFyZ2V0OiBGcmFtZVNldCk6IFByb21pc2U8Q2FydGVzaWFuTWFwVmFsdWVbXT4ge1xuICAgICAgICBpZiAoIXRhcmdldD8ucmFpbkNvbXB1dGF0aW9uSWQgJiYgIXRhcmdldD8ucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYFBiIHdpdGggdGFyZ2V0IGluc2lnaHRzICR7dGFyZ2V0Py5kYXRlLnRvSVNPU3RyaW5nKCl9YDtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yICs9IG1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWVzOiBDYXJ0ZXNpYW5NYXBWYWx1ZVtdID0gW107XG4gICAgICAgIGxldCByYWluQ29tcHV0YXRpb25NYXA6IFJhaW5Db21wdXRhdGlvbk1hcDtcblxuICAgICAgICBpZiAodGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkKSB7XG4gICAgICAgICAgICByYWluQ29tcHV0YXRpb25NYXAgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFJhaW5Db21wdXRhdGlvbkNhcnRlc2lhbk1hcEJ5SWQoXG4gICAgICAgICAgICAgICAgdGhpcy5yYWluTm9kZS5pZCxcbiAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCkge1xuICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uTWFwID1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVDYXJ0ZXNpYW5NYXBCeUlkKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJhaW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocmFpbkNvbXB1dGF0aW9uTWFwKSB7XG4gICAgICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uTWFwLmdldE1hcERhdGEoKS5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgKG0udmFsdWVzIGFzIElDYXJ0ZXNpYW5NZWFzdXJlVmFsdWVbXSkuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcnRlc2lhbk1lYXN1cmVWYWx1ZSA9IENhcnRlc2lhbk1lYXN1cmVWYWx1ZS5Gcm9tKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnRlc2lhbk1hcFZhbHVlLkZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUuZ2V0Q2FydGVzaWFuVmFsdWVzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRlc2lhblRvb2xzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBQYiB3aXRoIGNvbXB1dGF0aW9ucyBmb3IgaWQ6ICR7dGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkfSAke3RhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWR9ICR7ZS5tZXNzYWdlfWA7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RFcnJvciArPSBtZXNzYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG59XG4iXX0=