@flowmap.gl/data 8.0.0-alpha.21 → 8.0.0-alpha.22

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.
@@ -24,9 +24,9 @@ import { clusterLocations } from './cluster/cluster';
24
24
  import { buildIndex, findAppropriateZoomLevel, makeLocationWeightGetter, } from './cluster/ClusterIndex';
25
25
  import getColors, { getColorsRGBA, getDiffColorsRGBA, getFlowColorScale, isDiffColors, isDiffColorsRGBA, } from './colors';
26
26
  import FlowmapAggregateAccessors from './FlowmapAggregateAccessors';
27
- import { getFlowThicknessScale, getViewportBoundingBox, } from './selector-functions';
27
+ import { addClusterNames, getFlowThicknessScale, getViewportBoundingBox, } from './selector-functions';
28
28
  import { getTimeGranularityByKey, getTimeGranularityByOrder, getTimeGranularityForDate, } from './time';
29
- import { isCluster, isLocationClusterNode, LocationFilterMode, } from './types';
29
+ import { isLocationClusterNode, LocationFilterMode, } from './types';
30
30
  const MAX_CLUSTER_ZOOM_LEVEL = 20;
31
31
  export default class FlowmapSelectors {
32
32
  constructor(accessors) {
@@ -40,6 +40,7 @@ export default class FlowmapSelectors {
40
40
  this.getLocationFilterMode = (state, props) => { var _a; return (_a = state.filter) === null || _a === void 0 ? void 0 : _a.locationFilterMode; };
41
41
  this.getClusteringEnabled = (state, props) => state.settings.clusteringEnabled;
42
42
  this.getLocationTotalsEnabled = (state, props) => state.settings.locationTotalsEnabled;
43
+ this.getLocationLabelsEnabled = (state, props) => state.settings.locationLabelsEnabled;
43
44
  this.getZoom = (state, props) => state.viewport.zoom;
44
45
  this.getViewport = (state, props) => state.viewport;
45
46
  this.getSelectedTimeRange = (state, props) => { var _a; return (_a = state.filter) === null || _a === void 0 ? void 0 : _a.selectedTimeRange; };
@@ -198,39 +199,8 @@ export default class FlowmapSelectors {
198
199
  if (!locationsById || !getLocationWeight || !clusterLevels)
199
200
  return undefined;
200
201
  const clusterIndex = buildIndex(clusterLevels);
201
- const { getLocationName, getLocationClusterName } = this.accessors.getFlowmapDataAccessors();
202
202
  // Adding meaningful names
203
- const getName = (id) => {
204
- const loc = locationsById.get(id);
205
- if (loc) {
206
- return getLocationName
207
- ? getLocationName(loc)
208
- : this.accessors.getLocationId(loc) || id;
209
- }
210
- return `"${id}"`;
211
- };
212
- for (const level of clusterLevels) {
213
- for (const node of level.nodes) {
214
- // Here mutating the nodes (adding names)
215
- if (isCluster(node)) {
216
- const leaves = clusterIndex.expandCluster(node);
217
- leaves.sort((a, b) => descending(getLocationWeight(a), getLocationWeight(b)));
218
- if (getLocationClusterName) {
219
- node.name = getLocationClusterName(leaves);
220
- }
221
- else {
222
- const topId = leaves[0];
223
- const otherId = leaves.length === 2 ? leaves[1] : undefined;
224
- node.name = `"${getName(topId)}" and ${otherId
225
- ? `"${getName(otherId)}"`
226
- : `${leaves.length - 1} others`}`;
227
- }
228
- }
229
- else {
230
- node.name = getName(node.id);
231
- }
232
- }
233
- }
203
+ addClusterNames(clusterIndex, clusterLevels, locationsById, this.accessors.getFlowmapDataAccessors(), getLocationWeight);
234
204
  return clusterIndex;
235
205
  });
236
206
  this.getAvailableClusterZoomLevels = createSelector(this.getClusterIndex, this.getSelectedLocations, (clusterIndex, selectedLocations) => {
@@ -636,8 +606,11 @@ export default class FlowmapSelectors {
636
606
  return undefined;
637
607
  return locations.reduce((m, d) => (m.set(this.accessors.getLocationId(d), d), m), new Map());
638
608
  });
639
- this.getLayersData = createSelector(this.getLocationsForFlowmapLayer, this.getFlowsForFlowmapLayer, this.getFlowmapColorsRGBA, this.getLocationsForFlowmapLayerById, this.getLocationIdsInViewport, this.getInCircleSizeGetter, this.getOutCircleSizeGetter, this.getFlowThicknessScale, this.getAnimate, (locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, animationEnabled) => {
640
- return this._prepareLayersData(locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, animationEnabled);
609
+ this.getLocationOrClusterByIdGetter = createSelector(this.getClusterIndex, this.getLocationsById, (clusterIndex, locationsById) => {
610
+ return (id) => { var _a; return (_a = clusterIndex === null || clusterIndex === void 0 ? void 0 : clusterIndex.getClusterById(id)) !== null && _a !== void 0 ? _a : locationsById === null || locationsById === void 0 ? void 0 : locationsById.get(id); };
611
+ });
612
+ this.getLayersData = createSelector(this.getLocationsForFlowmapLayer, this.getFlowsForFlowmapLayer, this.getFlowmapColorsRGBA, this.getLocationsForFlowmapLayerById, this.getLocationIdsInViewport, this.getInCircleSizeGetter, this.getOutCircleSizeGetter, this.getFlowThicknessScale, this.getAnimate, this.getLocationLabelsEnabled, (locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, animationEnabled, locationLabelsEnabled) => {
613
+ return this._prepareLayersData(locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, animationEnabled, locationLabelsEnabled);
641
614
  });
642
615
  this.accessors = new FlowmapAggregateAccessors(accessors);
643
616
  this.setAccessors(accessors);
@@ -654,14 +627,15 @@ export default class FlowmapSelectors {
654
627
  const getInCircleSize = this.getInCircleSizeGetter(state, props);
655
628
  const getOutCircleSize = this.getOutCircleSizeGetter(state, props);
656
629
  const flowThicknessScale = this.getFlowThicknessScale(state, props);
657
- return this._prepareLayersData(locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, state.settings.animationEnabled);
630
+ const locationLabelsEnabled = this.getLocationLabelsEnabled(state, props);
631
+ return this._prepareLayersData(locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, state.settings.animationEnabled, locationLabelsEnabled);
658
632
  }
659
- _prepareLayersData(locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, animationEnabled) {
633
+ _prepareLayersData(locations, flows, flowmapColors, locationsById, locationIdsInViewport, getInCircleSize, getOutCircleSize, flowThicknessScale, animationEnabled, locationLabelsEnabled) {
660
634
  if (!locations)
661
635
  locations = [];
662
636
  if (!flows)
663
637
  flows = [];
664
- const { getFlowOriginId, getFlowDestId, getFlowMagnitude, getLocationId, getLocationLon, getLocationLat, } = this.accessors;
638
+ const { getFlowOriginId, getFlowDestId, getFlowMagnitude, getLocationId, getLocationLon, getLocationLat, getLocationName, } = this.accessors;
665
639
  const flowMagnitudeExtent = extent(flows, (f) => getFlowMagnitude(f));
666
640
  const flowColorScale = getFlowColorScale(flowmapColors, flowMagnitudeExtent, false);
667
641
  // Using a generator here helps to avoid creating intermediary arrays
@@ -734,8 +708,7 @@ export default class FlowmapSelectors {
734
708
  }
735
709
  })())
736
710
  : undefined;
737
- return {
738
- circleAttributes: {
711
+ return Object.assign({ circleAttributes: {
739
712
  length: locations.length,
740
713
  attributes: {
741
714
  getPosition: { value: circlePositions, size: 2 },
@@ -743,14 +716,14 @@ export default class FlowmapSelectors {
743
716
  getInRadius: { value: inCircleRadii, size: 1 },
744
717
  getOutRadius: { value: outCircleRadii, size: 1 },
745
718
  },
746
- },
747
- lineAttributes: {
719
+ }, lineAttributes: {
748
720
  length: flows.length,
749
721
  attributes: Object.assign({ getSourcePosition: { value: sourcePositions, size: 2 }, getTargetPosition: { value: targetPositions, size: 2 }, getThickness: { value: thicknesses, size: 1 }, getColor: { value: flowLineColors, size: 4 }, getEndpointOffsets: { value: endpointOffsets, size: 2 } }, (staggeringValues
750
722
  ? { getStaggering: { value: staggeringValues, size: 1 } }
751
723
  : {})),
752
- },
753
- };
724
+ } }, (locationLabelsEnabled
725
+ ? { locationLabels: locations.map(getLocationName) }
726
+ : undefined));
754
727
  }
755
728
  getLocationsInBbox(tree, bbox) {
756
729
  if (!tree)
@@ -885,4 +858,4 @@ export function getFlowLineAttributesByIndex(lineAttributes, index) {
885
858
  : undefined)),
886
859
  };
887
860
  }
888
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcFNlbGVjdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9GbG93bWFwU2VsZWN0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDcEUsT0FBTyxFQUFjLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsY0FBYyxHQUVmLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUNMLFVBQVUsRUFFVix3QkFBd0IsRUFFeEIsd0JBQXdCLEdBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxTQUFTLEVBQUUsRUFHaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLGdCQUFnQixHQUNqQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLHlCQUF5QixNQUFNLDZCQUE2QixDQUFDO0FBRXBFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsc0JBQXNCLEdBQ3ZCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIseUJBQXlCLEdBRTFCLE1BQU0sUUFBUSxDQUFDO0FBQ2hCLE9BQU8sRUFXTCxTQUFTLEVBQ1QscUJBQXFCLEVBRXJCLGtCQUFrQixHQUVuQixNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQVNsQyxNQUFNLENBQUMs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LFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztvQkFDckQsSUFBSSxFQUFFLENBQUM7aUJBQ1I7YUFDRjtZQUNILENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDZjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIyIEZsb3dtYXBCbHVlXG4gKiBDb3B5cmlnaHQgMjAxOC0yMDIwIFRlcmFseXRpY3MsIG1vZGlmaWVkIGJ5IEZsb3dtYXBCbHVlXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICovXG5cbmltcG9ydCB7YXNjZW5kaW5nLCBkZXNjZW5kaW5nLCBleHRlbnQsIG1pbiwgcm9sbHVwfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQge1NjYWxlTGluZWFyLCBzY2FsZVNxcnR9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCBLREJ1c2ggZnJvbSAna2RidXNoJztcbmltcG9ydCB7XG4gIGNyZWF0ZVNlbGVjdG9yLFxuICBjcmVhdGVTZWxlY3RvckNyZWF0b3IsXG4gIGRlZmF1bHRNZW1vaXplLFxuICBQYXJhbWV0cmljU2VsZWN0b3IsXG59IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCB7YWxlYX0gZnJvbSAnc2VlZHJhbmRvbSc7XG5pbXBvcnQge2NsdXN0ZXJMb2NhdGlvbnN9IGZyb20gJy4vY2x1c3Rlci9jbHVzdGVyJztcbmltcG9ydCB7XG4gIGJ1aWxkSW5kZXgsXG4gIENsdXN0ZXJJbmRleCxcbiAgZmluZEFwcHJvcHJpYXRlWm9vbUxldmVsLFxuICBMb2NhdGlvbldlaWdodEdldHRlcixcbiAgbWFrZUxvY2F0aW9uV2VpZ2h0R2V0dGVyLFxufSBmcm9tICcuL2NsdXN0ZXIvQ2x1c3RlckluZGV4JztcbmltcG9ydCBnZXRDb2xvcnMsIHtcbiAgQ29sb3JzUkdCQSxcbiAgRGlmZkNvbG9yc1JHQkEsXG4gIGdldENvbG9yc1JHQkEsXG4gIGdldERpZmZDb2xvcnNSR0JBLFxuICBnZXRGbG93Q29sb3JTY2FsZSxcbiAgaXNEaWZmQ29sb3JzLFxuICBpc0RpZmZDb2xvcnNSR0JBLFxufSBmcm9tICcuL2NvbG9ycyc7XG5pbXBvcnQgRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29ycyBmcm9tICcuL0Zsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnMnO1xuaW1wb3J0IHtGbG93bWFwU3RhdGV9IGZyb20gJy4vRmxvd21hcFN0YXRlJztcbmltcG9ydCB7XG4gIGdldEZsb3dUaGlja25lc3NTY2FsZSxcbiAgZ2V0Vmlld3BvcnRCb3VuZGluZ0JveCxcbn0gZnJvbSAnLi9zZWxlY3Rvci1mdW5jdGlvbnMnO1xuaW1wb3J0IHtcbiAgZ2V0VGltZUdyYW51bGFyaXR5QnlLZXksXG4gIGdldFRpbWVHcmFudWxhcml0eUJ5T3JkZXIsXG4gIGdldFRpbWVHcmFudWxhcml0eUZvckRhdGUsXG4gIFRpbWVHcmFudWxhcml0eUtleSxcbn0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7XG4gIEFnZ3JlZ2F0ZUZsb3csXG4gIENsdXN0ZXIsXG4gIENsdXN0ZXJMZXZlbHMsXG4gIENsdXN0ZXJOb2RlLFxuICBDb3VudEJ5VGltZSxcbiAgRmxvd0FjY2Vzc29ycyxcbiAgRmxvd0NpcmNsZXNMYXllckF0dHJpYnV0ZXMsXG4gIEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcyxcbiAgRmxvd21hcERhdGEsXG4gIEZsb3dtYXBEYXRhQWNjZXNzb3JzLFxuICBpc0NsdXN0ZXIsXG4gIGlzTG9jYXRpb25DbHVzdGVyTm9kZSxcbiAgTGF5ZXJzRGF0YSxcbiAgTG9jYXRpb25GaWx0ZXJNb2RlLFxuICBMb2NhdGlvblRvdGFscyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IE1BWF9DTFVTVEVSX1pPT01fTEVWRUwgPSAyMDtcbnR5cGUgS0RCdXNoVHJlZSA9IGFueTtcblxuZXhwb3J0IHR5cGUgU2VsZWN0b3I8TCwgRiwgVD4gPSBQYXJhbWV0cmljU2VsZWN0b3I8XG4gIEZsb3dtYXBTdGF0ZSxcbiAgRmxvd21hcERhdGE8TCwgRj4sXG4gIFRcbj47XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsb3dtYXBTZWxlY3RvcnM8TCwgRj4ge1xuICBhY2Nlc3NvcnM6IEZsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnM8TCwgRj47XG5cbiAgY29uc3RydWN0b3IoYWNjZXNzb3JzOiBGbG93bWFwRGF0YUFjY2Vzc29yczxMLCBGPikge1xuICAgIHRoaXMuYWNjZXNzb3JzID0gbmV3IEZsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnMoYWNjZXNzb3JzKTtcbiAgICB0aGlzLnNldEFjY2Vzc29ycyhhY2Nlc3NvcnMpO1xuICB9XG5cbiAgc2V0QWNjZXNzb3JzKGFjY2Vzc29yczogRmxvd21hcERhdGFBY2Nlc3NvcnM8TCwgRj4pIHtcbiAgICB0aGlzLmFjY2Vzc29ycyA9IG5ldyBGbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzKGFjY2Vzc29ycyk7XG4gIH1cblxuICBnZXRGbG93c0Zyb21Qcm9wcyA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+XG4gICAgcHJvcHMuZmxvd3M7XG4gIGdldExvY2F0aW9uc0Zyb21Qcm9wcyA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+XG4gICAgcHJvcHMubG9jYXRpb25zO1xuICBnZXRDbHVzdGVyTGV2ZWxzRnJvbVByb3BzID0gKFxuICAgIHN0YXRlOiBGbG93bWFwU3RhdGUsXG4gICAgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+LFxuICApID0+IHtcbiAgICByZXR1cm4gcHJvcHMuY2x1c3RlckxldmVscztcbiAgfTtcbiAgZ2V0TWF4VG9wRmxvd3NEaXNwbGF5TnVtID0gKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPikgPT5cbiAgICBzdGF0ZS5zZXR0aW5ncy5tYXhUb3BGbG93c0Rpc3BsYXlOdW07XG4gIGdldFNlbGVjdGVkTG9jYXRpb25zID0gKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPikgPT5cbiAgICBzdGF0ZS5maWx0ZXI/LnNlbGVjdGVkTG9jYXRpb25zO1xuICBnZXRMb2NhdGlvbkZpbHRlck1vZGUgPSAoc3RhdGU6IEZsb3dtYXBTdGF0ZSwgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+KSA9PlxuICAgIHN0YXRlLmZpbHRlcj8ubG9jYXRpb25GaWx0ZXJNb2RlO1xuICBnZXRDbHVzdGVyaW5nRW5hYmxlZCA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+XG4gICAgc3RhdGUuc2V0dGluZ3MuY2x1c3RlcmluZ0VuYWJsZWQ7XG4gIGdldExvY2F0aW9uVG90YWxzRW5hYmxlZCA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+XG4gICAgc3RhdGUuc2V0dGluZ3MubG9jYXRpb25Ub3RhbHNFbmFibGVkO1xuICBnZXRab29tID0gKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPikgPT5cbiAgICBzdGF0ZS52aWV3cG9ydC56b29tO1xuICBnZXRWaWV3cG9ydCA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+XG4gICAgc3RhdGUudmlld3BvcnQ7XG4gIGdldFNlbGVjdGVkVGltZVJhbmdlID0gKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPikgPT5cbiAgICBzdGF0ZS5maWx0ZXI/LnNlbGVjdGVkVGltZVJhbmdlO1xuXG4gIGdldENvbG9yU2NoZW1lOiBTZWxlY3RvcjxMLCBGLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gPSAoXG4gICAgc3RhdGU6IEZsb3dtYXBTdGF0ZSxcbiAgICBwcm9wczogRmxvd21hcERhdGE8TCwgRj4sXG4gICkgPT4gc3RhdGUuc2V0dGluZ3MuY29sb3JTY2hlbWU7XG5cbiAgZ2V0RGFya01vZGU6IFNlbGVjdG9yPEwsIEYsIGJvb2xlYW4+ID0gKFxuICAgIHN0YXRlOiBGbG93bWFwU3RhdGUsXG4gICAgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+LFxuICApID0+IHN0YXRlLnNldHRpbmdzLmRhcmtNb2RlO1xuXG4gIGdldEZhZGVFbmFibGVkOiBTZWxlY3RvcjxMLCBGLCBib29sZWFuPiA9IChcbiAgICBzdGF0ZTogRmxvd21hcFN0YXRlLFxuICAgIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPixcbiAgKSA9PiBzdGF0ZS5zZXR0aW5ncy5mYWRlRW5hYmxlZDtcblxuICBnZXRGYWRlT3BhY2l0eUVuYWJsZWQ6IFNlbGVjdG9yPEwsIEYsIGJvb2xlYW4+ID0gKFxuICAgIHN0YXRlOiBGbG93bWFwU3RhdGUsXG4gICAgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+LFxuICApID0+IHN0YXRlLnNldHRpbmdzLmZhZGVPcGFjaXR5RW5hYmxlZDtcblxuICBnZXRGYWRlQW1vdW50OiBTZWxlY3RvcjxMLCBGLCBudW1iZXI+ID0gKFxuICAgIHN0YXRlOiBGbG93bWFwU3RhdGUsXG4gICAgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+LFxuICApID0+IHN0YXRlLnNldHRpbmdzLmZhZGVBbW91bnQ7XG5cbiAgZ2V0QW5pbWF0ZTogU2VsZWN0b3I8TCwgRiwgYm9vbGVhbj4gPSAoXG4gICAgc3RhdGU6IEZsb3dtYXBTdGF0ZSxcbiAgICBwcm9wczogRmxvd21hcERhdGE8TCwgRj4sXG4gICkgPT4gc3RhdGUuc2V0dGluZ3MuYW5pbWF0aW9uRW5hYmxlZDtcblxuICBnZXRJbnZhbGlkTG9jYXRpb25JZHM6IFNlbGVjdG9yPEwsIEYsIChzdHJpbmcgfCBudW1iZXIpW10gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldExvY2F0aW9uc0Zyb21Qcm9wcywgKGxvY2F0aW9ucykgPT4ge1xuICAgICAgaWYgKCFsb2NhdGlvbnMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbnZhbGlkID0gW107XG4gICAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uSWQobG9jYXRpb24pO1xuICAgICAgICBjb25zdCBsb24gPSB0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbkxvbihsb2NhdGlvbik7XG4gICAgICAgIGNvbnN0IGxhdCA9IHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uTGF0KGxvY2F0aW9uKTtcbiAgICAgICAgaWYgKCEoLTkwIDw9IGxhdCAmJiBsYXQgPD0gOTApIHx8ICEoLTE4MCA8PSBsb24gJiYgbG9uIDw9IDE4MCkpIHtcbiAgICAgICAgICBpbnZhbGlkLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaW52YWxpZC5sZW5ndGggPiAwID8gaW52YWxpZCA6IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICBnZXRMb2NhdGlvbnM6IFNlbGVjdG9yPEwsIEYsIEl0ZXJhYmxlPEw+IHwgdW5kZWZpbmVkPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0TG9jYXRpb25zRnJvbVByb3BzLFxuICAgIHRoaXMuZ2V0SW52YWxpZExvY2F0aW9uSWRzLFxuICAgIChsb2NhdGlvbnMsIGludmFsaWRJZHMpID0+IHtcbiAgICAgIGlmICghbG9jYXRpb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFpbnZhbGlkSWRzIHx8IGludmFsaWRJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgY29uc3QgaW52YWxpZCA9IG5ldyBTZXQoaW52YWxpZElkcyk7XG4gICAgICBjb25zdCBmaWx0ZXJlZDogTFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uSWQobG9jYXRpb24pO1xuICAgICAgICBpZiAoIWludmFsaWQuaGFzKGlkKSkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2gobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgfSxcbiAgKTtcblxuICBnZXRMb2NhdGlvbklkczogU2VsZWN0b3I8TCwgRiwgU2V0PHN0cmluZyB8IG51bWJlcj4gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldExvY2F0aW9ucywgKGxvY2F0aW9ucykgPT4ge1xuICAgICAgaWYgKCFsb2NhdGlvbnMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcbiAgICAgIGZvciAoY29uc3QgaWQgb2YgbG9jYXRpb25zKSB7XG4gICAgICAgIGlkcy5hZGQodGhpcy5hY2Nlc3NvcnMuZ2V0TG9jYXRpb25JZChpZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcblxuICBnZXRTZWxlY3RlZExvY2F0aW9uc1NldDogU2VsZWN0b3I8TCwgRiwgU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldFNlbGVjdGVkTG9jYXRpb25zLCAoaWRzKSA9PlxuICAgICAgaWRzICYmIGlkcy5sZW5ndGggPiAwID8gbmV3IFNldChpZHMpIDogdW5kZWZpbmVkLFxuICAgICk7XG5cbiAgZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9uczogU2VsZWN0b3I8TCwgRiwgRltdIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldEZsb3dzRnJvbVByb3BzLFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbklkcyxcbiAgICAgIChmbG93cywgaWRzKSA9PiB7XG4gICAgICAgIGlmICghaWRzIHx8ICFmbG93cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgY29uc3Qgc3JjSWQgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93T3JpZ2luSWQoZmxvdyk7XG4gICAgICAgICAgY29uc3QgZHN0SWQgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGZsb3cpO1xuICAgICAgICAgIGlmIChpZHMuaGFzKHNyY0lkKSAmJiBpZHMuaGFzKGRzdElkKSkge1xuICAgICAgICAgICAgZmlsdGVyZWQucHVzaChmbG93KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkLnNvcnQoKGE6IEYsIGI6IEYpID0+XG4gICAgICAgICAgZGVzY2VuZGluZyhcbiAgICAgICAgICAgIE1hdGguYWJzKHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoYSkpLFxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShiKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRBY3R1YWxUaW1lRXh0ZW50OiBTZWxlY3RvcjxMLCBGLCBbRGF0ZSwgRGF0ZV0gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldFNvcnRlZEZsb3dzRm9yS25vd25Mb2NhdGlvbnMsIChmbG93cykgPT4ge1xuICAgICAgaWYgKCFmbG93cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBzdGFydCA9IG51bGw7XG4gICAgICBsZXQgZW5kID0gbnVsbDtcbiAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICBjb25zdCB0aW1lID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd1RpbWUoZmxvdyk7XG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPiB0aW1lKSBzdGFydCA9IHRpbWU7XG4gICAgICAgICAgaWYgKGVuZCA9PSBudWxsIHx8IGVuZCA8IHRpbWUpIGVuZCA9IHRpbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3RhcnQgfHwgIWVuZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBbc3RhcnQsIGVuZF07XG4gICAgfSk7XG5cbiAgZ2V0VGltZUdyYW51bGFyaXR5S2V5OiBTZWxlY3RvcjxMLCBGLCBUaW1lR3JhbnVsYXJpdHlLZXkgfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAgIHRoaXMuZ2V0QWN0dWFsVGltZUV4dGVudCxcbiAgICAgIChmbG93cywgdGltZUV4dGVudCkgPT4ge1xuICAgICAgICBpZiAoIWZsb3dzIHx8ICF0aW1lRXh0ZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gbWluKGZsb3dzLCAoZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93VGltZShkKTtcbiAgICAgICAgICByZXR1cm4gdCA/IGdldFRpbWVHcmFudWxhcml0eUZvckRhdGUodCkub3JkZXIgOiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG1pbk9yZGVyID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHRpbWVHcmFudWxhcml0eSA9IGdldFRpbWVHcmFudWxhcml0eUJ5T3JkZXIobWluT3JkZXIpO1xuICAgICAgICByZXR1cm4gdGltZUdyYW51bGFyaXR5ID8gdGltZUdyYW51bGFyaXR5LmtleSA6IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRUaW1lRXh0ZW50OiBTZWxlY3RvcjxMLCBGLCBbRGF0ZSwgRGF0ZV0gfCB1bmRlZmluZWQ+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRBY3R1YWxUaW1lRXh0ZW50LFxuICAgIHRoaXMuZ2V0VGltZUdyYW51bGFyaXR5S2V5LFxuICAgICh0aW1lRXh0ZW50LCB0aW1lR3JhbnVsYXJpdHlLZXkpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVHcmFudWxhcml0eSA9IHRpbWVHcmFudWxhcml0eUtleVxuICAgICAgICA/IGdldFRpbWVHcmFudWxhcml0eUJ5S2V5KHRpbWVHcmFudWxhcml0eUtleSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXRpbWVFeHRlbnQgfHwgIXRpbWVHcmFudWxhcml0eT8uaW50ZXJ2YWwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB7aW50ZXJ2YWx9ID0gdGltZUdyYW51bGFyaXR5O1xuICAgICAgcmV0dXJuIFt0aW1lRXh0ZW50WzBdLCBpbnRlcnZhbC5vZmZzZXQoaW50ZXJ2YWwuZmxvb3IodGltZUV4dGVudFsxXSksIDEpXTtcbiAgICB9LFxuICApO1xuXG4gIGdldFNvcnRlZEZsb3dzRm9yS25vd25Mb2NhdGlvbnNGaWx0ZXJlZEJ5VGltZTogU2VsZWN0b3I8XG4gICAgTCxcbiAgICBGLFxuICAgIEZbXSB8IHVuZGVmaW5lZFxuICA+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRTb3J0ZWRGbG93c0Zvcktub3duTG9jYXRpb25zLFxuICAgIHRoaXMuZ2V0VGltZUV4dGVudCxcbiAgICB0aGlzLmdldFNlbGVjdGVkVGltZVJhbmdlLFxuICAgIChmbG93cywgdGltZUV4dGVudCwgdGltZVJhbmdlKSA9PiB7XG4gICAgICBpZiAoIWZsb3dzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICAhdGltZUV4dGVudCB8fFxuICAgICAgICAhdGltZVJhbmdlIHx8XG4gICAgICAgICh0aW1lRXh0ZW50WzBdID09PSB0aW1lUmFuZ2VbMF0gJiYgdGltZUV4dGVudFsxXSA9PT0gdGltZVJhbmdlWzFdKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmbG93cztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmbG93cy5maWx0ZXIoKGZsb3cpID0+IHtcbiAgICAgICAgY29uc3QgdGltZSA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dUaW1lKGZsb3cpO1xuICAgICAgICByZXR1cm4gdGltZSAmJiB0aW1lUmFuZ2VbMF0gPD0gdGltZSAmJiB0aW1lIDwgdGltZVJhbmdlWzFdO1xuICAgICAgfSk7XG4gICAgfSxcbiAgKTtcblxuICBnZXRMb2NhdGlvbnNIYXZpbmdGbG93czogU2VsZWN0b3I8TCwgRiwgSXRlcmFibGU8TD4gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25zLFxuICAgICAgKGZsb3dzLCBsb2NhdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKCFsb2NhdGlvbnMgfHwgIWZsb3dzKSByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICBjb25zdCB3aXRoRmxvd3MgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIHdpdGhGbG93cy5hZGQodGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGZsb3cpKTtcbiAgICAgICAgICB3aXRoRmxvd3MuYWRkKHRoaXMuYWNjZXNzb3JzLmdldEZsb3dEZXN0SWQoZmxvdykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgICAgaWYgKHdpdGhGbG93cy5oYXModGhpcy5hY2Nlc3NvcnMuZ2V0TG9jYXRpb25JZChsb2NhdGlvbikpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGxvY2F0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgfSxcbiAgICApO1xuXG4gIGdldExvY2F0aW9uc0J5SWQ6IFNlbGVjdG9yPEwsIEYsIE1hcDxzdHJpbmcgfCBudW1iZXIsIEw+IHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IodGhpcy5nZXRMb2NhdGlvbnNIYXZpbmdGbG93cywgKGxvY2F0aW9ucykgPT4ge1xuICAgICAgaWYgKCFsb2NhdGlvbnMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBsb2NhdGlvbnNCeUlkID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIEw+KCk7XG4gICAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xuICAgICAgICBsb2NhdGlvbnNCeUlkLnNldCh0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGxvY2F0aW9uKSwgbG9jYXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxvY2F0aW9uc0J5SWQ7XG4gICAgfSk7XG5cbiAgZ2V0TG9jYXRpb25XZWlnaHRHZXR0ZXI6IFNlbGVjdG9yPEwsIEYsIExvY2F0aW9uV2VpZ2h0R2V0dGVyIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IodGhpcy5nZXRTb3J0ZWRGbG93c0Zvcktub3duTG9jYXRpb25zLCAoZmxvd3MpID0+IHtcbiAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBnZXRMb2NhdGlvbldlaWdodCA9IG1ha2VMb2NhdGlvbldlaWdodEdldHRlcihcbiAgICAgICAgZmxvd3MsXG4gICAgICAgIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dtYXBEYXRhQWNjZXNzb3JzKCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIGdldExvY2F0aW9uV2VpZ2h0O1xuICAgIH0pO1xuXG4gIGdldENsdXN0ZXJMZXZlbHM6IFNlbGVjdG9yPEwsIEYsIENsdXN0ZXJMZXZlbHMgfCB1bmRlZmluZWQ+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDbHVzdGVyTGV2ZWxzRnJvbVByb3BzLFxuICAgIHRoaXMuZ2V0TG9jYXRpb25zSGF2aW5nRmxvd3MsXG4gICAgdGhpcy5nZXRMb2NhdGlvbldlaWdodEdldHRlcixcbiAgICAoY2x1c3RlckxldmVsc0Zyb21Qcm9wcywgbG9jYXRpb25zLCBnZXRMb2NhdGlvbldlaWdodCkgPT4ge1xuICAgICAgaWYgKGNsdXN0ZXJMZXZlbHNGcm9tUHJvcHMpIHJldHVybiBjbHVzdGVyTGV2ZWxzRnJvbVByb3BzO1xuICAgICAgaWYgKCFsb2NhdGlvbnMgfHwgIWdldExvY2F0aW9uV2VpZ2h0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY2x1c3RlckxldmVscyA9IGNsdXN0ZXJMb2NhdGlvbnMoXG4gICAgICAgIGxvY2F0aW9ucyxcbiAgICAgICAgdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd21hcERhdGFBY2Nlc3NvcnMoKSxcbiAgICAgICAgZ2V0TG9jYXRpb25XZWlnaHQsXG4gICAgICAgIHtcbiAgICAgICAgICBtYXhab29tOiBNQVhfQ0xVU1RFUl9aT09NX0xFVkVMLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBjbHVzdGVyTGV2ZWxzO1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0Q2x1c3RlckluZGV4OiBTZWxlY3RvcjxMLCBGLCBDbHVzdGVySW5kZXg8Rj4gfCB1bmRlZmluZWQ+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRMb2NhdGlvbnNCeUlkLFxuICAgIHRoaXMuZ2V0TG9jYXRpb25XZWlnaHRHZXR0ZXIsXG4gICAgdGhpcy5nZXRDbHVzdGVyTGV2ZWxzLFxuICAgIChsb2NhdGlvbnNCeUlkLCBnZXRMb2NhdGlvbldlaWdodCwgY2x1c3RlckxldmVscykgPT4ge1xuICAgICAgaWYgKCFsb2NhdGlvbnNCeUlkIHx8ICFnZXRMb2NhdGlvbldlaWdodCB8fCAhY2x1c3RlckxldmVscylcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgY2x1c3RlckluZGV4ID0gYnVpbGRJbmRleDxGPihjbHVzdGVyTGV2ZWxzKTtcbiAgICAgIGNvbnN0IHtnZXRMb2NhdGlvbk5hbWUsIGdldExvY2F0aW9uQ2x1c3Rlck5hbWV9ID1cbiAgICAgICAgdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd21hcERhdGFBY2Nlc3NvcnMoKTtcblxuICAgICAgLy8gQWRkaW5nIG1lYW5pbmdmdWwgbmFtZXNcbiAgICAgIGNvbnN0IGdldE5hbWUgPSAoaWQ6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBsb2MgPSBsb2NhdGlvbnNCeUlkLmdldChpZCk7XG4gICAgICAgIGlmIChsb2MpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TG9jYXRpb25OYW1lXG4gICAgICAgICAgICA/IGdldExvY2F0aW9uTmFtZShsb2MpXG4gICAgICAgICAgICA6IHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uSWQobG9jKSB8fCBpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFwiJHtpZH1cImA7XG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBjbHVzdGVyTGV2ZWxzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBsZXZlbC5ub2Rlcykge1xuICAgICAgICAgIC8vIEhlcmUgbXV0YXRpbmcgdGhlIG5vZGVzIChhZGRpbmcgbmFtZXMpXG4gICAgICAgICAgaWYgKGlzQ2x1c3Rlcihub2RlKSkge1xuICAgICAgICAgICAgY29uc3QgbGVhdmVzID0gY2x1c3RlckluZGV4LmV4cGFuZENsdXN0ZXIobm9kZSk7XG5cbiAgICAgICAgICAgIGxlYXZlcy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICBkZXNjZW5kaW5nKGdldExvY2F0aW9uV2VpZ2h0KGEpLCBnZXRMb2NhdGlvbldlaWdodChiKSksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZ2V0TG9jYXRpb25DbHVzdGVyTmFtZSkge1xuICAgICAgICAgICAgICBub2RlLm5hbWUgPSBnZXRMb2NhdGlvbkNsdXN0ZXJOYW1lKGxlYXZlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCB0b3BJZCA9IGxlYXZlc1swXTtcbiAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJZCA9IGxlYXZlcy5sZW5ndGggPT09IDIgPyBsZWF2ZXNbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIG5vZGUubmFtZSA9IGBcIiR7Z2V0TmFtZSh0b3BJZCl9XCIgYW5kICR7XG4gICAgICAgICAgICAgICAgb3RoZXJJZFxuICAgICAgICAgICAgICAgICAgPyBgXCIke2dldE5hbWUob3RoZXJJZCl9XCJgXG4gICAgICAgICAgICAgICAgICA6IGAke2xlYXZlcy5sZW5ndGggLSAxfSBvdGhlcnNgXG4gICAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAobm9kZSBhcyBhbnkpLm5hbWUgPSBnZXROYW1lKG5vZGUuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2x1c3RlckluZGV4O1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0QXZhaWxhYmxlQ2x1c3Rlclpvb21MZXZlbHMgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldENsdXN0ZXJJbmRleCxcbiAgICB0aGlzLmdldFNlbGVjdGVkTG9jYXRpb25zLFxuICAgIChjbHVzdGVySW5kZXgsIHNlbGVjdGVkTG9jYXRpb25zKTogbnVtYmVyW10gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgaWYgKCFjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGV0IG1heFpvb20gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICBsZXQgbWluWm9vbSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICAgICAgY29uc3QgYWRqdXN0ID0gKHpvbmVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVySW5kZXguZ2V0Q2x1c3RlckJ5SWQoem9uZUlkKTtcbiAgICAgICAgaWYgKGNsdXN0ZXIpIHtcbiAgICAgICAgICBtaW5ab29tID0gTWF0aC5tYXgobWluWm9vbSwgY2x1c3Rlci56b29tKTtcbiAgICAgICAgICBtYXhab29tID0gTWF0aC5taW4obWF4Wm9vbSwgY2x1c3Rlci56b29tKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB6b29tID0gY2x1c3RlckluZGV4LmdldE1pblpvb21Gb3JMb2NhdGlvbih6b25lSWQpO1xuICAgICAgICAgIG1pblpvb20gPSBNYXRoLm1heChtaW5ab29tLCB6b29tKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKHNlbGVjdGVkTG9jYXRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc2VsZWN0ZWRMb2NhdGlvbnMpIHtcbiAgICAgICAgICBhZGp1c3QoaWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjbHVzdGVySW5kZXguYXZhaWxhYmxlWm9vbUxldmVscy5maWx0ZXIoXG4gICAgICAgIChsZXZlbCkgPT4gbWluWm9vbSA8PSBsZXZlbCAmJiBsZXZlbCA8PSBtYXhab29tLFxuICAgICAgKTtcbiAgICB9LFxuICApO1xuXG4gIF9nZXRDbHVzdGVyWm9vbTogU2VsZWN0b3I8TCwgRiwgbnVtYmVyIHwgdW5kZWZpbmVkPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0Q2x1c3RlckluZGV4LFxuICAgIHRoaXMuZ2V0Wm9vbSxcbiAgICB0aGlzLmdldEF2YWlsYWJsZUNsdXN0ZXJab29tTGV2ZWxzLFxuICAgIChjbHVzdGVySW5kZXgsIG1hcFpvb20sIGF2YWlsYWJsZUNsdXN0ZXJab29tTGV2ZWxzKSA9PiB7XG4gICAgICBpZiAoIWNsdXN0ZXJJbmRleCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXZhaWxhYmxlQ2x1c3Rlclpvb21MZXZlbHMgfHwgbWFwWm9vbSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsdXN0ZXJab29tID0gZmluZEFwcHJvcHJpYXRlWm9vbUxldmVsKFxuICAgICAgICBhdmFpbGFibGVDbHVzdGVyWm9vbUxldmVscyxcbiAgICAgICAgbWFwWm9vbSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gY2x1c3Rlclpvb207XG4gICAgfSxcbiAgKTtcblxuICBnZXRDbHVzdGVyWm9vbSA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+IHtcbiAgICBjb25zdCB7c2V0dGluZ3N9ID0gc3RhdGU7XG4gICAgaWYgKCFzZXR0aW5ncy5jbHVzdGVyaW5nRW5hYmxlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc2V0dGluZ3MuY2x1c3RlcmluZ0F1dG8gfHwgc2V0dGluZ3MuY2x1c3RlcmluZ0xldmVsID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRDbHVzdGVyWm9vbShzdGF0ZSwgcHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0dGluZ3MuY2x1c3RlcmluZ0xldmVsO1xuICB9O1xuXG4gIGdldExvY2F0aW9uc0ZvclNlYXJjaEJveDogU2VsZWN0b3I8TCwgRiwgKEwgfCBDbHVzdGVyKVtdIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldENsdXN0ZXJpbmdFbmFibGVkLFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbnNIYXZpbmdGbG93cyxcbiAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbnMsXG4gICAgICB0aGlzLmdldENsdXN0ZXJab29tLFxuICAgICAgdGhpcy5nZXRDbHVzdGVySW5kZXgsXG4gICAgICAoXG4gICAgICAgIGNsdXN0ZXJpbmdFbmFibGVkLFxuICAgICAgICBsb2NhdGlvbnMsXG4gICAgICAgIHNlbGVjdGVkTG9jYXRpb25zLFxuICAgICAgICBjbHVzdGVyWm9vbSxcbiAgICAgICAgY2x1c3RlckluZGV4LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmICghbG9jYXRpb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmVzdWx0OiAoTCB8IENsdXN0ZXIpW10gPSBBcnJheS5mcm9tKGxvY2F0aW9ucyk7XG4gICAgICAgIC8vIGlmIChjbHVzdGVyaW5nRW5hYmxlZCkge1xuICAgICAgICAvLyAgIGlmIChjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHpvb21JdGVtcyA9IGNsdXN0ZXJJbmRleC5nZXRDbHVzdGVyTm9kZXNGb3IoY2x1c3Rlclpvb20pO1xuICAgICAgICAvLyAgICAgaWYgKHpvb21JdGVtcykge1xuICAgICAgICAvLyAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHpvb21JdGVtcy5maWx0ZXIoaXNDbHVzdGVyKSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKGNsdXN0ZXJJbmRleCAmJiBzZWxlY3RlZExvY2F0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHRvQXBwZW5kID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzZWxlY3RlZExvY2F0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJJbmRleC5nZXRDbHVzdGVyQnlJZChpZCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNsdXN0ZXIgJiZcbiAgICAgICAgICAgICAgIXJlc3VsdC5maW5kKFxuICAgICAgICAgICAgICAgIChkKSA9PlxuICAgICAgICAgICAgICAgICAgKGlzTG9jYXRpb25DbHVzdGVyTm9kZShkKVxuICAgICAgICAgICAgICAgICAgICA/IGQuaWRcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGQpKSA9PT0gaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0b0FwcGVuZC5wdXNoKGNsdXN0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodG9BcHBlbmQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0b0FwcGVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0RGlmZk1vZGU6IFNlbGVjdG9yPEwsIEYsIGJvb2xlYW4+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRGbG93c0Zyb21Qcm9wcyxcbiAgICAoZmxvd3MpID0+IHtcbiAgICAgIGlmIChmbG93cykge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmxvd3MpIHtcbiAgICAgICAgICBpZiAodGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShmKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICk7XG5cbiAgX2dldEZsb3dtYXBDb2xvcnMgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldERpZmZNb2RlLFxuICAgIHRoaXMuZ2V0Q29sb3JTY2hlbWUsXG4gICAgdGhpcy5nZXREYXJrTW9kZSxcbiAgICB0aGlzLmdldEZhZGVFbmFibGVkLFxuICAgIHRoaXMuZ2V0RmFkZU9wYWNpdHlFbmFibGVkLFxuICAgIHRoaXMuZ2V0RmFkZUFtb3VudCxcbiAgICB0aGlzLmdldEFuaW1hdGUsXG4gICAgZ2V0Q29sb3JzLFxuICApO1xuXG4gIGdldEZsb3dtYXBDb2xvcnNSR0JBID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5fZ2V0Rmxvd21hcENvbG9ycyxcbiAgICAoZmxvd21hcENvbG9ycykgPT4ge1xuICAgICAgcmV0dXJuIGlzRGlmZkNvbG9ycyhmbG93bWFwQ29sb3JzKVxuICAgICAgICA/IGdldERpZmZDb2xvcnNSR0JBKGZsb3dtYXBDb2xvcnMpXG4gICAgICAgIDogZ2V0Q29sb3JzUkdCQShmbG93bWFwQ29sb3JzKTtcbiAgICB9LFxuICApO1xuXG4gIGdldFVua25vd25Mb2NhdGlvbnM6IFNlbGVjdG9yPEwsIEYsIFNldDxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldExvY2F0aW9uSWRzLFxuICAgICAgdGhpcy5nZXRGbG93c0Zyb21Qcm9wcyxcbiAgICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAgIChpZHMsIGZsb3dzLCBmbG93c0Zvcktub3duTG9jYXRpb25zKSA9PiB7XG4gICAgICAgIGlmICghaWRzIHx8ICFmbG93cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZsb3dzRm9yS25vd25Mb2NhdGlvbnNcbiAgICAgICAgICAvLyAmJiBmbG93cy5sZW5ndGggPT09IGZsb3dzRm9yS25vd25Mb2NhdGlvbnMubGVuZ3RoXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGlmICghaWRzLmhhcyh0aGlzLmFjY2Vzc29ycy5nZXRGbG93T3JpZ2luSWQoZmxvdykpKVxuICAgICAgICAgICAgbWlzc2luZy5hZGQodGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGZsb3cpKTtcbiAgICAgICAgICBpZiAoIWlkcy5oYXModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KSkpXG4gICAgICAgICAgICBtaXNzaW5nLmFkZCh0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGZsb3cpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlzc2luZztcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRTb3J0ZWRBZ2dyZWdhdGVkRmlsdGVyZWRGbG93czogU2VsZWN0b3I8XG4gICAgTCxcbiAgICBGLFxuICAgIChGIHwgQWdncmVnYXRlRmxvdylbXSB8IHVuZGVmaW5lZFxuICA+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDbHVzdGVySW5kZXgsXG4gICAgdGhpcy5nZXRDbHVzdGVyaW5nRW5hYmxlZCxcbiAgICB0aGlzLmdldFNvcnRlZEZsb3dzRm9yS25vd25Mb2NhdGlvbnNGaWx0ZXJlZEJ5VGltZSxcbiAgICB0aGlzLmdldENsdXN0ZXJab29tLFxuICAgIHRoaXMuZ2V0VGltZUV4dGVudCxcbiAgICAoY2x1c3RlclRyZWUsIGlzQ2x1c3RlcmluZ0VuYWJsZWQsIGZsb3dzLCBjbHVzdGVyWm9vbSwgdGltZUV4dGVudCkgPT4ge1xuICAgICAgaWYgKCFmbG93cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBhZ2dyZWdhdGVkOiAoRiB8IEFnZ3JlZ2F0ZUZsb3cpW107XG4gICAgICBpZiAoaXNDbHVzdGVyaW5nRW5hYmxlZCAmJiBjbHVzdGVyVHJlZSAmJiBjbHVzdGVyWm9vbSAhPSBudWxsKSB7XG4gICAgICAgIGFnZ3JlZ2F0ZWQgPSBjbHVzdGVyVHJlZS5hZ2dyZWdhdGVGbG93cyhcbiAgICAgICAgICAvLyBUT0RPOiBhZ2dyZWdhdGUgYWNyb3NzIHRpbWVcbiAgICAgICAgICAvLyB0aW1lRXh0ZW50ICE9IG51bGxcbiAgICAgICAgICAvLyAgID8gYWdncmVnYXRlRmxvd3MoZmxvd3MpIC8vIGNsdXN0ZXJUcmVlLmFnZ3JlZ2F0ZUZsb3dzIHdvbid0IGFnZ3JlZ2F0ZSB1bmNsdXN0ZXJlZCBhY3Jvc3MgdGltZVxuICAgICAgICAgIC8vICAgOiBmbG93cyxcbiAgICAgICAgICBmbG93cyxcbiAgICAgICAgICBjbHVzdGVyWm9vbSxcbiAgICAgICAgICB0aGlzLmFjY2Vzc29ycy5nZXRGbG93bWFwRGF0YUFjY2Vzc29ycygpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWdncmVnYXRlZCA9IGFnZ3JlZ2F0ZUZsb3dzKFxuICAgICAgICAgIGZsb3dzLFxuICAgICAgICAgIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dtYXBEYXRhQWNjZXNzb3JzKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhZ2dyZWdhdGVkLnNvcnQoKGEsIGIpID0+XG4gICAgICAgIGRlc2NlbmRpbmcoXG4gICAgICAgICAgTWF0aC5hYnModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShhKSksXG4gICAgICAgICAgTWF0aC5hYnModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShiKSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZWQ7XG4gICAgfSxcbiAgKTtcblxuICBnZXRFeHBhbmRlZFNlbGVjdGVkTG9jYXRpb25zU2V0OiBTZWxlY3RvcjxMLCBGLCBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRDbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbnNTZXQsXG4gICAgICB0aGlzLmdldENsdXN0ZXJJbmRleCxcbiAgICAgIChjbHVzdGVyaW5nRW5hYmxlZCwgc2VsZWN0ZWRMb2NhdGlvbnMsIGNsdXN0ZXJJbmRleCkgPT4ge1xuICAgICAgICBpZiAoIXNlbGVjdGVkTG9jYXRpb25zIHx8ICFjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbklkIG9mIHNlbGVjdGVkTG9jYXRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJJbmRleC5nZXRDbHVzdGVyQnlJZChsb2NhdGlvbklkKTtcbiAgICAgICAgICBpZiAoY2x1c3Rlcikge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBjbHVzdGVySW5kZXguZXhwYW5kQ2x1c3RlcihjbHVzdGVyKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LmFkZChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5hZGQobG9jYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0VG90YWxDb3VudHNCeVRpbWU6IFNlbGVjdG9yPEwsIEYsIENvdW50QnlUaW1lW10gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAgIHRoaXMuZ2V0VGltZUdyYW51bGFyaXR5S2V5LFxuICAgICAgdGhpcy5nZXRUaW1lRXh0ZW50LFxuICAgICAgdGhpcy5nZXRFeHBhbmRlZFNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgICAoXG4gICAgICAgIGZsb3dzLFxuICAgICAgICB0aW1lR3JhbnVsYXJpdHlLZXksXG4gICAgICAgIHRpbWVFeHRlbnQsXG4gICAgICAgIHNlbGVjdGVkTG9jYXRpb25TZXQsXG4gICAgICAgIGxvY2F0aW9uRmlsdGVyTW9kZSxcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lR3JhbnVsYXJpdHkgPSB0aW1lR3JhbnVsYXJpdHlLZXlcbiAgICAgICAgICA/IGdldFRpbWVHcmFudWxhcml0eUJ5S2V5KHRpbWVHcmFudWxhcml0eUtleSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFmbG93cyB8fCAhdGltZUdyYW51bGFyaXR5IHx8ICF0aW1lRXh0ZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBieVRpbWUgPSBmbG93cy5yZWR1Y2UoKG0sIGZsb3cpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzRmxvd0luU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBmbG93LFxuICAgICAgICAgICAgICBzZWxlY3RlZExvY2F0aW9uU2V0LFxuICAgICAgICAgICAgICBsb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aW1lR3JhbnVsYXJpdHlcbiAgICAgICAgICAgICAgLmludGVydmFsKHRoaXMuYWNjZXNzb3JzLmdldEZsb3dUaW1lKGZsb3cpKVxuICAgICAgICAgICAgICAuZ2V0VGltZSgpO1xuICAgICAgICAgICAgbS5zZXQoXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgKG0uZ2V0KGtleSkgPz8gMCkgKyB0aGlzLmFjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGZsb3cpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH0sIG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCkpO1xuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGJ5VGltZS5lbnRyaWVzKCkpLm1hcCgoW21pbGxpcywgY291bnRdKSA9PiAoe1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKG1pbGxpcyksXG4gICAgICAgICAgY291bnQsXG4gICAgICAgIH0pKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRNYXhMb2NhdGlvbkNpcmNsZVNpemU6IFNlbGVjdG9yPEwsIEYsIG51bWJlcj4gPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldExvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICAobG9jYXRpb25Ub3RhbHNFbmFibGVkKSA9PiAobG9jYXRpb25Ub3RhbHNFbmFibGVkID8gMTcgOiAxKSxcbiAgKTtcblxuICBnZXRWaWV3cG9ydEJvdW5kaW5nQm94OiBTZWxlY3RvcjxMLCBGLCBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRWaWV3cG9ydCxcbiAgICAgIHRoaXMuZ2V0TWF4TG9jYXRpb25DaXJjbGVTaXplLFxuICAgICAgZ2V0Vmlld3BvcnRCb3VuZGluZ0JveCxcbiAgICApO1xuXG4gIGdldExvY2F0aW9uc0Zvclpvb206IFNlbGVjdG9yPEwsIEYsIEl0ZXJhYmxlPEw+IHwgQ2x1c3Rlck5vZGVbXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRDbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25zSGF2aW5nRmxvd3MsXG4gICAgICB0aGlzLmdldENsdXN0ZXJJbmRleCxcbiAgICAgIHRoaXMuZ2V0Q2x1c3Rlclpvb20sXG4gICAgICAoY2x1c3RlcmluZ0VuYWJsZWQsIGxvY2F0aW9uc0hhdmluZ0Zsb3dzLCBjbHVzdGVySW5kZXgsIGNsdXN0ZXJab29tKSA9PiB7XG4gICAgICAgIGlmIChjbHVzdGVyaW5nRW5hYmxlZCAmJiBjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gY2x1c3RlckluZGV4LmdldENsdXN0ZXJOb2Rlc0ZvcihjbHVzdGVyWm9vbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGxvY2F0aW9uc0hhdmluZ0Zsb3dzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0TG9jYXRpb25Ub3RhbHM6IFNlbGVjdG9yPFxuICAgIEwsXG4gICAgRixcbiAgICBNYXA8c3RyaW5nIHwgbnVtYmVyLCBMb2NhdGlvblRvdGFscz4gfCB1bmRlZmluZWRcbiAgPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0TG9jYXRpb25zRm9yWm9vbSxcbiAgICB0aGlzLmdldFNvcnRlZEFnZ3JlZ2F0ZWRGaWx0ZXJlZEZsb3dzLFxuICAgIHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbnNTZXQsXG4gICAgdGhpcy5nZXRMb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgKGxvY2F0aW9ucywgZmxvd3MsIHNlbGVjdGVkTG9jYXRpb25zU2V0LCBsb2NhdGlvbkZpbHRlck1vZGUpID0+IHtcbiAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0b3RhbHMgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgTG9jYXRpb25Ub3RhbHM+KCk7XG4gICAgICBjb25zdCBhZGQgPSAoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGQ6IFBhcnRpYWw8TG9jYXRpb25Ub3RhbHM+LFxuICAgICAgKTogTG9jYXRpb25Ub3RhbHMgPT4ge1xuICAgICAgICBjb25zdCBydiA9IHRvdGFscy5nZXQoaWQpID8/IHtcbiAgICAgICAgICBpbmNvbWluZ0NvdW50OiAwLFxuICAgICAgICAgIG91dGdvaW5nQ291bnQ6IDAsXG4gICAgICAgICAgaW50ZXJuYWxDb3VudDogMCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGQuaW5jb21pbmdDb3VudCAhPSBudWxsKSBydi5pbmNvbWluZ0NvdW50ICs9IGQuaW5jb21pbmdDb3VudDtcbiAgICAgICAgaWYgKGQub3V0Z29pbmdDb3VudCAhPSBudWxsKSBydi5vdXRnb2luZ0NvdW50ICs9IGQub3V0Z29pbmdDb3VudDtcbiAgICAgICAgaWYgKGQuaW50ZXJuYWxDb3VudCAhPSBudWxsKSBydi5pbnRlcm5hbENvdW50ICs9IGQuaW50ZXJuYWxDb3VudDtcbiAgICAgICAgcmV0dXJuIHJ2O1xuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmbG93cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pc0Zsb3dJblNlbGVjdGlvbihmLCBzZWxlY3RlZExvY2F0aW9uc1NldCwgbG9jYXRpb25GaWx0ZXJNb2RlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5JZCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmKTtcbiAgICAgICAgICBjb25zdCBkZXN0SWQgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGYpO1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShmKTtcbiAgICAgICAgICBpZiAob3JpZ2luSWQgPT09IGRlc3RJZCkge1xuICAgICAgICAgICAgdG90YWxzLnNldChvcmlnaW5JZCwgYWRkKG9yaWdpbklkLCB7aW50ZXJuYWxDb3VudDogY291bnR9KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvdGFscy5zZXQob3JpZ2luSWQsIGFkZChvcmlnaW5JZCwge291dGdvaW5nQ291bnQ6IGNvdW50fSkpO1xuICAgICAgICAgICAgdG90YWxzLnNldChkZXN0SWQsIGFkZChkZXN0SWQsIHtpbmNvbWluZ0NvdW50OiBjb3VudH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0b3RhbHM7XG4gICAgfSxcbiAgKTtcblxuICBnZXRMb2NhdGlvbnNUcmVlOiBTZWxlY3RvcjxMLCBGLCBLREJ1c2hUcmVlPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0TG9jYXRpb25zRm9yWm9vbSxcbiAgICAobG9jYXRpb25zKSA9PiB7XG4gICAgICBpZiAoIWxvY2F0aW9ucykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBLREJ1c2goXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbG9jYXRpb25zLFxuICAgICAgICAobG9jYXRpb246IEwgfCBDbHVzdGVyTm9kZSkgPT5cbiAgICAgICAgICBsbmdYKHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uTG9uKGxvY2F0aW9uKSksXG4gICAgICAgIChsb2NhdGlvbjogTCB8IENsdXN0ZXJOb2RlKSA9PlxuICAgICAgICAgIGxhdFkodGhpcy5hY2Nlc3NvcnMuZ2V0TG9jYXRpb25MYXQobG9jYXRpb24pKSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBfZ2V0TG9jYXRpb25JZHNJblZpZXdwb3J0OiBTZWxlY3RvcjxMLCBGLCBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbnNUcmVlLFxuICAgICAgdGhpcy5nZXRWaWV3cG9ydEJvdW5kaW5nQm94LFxuICAgICAgKHRyZWU6IEtEQnVzaFRyZWUsIGJib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuX2dldExvY2F0aW9uc0luQmJveEluZGljZXModHJlZSwgYmJveCk7XG4gICAgICAgIGlmIChpZHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNldChcbiAgICAgICAgICAgIGlkcy5tYXAoKGlkeDogbnVtYmVyKSA9PiB0cmVlLnBvaW50c1tpZHhdLmlkKSBhcyBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRMb2NhdGlvbklkc0luVmlld3BvcnQ6IFNlbGVjdG9yPEwsIEYsIFNldDxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3JDcmVhdG9yKFxuICAgICAgZGVmYXVsdE1lbW9pemUsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAoXG4gICAgICAgIHMxOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgczI6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChzMSA9PT0gczIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChzMS5zaXplICE9PSBzMi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzMSkgaWYgKCFzMi5oYXMoaXRlbSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICkoXG4gICAgICB0aGlzLl9nZXRMb2NhdGlvbklkc0luVmlld3BvcnQsXG4gICAgICAobG9jYXRpb25JZHM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGlmICghbG9jYXRpb25JZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbklkcztcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRUb3RhbFVuZmlsdGVyZWRDb3VudDogU2VsZWN0b3I8TCwgRiwgbnVtYmVyIHwgdW5kZWZpbmVkPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAoZmxvd3MpID0+IHtcbiAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gZmxvd3MucmVkdWNlKFxuICAgICAgICAobSwgZmxvdykgPT4gbSArIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoZmxvdyksXG4gICAgICAgIDAsXG4gICAgICApO1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0VG90YWxGaWx0ZXJlZENvdW50OiBTZWxlY3RvcjxMLCBGLCBudW1iZXIgfCB1bmRlZmluZWQ+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRTb3J0ZWRBZ2dyZWdhdGVkRmlsdGVyZWRGbG93cyxcbiAgICB0aGlzLmdldFNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgIHRoaXMuZ2V0TG9jYXRpb25GaWx0ZXJNb2RlLFxuICAgIChmbG93cywgc2VsZWN0ZWRMb2NhdGlvblNldCwgbG9jYXRpb25GaWx0ZXJNb2RlKSA9PiB7XG4gICAgICBpZiAoIWZsb3dzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY291bnQgPSBmbG93cy5yZWR1Y2UoKG0sIGZsb3cpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNGbG93SW5TZWxlY3Rpb24oZmxvdywgc2VsZWN0ZWRMb2NhdGlvblNldCwgbG9jYXRpb25GaWx0ZXJNb2RlKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbSArIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoZmxvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9LCAwKTtcbiAgICAgIHJldHVybiBjb3VudDtcbiAgICB9LFxuICApO1xuXG4gIF9nZXRMb2NhdGlvblRvdGFsc0V4dGVudDogU2VsZWN0b3I8TCwgRiwgW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0TG9jYXRpb25Ub3RhbHMsIChsb2NhdGlvblRvdGFscykgPT5cbiAgICAgIGNhbGNMb2NhdGlvblRvdGFsc0V4dGVudChsb2NhdGlvblRvdGFscywgdW5kZWZpbmVkKSxcbiAgICApO1xuXG4gIF9nZXRMb2NhdGlvblRvdGFsc0ZvclZpZXdwb3J0RXh0ZW50OiBTZWxlY3RvcjxcbiAgICBMLFxuICAgIEYsXG4gICAgW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZFxuICA+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICB0aGlzLmdldExvY2F0aW9uSWRzSW5WaWV3cG9ydCxcbiAgICAobG9jYXRpb25Ub3RhbHMsIGxvY2F0aW9uc0luVmlld3BvcnQpID0+XG4gICAgICBjYWxjTG9jYXRpb25Ub3RhbHNFeHRlbnQobG9jYXRpb25Ub3RhbHMsIGxvY2F0aW9uc0luVmlld3BvcnQpLFxuICApO1xuXG4gIGdldExvY2F0aW9uVG90YWxzRXh0ZW50ID0gKFxuICAgIHN0YXRlOiBGbG93bWFwU3RhdGUsXG4gICAgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+LFxuICApOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoc3RhdGUuc2V0dGluZ3MuYWRhcHRpdmVTY2FsZXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TG9jYXRpb25Ub3RhbHNGb3JWaWV3cG9ydEV4dGVudChzdGF0ZSwgcHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TG9jYXRpb25Ub3RhbHNFeHRlbnQoc3RhdGUsIHByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgZ2V0Rmxvd3NGb3JGbG93bWFwTGF5ZXI6IFNlbGVjdG9yPEwsIEYsIChGIHwgQWdncmVnYXRlRmxvdylbXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRTb3J0ZWRBZ2dyZWdhdGVkRmlsdGVyZWRGbG93cyxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25JZHNJblZpZXdwb3J0LFxuICAgICAgdGhpcy5nZXRTZWxlY3RlZExvY2F0aW9uc1NldCxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25GaWx0ZXJNb2RlLFxuICAgICAgdGhpcy5nZXRNYXhUb3BGbG93c0Rpc3BsYXlOdW0sXG4gICAgICAoXG4gICAgICAgIGZsb3dzLFxuICAgICAgICBsb2NhdGlvbklkc0luVmlld3BvcnQsXG4gICAgICAgIHNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgICAgICBsb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgICAgIG1heFRvcEZsb3dzRGlzcGxheU51bSxcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoIWZsb3dzIHx8ICFsb2NhdGlvbklkc0luVmlld3BvcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBpY2tlZDogKEYgfCBBZ2dyZWdhdGVGbG93KVtdID0gW107XG4gICAgICAgIGxldCBwaWNrZWRDb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBsb2NhdGlvbklkc0luVmlld3BvcnQuaGFzKG9yaWdpbikgfHxcbiAgICAgICAgICAgIGxvY2F0aW9uSWRzSW5WaWV3cG9ydC5oYXMoZGVzdClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5pc0Zsb3dJblNlbGVjdGlvbihcbiAgICAgICAgICAgICAgICBmbG93LFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uRmlsdGVyTW9kZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChvcmlnaW4gIT09IGRlc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBleGNsdWRlIHNlbGYtbG9vcHNcbiAgICAgICAgICAgICAgICBwaWNrZWQucHVzaChmbG93KTtcbiAgICAgICAgICAgICAgICBwaWNrZWRDb3VudCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE9ubHkga2VlcCB0b3BcbiAgICAgICAgICBpZiAocGlja2VkQ291bnQgPiBtYXhUb3BGbG93c0Rpc3BsYXlOdW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFzc3VtaW5nIHRoZXkgYXJlIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyLFxuICAgICAgICAvLyB3ZSBuZWVkIGFzY2VuZGluZyBmb3IgcmVuZGVyaW5nXG4gICAgICAgIHJldHVybiBwaWNrZWQucmV2ZXJzZSgpO1xuICAgICAgfSxcbiAgICApO1xuXG4gIF9nZXRGbG93TWFnbml0dWRlRXh0ZW50OiBTZWxlY3RvcjxMLCBGLCBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldFNvcnRlZEFnZ3JlZ2F0ZWRGaWx0ZXJlZEZsb3dzLFxuICAgICAgdGhpcy5nZXRTZWxlY3RlZExvY2F0aW9uc1NldCxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25GaWx0ZXJNb2RlLFxuICAgICAgKGZsb3dzLCBzZWxlY3RlZExvY2F0aW9uc1NldCwgbG9jYXRpb25GaWx0ZXJNb2RlKSA9PiB7XG4gICAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBydjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIGZsb3dzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGYpICE9PVxuICAgICAgICAgICAgICB0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGYpICYmXG4gICAgICAgICAgICB0aGlzLmlzRmxvd0luU2VsZWN0aW9uKGYsIHNlbGVjdGVkTG9jYXRpb25zU2V0LCBsb2NhdGlvbkZpbHRlck1vZGUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoZik7XG4gICAgICAgICAgICBpZiAocnYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICBydiA9IFtjb3VudCwgY291bnRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNvdW50IDwgcnZbMF0pIHJ2WzBdID0gY291bnQ7XG4gICAgICAgICAgICAgIGlmIChjb3VudCA+IHJ2WzFdKSBydlsxXSA9IGNvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnY7XG4gICAgICB9LFxuICAgICk7XG5cbiAgX2dldEFkYXB0aXZlRmxvd01hZ25pdHVkZUV4dGVudDogU2VsZWN0b3I8XG4gICAgTCxcbiAgICBGLFxuICAgIFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWRcbiAgPiA9IGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0Rmxvd3NGb3JGbG93bWFwTGF5ZXIsIChmbG93cykgPT4ge1xuICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcnYgPSBleHRlbnQoZmxvd3MsIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUpO1xuICAgIHJldHVybiBydlswXSAhPT0gdW5kZWZpbmVkICYmIHJ2WzFdICE9PSB1bmRlZmluZWQgPyBydiA6IHVuZGVmaW5lZDtcbiAgfSk7XG5cbiAgZ2V0Rmxvd01hZ25pdHVkZUV4dGVudCA9IChcbiAgICBzdGF0ZTogRmxvd21hcFN0YXRlLFxuICAgIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPixcbiAgKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHN0YXRlLnNldHRpbmdzLmFkYXB0aXZlU2NhbGVzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEFkYXB0aXZlRmxvd01hZ25pdHVkZUV4dGVudChzdGF0ZSwgcHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Rmxvd01hZ25pdHVkZUV4dGVudChzdGF0ZSwgcHJvcHMpO1xuICAgIH1cbiAgfTtcblxuICBnZXRMb2NhdGlvbk1heEFic1RvdGFsR2V0dGVyID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICAobG9jYXRpb25Ub3RhbHMpID0+IHtcbiAgICAgIHJldHVybiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gbG9jYXRpb25Ub3RhbHM/LmdldChsb2NhdGlvbklkKTtcbiAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICAgIE1hdGguYWJzKHRvdGFsLmluY29taW5nQ291bnQgKyB0b3RhbC5pbnRlcm5hbENvdW50KSxcbiAgICAgICAgICBNYXRoLmFicyh0b3RhbC5vdXRnb2luZ0NvdW50ICsgdG90YWwuaW50ZXJuYWxDb3VudCksXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0Rmxvd1RoaWNrbmVzc1NjYWxlID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRGbG93TWFnbml0dWRlRXh0ZW50LFxuICAgIGdldEZsb3dUaGlja25lc3NTY2FsZSxcbiAgKTtcblxuICBnZXRDaXJjbGVTaXplU2NhbGUgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldE1heExvY2F0aW9uQ2lyY2xlU2l6ZSxcbiAgICB0aGlzLmdldExvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICB0aGlzLmdldExvY2F0aW9uVG90YWxzRXh0ZW50LFxuICAgIChtYXhMb2NhdGlvbkNpcmNsZVNpemUsIGxvY2F0aW9uVG90YWxzRW5hYmxlZCwgbG9jYXRpb25Ub3RhbHNFeHRlbnQpID0+IHtcbiAgICAgIGlmICghbG9jYXRpb25Ub3RhbHNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBtYXhMb2NhdGlvbkNpcmNsZVNpemU7XG4gICAgICB9XG4gICAgICBpZiAoIWxvY2F0aW9uVG90YWxzRXh0ZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHNjYWxlU3FydCgpXG4gICAgICAgIC5yYW5nZShbMCwgbWF4TG9jYXRpb25DaXJjbGVTaXplXSlcbiAgICAgICAgLmRvbWFpbihbXG4gICAgICAgICAgMCxcbiAgICAgICAgICAvLyBzaG91bGQgc3VwcG9ydCBkaWZmIG1vZGUgdG9vXG4gICAgICAgICAgTWF0aC5tYXguYXBwbHkoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbG9jYXRpb25Ub3RhbHNFeHRlbnQubWFwKCh4OiBudW1iZXIgfCB1bmRlZmluZWQpID0+XG4gICAgICAgICAgICAgIE1hdGguYWJzKHggfHwgMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0SW5DaXJjbGVTaXplR2V0dGVyID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDaXJjbGVTaXplU2NhbGUsXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICAoY2lyY2xlU2l6ZVNjYWxlLCBsb2NhdGlvblRvdGFscykgPT4ge1xuICAgICAgcmV0dXJuIChsb2NhdGlvbklkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdG90YWwgPSBsb2NhdGlvblRvdGFscz8uZ2V0KGxvY2F0aW9uSWQpO1xuICAgICAgICBpZiAodG90YWwgJiYgY2lyY2xlU2l6ZVNjYWxlKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNpcmNsZVNpemVTY2FsZShcbiAgICAgICAgICAgICAgTWF0aC5hYnModG90YWwuaW5jb21pbmdDb3VudCArIHRvdGFsLmludGVybmFsQ291bnQpLFxuICAgICAgICAgICAgKSB8fCAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH07XG4gICAgfSxcbiAgKTtcblxuICBnZXRPdXRDaXJjbGVTaXplR2V0dGVyID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDaXJjbGVTaXplU2NhbGUsXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICAoY2lyY2xlU2l6ZVNjYWxlLCBsb2NhdGlvblRvdGFscykgPT4ge1xuICAgICAgcmV0dXJuIChsb2NhdGlvbklkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdG90YWwgPSBsb2NhdGlvblRvdGFscz8uZ2V0KGxvY2F0aW9uSWQpO1xuICAgICAgICBpZiAodG90YWwgJiYgY2lyY2xlU2l6ZVNjYWxlKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNpcmNsZVNpemVTY2FsZShcbiAgICAgICAgICAgICAgTWF0aC5hYnModG90YWwub3V0Z29pbmdDb3VudCArIHRvdGFsLmludGVybmFsQ291bnQpLFxuICAgICAgICAgICAgKSB8fCAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH07XG4gICAgfSxcbiAgKTtcblxuICBnZXRTb3J0ZWRMb2NhdGlvbnNGb3Jab29tOiBTZWxlY3RvcjxMLCBGLCBMW10gfCBDbHVzdGVyTm9kZVtdIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldExvY2F0aW9uc0Zvclpvb20sXG4gICAgICB0aGlzLmdldEluQ2lyY2xlU2l6ZUdldHRlcixcbiAgICAgIHRoaXMuZ2V0T3V0Q2lyY2xlU2l6ZUdldHRlcixcbiAgICAgIChsb2NhdGlvbnMsIGdldEluQ2lyY2xlU2l6ZSwgZ2V0T3V0Q2lyY2xlU2l6ZSkgPT4ge1xuICAgICAgICBpZiAoIWxvY2F0aW9ucykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbmV4dExvY2F0aW9ucyA9IFsuLi5sb2NhdGlvbnNdIGFzIExbXSB8IENsdXN0ZXJOb2RlW107XG4gICAgICAgIHJldHVybiBuZXh0TG9jYXRpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZEEgPSB0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGEpO1xuICAgICAgICAgIGNvbnN0IGlkQiA9IHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uSWQoYik7XG4gICAgICAgICAgcmV0dXJuIGFzY2VuZGluZyhcbiAgICAgICAgICAgIE1hdGgubWF4KGdldEluQ2lyY2xlU2l6ZShpZEEpLCBnZXRPdXRDaXJjbGVTaXplKGlkQSkpLFxuICAgICAgICAgICAgTWF0aC5tYXgoZ2V0SW5DaXJjbGVTaXplKGlkQiksIGdldE91dENpcmNsZVNpemUoaWRCKSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0TG9jYXRpb25zRm9yRmxvd21hcExheWVyOiBTZWxlY3RvcjxcbiAgICBMLFxuICAgIEYsXG4gICAgQXJyYXk8TCB8IENsdXN0ZXJOb2RlPiB8IHVuZGVmaW5lZFxuICA+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRTb3J0ZWRMb2NhdGlvbnNGb3Jab29tLFxuICAgIC8vIHRoaXMuZ2V0TG9jYXRpb25JZHNJblZpZXdwb3J0LFxuICAgIChcbiAgICAgIGxvY2F0aW9ucyxcbiAgICAgIC8vIGxvY2F0aW9uSWRzSW5WaWV3cG9ydFxuICAgICkgPT4ge1xuICAgICAgLy8gaWYgKCFsb2NhdGlvbnMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBpZiAoIWxvY2F0aW9uSWRzSW5WaWV3cG9ydCkgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgIC8vIGlmIChsb2NhdGlvbklkc0luVmlld3BvcnQuc2l6ZSA9PT0gbG9jYXRpb25zLmxlbmd0aCkgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgIC8vIGNvbnN0IGZpbHRlcmVkID0gW107XG4gICAgICAvLyBmb3IgKGNvbnN0IGxvYyBvZiBsb2NhdGlvbnMpIHtcbiAgICAgIC8vICAgaWYgKGxvY2F0aW9uSWRzSW5WaWV3cG9ydC5oYXMobG9jLmlkKSkge1xuICAgICAgLy8gICAgIGZpbHRlcmVkLnB1c2gobG9jKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgLy8gcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgLy8gcmV0dXJuIGxvY2F0aW9ucy5maWx0ZXIoXG4gICAgICAvLyAgIChsb2M6IEwgfCBDbHVzdGVyTm9kZSkgPT4gbG9jYXRpb25JZHNJblZpZXdwb3J0IS5oYXMobG9jLmlkKVxuICAgICAgLy8gKTtcbiAgICAgIC8vIFRPRE86IHJldHVybiBsb2NhdGlvbiBpbiB2aWV3cG9ydCArIFwiY29ubmVjdGVkXCIgb25lc1xuICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICB9LFxuICApO1xuXG4gIGdldExvY2F0aW9uc0ZvckZsb3dtYXBMYXllckJ5SWQ6IFNlbGVjdG9yPFxuICAgIEwsXG4gICAgRixcbiAgICBNYXA8c3RyaW5nLCBMIHwgQ2x1c3Rlck5vZGU+IHwgdW5kZWZpbmVkXG4gID4gPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldExvY2F0aW9uc0ZvckZsb3dtYXBMYXllciwgKGxvY2F0aW9ucykgPT4ge1xuICAgIGlmICghbG9jYXRpb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb2NhdGlvbnMucmVkdWNlKFxuICAgICAgKG0sIGQpID0+IChtLnNldCh0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGQpLCBkKSwgbSksXG4gICAgICBuZXcgTWFwKCksXG4gICAgKTtcbiAgfSk7XG5cbiAgZ2V0TGF5ZXJzRGF0YTogU2VsZWN0b3I8TCwgRiwgTGF5ZXJzRGF0YT4gPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldExvY2F0aW9uc0ZvckZsb3dtYXBMYXllcixcbiAgICB0aGlzLmdldEZsb3dzRm9yRmxvd21hcExheWVyLFxuICAgIHRoaXMuZ2V0Rmxvd21hcENvbG9yc1JHQkEsXG4gICAgdGhpcy5nZXRMb2NhdGlvbnNGb3JGbG93bWFwTGF5ZXJCeUlkLFxuICAgIHRoaXMuZ2V0TG9jYXRpb25JZHNJblZpZXdwb3J0LFxuICAgIHRoaXMuZ2V0SW5DaXJjbGVTaXplR2V0dGVyLFxuICAgIHRoaXMuZ2V0T3V0Q2lyY2xlU2l6ZUdldHRlcixcbiAgICB0aGlzLmdldEZsb3dUaGlja25lc3NTY2FsZSxcbiAgICB0aGlzLmdldEFuaW1hdGUsXG4gICAgKFxuICAgICAgbG9jYXRpb25zLFxuICAgICAgZmxvd3MsXG4gICAgICBmbG93bWFwQ29sb3JzLFxuICAgICAgbG9jYXRpb25zQnlJZCxcbiAgICAgIGxvY2F0aW9uSWRzSW5WaWV3cG9ydCxcbiAgICAgIGdldEluQ2lyY2xlU2l6ZSxcbiAgICAgIGdldE91dENpcmNsZVNpemUsXG4gICAgICBmbG93VGhpY2tuZXNzU2NhbGUsXG4gICAgICBhbmltYXRpb25FbmFibGVkLFxuICAgICkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVMYXllcnNEYXRhKFxuICAgICAgICBsb2NhdGlvbnMsXG4gICAgICAgIGZsb3dzLFxuICAgICAgICBmbG93bWFwQ29sb3JzLFxuICAgICAgICBsb2NhdGlvbnNCeUlkLFxuICAgICAgICBsb2NhdGlvbklkc0luVmlld3BvcnQsXG4gICAgICAgIGdldEluQ2lyY2xlU2l6ZSxcbiAgICAgICAgZ2V0T3V0Q2lyY2xlU2l6ZSxcbiAgICAgICAgZmxvd1RoaWNrbmVzc1NjYWxlLFxuICAgICAgICBhbmltYXRpb25FbmFibGVkLFxuICAgICAgKTtcbiAgICB9LFxuICApO1xuXG4gIHByZXBhcmVMYXllcnNEYXRhKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPik6IExheWVyc0RhdGEge1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IHRoaXMuZ2V0TG9jYXRpb25zRm9yRmxvd21hcExheWVyKHN0YXRlLCBwcm9wcykgfHwgW107XG4gICAgY29uc3QgZmxvd3MgPSB0aGlzLmdldEZsb3dzRm9yRmxvd21hcExheWVyKHN0YXRlLCBwcm9wcykgfHwgW107XG4gICAgY29uc3QgZmxvd21hcENvbG9ycyA9IHRoaXMuZ2V0Rmxvd21hcENvbG9yc1JHQkEoc3RhdGUsIHByb3BzKTtcbiAgICBjb25zdCBsb2NhdGlvbnNCeUlkID0gdGhpcy5nZXRMb2NhdGlvbnNGb3JGbG93bWFwTGF5ZXJCeUlkKHN0YXRlLCBwcm9wcyk7XG4gICAgY29uc3QgbG9jYXRpb25JZHNJblZpZXdwb3J0ID0gdGhpcy5nZXRMb2NhdGlvbklkc0luVmlld3BvcnQoc3RhdGUsIHByb3BzKTtcbiAgICBjb25zdCBnZXRJbkNpcmNsZVNpemUgPSB0aGlzLmdldEluQ2lyY2xlU2l6ZUdldHRlcihzdGF0ZSwgcHJvcHMpO1xuICAgIGNvbnN0IGdldE91dENpcmNsZVNpemUgPSB0aGlzLmdldE91dENpcmNsZVNpemVHZXR0ZXIoc3RhdGUsIHByb3BzKTtcbiAgICBjb25zdCBmbG93VGhpY2tuZXNzU2NhbGUgPSB0aGlzLmdldEZsb3dUaGlja25lc3NTY2FsZShzdGF0ZSwgcHJvcHMpO1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlTGF5ZXJzRGF0YShcbiAgICAgIGxvY2F0aW9ucyxcbiAgICAgIGZsb3dzLFxuICAgICAgZmxvd21hcENvbG9ycyxcbiAgICAgIGxvY2F0aW9uc0J5SWQsXG4gICAgICBsb2NhdGlvbklkc0luVmlld3BvcnQsXG4gICAgICBnZXRJbkNpcmNsZVNpemUsXG4gICAgICBnZXRPdXRDaXJjbGVTaXplLFxuICAgICAgZmxvd1RoaWNrbmVzc1NjYWxlLFxuICAgICAgc3RhdGUuc2V0dGluZ3MuYW5pbWF0aW9uRW5hYmxlZCxcbiAgICApO1xuICB9XG5cbiAgX3ByZXBhcmVMYXllcnNEYXRhKFxuICAgIGxvY2F0aW9uczogKEwgfCBDbHVzdGVyTm9kZSlbXSB8IHVuZGVmaW5lZCxcbiAgICBmbG93czogKEYgfCBBZ2dyZWdhdGVGbG93KVtdIHwgdW5kZWZpbmVkLFxuICAgIGZsb3dtYXBDb2xvcnM6IERpZmZDb2xvcnNSR0JBIHwgQ29sb3JzUkdCQSxcbiAgICBsb2NhdGlvbnNCeUlkOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBMIHwgQ2x1c3Rlck5vZGU+IHwgdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uSWRzSW5WaWV3cG9ydDogU2V0PHN0cmluZyB8IG51bWJlcj4gfCB1bmRlZmluZWQsXG4gICAgZ2V0SW5DaXJjbGVTaXplOiAobG9jYXRpb25JZDogc3RyaW5nIHwgbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgZ2V0T3V0Q2lyY2xlU2l6ZTogKGxvY2F0aW9uSWQ6IHN0cmluZyB8IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIGZsb3dUaGlja25lc3NTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPiB8IHVuZGVmaW5lZCxcbiAgICBhbmltYXRpb25FbmFibGVkOiBib29sZWFuLFxuICApOiBMYXllcnNEYXRhIHtcbiAgICBpZiAoIWxvY2F0aW9ucykgbG9jYXRpb25zID0gW107XG4gICAgaWYgKCFmbG93cykgZmxvd3MgPSBbXTtcbiAgICBjb25zdCB7XG4gICAgICBnZXRGbG93T3JpZ2luSWQsXG4gICAgICBnZXRGbG93RGVzdElkLFxuICAgICAgZ2V0Rmxvd01hZ25pdHVkZSxcbiAgICAgIGdldExvY2F0aW9uSWQsXG4gICAgICBnZXRMb2NhdGlvbkxvbixcbiAgICAgIGdldExvY2F0aW9uTGF0LFxuICAgIH0gPSB0aGlzLmFjY2Vzc29ycztcblxuICAgIGNvbnN0IGZsb3dNYWduaXR1ZGVFeHRlbnQgPSBleHRlbnQoZmxvd3MsIChmKSA9PiBnZXRGbG93TWFnbml0dWRlKGYpKSBhcyBbXG4gICAgICBudW1iZXIsXG4gICAgICBudW1iZXIsXG4gICAgXTtcbiAgICBjb25zdCBmbG93Q29sb3JTY2FsZSA9IGdldEZsb3dDb2xvclNjYWxlKFxuICAgICAgZmxvd21hcENvbG9ycyxcbiAgICAgIGZsb3dNYWduaXR1ZGVFeHRlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuXG4gICAgLy8gVXNpbmcgYSBnZW5lcmF0b3IgaGVyZSBoZWxwcyB0byBhdm9pZCBjcmVhdGluZyBpbnRlcm1lZGlhcnkgYXJyYXlzXG4gICAgY29uc3QgY2lyY2xlUG9zaXRpb25zID0gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICB5aWVsZCBnZXRMb2NhdGlvbkxvbihsb2NhdGlvbik7XG4gICAgICAgICAgeWllbGQgZ2V0TG9jYXRpb25MYXQobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICk7XG5cbiAgICAvLyBUT0RPOiBkaWZmIG1vZGVcbiAgICBjb25zdCBjaXJjbGVDb2xvciA9IGlzRGlmZkNvbG9yc1JHQkEoZmxvd21hcENvbG9ycylcbiAgICAgID8gZmxvd21hcENvbG9ycy5wb3NpdGl2ZS5sb2NhdGlvbkNpcmNsZXMuaW5uZXJcbiAgICAgIDogZmxvd21hcENvbG9ycy5sb2NhdGlvbkNpcmNsZXMuaW5uZXI7XG5cbiAgICBjb25zdCBjaXJjbGVDb2xvcnMgPSBVaW50OEFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICB5aWVsZCogY2lyY2xlQ29sb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGluQ2lyY2xlUmFkaWkgPSBGbG9hdDMyQXJyYXkuZnJvbShcbiAgICAgIChmdW5jdGlvbiogKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0TG9jYXRpb25JZChsb2NhdGlvbik7XG4gICAgICAgICAgeWllbGQgbG9jYXRpb25JZHNJblZpZXdwb3J0Py5oYXMoaWQpID8gZ2V0SW5DaXJjbGVTaXplKGlkKSA6IDEuMDtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IG91dENpcmNsZVJhZGlpID0gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldExvY2F0aW9uSWQobG9jYXRpb24pO1xuICAgICAgICAgIHlpZWxkIGxvY2F0aW9uSWRzSW5WaWV3cG9ydD8uaGFzKGlkKSA/IGdldE91dENpcmNsZVNpemUoaWQpIDogMS4wO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2VQb3NpdGlvbnMgPSBGbG9hdDMyQXJyYXkuZnJvbShcbiAgICAgIChmdW5jdGlvbiogKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcbiAgICAgICAgICBjb25zdCBsb2MgPSBsb2NhdGlvbnNCeUlkPy5nZXQoZ2V0Rmxvd09yaWdpbklkKGZsb3cpKTtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxvbihsb2MpIDogMDtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxhdChsb2MpIDogMDtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldFBvc2l0aW9ucyA9IEZsb2F0MzJBcnJheS5mcm9tKFxuICAgICAgKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGNvbnN0IGxvYyA9IGxvY2F0aW9uc0J5SWQ/LmdldChnZXRGbG93RGVzdElkKGZsb3cpKTtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxvbihsb2MpIDogMDtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxhdChsb2MpIDogMDtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IHRoaWNrbmVzc2VzID0gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgeWllbGQgZmxvd1RoaWNrbmVzc1NjYWxlXG4gICAgICAgICAgICA/IGZsb3dUaGlja25lc3NTY2FsZShnZXRGbG93TWFnbml0dWRlKGZsb3cpKSB8fCAwXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgKTtcbiAgICBjb25zdCBlbmRwb2ludE9mZnNldHMgPSBGbG9hdDMyQXJyYXkuZnJvbShcbiAgICAgIChmdW5jdGlvbiogKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5JZCA9IGdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICAgICAgICBjb25zdCBkZXN0SWQgPSBnZXRGbG93RGVzdElkKGZsb3cpO1xuICAgICAgICAgIHlpZWxkIE1hdGgubWF4KGdldEluQ2lyY2xlU2l6ZShvcmlnaW5JZCksIGdldE91dENpcmNsZVNpemUob3JpZ2luSWQpKTtcbiAgICAgICAgICB5aWVsZCBNYXRoLm1heChnZXRJbkNpcmNsZVNpemUoZGVzdElkKSwgZ2V0T3V0Q2lyY2xlU2l6ZShkZXN0SWQpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IGZsb3dMaW5lQ29sb3JzID0gVWludDhBcnJheS5mcm9tKFxuICAgICAgKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIHlpZWxkKiBmbG93Q29sb3JTY2FsZShnZXRGbG93TWFnbml0dWRlKGZsb3cpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhZ2dlcmluZ1ZhbHVlcyA9IGFuaW1hdGlvbkVuYWJsZWRcbiAgICAgID8gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAgICAgKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmxvd3MpIHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICB5aWVsZCBuZXcgYWxlYShgJHtnZXRGbG93T3JpZ2luSWQoZil9LSR7Z2V0Rmxvd0Rlc3RJZChmKX1gKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNpcmNsZUF0dHJpYnV0ZXM6IHtcbiAgICAgICAgbGVuZ3RoOiBsb2NhdGlvbnMubGVuZ3RoLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgZ2V0UG9zaXRpb246IHt2YWx1ZTogY2lyY2xlUG9zaXRpb25zLCBzaXplOiAyfSxcbiAgICAgICAgICBnZXRDb2xvcjoge3ZhbHVlOiBjaXJjbGVDb2xvcnMsIHNpemU6IDR9LFxuICAgICAgICAgIGdldEluUmFkaXVzOiB7dmFsdWU6IGluQ2lyY2xlUmFkaWksIHNpemU6IDF9LFxuICAgICAgICAgIGdldE91dFJhZGl1czoge3ZhbHVlOiBvdXRDaXJjbGVSYWRpaSwgc2l6ZTogMX0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGluZUF0dHJpYnV0ZXM6IHtcbiAgICAgICAgbGVuZ3RoOiBmbG93cy5sZW5ndGgsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBnZXRTb3VyY2VQb3NpdGlvbjoge3ZhbHVlOiBzb3VyY2VQb3NpdGlvbnMsIHNpemU6IDJ9LFxuICAgICAgICAgIGdldFRhcmdldFBvc2l0aW9uOiB7dmFsdWU6IHRhcmdldFBvc2l0aW9ucywgc2l6ZTogMn0sXG4gICAgICAgICAgZ2V0VGhpY2tuZXNzOiB7dmFsdWU6IHRoaWNrbmVzc2VzLCBzaXplOiAxfSxcbiAgICAgICAgICBnZXRDb2xvcjoge3ZhbHVlOiBmbG93TGluZUNvbG9ycywgc2l6ZTogNH0sXG4gICAgICAgICAgZ2V0RW5kcG9pbnRPZmZzZXRzOiB7dmFsdWU6IGVuZHBvaW50T2Zmc2V0cywgc2l6ZTogMn0sXG4gICAgICAgICAgLi4uKHN0YWdnZXJpbmdWYWx1ZXNcbiAgICAgICAgICAgID8ge2dldFN0YWdnZXJpbmc6IHt2YWx1ZTogc3RhZ2dlcmluZ1ZhbHVlcywgc2l6ZTogMX19XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGdldExvY2F0aW9uc0luQmJveChcbiAgICB0cmVlOiBLREJ1c2hUcmVlLFxuICAgIGJib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICApOiBBcnJheTxMPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0cmVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLl9nZXRMb2NhdGlvbnNJbkJib3hJbmRpY2VzKHRyZWUsIGJib3gpLm1hcChcbiAgICAgIChpZHg6IG51bWJlcikgPT4gdHJlZS5wb2ludHNbaWR4XSxcbiAgICApIGFzIEFycmF5PEw+O1xuICB9XG5cbiAgX2dldExvY2F0aW9uc0luQmJveEluZGljZXMoXG4gICAgdHJlZTogS0RCdXNoVHJlZSxcbiAgICBiYm94OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgKSB7XG4gICAgaWYgKCF0cmVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IFtsb24xLCBsYXQxLCBsb24yLCBsYXQyXSA9IGJib3g7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IFtsbmdYKGxvbjEpLCBsYXRZKGxhdDEpLCBsbmdYKGxvbjIpLCBsYXRZKGxhdDIpXTtcbiAgICByZXR1cm4gdHJlZS5yYW5nZShcbiAgICAgIE1hdGgubWluKHgxLCB4MiksXG4gICAgICBNYXRoLm1pbih5MSwgeTIpLFxuICAgICAgTWF0aC5tYXgoeDEsIHgyKSxcbiAgICAgIE1hdGgubWF4KHkxLCB5MiksXG4gICAgKTtcbiAgfVxuXG4gIGlzRmxvd0luU2VsZWN0aW9uKFxuICAgIGZsb3c6IEYgfCBBZ2dyZWdhdGVGbG93LFxuICAgIHNlbGVjdGVkTG9jYXRpb25zU2V0OiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB8IHVuZGVmaW5lZCxcbiAgICBsb2NhdGlvbkZpbHRlck1vZGU/OiBMb2NhdGlvbkZpbHRlck1vZGUsXG4gICkge1xuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICBjb25zdCBkZXN0ID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KTtcbiAgICBpZiAoc2VsZWN0ZWRMb2NhdGlvbnNTZXQpIHtcbiAgICAgIHN3aXRjaCAobG9jYXRpb25GaWx0ZXJNb2RlKSB7XG4gICAgICAgIGNhc2UgTG9jYXRpb25GaWx0ZXJNb2RlLkFMTDpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc2VsZWN0ZWRMb2NhdGlvbnNTZXQuaGFzKG9yaWdpbikgfHwgc2VsZWN0ZWRMb2NhdGlvbnNTZXQuaGFzKGRlc3QpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBMb2NhdGlvbkZpbHRlck1vZGUuQkVUV0VFTjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc2VsZWN0ZWRMb2NhdGlvbnNTZXQuaGFzKG9yaWdpbikgJiYgc2VsZWN0ZWRMb2NhdGlvbnNTZXQuaGFzKGRlc3QpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBMb2NhdGlvbkZpbHRlck1vZGUuSU5DT01JTkc6XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTG9jYXRpb25zU2V0LmhhcyhkZXN0KTtcbiAgICAgICAgY2FzZSBMb2NhdGlvbkZpbHRlck1vZGUuT1VUR09JTkc6XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTG9jYXRpb25zU2V0LmhhcyhvcmlnaW4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGNhbGNMb2NhdGlvblRvdGFscyhcbiAgLy8gICBsb2NhdGlvbnM6IChMIHwgQ2x1c3Rlck5vZGUpW10sXG4gIC8vICAgZmxvd3M6IEZbXSxcbiAgLy8gKTogTG9jYXRpb25zVG90YWxzIHtcbiAgLy8gICByZXR1cm4gZmxvd3MucmVkdWNlKFxuICAvLyAgICAgKGFjYzogTG9jYXRpb25zVG90YWxzLCBjdXJyKSA9PiB7XG4gIC8vICAgICAgIGNvbnN0IG9yaWdpbklkID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGN1cnIpO1xuICAvLyAgICAgICBjb25zdCBkZXN0SWQgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGN1cnIpO1xuICAvLyAgICAgICBjb25zdCBtYWduaXR1ZGUgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGN1cnIpO1xuICAvLyAgICAgICBpZiAob3JpZ2luSWQgPT09IGRlc3RJZCkge1xuICAvLyAgICAgICAgIGFjYy5pbnRlcm5hbFtvcmlnaW5JZF0gPSAoYWNjLmludGVybmFsW29yaWdpbklkXSB8fCAwKSArIG1hZ25pdHVkZTtcbiAgLy8gICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICBhY2Mub3V0Z29pbmdbb3JpZ2luSWRdID0gKGFjYy5vdXRnb2luZ1tvcmlnaW5JZF0gfHwgMCkgKyBtYWduaXR1ZGU7XG4gIC8vICAgICAgICAgYWNjLmluY29taW5nW2Rlc3RJZF0gPSAoYWNjLmluY29taW5nW2Rlc3RJZF0gfHwgMCkgKyBtYWduaXR1ZGU7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgICAgcmV0dXJuIGFjYztcbiAgLy8gICAgIH0sXG4gIC8vICAgICB7aW5jb21pbmc6IHt9LCBvdXRnb2luZzoge30sIGludGVybmFsOiB7fX0sXG4gIC8vICAgKTtcbiAgLy8gfVxufVxuXG5mdW5jdGlvbiBjYWxjTG9jYXRpb25Ub3RhbHNFeHRlbnQoXG4gIGxvY2F0aW9uVG90YWxzOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBMb2NhdGlvblRvdGFscz4gfCB1bmRlZmluZWQsXG4gIGxvY2F0aW9uSWRzSW5WaWV3cG9ydDogU2V0PHN0cmluZyB8IG51bWJlcj4gfCB1bmRlZmluZWQsXG4pIHtcbiAgaWYgKCFsb2NhdGlvblRvdGFscykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHJ2OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtcbiAgICBpZCxcbiAgICB7aW5jb21pbmdDb3VudCwgb3V0Z29pbmdDb3VudCwgaW50ZXJuYWxDb3VudH0sXG4gIF0gb2YgbG9jYXRpb25Ub3RhbHMuZW50cmllcygpKSB7XG4gICAgaWYgKGxvY2F0aW9uSWRzSW5WaWV3cG9ydCA9PSBudWxsIHx8IGxvY2F0aW9uSWRzSW5WaWV3cG9ydC5oYXMoaWQpKSB7XG4gICAgICBjb25zdCBsbyA9IE1hdGgubWluKFxuICAgICAgICBpbmNvbWluZ0NvdW50ICsgaW50ZXJuYWxDb3VudCxcbiAgICAgICAgb3V0Z29pbmdDb3VudCArIGludGVybmFsQ291bnQsXG4gICAgICAgIGludGVybmFsQ291bnQsXG4gICAgICApO1xuICAgICAgY29uc3QgaGkgPSBNYXRoLm1heChcbiAgICAgICAgaW5jb21pbmdDb3VudCArIGludGVybmFsQ291bnQsXG4gICAgICAgIG91dGdvaW5nQ291bnQgKyBpbnRlcm5hbENvdW50LFxuICAgICAgICBpbnRlcm5hbENvdW50LFxuICAgICAgKTtcbiAgICAgIGlmICghcnYpIHtcbiAgICAgICAgcnYgPSBbbG8sIGhpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsbyA8IHJ2WzBdKSBydlswXSA9IGxvO1xuICAgICAgICBpZiAoaGkgPiBydlsxXSkgcnZbMV0gPSBoaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2O1xufVxuXG4vLyBsb25naXR1ZGUvbGF0aXR1ZGUgdG8gc3BoZXJpY2FsIG1lcmNhdG9yIGluIFswLi4xXSByYW5nZVxuZnVuY3Rpb24gbG5nWChsbmc6IG51bWJlcikge1xuICByZXR1cm4gbG5nIC8gMzYwICsgMC41O1xufVxuXG5mdW5jdGlvbiBsYXRZKGxhdDogbnVtYmVyKSB7XG4gIGNvbnN0IHNpbiA9IE1hdGguc2luKChsYXQgKiBNYXRoLlBJKSAvIDE4MCk7XG4gIGNvbnN0IHkgPSAwLjUgLSAoMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkpIC8gTWF0aC5QSTtcbiAgcmV0dXJuIHkgPCAwID8gMCA6IHkgPiAxID8gMSA6IHk7XG59XG5cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZUZsb3dzPEY+KFxuICBmbG93czogRltdLFxuICBmbG93QWNjZXNzb3JzOiBGbG93QWNjZXNzb3JzPEY+LFxuKTogQWdncmVnYXRlRmxvd1tdIHtcbiAgLy8gU3VtIHVwIGZsb3dzIHdpdGggc2FtZSBvcmlnaW4sIGRlc3RcbiAgY29uc3QgYnlPcmlnaW5EZXN0ID0gcm9sbHVwKFxuICAgIGZsb3dzLFxuICAgIChmZjogRltdKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW4gPSBmbG93QWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmZlswXSk7XG4gICAgICBjb25zdCBkZXN0ID0gZmxvd0FjY2Vzc29ycy5nZXRGbG93RGVzdElkKGZmWzBdKTtcbiAgICAgIC8vIGNvbnN0IGNvbG9yID0gZmZbMF0uY29sb3I7XG4gICAgICBjb25zdCBydjogQWdncmVnYXRlRmxvdyA9IHtcbiAgICAgICAgYWdncmVnYXRlOiB0cnVlLFxuICAgICAgICBvcmlnaW4sXG4gICAgICAgIGRlc3QsXG4gICAgICAgIGNvdW50OiBmZi5yZWR1Y2UoKG0sIGYpID0+IHtcbiAgICAgICAgICBjb25zdCBjb3VudCA9IGZsb3dBY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShmKTtcbiAgICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICAgIGlmICghaXNOYU4oY291bnQpICYmIGlzRmluaXRlKGNvdW50KSkgcmV0dXJuIG0gKyBjb3VudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH0sIDApLFxuICAgICAgICAvLyB0aW1lOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgLy8gaWYgKGNvbG9yKSBydi5jb2xvciA9IGNvbG9yO1xuICAgICAgcmV0dXJuIHJ2O1xuICAgIH0sXG4gICAgZmxvd0FjY2Vzc29ycy5nZXRGbG93T3JpZ2luSWQsXG4gICAgZmxvd0FjY2Vzc29ycy5nZXRGbG93RGVzdElkLFxuICApO1xuXG4gIGNvbnN0IHJ2OiBBZ2dyZWdhdGVGbG93W10gPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZXMgb2YgYnlPcmlnaW5EZXN0LnZhbHVlcygpKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMudmFsdWVzKCkpIHtcbiAgICAgIHJ2LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnY7XG59XG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIHRvIGF1Z21lbnQgaG92ZXIgcGlja2luZyBpbmZvIHNvIHRoYXQgd2UgY2FuIGRpc3BsYWNlIGxvY2F0aW9uIHRvb2x0aXBcbiAqIEBwYXJhbSBjaXJjbGVBdHRyaWJ1dGVzXG4gKiBAcGFyYW0gaW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleChcbiAgY2lyY2xlQXR0cmlidXRlczogRmxvd0NpcmNsZXNMYXllckF0dHJpYnV0ZXMsXG4gIGluZGV4OiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCB7Z2V0SW5SYWRpdXMsIGdldE91dFJhZGl1c30gPSBjaXJjbGVBdHRyaWJ1dGVzLmF0dHJpYnV0ZXM7XG4gIHJldHVybiBNYXRoLm1heChnZXRJblJhZGl1cy52YWx1ZVtpbmRleF0sIGdldE91dFJhZGl1cy52YWx1ZVtpbmRleF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYXRpb25Db29yZHNCeUluZGV4KFxuICBjaXJjbGVBdHRyaWJ1dGVzOiBGbG93Q2lyY2xlc0xheWVyQXR0cmlidXRlcyxcbiAgaW5kZXg6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCB7Z2V0UG9zaXRpb259ID0gY2lyY2xlQXR0cmlidXRlcy5hdHRyaWJ1dGVzO1xuICByZXR1cm4gW2dldFBvc2l0aW9uLnZhbHVlW2luZGV4ICogMl0sIGdldFBvc2l0aW9uLnZhbHVlW2luZGV4ICogMiArIDFdXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZsb3dMaW5lQXR0cmlidXRlc0J5SW5kZXgoXG4gIGxpbmVBdHRyaWJ1dGVzOiBGbG93TGluZXNMYXllckF0dHJpYnV0ZXMsXG4gIGluZGV4OiBudW1iZXIsXG4pOiBGbG93TGluZXNMYXllckF0dHJpYnV0ZXMge1xuICBjb25zdCB7XG4gICAgZ2V0Q29sb3IsXG4gICAgZ2V0RW5kcG9pbnRPZmZzZXRzLFxuICAgIGdldFNvdXJjZVBvc2l0aW9uLFxuICAgIGdldFRhcmdldFBvc2l0aW9uLFxuICAgIGdldFRoaWNrbmVzcyxcbiAgICBnZXRTdGFnZ2VyaW5nLFxuICB9ID0gbGluZUF0dHJpYnV0ZXMuYXR0cmlidXRlcztcbiAgcmV0dXJuIHtcbiAgICBsZW5ndGg6IDEsXG4gICAgYXR0cmlidXRlczoge1xuICAgICAgZ2V0Q29sb3I6IHtcbiAgICAgICAgdmFsdWU6IGdldENvbG9yLnZhbHVlLnN1YmFycmF5KGluZGV4ICogNCwgKGluZGV4ICsgMSkgKiA0KSxcbiAgICAgICAgc2l6ZTogNCxcbiAgICAgIH0sXG4gICAgICBnZXRFbmRwb2ludE9mZnNldHM6IHtcbiAgICAgICAgdmFsdWU6IGdldEVuZHBvaW50T2Zmc2V0cy52YWx1ZS5zdWJhcnJheShpbmRleCAqIDIsIChpbmRleCArIDEpICogMiksXG4gICAgICAgIHNpemU6IDIsXG4gICAgICB9LFxuICAgICAgZ2V0U291cmNlUG9zaXRpb246IHtcbiAgICAgICAgdmFsdWU6IGdldFNvdXJjZVBvc2l0aW9uLnZhbHVlLnN1YmFycmF5KGluZGV4ICogMiwgKGluZGV4ICsgMSkgKiAyKSxcbiAgICAgICAgc2l6ZTogMixcbiAgICAgIH0sXG4gICAgICBnZXRUYXJnZXRQb3NpdGlvbjoge1xuICAgICAgICB2YWx1ZTogZ2V0VGFyZ2V0UG9zaXRpb24udmFsdWUuc3ViYXJyYXkoaW5kZXggKiAyLCAoaW5kZXggKyAxKSAqIDIpLFxuICAgICAgICBzaXplOiAyLFxuICAgICAgfSxcbiAgICAgIGdldFRoaWNrbmVzczoge1xuICAgICAgICB2YWx1ZTogZ2V0VGhpY2tuZXNzLnZhbHVlLnN1YmFycmF5KGluZGV4LCBpbmRleCArIDEpLFxuICAgICAgICBzaXplOiAxLFxuICAgICAgfSxcbiAgICAgIC4uLihnZXRTdGFnZ2VyaW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgZ2V0U3RhZ2dlcmluZzoge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0U3RhZ2dlcmluZy52YWx1ZS5zdWJhcnJheShpbmRleCwgaW5kZXggKyAxKSxcbiAgICAgICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCksXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
861
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcFNlbGVjdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9GbG93bWFwU2VsZWN0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDcEUsT0FBTyxFQUFjLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsY0FBYyxHQUVmLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUNMLFVBQVUsRUFFVix3QkFBd0IsRUFFeEIsd0JBQXdCLEdBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxTQUFTLEVBQUUsRUFHaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLGdCQUFnQixHQUNqQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLHlCQUF5QixNQUFNLDZCQUE2QixDQUFDO0FBRXBFLE9BQU8sRUFDTCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHNCQUFzQixHQUN2QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLHlCQUF5QixHQUUxQixNQUFNLFFBQVEsQ0FBQztBQUNoQixPQUFPLEVBWUwscUJBQXFCLEVBRXJCLGtCQUFrQixHQUVuQixNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQVNsQyxNQUFNLENBQUMs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Q0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLEVBQUUsQ0FBQzthQUNSLEVBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2pCLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLEVBQUUsQ0FBQzthQUNSLEVBQ0QsWUFBWSxFQUFFO2dCQUNaLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxFQUFFLENBQUM7YUFDUixJQUNFLENBQUMsYUFBYTtZQUNmLENBQUMsQ0FBQztnQkFDRSxhQUFhLEVBQUU7b0JBQ2IsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLEVBQUUsQ0FBQztpQkFDUjthQUNGO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUNmO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjIgRmxvd21hcEJsdWVcbiAqIENvcHlyaWdodCAyMDE4LTIwMjAgVGVyYWx5dGljcywgbW9kaWZpZWQgYnkgRmxvd21hcEJsdWVcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cblxuaW1wb3J0IHthc2NlbmRpbmcsIGRlc2NlbmRpbmcsIGV4dGVudCwgbWluLCByb2xsdXB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7U2NhbGVMaW5lYXIsIHNjYWxlU3FydH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IEtEQnVzaCBmcm9tICdrZGJ1c2gnO1xuaW1wb3J0IHtcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcixcbiAgZGVmYXVsdE1lbW9pemUsXG4gIFBhcmFtZXRyaWNTZWxlY3Rvcixcbn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHthbGVhfSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7Y2x1c3RlckxvY2F0aW9uc30gZnJvbSAnLi9jbHVzdGVyL2NsdXN0ZXInO1xuaW1wb3J0IHtcbiAgYnVpbGRJbmRleCxcbiAgQ2x1c3RlckluZGV4LFxuICBmaW5kQXBwcm9wcmlhdGVab29tTGV2ZWwsXG4gIExvY2F0aW9uV2VpZ2h0R2V0dGVyLFxuICBtYWtlTG9jYXRpb25XZWlnaHRHZXR0ZXIsXG59IGZyb20gJy4vY2x1c3Rlci9DbHVzdGVySW5kZXgnO1xuaW1wb3J0IGdldENvbG9ycywge1xuICBDb2xvcnNSR0JBLFxuICBEaWZmQ29sb3JzUkdCQSxcbiAgZ2V0Q29sb3JzUkdCQSxcbiAgZ2V0RGlmZkNvbG9yc1JHQkEsXG4gIGdldEZsb3dDb2xvclNjYWxlLFxuICBpc0RpZmZDb2xvcnMsXG4gIGlzRGlmZkNvbG9yc1JHQkEsXG59IGZyb20gJy4vY29sb3JzJztcbmltcG9ydCBGbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzIGZyb20gJy4vRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29ycyc7XG5pbXBvcnQge0Zsb3dtYXBTdGF0ZX0gZnJvbSAnLi9GbG93bWFwU3RhdGUnO1xuaW1wb3J0IHtcbiAgYWRkQ2x1c3Rlck5hbWVzLFxuICBnZXRGbG93VGhpY2tuZXNzU2NhbGUsXG4gIGdldFZpZXdwb3J0Qm91bmRpbmdCb3gsXG59IGZyb20gJy4vc2VsZWN0b3ItZnVuY3Rpb25zJztcbmltcG9ydCB7XG4gIGdldFRpbWVHcmFudWxhcml0eUJ5S2V5LFxuICBnZXRUaW1lR3JhbnVsYXJpdHlCeU9yZGVyLFxuICBnZXRUaW1lR3JhbnVsYXJpdHlGb3JEYXRlLFxuICBUaW1lR3JhbnVsYXJpdHlLZXksXG59IGZyb20gJy4vdGltZSc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGVGbG93LFxuICBDbHVzdGVyLFxuICBDbHVzdGVyTGV2ZWxzLFxuICBDbHVzdGVyTm9kZSxcbiAgQ291bnRCeVRpbWUsXG4gIEZsb3dBY2Nlc3NvcnMsXG4gIEZsb3dDaXJjbGVzTGF5ZXJBdHRyaWJ1dGVzLFxuICBGbG93TGluZXNMYXllckF0dHJpYnV0ZXMsXG4gIEZsb3dtYXBEYXRhLFxuICBGbG93bWFwRGF0YUFjY2Vzc29ycyxcbiAgaXNDbHVzdGVyLFxuICBpc0xvY2F0aW9uQ2x1c3Rlck5vZGUsXG4gIExheWVyc0RhdGEsXG4gIExvY2F0aW9uRmlsdGVyTW9kZSxcbiAgTG9jYXRpb25Ub3RhbHMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBNQVhfQ0xVU1RFUl9aT09NX0xFVkVMID0gMjA7XG50eXBlIEtEQnVzaFRyZWUgPSBhbnk7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdG9yPEwsIEYsIFQ+ID0gUGFyYW1ldHJpY1NlbGVjdG9yPFxuICBGbG93bWFwU3RhdGUsXG4gIEZsb3dtYXBEYXRhPEwsIEY+LFxuICBUXG4+O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbG93bWFwU2VsZWN0b3JzPEwsIEY+IHtcbiAgYWNjZXNzb3JzOiBGbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzPEwsIEY+O1xuXG4gIGNvbnN0cnVjdG9yKGFjY2Vzc29yczogRmxvd21hcERhdGFBY2Nlc3NvcnM8TCwgRj4pIHtcbiAgICB0aGlzLmFjY2Vzc29ycyA9IG5ldyBGbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzKGFjY2Vzc29ycyk7XG4gICAgdGhpcy5zZXRBY2Nlc3NvcnMoYWNjZXNzb3JzKTtcbiAgfVxuXG4gIHNldEFjY2Vzc29ycyhhY2Nlc3NvcnM6IEZsb3dtYXBEYXRhQWNjZXNzb3JzPEwsIEY+KSB7XG4gICAgdGhpcy5hY2Nlc3NvcnMgPSBuZXcgRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29ycyhhY2Nlc3NvcnMpO1xuICB9XG5cbiAgZ2V0Rmxvd3NGcm9tUHJvcHMgPSAoc3RhdGU6IEZsb3dtYXBTdGF0ZSwgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+KSA9PlxuICAgIHByb3BzLmZsb3dzO1xuICBnZXRMb2NhdGlvbnNGcm9tUHJvcHMgPSAoc3RhdGU6IEZsb3dtYXBTdGF0ZSwgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+KSA9PlxuICAgIHByb3BzLmxvY2F0aW9ucztcbiAgZ2V0Q2x1c3RlckxldmVsc0Zyb21Qcm9wcyA9IChcbiAgICBzdGF0ZTogRmxvd21hcFN0YXRlLFxuICAgIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPixcbiAgKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzLmNsdXN0ZXJMZXZlbHM7XG4gIH07XG4gIGdldE1heFRvcEZsb3dzRGlzcGxheU51bSA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+XG4gICAgc3RhdGUuc2V0dGluZ3MubWF4VG9wRmxvd3NEaXNwbGF5TnVtO1xuICBnZXRTZWxlY3RlZExvY2F0aW9ucyA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+XG4gICAgc3RhdGUuZmlsdGVyPy5zZWxlY3RlZExvY2F0aW9ucztcbiAgZ2V0TG9jYXRpb25GaWx0ZXJNb2RlID0gKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPikgPT5cbiAgICBzdGF0ZS5maWx0ZXI/LmxvY2F0aW9uRmlsdGVyTW9kZTtcbiAgZ2V0Q2x1c3RlcmluZ0VuYWJsZWQgPSAoc3RhdGU6IEZsb3dtYXBTdGF0ZSwgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+KSA9PlxuICAgIHN0YXRlLnNldHRpbmdzLmNsdXN0ZXJpbmdFbmFibGVkO1xuICBnZXRMb2NhdGlvblRvdGFsc0VuYWJsZWQgPSAoc3RhdGU6IEZsb3dtYXBTdGF0ZSwgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+KSA9PlxuICAgIHN0YXRlLnNldHRpbmdzLmxvY2F0aW9uVG90YWxzRW5hYmxlZDtcbiAgZ2V0TG9jYXRpb25MYWJlbHNFbmFibGVkID0gKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPikgPT5cbiAgICBzdGF0ZS5zZXR0aW5ncy5sb2NhdGlvbkxhYmVsc0VuYWJsZWQ7XG4gIGdldFpvb20gPSAoc3RhdGU6IEZsb3dtYXBTdGF0ZSwgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+KSA9PlxuICAgIHN0YXRlLnZpZXdwb3J0Lnpvb207XG4gIGdldFZpZXdwb3J0ID0gKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPikgPT5cbiAgICBzdGF0ZS52aWV3cG9ydDtcbiAgZ2V0U2VsZWN0ZWRUaW1lUmFuZ2UgPSAoc3RhdGU6IEZsb3dtYXBTdGF0ZSwgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+KSA9PlxuICAgIHN0YXRlLmZpbHRlcj8uc2VsZWN0ZWRUaW1lUmFuZ2U7XG5cbiAgZ2V0Q29sb3JTY2hlbWU6IFNlbGVjdG9yPEwsIEYsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiA9IChcbiAgICBzdGF0ZTogRmxvd21hcFN0YXRlLFxuICAgIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPixcbiAgKSA9PiBzdGF0ZS5zZXR0aW5ncy5jb2xvclNjaGVtZTtcblxuICBnZXREYXJrTW9kZTogU2VsZWN0b3I8TCwgRiwgYm9vbGVhbj4gPSAoXG4gICAgc3RhdGU6IEZsb3dtYXBTdGF0ZSxcbiAgICBwcm9wczogRmxvd21hcERhdGE8TCwgRj4sXG4gICkgPT4gc3RhdGUuc2V0dGluZ3MuZGFya01vZGU7XG5cbiAgZ2V0RmFkZUVuYWJsZWQ6IFNlbGVjdG9yPEwsIEYsIGJvb2xlYW4+ID0gKFxuICAgIHN0YXRlOiBGbG93bWFwU3RhdGUsXG4gICAgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+LFxuICApID0+IHN0YXRlLnNldHRpbmdzLmZhZGVFbmFibGVkO1xuXG4gIGdldEZhZGVPcGFjaXR5RW5hYmxlZDogU2VsZWN0b3I8TCwgRiwgYm9vbGVhbj4gPSAoXG4gICAgc3RhdGU6IEZsb3dtYXBTdGF0ZSxcbiAgICBwcm9wczogRmxvd21hcERhdGE8TCwgRj4sXG4gICkgPT4gc3RhdGUuc2V0dGluZ3MuZmFkZU9wYWNpdHlFbmFibGVkO1xuXG4gIGdldEZhZGVBbW91bnQ6IFNlbGVjdG9yPEwsIEYsIG51bWJlcj4gPSAoXG4gICAgc3RhdGU6IEZsb3dtYXBTdGF0ZSxcbiAgICBwcm9wczogRmxvd21hcERhdGE8TCwgRj4sXG4gICkgPT4gc3RhdGUuc2V0dGluZ3MuZmFkZUFtb3VudDtcblxuICBnZXRBbmltYXRlOiBTZWxlY3RvcjxMLCBGLCBib29sZWFuPiA9IChcbiAgICBzdGF0ZTogRmxvd21hcFN0YXRlLFxuICAgIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPixcbiAgKSA9PiBzdGF0ZS5zZXR0aW5ncy5hbmltYXRpb25FbmFibGVkO1xuXG4gIGdldEludmFsaWRMb2NhdGlvbklkczogU2VsZWN0b3I8TCwgRiwgKHN0cmluZyB8IG51bWJlcilbXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0TG9jYXRpb25zRnJvbVByb3BzLCAobG9jYXRpb25zKSA9PiB7XG4gICAgICBpZiAoIWxvY2F0aW9ucykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGludmFsaWQgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5hY2Nlc3NvcnMuZ2V0TG9jYXRpb25JZChsb2NhdGlvbik7XG4gICAgICAgIGNvbnN0IGxvbiA9IHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uTG9uKGxvY2F0aW9uKTtcbiAgICAgICAgY29uc3QgbGF0ID0gdGhpcy5hY2Nlc3NvcnMuZ2V0TG9jYXRpb25MYXQobG9jYXRpb24pO1xuICAgICAgICBpZiAoISgtOTAgPD0gbGF0ICYmIGxhdCA8PSA5MCkgfHwgISgtMTgwIDw9IGxvbiAmJiBsb24gPD0gMTgwKSkge1xuICAgICAgICAgIGludmFsaWQucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnZhbGlkLmxlbmd0aCA+IDAgPyBpbnZhbGlkIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gIGdldExvY2F0aW9uczogU2VsZWN0b3I8TCwgRiwgSXRlcmFibGU8TD4gfCB1bmRlZmluZWQ+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRMb2NhdGlvbnNGcm9tUHJvcHMsXG4gICAgdGhpcy5nZXRJbnZhbGlkTG9jYXRpb25JZHMsXG4gICAgKGxvY2F0aW9ucywgaW52YWxpZElkcykgPT4ge1xuICAgICAgaWYgKCFsb2NhdGlvbnMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWludmFsaWRJZHMgfHwgaW52YWxpZElkcy5sZW5ndGggPT09IDApIHJldHVybiBsb2NhdGlvbnM7XG4gICAgICBjb25zdCBpbnZhbGlkID0gbmV3IFNldChpbnZhbGlkSWRzKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkOiBMW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5hY2Nlc3NvcnMuZ2V0TG9jYXRpb25JZChsb2NhdGlvbik7XG4gICAgICAgIGlmICghaW52YWxpZC5oYXMoaWQpKSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaChsb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICB9LFxuICApO1xuXG4gIGdldExvY2F0aW9uSWRzOiBTZWxlY3RvcjxMLCBGLCBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0TG9jYXRpb25zLCAobG9jYXRpb25zKSA9PiB7XG4gICAgICBpZiAoIWxvY2F0aW9ucykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBpZCBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgaWRzLmFkZCh0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGlkKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuXG4gIGdldFNlbGVjdGVkTG9jYXRpb25zU2V0OiBTZWxlY3RvcjxMLCBGLCBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbnMsIChpZHMpID0+XG4gICAgICBpZHMgJiYgaWRzLmxlbmd0aCA+IDAgPyBuZXcgU2V0KGlkcykgOiB1bmRlZmluZWQsXG4gICAgKTtcblxuICBnZXRTb3J0ZWRGbG93c0Zvcktub3duTG9jYXRpb25zOiBTZWxlY3RvcjxMLCBGLCBGW10gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMuZ2V0Rmxvd3NGcm9tUHJvcHMsXG4gICAgICB0aGlzLmdldExvY2F0aW9uSWRzLFxuICAgICAgKGZsb3dzLCBpZHMpID0+IHtcbiAgICAgICAgaWYgKCFpZHMgfHwgIWZsb3dzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcbiAgICAgICAgICBjb25zdCBzcmNJZCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICAgICAgICBjb25zdCBkc3RJZCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dEZXN0SWQoZmxvdyk7XG4gICAgICAgICAgaWYgKGlkcy5oYXMoc3JjSWQpICYmIGlkcy5oYXMoZHN0SWQpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGZsb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWQuc29ydCgoYTogRiwgYjogRikgPT5cbiAgICAgICAgICBkZXNjZW5kaW5nKFxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShhKSksXG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmFjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGIpKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICApO1xuXG4gIGdldEFjdHVhbFRpbWVFeHRlbnQ6IFNlbGVjdG9yPEwsIEYsIFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucywgKGZsb3dzKSA9PiB7XG4gICAgICBpZiAoIWZsb3dzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgbGV0IHN0YXJ0ID0gbnVsbDtcbiAgICAgIGxldCBlbmQgPSBudWxsO1xuICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93VGltZShmbG93KTtcbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+IHRpbWUpIHN0YXJ0ID0gdGltZTtcbiAgICAgICAgICBpZiAoZW5kID09IG51bGwgfHwgZW5kIDwgdGltZSkgZW5kID0gdGltZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIFtzdGFydCwgZW5kXTtcbiAgICB9KTtcblxuICBnZXRUaW1lR3JhbnVsYXJpdHlLZXk6IFNlbGVjdG9yPEwsIEYsIFRpbWVHcmFudWxhcml0eUtleSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRTb3J0ZWRGbG93c0Zvcktub3duTG9jYXRpb25zLFxuICAgICAgdGhpcy5nZXRBY3R1YWxUaW1lRXh0ZW50LFxuICAgICAgKGZsb3dzLCB0aW1lRXh0ZW50KSA9PiB7XG4gICAgICAgIGlmICghZmxvd3MgfHwgIXRpbWVFeHRlbnQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgbWluT3JkZXIgPSBtaW4oZmxvd3MsIChkKSA9PiB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dUaW1lKGQpO1xuICAgICAgICAgIHJldHVybiB0ID8gZ2V0VGltZUdyYW51bGFyaXR5Rm9yRGF0ZSh0KS5vcmRlciA6IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobWluT3JkZXIgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdGltZUdyYW51bGFyaXR5ID0gZ2V0VGltZUdyYW51bGFyaXR5QnlPcmRlcihtaW5PcmRlcik7XG4gICAgICAgIHJldHVybiB0aW1lR3JhbnVsYXJpdHkgPyB0aW1lR3JhbnVsYXJpdHkua2V5IDogdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICApO1xuXG4gIGdldFRpbWVFeHRlbnQ6IFNlbGVjdG9yPEwsIEYsIFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZD4gPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldEFjdHVhbFRpbWVFeHRlbnQsXG4gICAgdGhpcy5nZXRUaW1lR3JhbnVsYXJpdHlLZXksXG4gICAgKHRpbWVFeHRlbnQsIHRpbWVHcmFudWxhcml0eUtleSkgPT4ge1xuICAgICAgY29uc3QgdGltZUdyYW51bGFyaXR5ID0gdGltZUdyYW51bGFyaXR5S2V5XG4gICAgICAgID8gZ2V0VGltZUdyYW51bGFyaXR5QnlLZXkodGltZUdyYW51bGFyaXR5S2V5KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghdGltZUV4dGVudCB8fCAhdGltZUdyYW51bGFyaXR5Py5pbnRlcnZhbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHtpbnRlcnZhbH0gPSB0aW1lR3JhbnVsYXJpdHk7XG4gICAgICByZXR1cm4gW3RpbWVFeHRlbnRbMF0sIGludGVydmFsLm9mZnNldChpbnRlcnZhbC5mbG9vcih0aW1lRXh0ZW50WzFdKSwgMSldO1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9uc0ZpbHRlcmVkQnlUaW1lOiBTZWxlY3RvcjxcbiAgICBMLFxuICAgIEYsXG4gICAgRltdIHwgdW5kZWZpbmVkXG4gID4gPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldFNvcnRlZEZsb3dzRm9yS25vd25Mb2NhdGlvbnMsXG4gICAgdGhpcy5nZXRUaW1lRXh0ZW50LFxuICAgIHRoaXMuZ2V0U2VsZWN0ZWRUaW1lUmFuZ2UsXG4gICAgKGZsb3dzLCB0aW1lRXh0ZW50LCB0aW1lUmFuZ2UpID0+IHtcbiAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgICF0aW1lRXh0ZW50IHx8XG4gICAgICAgICF0aW1lUmFuZ2UgfHxcbiAgICAgICAgKHRpbWVFeHRlbnRbMF0gPT09IHRpbWVSYW5nZVswXSAmJiB0aW1lRXh0ZW50WzFdID09PSB0aW1lUmFuZ2VbMV0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZsb3dzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsb3dzLmZpbHRlcigoZmxvdykgPT4ge1xuICAgICAgICBjb25zdCB0aW1lID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd1RpbWUoZmxvdyk7XG4gICAgICAgIHJldHVybiB0aW1lICYmIHRpbWVSYW5nZVswXSA8PSB0aW1lICYmIHRpbWUgPCB0aW1lUmFuZ2VbMV07XG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuXG4gIGdldExvY2F0aW9uc0hhdmluZ0Zsb3dzOiBTZWxlY3RvcjxMLCBGLCBJdGVyYWJsZTxMPiB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRTb3J0ZWRGbG93c0Zvcktub3duTG9jYXRpb25zLFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbnMsXG4gICAgICAoZmxvd3MsIGxvY2F0aW9ucykgPT4ge1xuICAgICAgICBpZiAoIWxvY2F0aW9ucyB8fCAhZmxvd3MpIHJldHVybiBsb2NhdGlvbnM7XG4gICAgICAgIGNvbnN0IHdpdGhGbG93cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgd2l0aEZsb3dzLmFkZCh0aGlzLmFjY2Vzc29ycy5nZXRGbG93T3JpZ2luSWQoZmxvdykpO1xuICAgICAgICAgIHdpdGhGbG93cy5hZGQodGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICBpZiAod2l0aEZsb3dzLmhhcyh0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGxvY2F0aW9uKSkpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkLnB1c2gobG9jYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0TG9jYXRpb25zQnlJZDogU2VsZWN0b3I8TCwgRiwgTWFwPHN0cmluZyB8IG51bWJlciwgTD4gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldExvY2F0aW9uc0hhdmluZ0Zsb3dzLCAobG9jYXRpb25zKSA9PiB7XG4gICAgICBpZiAoIWxvY2F0aW9ucykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGxvY2F0aW9uc0J5SWQgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgTD4oKTtcbiAgICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgIGxvY2F0aW9uc0J5SWQuc2V0KHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uSWQobG9jYXRpb24pLCBsb2NhdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbG9jYXRpb25zQnlJZDtcbiAgICB9KTtcblxuICBnZXRMb2NhdGlvbldlaWdodEdldHRlcjogU2VsZWN0b3I8TCwgRiwgTG9jYXRpb25XZWlnaHRHZXR0ZXIgfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldFNvcnRlZEZsb3dzRm9yS25vd25Mb2NhdGlvbnMsIChmbG93cykgPT4ge1xuICAgICAgaWYgKCFmbG93cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGdldExvY2F0aW9uV2VpZ2h0ID0gbWFrZUxvY2F0aW9uV2VpZ2h0R2V0dGVyKFxuICAgICAgICBmbG93cyxcbiAgICAgICAgdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd21hcERhdGFBY2Nlc3NvcnMoKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZ2V0TG9jYXRpb25XZWlnaHQ7XG4gICAgfSk7XG5cbiAgZ2V0Q2x1c3RlckxldmVsczogU2VsZWN0b3I8TCwgRiwgQ2x1c3RlckxldmVscyB8IHVuZGVmaW5lZD4gPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldENsdXN0ZXJMZXZlbHNGcm9tUHJvcHMsXG4gICAgdGhpcy5nZXRMb2NhdGlvbnNIYXZpbmdGbG93cyxcbiAgICB0aGlzLmdldExvY2F0aW9uV2VpZ2h0R2V0dGVyLFxuICAgIChjbHVzdGVyTGV2ZWxzRnJvbVByb3BzLCBsb2NhdGlvbnMsIGdldExvY2F0aW9uV2VpZ2h0KSA9PiB7XG4gICAgICBpZiAoY2x1c3RlckxldmVsc0Zyb21Qcm9wcykgcmV0dXJuIGNsdXN0ZXJMZXZlbHNGcm9tUHJvcHM7XG4gICAgICBpZiAoIWxvY2F0aW9ucyB8fCAhZ2V0TG9jYXRpb25XZWlnaHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjbHVzdGVyTGV2ZWxzID0gY2x1c3RlckxvY2F0aW9ucyhcbiAgICAgICAgbG9jYXRpb25zLFxuICAgICAgICB0aGlzLmFjY2Vzc29ycy5nZXRGbG93bWFwRGF0YUFjY2Vzc29ycygpLFxuICAgICAgICBnZXRMb2NhdGlvbldlaWdodCxcbiAgICAgICAge1xuICAgICAgICAgIG1heFpvb206IE1BWF9DTFVTVEVSX1pPT01fTEVWRUwsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNsdXN0ZXJMZXZlbHM7XG4gICAgfSxcbiAgKTtcblxuICBnZXRDbHVzdGVySW5kZXg6IFNlbGVjdG9yPEwsIEYsIENsdXN0ZXJJbmRleDxGPiB8IHVuZGVmaW5lZD4gPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldExvY2F0aW9uc0J5SWQsXG4gICAgdGhpcy5nZXRMb2NhdGlvbldlaWdodEdldHRlcixcbiAgICB0aGlzLmdldENsdXN0ZXJMZXZlbHMsXG4gICAgKGxvY2F0aW9uc0J5SWQsIGdldExvY2F0aW9uV2VpZ2h0LCBjbHVzdGVyTGV2ZWxzKSA9PiB7XG4gICAgICBpZiAoIWxvY2F0aW9uc0J5SWQgfHwgIWdldExvY2F0aW9uV2VpZ2h0IHx8ICFjbHVzdGVyTGV2ZWxzKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjbHVzdGVySW5kZXggPSBidWlsZEluZGV4PEY+KGNsdXN0ZXJMZXZlbHMpO1xuICAgICAgLy8gQWRkaW5nIG1lYW5pbmdmdWwgbmFtZXNcbiAgICAgIGFkZENsdXN0ZXJOYW1lcyhcbiAgICAgICAgY2x1c3RlckluZGV4LFxuICAgICAgICBjbHVzdGVyTGV2ZWxzLFxuICAgICAgICBsb2NhdGlvbnNCeUlkLFxuICAgICAgICB0aGlzLmFjY2Vzc29ycy5nZXRGbG93bWFwRGF0YUFjY2Vzc29ycygpLFxuICAgICAgICBnZXRMb2NhdGlvbldlaWdodCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gY2x1c3RlckluZGV4O1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0QXZhaWxhYmxlQ2x1c3Rlclpvb21MZXZlbHMgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldENsdXN0ZXJJbmRleCxcbiAgICB0aGlzLmdldFNlbGVjdGVkTG9jYXRpb25zLFxuICAgIChjbHVzdGVySW5kZXgsIHNlbGVjdGVkTG9jYXRpb25zKTogbnVtYmVyW10gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgaWYgKCFjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGV0IG1heFpvb20gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICBsZXQgbWluWm9vbSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICAgICAgY29uc3QgYWRqdXN0ID0gKHpvbmVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVySW5kZXguZ2V0Q2x1c3RlckJ5SWQoem9uZUlkKTtcbiAgICAgICAgaWYgKGNsdXN0ZXIpIHtcbiAgICAgICAgICBtaW5ab29tID0gTWF0aC5tYXgobWluWm9vbSwgY2x1c3Rlci56b29tKTtcbiAgICAgICAgICBtYXhab29tID0gTWF0aC5taW4obWF4Wm9vbSwgY2x1c3Rlci56b29tKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB6b29tID0gY2x1c3RlckluZGV4LmdldE1pblpvb21Gb3JMb2NhdGlvbih6b25lSWQpO1xuICAgICAgICAgIG1pblpvb20gPSBNYXRoLm1heChtaW5ab29tLCB6b29tKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKHNlbGVjdGVkTG9jYXRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc2VsZWN0ZWRMb2NhdGlvbnMpIHtcbiAgICAgICAgICBhZGp1c3QoaWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjbHVzdGVySW5kZXguYXZhaWxhYmxlWm9vbUxldmVscy5maWx0ZXIoXG4gICAgICAgIChsZXZlbCkgPT4gbWluWm9vbSA8PSBsZXZlbCAmJiBsZXZlbCA8PSBtYXhab29tLFxuICAgICAgKTtcbiAgICB9LFxuICApO1xuXG4gIF9nZXRDbHVzdGVyWm9vbTogU2VsZWN0b3I8TCwgRiwgbnVtYmVyIHwgdW5kZWZpbmVkPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0Q2x1c3RlckluZGV4LFxuICAgIHRoaXMuZ2V0Wm9vbSxcbiAgICB0aGlzLmdldEF2YWlsYWJsZUNsdXN0ZXJab29tTGV2ZWxzLFxuICAgIChjbHVzdGVySW5kZXgsIG1hcFpvb20sIGF2YWlsYWJsZUNsdXN0ZXJab29tTGV2ZWxzKSA9PiB7XG4gICAgICBpZiAoIWNsdXN0ZXJJbmRleCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXZhaWxhYmxlQ2x1c3Rlclpvb21MZXZlbHMgfHwgbWFwWm9vbSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsdXN0ZXJab29tID0gZmluZEFwcHJvcHJpYXRlWm9vbUxldmVsKFxuICAgICAgICBhdmFpbGFibGVDbHVzdGVyWm9vbUxldmVscyxcbiAgICAgICAgbWFwWm9vbSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gY2x1c3Rlclpvb207XG4gICAgfSxcbiAgKTtcblxuICBnZXRDbHVzdGVyWm9vbSA9IChzdGF0ZTogRmxvd21hcFN0YXRlLCBwcm9wczogRmxvd21hcERhdGE8TCwgRj4pID0+IHtcbiAgICBjb25zdCB7c2V0dGluZ3N9ID0gc3RhdGU7XG4gICAgaWYgKCFzZXR0aW5ncy5jbHVzdGVyaW5nRW5hYmxlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc2V0dGluZ3MuY2x1c3RlcmluZ0F1dG8gfHwgc2V0dGluZ3MuY2x1c3RlcmluZ0xldmVsID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRDbHVzdGVyWm9vbShzdGF0ZSwgcHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0dGluZ3MuY2x1c3RlcmluZ0xldmVsO1xuICB9O1xuXG4gIGdldExvY2F0aW9uc0ZvclNlYXJjaEJveDogU2VsZWN0b3I8TCwgRiwgKEwgfCBDbHVzdGVyKVtdIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldENsdXN0ZXJpbmdFbmFibGVkLFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbnNIYXZpbmdGbG93cyxcbiAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbnMsXG4gICAgICB0aGlzLmdldENsdXN0ZXJab29tLFxuICAgICAgdGhpcy5nZXRDbHVzdGVySW5kZXgsXG4gICAgICAoXG4gICAgICAgIGNsdXN0ZXJpbmdFbmFibGVkLFxuICAgICAgICBsb2NhdGlvbnMsXG4gICAgICAgIHNlbGVjdGVkTG9jYXRpb25zLFxuICAgICAgICBjbHVzdGVyWm9vbSxcbiAgICAgICAgY2x1c3RlckluZGV4LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmICghbG9jYXRpb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmVzdWx0OiAoTCB8IENsdXN0ZXIpW10gPSBBcnJheS5mcm9tKGxvY2F0aW9ucyk7XG4gICAgICAgIC8vIGlmIChjbHVzdGVyaW5nRW5hYmxlZCkge1xuICAgICAgICAvLyAgIGlmIChjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHpvb21JdGVtcyA9IGNsdXN0ZXJJbmRleC5nZXRDbHVzdGVyTm9kZXNGb3IoY2x1c3Rlclpvb20pO1xuICAgICAgICAvLyAgICAgaWYgKHpvb21JdGVtcykge1xuICAgICAgICAvLyAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHpvb21JdGVtcy5maWx0ZXIoaXNDbHVzdGVyKSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKGNsdXN0ZXJJbmRleCAmJiBzZWxlY3RlZExvY2F0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHRvQXBwZW5kID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzZWxlY3RlZExvY2F0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJJbmRleC5nZXRDbHVzdGVyQnlJZChpZCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNsdXN0ZXIgJiZcbiAgICAgICAgICAgICAgIXJlc3VsdC5maW5kKFxuICAgICAgICAgICAgICAgIChkKSA9PlxuICAgICAgICAgICAgICAgICAgKGlzTG9jYXRpb25DbHVzdGVyTm9kZShkKVxuICAgICAgICAgICAgICAgICAgICA/IGQuaWRcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGQpKSA9PT0gaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0b0FwcGVuZC5wdXNoKGNsdXN0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodG9BcHBlbmQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0b0FwcGVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0RGlmZk1vZGU6IFNlbGVjdG9yPEwsIEYsIGJvb2xlYW4+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRGbG93c0Zyb21Qcm9wcyxcbiAgICAoZmxvd3MpID0+IHtcbiAgICAgIGlmIChmbG93cykge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmxvd3MpIHtcbiAgICAgICAgICBpZiAodGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShmKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICk7XG5cbiAgX2dldEZsb3dtYXBDb2xvcnMgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldERpZmZNb2RlLFxuICAgIHRoaXMuZ2V0Q29sb3JTY2hlbWUsXG4gICAgdGhpcy5nZXREYXJrTW9kZSxcbiAgICB0aGlzLmdldEZhZGVFbmFibGVkLFxuICAgIHRoaXMuZ2V0RmFkZU9wYWNpdHlFbmFibGVkLFxuICAgIHRoaXMuZ2V0RmFkZUFtb3VudCxcbiAgICB0aGlzLmdldEFuaW1hdGUsXG4gICAgZ2V0Q29sb3JzLFxuICApO1xuXG4gIGdldEZsb3dtYXBDb2xvcnNSR0JBID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5fZ2V0Rmxvd21hcENvbG9ycyxcbiAgICAoZmxvd21hcENvbG9ycykgPT4ge1xuICAgICAgcmV0dXJuIGlzRGlmZkNvbG9ycyhmbG93bWFwQ29sb3JzKVxuICAgICAgICA/IGdldERpZmZDb2xvcnNSR0JBKGZsb3dtYXBDb2xvcnMpXG4gICAgICAgIDogZ2V0Q29sb3JzUkdCQShmbG93bWFwQ29sb3JzKTtcbiAgICB9LFxuICApO1xuXG4gIGdldFVua25vd25Mb2NhdGlvbnM6IFNlbGVjdG9yPEwsIEYsIFNldDxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldExvY2F0aW9uSWRzLFxuICAgICAgdGhpcy5nZXRGbG93c0Zyb21Qcm9wcyxcbiAgICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAgIChpZHMsIGZsb3dzLCBmbG93c0Zvcktub3duTG9jYXRpb25zKSA9PiB7XG4gICAgICAgIGlmICghaWRzIHx8ICFmbG93cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZsb3dzRm9yS25vd25Mb2NhdGlvbnNcbiAgICAgICAgICAvLyAmJiBmbG93cy5sZW5ndGggPT09IGZsb3dzRm9yS25vd25Mb2NhdGlvbnMubGVuZ3RoXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGlmICghaWRzLmhhcyh0aGlzLmFjY2Vzc29ycy5nZXRGbG93T3JpZ2luSWQoZmxvdykpKVxuICAgICAgICAgICAgbWlzc2luZy5hZGQodGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGZsb3cpKTtcbiAgICAgICAgICBpZiAoIWlkcy5oYXModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KSkpXG4gICAgICAgICAgICBtaXNzaW5nLmFkZCh0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGZsb3cpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlzc2luZztcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRTb3J0ZWRBZ2dyZWdhdGVkRmlsdGVyZWRGbG93czogU2VsZWN0b3I8XG4gICAgTCxcbiAgICBGLFxuICAgIChGIHwgQWdncmVnYXRlRmxvdylbXSB8IHVuZGVmaW5lZFxuICA+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDbHVzdGVySW5kZXgsXG4gICAgdGhpcy5nZXRDbHVzdGVyaW5nRW5hYmxlZCxcbiAgICB0aGlzLmdldFNvcnRlZEZsb3dzRm9yS25vd25Mb2NhdGlvbnNGaWx0ZXJlZEJ5VGltZSxcbiAgICB0aGlzLmdldENsdXN0ZXJab29tLFxuICAgIHRoaXMuZ2V0VGltZUV4dGVudCxcbiAgICAoY2x1c3RlclRyZWUsIGlzQ2x1c3RlcmluZ0VuYWJsZWQsIGZsb3dzLCBjbHVzdGVyWm9vbSwgdGltZUV4dGVudCkgPT4ge1xuICAgICAgaWYgKCFmbG93cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBhZ2dyZWdhdGVkOiAoRiB8IEFnZ3JlZ2F0ZUZsb3cpW107XG4gICAgICBpZiAoaXNDbHVzdGVyaW5nRW5hYmxlZCAmJiBjbHVzdGVyVHJlZSAmJiBjbHVzdGVyWm9vbSAhPSBudWxsKSB7XG4gICAgICAgIGFnZ3JlZ2F0ZWQgPSBjbHVzdGVyVHJlZS5hZ2dyZWdhdGVGbG93cyhcbiAgICAgICAgICAvLyBUT0RPOiBhZ2dyZWdhdGUgYWNyb3NzIHRpbWVcbiAgICAgICAgICAvLyB0aW1lRXh0ZW50ICE9IG51bGxcbiAgICAgICAgICAvLyAgID8gYWdncmVnYXRlRmxvd3MoZmxvd3MpIC8vIGNsdXN0ZXJUcmVlLmFnZ3JlZ2F0ZUZsb3dzIHdvbid0IGFnZ3JlZ2F0ZSB1bmNsdXN0ZXJlZCBhY3Jvc3MgdGltZVxuICAgICAgICAgIC8vICAgOiBmbG93cyxcbiAgICAgICAgICBmbG93cyxcbiAgICAgICAgICBjbHVzdGVyWm9vbSxcbiAgICAgICAgICB0aGlzLmFjY2Vzc29ycy5nZXRGbG93bWFwRGF0YUFjY2Vzc29ycygpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWdncmVnYXRlZCA9IGFnZ3JlZ2F0ZUZsb3dzKFxuICAgICAgICAgIGZsb3dzLFxuICAgICAgICAgIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dtYXBEYXRhQWNjZXNzb3JzKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhZ2dyZWdhdGVkLnNvcnQoKGEsIGIpID0+XG4gICAgICAgIGRlc2NlbmRpbmcoXG4gICAgICAgICAgTWF0aC5hYnModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShhKSksXG4gICAgICAgICAgTWF0aC5hYnModGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShiKSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZWQ7XG4gICAgfSxcbiAgKTtcblxuICBnZXRFeHBhbmRlZFNlbGVjdGVkTG9jYXRpb25zU2V0OiBTZWxlY3RvcjxMLCBGLCBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRDbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbnNTZXQsXG4gICAgICB0aGlzLmdldENsdXN0ZXJJbmRleCxcbiAgICAgIChjbHVzdGVyaW5nRW5hYmxlZCwgc2VsZWN0ZWRMb2NhdGlvbnMsIGNsdXN0ZXJJbmRleCkgPT4ge1xuICAgICAgICBpZiAoIXNlbGVjdGVkTG9jYXRpb25zIHx8ICFjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbklkIG9mIHNlbGVjdGVkTG9jYXRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJJbmRleC5nZXRDbHVzdGVyQnlJZChsb2NhdGlvbklkKTtcbiAgICAgICAgICBpZiAoY2x1c3Rlcikge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBjbHVzdGVySW5kZXguZXhwYW5kQ2x1c3RlcihjbHVzdGVyKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LmFkZChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5hZGQobG9jYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0VG90YWxDb3VudHNCeVRpbWU6IFNlbGVjdG9yPEwsIEYsIENvdW50QnlUaW1lW10gfCB1bmRlZmluZWQ+ID1cbiAgICBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAgIHRoaXMuZ2V0VGltZUdyYW51bGFyaXR5S2V5LFxuICAgICAgdGhpcy5nZXRUaW1lRXh0ZW50LFxuICAgICAgdGhpcy5nZXRFeHBhbmRlZFNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgICAoXG4gICAgICAgIGZsb3dzLFxuICAgICAgICB0aW1lR3JhbnVsYXJpdHlLZXksXG4gICAgICAgIHRpbWVFeHRlbnQsXG4gICAgICAgIHNlbGVjdGVkTG9jYXRpb25TZXQsXG4gICAgICAgIGxvY2F0aW9uRmlsdGVyTW9kZSxcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lR3JhbnVsYXJpdHkgPSB0aW1lR3JhbnVsYXJpdHlLZXlcbiAgICAgICAgICA/IGdldFRpbWVHcmFudWxhcml0eUJ5S2V5KHRpbWVHcmFudWxhcml0eUtleSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFmbG93cyB8fCAhdGltZUdyYW51bGFyaXR5IHx8ICF0aW1lRXh0ZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBieVRpbWUgPSBmbG93cy5yZWR1Y2UoKG0sIGZsb3cpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzRmxvd0luU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBmbG93LFxuICAgICAgICAgICAgICBzZWxlY3RlZExvY2F0aW9uU2V0LFxuICAgICAgICAgICAgICBsb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aW1lR3JhbnVsYXJpdHlcbiAgICAgICAgICAgICAgLmludGVydmFsKHRoaXMuYWNjZXNzb3JzLmdldEZsb3dUaW1lKGZsb3cpKVxuICAgICAgICAgICAgICAuZ2V0VGltZSgpO1xuICAgICAgICAgICAgbS5zZXQoXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgKG0uZ2V0KGtleSkgPz8gMCkgKyB0aGlzLmFjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGZsb3cpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH0sIG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCkpO1xuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGJ5VGltZS5lbnRyaWVzKCkpLm1hcCgoW21pbGxpcywgY291bnRdKSA9PiAoe1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKG1pbGxpcyksXG4gICAgICAgICAgY291bnQsXG4gICAgICAgIH0pKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRNYXhMb2NhdGlvbkNpcmNsZVNpemU6IFNlbGVjdG9yPEwsIEYsIG51bWJlcj4gPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldExvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICAobG9jYXRpb25Ub3RhbHNFbmFibGVkKSA9PiAobG9jYXRpb25Ub3RhbHNFbmFibGVkID8gMTcgOiAxKSxcbiAgKTtcblxuICBnZXRWaWV3cG9ydEJvdW5kaW5nQm94OiBTZWxlY3RvcjxMLCBGLCBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRWaWV3cG9ydCxcbiAgICAgIHRoaXMuZ2V0TWF4TG9jYXRpb25DaXJjbGVTaXplLFxuICAgICAgZ2V0Vmlld3BvcnRCb3VuZGluZ0JveCxcbiAgICApO1xuXG4gIGdldExvY2F0aW9uc0Zvclpvb206IFNlbGVjdG9yPEwsIEYsIEl0ZXJhYmxlPEw+IHwgQ2x1c3Rlck5vZGVbXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRDbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25zSGF2aW5nRmxvd3MsXG4gICAgICB0aGlzLmdldENsdXN0ZXJJbmRleCxcbiAgICAgIHRoaXMuZ2V0Q2x1c3Rlclpvb20sXG4gICAgICAoY2x1c3RlcmluZ0VuYWJsZWQsIGxvY2F0aW9uc0hhdmluZ0Zsb3dzLCBjbHVzdGVySW5kZXgsIGNsdXN0ZXJab29tKSA9PiB7XG4gICAgICAgIGlmIChjbHVzdGVyaW5nRW5hYmxlZCAmJiBjbHVzdGVySW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gY2x1c3RlckluZGV4LmdldENsdXN0ZXJOb2Rlc0ZvcihjbHVzdGVyWm9vbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGxvY2F0aW9uc0hhdmluZ0Zsb3dzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0TG9jYXRpb25Ub3RhbHM6IFNlbGVjdG9yPFxuICAgIEwsXG4gICAgRixcbiAgICBNYXA8c3RyaW5nIHwgbnVtYmVyLCBMb2NhdGlvblRvdGFscz4gfCB1bmRlZmluZWRcbiAgPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0TG9jYXRpb25zRm9yWm9vbSxcbiAgICB0aGlzLmdldFNvcnRlZEFnZ3JlZ2F0ZWRGaWx0ZXJlZEZsb3dzLFxuICAgIHRoaXMuZ2V0U2VsZWN0ZWRMb2NhdGlvbnNTZXQsXG4gICAgdGhpcy5nZXRMb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgKGxvY2F0aW9ucywgZmxvd3MsIHNlbGVjdGVkTG9jYXRpb25zU2V0LCBsb2NhdGlvbkZpbHRlck1vZGUpID0+IHtcbiAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0b3RhbHMgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgTG9jYXRpb25Ub3RhbHM+KCk7XG4gICAgICBjb25zdCBhZGQgPSAoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGQ6IFBhcnRpYWw8TG9jYXRpb25Ub3RhbHM+LFxuICAgICAgKTogTG9jYXRpb25Ub3RhbHMgPT4ge1xuICAgICAgICBjb25zdCBydiA9IHRvdGFscy5nZXQoaWQpID8/IHtcbiAgICAgICAgICBpbmNvbWluZ0NvdW50OiAwLFxuICAgICAgICAgIG91dGdvaW5nQ291bnQ6IDAsXG4gICAgICAgICAgaW50ZXJuYWxDb3VudDogMCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGQuaW5jb21pbmdDb3VudCAhPSBudWxsKSBydi5pbmNvbWluZ0NvdW50ICs9IGQuaW5jb21pbmdDb3VudDtcbiAgICAgICAgaWYgKGQub3V0Z29pbmdDb3VudCAhPSBudWxsKSBydi5vdXRnb2luZ0NvdW50ICs9IGQub3V0Z29pbmdDb3VudDtcbiAgICAgICAgaWYgKGQuaW50ZXJuYWxDb3VudCAhPSBudWxsKSBydi5pbnRlcm5hbENvdW50ICs9IGQuaW50ZXJuYWxDb3VudDtcbiAgICAgICAgcmV0dXJuIHJ2O1xuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmbG93cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pc0Zsb3dJblNlbGVjdGlvbihmLCBzZWxlY3RlZExvY2F0aW9uc1NldCwgbG9jYXRpb25GaWx0ZXJNb2RlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5JZCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmKTtcbiAgICAgICAgICBjb25zdCBkZXN0SWQgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGYpO1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd01hZ25pdHVkZShmKTtcbiAgICAgICAgICBpZiAob3JpZ2luSWQgPT09IGRlc3RJZCkge1xuICAgICAgICAgICAgdG90YWxzLnNldChvcmlnaW5JZCwgYWRkKG9yaWdpbklkLCB7aW50ZXJuYWxDb3VudDogY291bnR9KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvdGFscy5zZXQob3JpZ2luSWQsIGFkZChvcmlnaW5JZCwge291dGdvaW5nQ291bnQ6IGNvdW50fSkpO1xuICAgICAgICAgICAgdG90YWxzLnNldChkZXN0SWQsIGFkZChkZXN0SWQsIHtpbmNvbWluZ0NvdW50OiBjb3VudH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0b3RhbHM7XG4gICAgfSxcbiAgKTtcblxuICBnZXRMb2NhdGlvbnNUcmVlOiBTZWxlY3RvcjxMLCBGLCBLREJ1c2hUcmVlPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0TG9jYXRpb25zRm9yWm9vbSxcbiAgICAobG9jYXRpb25zKSA9PiB7XG4gICAgICBpZiAoIWxvY2F0aW9ucykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBLREJ1c2goXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbG9jYXRpb25zLFxuICAgICAgICAobG9jYXRpb246IEwgfCBDbHVzdGVyTm9kZSkgPT5cbiAgICAgICAgICBsbmdYKHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uTG9uKGxvY2F0aW9uKSksXG4gICAgICAgIChsb2NhdGlvbjogTCB8IENsdXN0ZXJOb2RlKSA9PlxuICAgICAgICAgIGxhdFkodGhpcy5hY2Nlc3NvcnMuZ2V0TG9jYXRpb25MYXQobG9jYXRpb24pKSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcblxuICBfZ2V0TG9jYXRpb25JZHNJblZpZXdwb3J0OiBTZWxlY3RvcjxMLCBGLCBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRMb2NhdGlvbnNUcmVlLFxuICAgICAgdGhpcy5nZXRWaWV3cG9ydEJvdW5kaW5nQm94LFxuICAgICAgKHRyZWU6IEtEQnVzaFRyZWUsIGJib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuX2dldExvY2F0aW9uc0luQmJveEluZGljZXModHJlZSwgYmJveCk7XG4gICAgICAgIGlmIChpZHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNldChcbiAgICAgICAgICAgIGlkcy5tYXAoKGlkeDogbnVtYmVyKSA9PiB0cmVlLnBvaW50c1tpZHhdLmlkKSBhcyBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRMb2NhdGlvbklkc0luVmlld3BvcnQ6IFNlbGVjdG9yPEwsIEYsIFNldDxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3JDcmVhdG9yKFxuICAgICAgZGVmYXVsdE1lbW9pemUsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAoXG4gICAgICAgIHMxOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgczI6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChzMSA9PT0gczIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChzMS5zaXplICE9PSBzMi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzMSkgaWYgKCFzMi5oYXMoaXRlbSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICkoXG4gICAgICB0aGlzLl9nZXRMb2NhdGlvbklkc0luVmlld3BvcnQsXG4gICAgICAobG9jYXRpb25JZHM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGlmICghbG9jYXRpb25JZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbklkcztcbiAgICAgIH0sXG4gICAgKTtcblxuICBnZXRUb3RhbFVuZmlsdGVyZWRDb3VudDogU2VsZWN0b3I8TCwgRiwgbnVtYmVyIHwgdW5kZWZpbmVkPiA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZ2V0U29ydGVkRmxvd3NGb3JLbm93bkxvY2F0aW9ucyxcbiAgICAoZmxvd3MpID0+IHtcbiAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gZmxvd3MucmVkdWNlKFxuICAgICAgICAobSwgZmxvdykgPT4gbSArIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoZmxvdyksXG4gICAgICAgIDAsXG4gICAgICApO1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0VG90YWxGaWx0ZXJlZENvdW50OiBTZWxlY3RvcjxMLCBGLCBudW1iZXIgfCB1bmRlZmluZWQ+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRTb3J0ZWRBZ2dyZWdhdGVkRmlsdGVyZWRGbG93cyxcbiAgICB0aGlzLmdldFNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgIHRoaXMuZ2V0TG9jYXRpb25GaWx0ZXJNb2RlLFxuICAgIChmbG93cywgc2VsZWN0ZWRMb2NhdGlvblNldCwgbG9jYXRpb25GaWx0ZXJNb2RlKSA9PiB7XG4gICAgICBpZiAoIWZsb3dzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY291bnQgPSBmbG93cy5yZWR1Y2UoKG0sIGZsb3cpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNGbG93SW5TZWxlY3Rpb24oZmxvdywgc2VsZWN0ZWRMb2NhdGlvblNldCwgbG9jYXRpb25GaWx0ZXJNb2RlKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbSArIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoZmxvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9LCAwKTtcbiAgICAgIHJldHVybiBjb3VudDtcbiAgICB9LFxuICApO1xuXG4gIF9nZXRMb2NhdGlvblRvdGFsc0V4dGVudDogU2VsZWN0b3I8TCwgRiwgW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0TG9jYXRpb25Ub3RhbHMsIChsb2NhdGlvblRvdGFscykgPT5cbiAgICAgIGNhbGNMb2NhdGlvblRvdGFsc0V4dGVudChsb2NhdGlvblRvdGFscywgdW5kZWZpbmVkKSxcbiAgICApO1xuXG4gIF9nZXRMb2NhdGlvblRvdGFsc0ZvclZpZXdwb3J0RXh0ZW50OiBTZWxlY3RvcjxcbiAgICBMLFxuICAgIEYsXG4gICAgW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZFxuICA+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICB0aGlzLmdldExvY2F0aW9uSWRzSW5WaWV3cG9ydCxcbiAgICAobG9jYXRpb25Ub3RhbHMsIGxvY2F0aW9uc0luVmlld3BvcnQpID0+XG4gICAgICBjYWxjTG9jYXRpb25Ub3RhbHNFeHRlbnQobG9jYXRpb25Ub3RhbHMsIGxvY2F0aW9uc0luVmlld3BvcnQpLFxuICApO1xuXG4gIGdldExvY2F0aW9uVG90YWxzRXh0ZW50ID0gKFxuICAgIHN0YXRlOiBGbG93bWFwU3RhdGUsXG4gICAgcHJvcHM6IEZsb3dtYXBEYXRhPEwsIEY+LFxuICApOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoc3RhdGUuc2V0dGluZ3MuYWRhcHRpdmVTY2FsZXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TG9jYXRpb25Ub3RhbHNGb3JWaWV3cG9ydEV4dGVudChzdGF0ZSwgcHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TG9jYXRpb25Ub3RhbHNFeHRlbnQoc3RhdGUsIHByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgZ2V0Rmxvd3NGb3JGbG93bWFwTGF5ZXI6IFNlbGVjdG9yPEwsIEYsIChGIHwgQWdncmVnYXRlRmxvdylbXSB8IHVuZGVmaW5lZD4gPVxuICAgIGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5nZXRTb3J0ZWRBZ2dyZWdhdGVkRmlsdGVyZWRGbG93cyxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25JZHNJblZpZXdwb3J0LFxuICAgICAgdGhpcy5nZXRTZWxlY3RlZExvY2F0aW9uc1NldCxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25GaWx0ZXJNb2RlLFxuICAgICAgdGhpcy5nZXRNYXhUb3BGbG93c0Rpc3BsYXlOdW0sXG4gICAgICAoXG4gICAgICAgIGZsb3dzLFxuICAgICAgICBsb2NhdGlvbklkc0luVmlld3BvcnQsXG4gICAgICAgIHNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgICAgICBsb2NhdGlvbkZpbHRlck1vZGUsXG4gICAgICAgIG1heFRvcEZsb3dzRGlzcGxheU51bSxcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoIWZsb3dzIHx8ICFsb2NhdGlvbklkc0luVmlld3BvcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBpY2tlZDogKEYgfCBBZ2dyZWdhdGVGbG93KVtdID0gW107XG4gICAgICAgIGxldCBwaWNrZWRDb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBsb2NhdGlvbklkc0luVmlld3BvcnQuaGFzKG9yaWdpbikgfHxcbiAgICAgICAgICAgIGxvY2F0aW9uSWRzSW5WaWV3cG9ydC5oYXMoZGVzdClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5pc0Zsb3dJblNlbGVjdGlvbihcbiAgICAgICAgICAgICAgICBmbG93LFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTG9jYXRpb25zU2V0LFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uRmlsdGVyTW9kZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChvcmlnaW4gIT09IGRlc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBleGNsdWRlIHNlbGYtbG9vcHNcbiAgICAgICAgICAgICAgICBwaWNrZWQucHVzaChmbG93KTtcbiAgICAgICAgICAgICAgICBwaWNrZWRDb3VudCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE9ubHkga2VlcCB0b3BcbiAgICAgICAgICBpZiAocGlja2VkQ291bnQgPiBtYXhUb3BGbG93c0Rpc3BsYXlOdW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFzc3VtaW5nIHRoZXkgYXJlIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyLFxuICAgICAgICAvLyB3ZSBuZWVkIGFzY2VuZGluZyBmb3IgcmVuZGVyaW5nXG4gICAgICAgIHJldHVybiBwaWNrZWQucmV2ZXJzZSgpO1xuICAgICAgfSxcbiAgICApO1xuXG4gIF9nZXRGbG93TWFnbml0dWRlRXh0ZW50OiBTZWxlY3RvcjxMLCBGLCBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldFNvcnRlZEFnZ3JlZ2F0ZWRGaWx0ZXJlZEZsb3dzLFxuICAgICAgdGhpcy5nZXRTZWxlY3RlZExvY2F0aW9uc1NldCxcbiAgICAgIHRoaXMuZ2V0TG9jYXRpb25GaWx0ZXJNb2RlLFxuICAgICAgKGZsb3dzLCBzZWxlY3RlZExvY2F0aW9uc1NldCwgbG9jYXRpb25GaWx0ZXJNb2RlKSA9PiB7XG4gICAgICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBydjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIGZsb3dzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGYpICE9PVxuICAgICAgICAgICAgICB0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGYpICYmXG4gICAgICAgICAgICB0aGlzLmlzRmxvd0luU2VsZWN0aW9uKGYsIHNlbGVjdGVkTG9jYXRpb25zU2V0LCBsb2NhdGlvbkZpbHRlck1vZGUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoZik7XG4gICAgICAgICAgICBpZiAocnYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICBydiA9IFtjb3VudCwgY291bnRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNvdW50IDwgcnZbMF0pIHJ2WzBdID0gY291bnQ7XG4gICAgICAgICAgICAgIGlmIChjb3VudCA+IHJ2WzFdKSBydlsxXSA9IGNvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnY7XG4gICAgICB9LFxuICAgICk7XG5cbiAgX2dldEFkYXB0aXZlRmxvd01hZ25pdHVkZUV4dGVudDogU2VsZWN0b3I8XG4gICAgTCxcbiAgICBGLFxuICAgIFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWRcbiAgPiA9IGNyZWF0ZVNlbGVjdG9yKHRoaXMuZ2V0Rmxvd3NGb3JGbG93bWFwTGF5ZXIsIChmbG93cykgPT4ge1xuICAgIGlmICghZmxvd3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcnYgPSBleHRlbnQoZmxvd3MsIHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUpO1xuICAgIHJldHVybiBydlswXSAhPT0gdW5kZWZpbmVkICYmIHJ2WzFdICE9PSB1bmRlZmluZWQgPyBydiA6IHVuZGVmaW5lZDtcbiAgfSk7XG5cbiAgZ2V0Rmxvd01hZ25pdHVkZUV4dGVudCA9IChcbiAgICBzdGF0ZTogRmxvd21hcFN0YXRlLFxuICAgIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPixcbiAgKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHN0YXRlLnNldHRpbmdzLmFkYXB0aXZlU2NhbGVzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEFkYXB0aXZlRmxvd01hZ25pdHVkZUV4dGVudChzdGF0ZSwgcHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Rmxvd01hZ25pdHVkZUV4dGVudChzdGF0ZSwgcHJvcHMpO1xuICAgIH1cbiAgfTtcblxuICBnZXRMb2NhdGlvbk1heEFic1RvdGFsR2V0dGVyID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICAobG9jYXRpb25Ub3RhbHMpID0+IHtcbiAgICAgIHJldHVybiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gbG9jYXRpb25Ub3RhbHM/LmdldChsb2NhdGlvbklkKTtcbiAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICAgIE1hdGguYWJzKHRvdGFsLmluY29taW5nQ291bnQgKyB0b3RhbC5pbnRlcm5hbENvdW50KSxcbiAgICAgICAgICBNYXRoLmFicyh0b3RhbC5vdXRnb2luZ0NvdW50ICsgdG90YWwuaW50ZXJuYWxDb3VudCksXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0Rmxvd1RoaWNrbmVzc1NjYWxlID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRGbG93TWFnbml0dWRlRXh0ZW50LFxuICAgIGdldEZsb3dUaGlja25lc3NTY2FsZSxcbiAgKTtcblxuICBnZXRDaXJjbGVTaXplU2NhbGUgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmdldE1heExvY2F0aW9uQ2lyY2xlU2l6ZSxcbiAgICB0aGlzLmdldExvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICB0aGlzLmdldExvY2F0aW9uVG90YWxzRXh0ZW50LFxuICAgIChtYXhMb2NhdGlvbkNpcmNsZVNpemUsIGxvY2F0aW9uVG90YWxzRW5hYmxlZCwgbG9jYXRpb25Ub3RhbHNFeHRlbnQpID0+IHtcbiAgICAgIGlmICghbG9jYXRpb25Ub3RhbHNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBtYXhMb2NhdGlvbkNpcmNsZVNpemU7XG4gICAgICB9XG4gICAgICBpZiAoIWxvY2F0aW9uVG90YWxzRXh0ZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHNjYWxlU3FydCgpXG4gICAgICAgIC5yYW5nZShbMCwgbWF4TG9jYXRpb25DaXJjbGVTaXplXSlcbiAgICAgICAgLmRvbWFpbihbXG4gICAgICAgICAgMCxcbiAgICAgICAgICAvLyBzaG91bGQgc3VwcG9ydCBkaWZmIG1vZGUgdG9vXG4gICAgICAgICAgTWF0aC5tYXguYXBwbHkoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbG9jYXRpb25Ub3RhbHNFeHRlbnQubWFwKCh4OiBudW1iZXIgfCB1bmRlZmluZWQpID0+XG4gICAgICAgICAgICAgIE1hdGguYWJzKHggfHwgMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgIH0sXG4gICk7XG5cbiAgZ2V0SW5DaXJjbGVTaXplR2V0dGVyID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDaXJjbGVTaXplU2NhbGUsXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICAoY2lyY2xlU2l6ZVNjYWxlLCBsb2NhdGlvblRvdGFscykgPT4ge1xuICAgICAgcmV0dXJuIChsb2NhdGlvbklkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdG90YWwgPSBsb2NhdGlvblRvdGFscz8uZ2V0KGxvY2F0aW9uSWQpO1xuICAgICAgICBpZiAodG90YWwgJiYgY2lyY2xlU2l6ZVNjYWxlKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNpcmNsZVNpemVTY2FsZShcbiAgICAgICAgICAgICAgTWF0aC5hYnModG90YWwuaW5jb21pbmdDb3VudCArIHRvdGFsLmludGVybmFsQ291bnQpLFxuICAgICAgICAgICAgKSB8fCAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH07XG4gICAgfSxcbiAgKTtcblxuICBnZXRPdXRDaXJjbGVTaXplR2V0dGVyID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDaXJjbGVTaXplU2NhbGUsXG4gICAgdGhpcy5nZXRMb2NhdGlvblRvdGFscyxcbiAgICAoY2lyY2xlU2l6ZVNjYWxlLCBsb2NhdGlvblRvdGFscykgPT4ge1xuICAgICAgcmV0dXJuIChsb2NhdGlvbklkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdG90YWwgPSBsb2NhdGlvblRvdGFscz8uZ2V0KGxvY2F0aW9uSWQpO1xuICAgICAgICBpZiAodG90YWwgJiYgY2lyY2xlU2l6ZVNjYWxlKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNpcmNsZVNpemVTY2FsZShcbiAgICAgICAgICAgICAgTWF0aC5hYnModG90YWwub3V0Z29pbmdDb3VudCArIHRvdGFsLmludGVybmFsQ291bnQpLFxuICAgICAgICAgICAgKSB8fCAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH07XG4gICAgfSxcbiAgKTtcblxuICBnZXRTb3J0ZWRMb2NhdGlvbnNGb3Jab29tOiBTZWxlY3RvcjxMLCBGLCBMW10gfCBDbHVzdGVyTm9kZVtdIHwgdW5kZWZpbmVkPiA9XG4gICAgY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmdldExvY2F0aW9uc0Zvclpvb20sXG4gICAgICB0aGlzLmdldEluQ2lyY2xlU2l6ZUdldHRlcixcbiAgICAgIHRoaXMuZ2V0T3V0Q2lyY2xlU2l6ZUdldHRlcixcbiAgICAgIChsb2NhdGlvbnMsIGdldEluQ2lyY2xlU2l6ZSwgZ2V0T3V0Q2lyY2xlU2l6ZSkgPT4ge1xuICAgICAgICBpZiAoIWxvY2F0aW9ucykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbmV4dExvY2F0aW9ucyA9IFsuLi5sb2NhdGlvbnNdIGFzIExbXSB8IENsdXN0ZXJOb2RlW107XG4gICAgICAgIHJldHVybiBuZXh0TG9jYXRpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZEEgPSB0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGEpO1xuICAgICAgICAgIGNvbnN0IGlkQiA9IHRoaXMuYWNjZXNzb3JzLmdldExvY2F0aW9uSWQoYik7XG4gICAgICAgICAgcmV0dXJuIGFzY2VuZGluZyhcbiAgICAgICAgICAgIE1hdGgubWF4KGdldEluQ2lyY2xlU2l6ZShpZEEpLCBnZXRPdXRDaXJjbGVTaXplKGlkQSkpLFxuICAgICAgICAgICAgTWF0aC5tYXgoZ2V0SW5DaXJjbGVTaXplKGlkQiksIGdldE91dENpcmNsZVNpemUoaWRCKSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgZ2V0TG9jYXRpb25zRm9yRmxvd21hcExheWVyOiBTZWxlY3RvcjxcbiAgICBMLFxuICAgIEYsXG4gICAgQXJyYXk8TCB8IENsdXN0ZXJOb2RlPiB8IHVuZGVmaW5lZFxuICA+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRTb3J0ZWRMb2NhdGlvbnNGb3Jab29tLFxuICAgIC8vIHRoaXMuZ2V0TG9jYXRpb25JZHNJblZpZXdwb3J0LFxuICAgIChcbiAgICAgIGxvY2F0aW9ucyxcbiAgICAgIC8vIGxvY2F0aW9uSWRzSW5WaWV3cG9ydFxuICAgICkgPT4ge1xuICAgICAgLy8gaWYgKCFsb2NhdGlvbnMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBpZiAoIWxvY2F0aW9uSWRzSW5WaWV3cG9ydCkgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgIC8vIGlmIChsb2NhdGlvbklkc0luVmlld3BvcnQuc2l6ZSA9PT0gbG9jYXRpb25zLmxlbmd0aCkgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgIC8vIGNvbnN0IGZpbHRlcmVkID0gW107XG4gICAgICAvLyBmb3IgKGNvbnN0IGxvYyBvZiBsb2NhdGlvbnMpIHtcbiAgICAgIC8vICAgaWYgKGxvY2F0aW9uSWRzSW5WaWV3cG9ydC5oYXMobG9jLmlkKSkge1xuICAgICAgLy8gICAgIGZpbHRlcmVkLnB1c2gobG9jKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgLy8gcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgLy8gcmV0dXJuIGxvY2F0aW9ucy5maWx0ZXIoXG4gICAgICAvLyAgIChsb2M6IEwgfCBDbHVzdGVyTm9kZSkgPT4gbG9jYXRpb25JZHNJblZpZXdwb3J0IS5oYXMobG9jLmlkKVxuICAgICAgLy8gKTtcbiAgICAgIC8vIFRPRE86IHJldHVybiBsb2NhdGlvbiBpbiB2aWV3cG9ydCArIFwiY29ubmVjdGVkXCIgb25lc1xuICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICB9LFxuICApO1xuXG4gIGdldExvY2F0aW9uc0ZvckZsb3dtYXBMYXllckJ5SWQ6IFNlbGVjdG9yPFxuICAgIEwsXG4gICAgRixcbiAgICBNYXA8c3RyaW5nLCBMIHwgQ2x1c3Rlck5vZGU+IHwgdW5kZWZpbmVkXG4gID4gPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmdldExvY2F0aW9uc0ZvckZsb3dtYXBMYXllciwgKGxvY2F0aW9ucykgPT4ge1xuICAgIGlmICghbG9jYXRpb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb2NhdGlvbnMucmVkdWNlKFxuICAgICAgKG0sIGQpID0+IChtLnNldCh0aGlzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGQpLCBkKSwgbSksXG4gICAgICBuZXcgTWFwKCksXG4gICAgKTtcbiAgfSk7XG5cbiAgZ2V0TG9jYXRpb25PckNsdXN0ZXJCeUlkR2V0dGVyID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRDbHVzdGVySW5kZXgsXG4gICAgdGhpcy5nZXRMb2NhdGlvbnNCeUlkLFxuICAgIChjbHVzdGVySW5kZXgsIGxvY2F0aW9uc0J5SWQpID0+IHtcbiAgICAgIHJldHVybiAoaWQ6IHN0cmluZyB8IG51bWJlcikgPT5cbiAgICAgICAgY2x1c3RlckluZGV4Py5nZXRDbHVzdGVyQnlJZChpZCkgPz8gbG9jYXRpb25zQnlJZD8uZ2V0KGlkKTtcbiAgICB9LFxuICApO1xuXG4gIGdldExheWVyc0RhdGE6IFNlbGVjdG9yPEwsIEYsIExheWVyc0RhdGE+ID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5nZXRMb2NhdGlvbnNGb3JGbG93bWFwTGF5ZXIsXG4gICAgdGhpcy5nZXRGbG93c0ZvckZsb3dtYXBMYXllcixcbiAgICB0aGlzLmdldEZsb3dtYXBDb2xvcnNSR0JBLFxuICAgIHRoaXMuZ2V0TG9jYXRpb25zRm9yRmxvd21hcExheWVyQnlJZCxcbiAgICB0aGlzLmdldExvY2F0aW9uSWRzSW5WaWV3cG9ydCxcbiAgICB0aGlzLmdldEluQ2lyY2xlU2l6ZUdldHRlcixcbiAgICB0aGlzLmdldE91dENpcmNsZVNpemVHZXR0ZXIsXG4gICAgdGhpcy5nZXRGbG93VGhpY2tuZXNzU2NhbGUsXG4gICAgdGhpcy5nZXRBbmltYXRlLFxuICAgIHRoaXMuZ2V0TG9jYXRpb25MYWJlbHNFbmFibGVkLFxuICAgIChcbiAgICAgIGxvY2F0aW9ucyxcbiAgICAgIGZsb3dzLFxuICAgICAgZmxvd21hcENvbG9ycyxcbiAgICAgIGxvY2F0aW9uc0J5SWQsXG4gICAgICBsb2NhdGlvbklkc0luVmlld3BvcnQsXG4gICAgICBnZXRJbkNpcmNsZVNpemUsXG4gICAgICBnZXRPdXRDaXJjbGVTaXplLFxuICAgICAgZmxvd1RoaWNrbmVzc1NjYWxlLFxuICAgICAgYW5pbWF0aW9uRW5hYmxlZCxcbiAgICAgIGxvY2F0aW9uTGFiZWxzRW5hYmxlZCxcbiAgICApID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl9wcmVwYXJlTGF5ZXJzRGF0YShcbiAgICAgICAgbG9jYXRpb25zLFxuICAgICAgICBmbG93cyxcbiAgICAgICAgZmxvd21hcENvbG9ycyxcbiAgICAgICAgbG9jYXRpb25zQnlJZCxcbiAgICAgICAgbG9jYXRpb25JZHNJblZpZXdwb3J0LFxuICAgICAgICBnZXRJbkNpcmNsZVNpemUsXG4gICAgICAgIGdldE91dENpcmNsZVNpemUsXG4gICAgICAgIGZsb3dUaGlja25lc3NTY2FsZSxcbiAgICAgICAgYW5pbWF0aW9uRW5hYmxlZCxcbiAgICAgICAgbG9jYXRpb25MYWJlbHNFbmFibGVkLFxuICAgICAgKTtcbiAgICB9LFxuICApO1xuXG4gIHByZXBhcmVMYXllcnNEYXRhKHN0YXRlOiBGbG93bWFwU3RhdGUsIHByb3BzOiBGbG93bWFwRGF0YTxMLCBGPik6IExheWVyc0RhdGEge1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IHRoaXMuZ2V0TG9jYXRpb25zRm9yRmxvd21hcExheWVyKHN0YXRlLCBwcm9wcykgfHwgW107XG4gICAgY29uc3QgZmxvd3MgPSB0aGlzLmdldEZsb3dzRm9yRmxvd21hcExheWVyKHN0YXRlLCBwcm9wcykgfHwgW107XG4gICAgY29uc3QgZmxvd21hcENvbG9ycyA9IHRoaXMuZ2V0Rmxvd21hcENvbG9yc1JHQkEoc3RhdGUsIHByb3BzKTtcbiAgICBjb25zdCBsb2NhdGlvbnNCeUlkID0gdGhpcy5nZXRMb2NhdGlvbnNGb3JGbG93bWFwTGF5ZXJCeUlkKHN0YXRlLCBwcm9wcyk7XG4gICAgY29uc3QgbG9jYXRpb25JZHNJblZpZXdwb3J0ID0gdGhpcy5nZXRMb2NhdGlvbklkc0luVmlld3BvcnQoc3RhdGUsIHByb3BzKTtcbiAgICBjb25zdCBnZXRJbkNpcmNsZVNpemUgPSB0aGlzLmdldEluQ2lyY2xlU2l6ZUdldHRlcihzdGF0ZSwgcHJvcHMpO1xuICAgIGNvbnN0IGdldE91dENpcmNsZVNpemUgPSB0aGlzLmdldE91dENpcmNsZVNpemVHZXR0ZXIoc3RhdGUsIHByb3BzKTtcbiAgICBjb25zdCBmbG93VGhpY2tuZXNzU2NhbGUgPSB0aGlzLmdldEZsb3dUaGlja25lc3NTY2FsZShzdGF0ZSwgcHJvcHMpO1xuICAgIGNvbnN0IGxvY2F0aW9uTGFiZWxzRW5hYmxlZCA9IHRoaXMuZ2V0TG9jYXRpb25MYWJlbHNFbmFibGVkKHN0YXRlLCBwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVMYXllcnNEYXRhKFxuICAgICAgbG9jYXRpb25zLFxuICAgICAgZmxvd3MsXG4gICAgICBmbG93bWFwQ29sb3JzLFxuICAgICAgbG9jYXRpb25zQnlJZCxcbiAgICAgIGxvY2F0aW9uSWRzSW5WaWV3cG9ydCxcbiAgICAgIGdldEluQ2lyY2xlU2l6ZSxcbiAgICAgIGdldE91dENpcmNsZVNpemUsXG4gICAgICBmbG93VGhpY2tuZXNzU2NhbGUsXG4gICAgICBzdGF0ZS5zZXR0aW5ncy5hbmltYXRpb25FbmFibGVkLFxuICAgICAgbG9jYXRpb25MYWJlbHNFbmFibGVkLFxuICAgICk7XG4gIH1cblxuICBfcHJlcGFyZUxheWVyc0RhdGEoXG4gICAgbG9jYXRpb25zOiAoTCB8IENsdXN0ZXJOb2RlKVtdIHwgdW5kZWZpbmVkLFxuICAgIGZsb3dzOiAoRiB8IEFnZ3JlZ2F0ZUZsb3cpW10gfCB1bmRlZmluZWQsXG4gICAgZmxvd21hcENvbG9yczogRGlmZkNvbG9yc1JHQkEgfCBDb2xvcnNSR0JBLFxuICAgIGxvY2F0aW9uc0J5SWQ6IE1hcDxzdHJpbmcgfCBudW1iZXIsIEwgfCBDbHVzdGVyTm9kZT4gfCB1bmRlZmluZWQsXG4gICAgbG9jYXRpb25JZHNJblZpZXdwb3J0OiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB8IHVuZGVmaW5lZCxcbiAgICBnZXRJbkNpcmNsZVNpemU6IChsb2NhdGlvbklkOiBzdHJpbmcgfCBudW1iZXIpID0+IG51bWJlcixcbiAgICBnZXRPdXRDaXJjbGVTaXplOiAobG9jYXRpb25JZDogc3RyaW5nIHwgbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgZmxvd1RoaWNrbmVzc1NjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+IHwgdW5kZWZpbmVkLFxuICAgIGFuaW1hdGlvbkVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgbG9jYXRpb25MYWJlbHNFbmFibGVkOiBib29sZWFuLFxuICApOiBMYXllcnNEYXRhIHtcbiAgICBpZiAoIWxvY2F0aW9ucykgbG9jYXRpb25zID0gW107XG4gICAgaWYgKCFmbG93cykgZmxvd3MgPSBbXTtcbiAgICBjb25zdCB7XG4gICAgICBnZXRGbG93T3JpZ2luSWQsXG4gICAgICBnZXRGbG93RGVzdElkLFxuICAgICAgZ2V0Rmxvd01hZ25pdHVkZSxcbiAgICAgIGdldExvY2F0aW9uSWQsXG4gICAgICBnZXRMb2NhdGlvbkxvbixcbiAgICAgIGdldExvY2F0aW9uTGF0LFxuICAgICAgZ2V0TG9jYXRpb25OYW1lLFxuICAgIH0gPSB0aGlzLmFjY2Vzc29ycztcblxuICAgIGNvbnN0IGZsb3dNYWduaXR1ZGVFeHRlbnQgPSBleHRlbnQoZmxvd3MsIChmKSA9PiBnZXRGbG93TWFnbml0dWRlKGYpKSBhcyBbXG4gICAgICBudW1iZXIsXG4gICAgICBudW1iZXIsXG4gICAgXTtcbiAgICBjb25zdCBmbG93Q29sb3JTY2FsZSA9IGdldEZsb3dDb2xvclNjYWxlKFxuICAgICAgZmxvd21hcENvbG9ycyxcbiAgICAgIGZsb3dNYWduaXR1ZGVFeHRlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuXG4gICAgLy8gVXNpbmcgYSBnZW5lcmF0b3IgaGVyZSBoZWxwcyB0byBhdm9pZCBjcmVhdGluZyBpbnRlcm1lZGlhcnkgYXJyYXlzXG4gICAgY29uc3QgY2lyY2xlUG9zaXRpb25zID0gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICB5aWVsZCBnZXRMb2NhdGlvbkxvbihsb2NhdGlvbik7XG4gICAgICAgICAgeWllbGQgZ2V0TG9jYXRpb25MYXQobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICk7XG5cbiAgICAvLyBUT0RPOiBkaWZmIG1vZGVcbiAgICBjb25zdCBjaXJjbGVDb2xvciA9IGlzRGlmZkNvbG9yc1JHQkEoZmxvd21hcENvbG9ycylcbiAgICAgID8gZmxvd21hcENvbG9ycy5wb3NpdGl2ZS5sb2NhdGlvbkNpcmNsZXMuaW5uZXJcbiAgICAgIDogZmxvd21hcENvbG9ycy5sb2NhdGlvbkNpcmNsZXMuaW5uZXI7XG5cbiAgICBjb25zdCBjaXJjbGVDb2xvcnMgPSBVaW50OEFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICB5aWVsZCogY2lyY2xlQ29sb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGluQ2lyY2xlUmFkaWkgPSBGbG9hdDMyQXJyYXkuZnJvbShcbiAgICAgIChmdW5jdGlvbiogKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0TG9jYXRpb25JZChsb2NhdGlvbik7XG4gICAgICAgICAgeWllbGQgbG9jYXRpb25JZHNJblZpZXdwb3J0Py5oYXMoaWQpID8gZ2V0SW5DaXJjbGVTaXplKGlkKSA6IDEuMDtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IG91dENpcmNsZVJhZGlpID0gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldExvY2F0aW9uSWQobG9jYXRpb24pO1xuICAgICAgICAgIHlpZWxkIGxvY2F0aW9uSWRzSW5WaWV3cG9ydD8uaGFzKGlkKSA/IGdldE91dENpcmNsZVNpemUoaWQpIDogMS4wO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2VQb3NpdGlvbnMgPSBGbG9hdDMyQXJyYXkuZnJvbShcbiAgICAgIChmdW5jdGlvbiogKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcbiAgICAgICAgICBjb25zdCBsb2MgPSBsb2NhdGlvbnNCeUlkPy5nZXQoZ2V0Rmxvd09yaWdpbklkKGZsb3cpKTtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxvbihsb2MpIDogMDtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxhdChsb2MpIDogMDtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldFBvc2l0aW9ucyA9IEZsb2F0MzJBcnJheS5mcm9tKFxuICAgICAgKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGNvbnN0IGxvYyA9IGxvY2F0aW9uc0J5SWQ/LmdldChnZXRGbG93RGVzdElkKGZsb3cpKTtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxvbihsb2MpIDogMDtcbiAgICAgICAgICB5aWVsZCBsb2MgPyBnZXRMb2NhdGlvbkxhdChsb2MpIDogMDtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IHRoaWNrbmVzc2VzID0gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAoZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgeWllbGQgZmxvd1RoaWNrbmVzc1NjYWxlXG4gICAgICAgICAgICA/IGZsb3dUaGlja25lc3NTY2FsZShnZXRGbG93TWFnbml0dWRlKGZsb3cpKSB8fCAwXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgKTtcbiAgICBjb25zdCBlbmRwb2ludE9mZnNldHMgPSBGbG9hdDMyQXJyYXkuZnJvbShcbiAgICAgIChmdW5jdGlvbiogKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5JZCA9IGdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICAgICAgICBjb25zdCBkZXN0SWQgPSBnZXRGbG93RGVzdElkKGZsb3cpO1xuICAgICAgICAgIHlpZWxkIE1hdGgubWF4KGdldEluQ2lyY2xlU2l6ZShvcmlnaW5JZCksIGdldE91dENpcmNsZVNpemUob3JpZ2luSWQpKTtcbiAgICAgICAgICB5aWVsZCBNYXRoLm1heChnZXRJbkNpcmNsZVNpemUoZGVzdElkKSwgZ2V0T3V0Q2lyY2xlU2l6ZShkZXN0SWQpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuICAgIGNvbnN0IGZsb3dMaW5lQ29sb3JzID0gVWludDhBcnJheS5mcm9tKFxuICAgICAgKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIHlpZWxkKiBmbG93Q29sb3JTY2FsZShnZXRGbG93TWFnbml0dWRlKGZsb3cpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhZ2dlcmluZ1ZhbHVlcyA9IGFuaW1hdGlvbkVuYWJsZWRcbiAgICAgID8gRmxvYXQzMkFycmF5LmZyb20oXG4gICAgICAgICAgKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmxvd3MpIHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICB5aWVsZCBuZXcgYWxlYShgJHtnZXRGbG93T3JpZ2luSWQoZil9LSR7Z2V0Rmxvd0Rlc3RJZChmKX1gKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNpcmNsZUF0dHJpYnV0ZXM6IHtcbiAgICAgICAgbGVuZ3RoOiBsb2NhdGlvbnMubGVuZ3RoLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgZ2V0UG9zaXRpb246IHt2YWx1ZTogY2lyY2xlUG9zaXRpb25zLCBzaXplOiAyfSxcbiAgICAgICAgICBnZXRDb2xvcjoge3ZhbHVlOiBjaXJjbGVDb2xvcnMsIHNpemU6IDR9LFxuICAgICAgICAgIGdldEluUmFkaXVzOiB7dmFsdWU6IGluQ2lyY2xlUmFkaWksIHNpemU6IDF9LFxuICAgICAgICAgIGdldE91dFJhZGl1czoge3ZhbHVlOiBvdXRDaXJjbGVSYWRpaSwgc2l6ZTogMX0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGluZUF0dHJpYnV0ZXM6IHtcbiAgICAgICAgbGVuZ3RoOiBmbG93cy5sZW5ndGgsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBnZXRTb3VyY2VQb3NpdGlvbjoge3ZhbHVlOiBzb3VyY2VQb3NpdGlvbnMsIHNpemU6IDJ9LFxuICAgICAgICAgIGdldFRhcmdldFBvc2l0aW9uOiB7dmFsdWU6IHRhcmdldFBvc2l0aW9ucywgc2l6ZTogMn0sXG4gICAgICAgICAgZ2V0VGhpY2tuZXNzOiB7dmFsdWU6IHRoaWNrbmVzc2VzLCBzaXplOiAxfSxcbiAgICAgICAgICBnZXRDb2xvcjoge3ZhbHVlOiBmbG93TGluZUNvbG9ycywgc2l6ZTogNH0sXG4gICAgICAgICAgZ2V0RW5kcG9pbnRPZmZzZXRzOiB7dmFsdWU6IGVuZHBvaW50T2Zmc2V0cywgc2l6ZTogMn0sXG4gICAgICAgICAgLi4uKHN0YWdnZXJpbmdWYWx1ZXNcbiAgICAgICAgICAgID8ge2dldFN0YWdnZXJpbmc6IHt2YWx1ZTogc3RhZ2dlcmluZ1ZhbHVlcywgc2l6ZTogMX19XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi4obG9jYXRpb25MYWJlbHNFbmFibGVkXG4gICAgICAgID8ge2xvY2F0aW9uTGFiZWxzOiBsb2NhdGlvbnMubWFwKGdldExvY2F0aW9uTmFtZSl9XG4gICAgICAgIDogdW5kZWZpbmVkKSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TG9jYXRpb25zSW5CYm94KFxuICAgIHRyZWU6IEtEQnVzaFRyZWUsXG4gICAgYmJveDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICk6IEFycmF5PEw+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRyZWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuX2dldExvY2F0aW9uc0luQmJveEluZGljZXModHJlZSwgYmJveCkubWFwKFxuICAgICAgKGlkeDogbnVtYmVyKSA9PiB0cmVlLnBvaW50c1tpZHhdLFxuICAgICkgYXMgQXJyYXk8TD47XG4gIH1cblxuICBfZ2V0TG9jYXRpb25zSW5CYm94SW5kaWNlcyhcbiAgICB0cmVlOiBLREJ1c2hUcmVlLFxuICAgIGJib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICApIHtcbiAgICBpZiAoIXRyZWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgW2xvbjEsIGxhdDEsIGxvbjIsIGxhdDJdID0gYmJveDtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gW2xuZ1gobG9uMSksIGxhdFkobGF0MSksIGxuZ1gobG9uMiksIGxhdFkobGF0MildO1xuICAgIHJldHVybiB0cmVlLnJhbmdlKFxuICAgICAgTWF0aC5taW4oeDEsIHgyKSxcbiAgICAgIE1hdGgubWluKHkxLCB5MiksXG4gICAgICBNYXRoLm1heCh4MSwgeDIpLFxuICAgICAgTWF0aC5tYXgoeTEsIHkyKSxcbiAgICApO1xuICB9XG5cbiAgaXNGbG93SW5TZWxlY3Rpb24oXG4gICAgZmxvdzogRiB8IEFnZ3JlZ2F0ZUZsb3csXG4gICAgc2VsZWN0ZWRMb2NhdGlvbnNTZXQ6IFNldDxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uRmlsdGVyTW9kZT86IExvY2F0aW9uRmlsdGVyTW9kZSxcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdGhpcy5hY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGZsb3cpO1xuICAgIGNvbnN0IGRlc3QgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGZsb3cpO1xuICAgIGlmIChzZWxlY3RlZExvY2F0aW9uc1NldCkge1xuICAgICAgc3dpdGNoIChsb2NhdGlvbkZpbHRlck1vZGUpIHtcbiAgICAgICAgY2FzZSBMb2NhdGlvbkZpbHRlck1vZGUuQUxMOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzZWxlY3RlZExvY2F0aW9uc1NldC5oYXMob3JpZ2luKSB8fCBzZWxlY3RlZExvY2F0aW9uc1NldC5oYXMoZGVzdClcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIExvY2F0aW9uRmlsdGVyTW9kZS5CRVRXRUVOOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzZWxlY3RlZExvY2F0aW9uc1NldC5oYXMob3JpZ2luKSAmJiBzZWxlY3RlZExvY2F0aW9uc1NldC5oYXMoZGVzdClcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIExvY2F0aW9uRmlsdGVyTW9kZS5JTkNPTUlORzpcbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnNTZXQuaGFzKGRlc3QpO1xuICAgICAgICBjYXNlIExvY2F0aW9uRmlsdGVyTW9kZS5PVVRHT0lORzpcbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnNTZXQuaGFzKG9yaWdpbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gY2FsY0xvY2F0aW9uVG90YWxzKFxuICAvLyAgIGxvY2F0aW9uczogKEwgfCBDbHVzdGVyTm9kZSlbXSxcbiAgLy8gICBmbG93czogRltdLFxuICAvLyApOiBMb2NhdGlvbnNUb3RhbHMge1xuICAvLyAgIHJldHVybiBmbG93cy5yZWR1Y2UoXG4gIC8vICAgICAoYWNjOiBMb2NhdGlvbnNUb3RhbHMsIGN1cnIpID0+IHtcbiAgLy8gICAgICAgY29uc3Qgb3JpZ2luSWQgPSB0aGlzLmFjY2Vzc29ycy5nZXRGbG93T3JpZ2luSWQoY3Vycik7XG4gIC8vICAgICAgIGNvbnN0IGRlc3RJZCA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dEZXN0SWQoY3Vycik7XG4gIC8vICAgICAgIGNvbnN0IG1hZ25pdHVkZSA9IHRoaXMuYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoY3Vycik7XG4gIC8vICAgICAgIGlmIChvcmlnaW5JZCA9PT0gZGVzdElkKSB7XG4gIC8vICAgICAgICAgYWNjLmludGVybmFsW29yaWdpbklkXSA9IChhY2MuaW50ZXJuYWxbb3JpZ2luSWRdIHx8IDApICsgbWFnbml0dWRlO1xuICAvLyAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgIGFjYy5vdXRnb2luZ1tvcmlnaW5JZF0gPSAoYWNjLm91dGdvaW5nW29yaWdpbklkXSB8fCAwKSArIG1hZ25pdHVkZTtcbiAgLy8gICAgICAgICBhY2MuaW5jb21pbmdbZGVzdElkXSA9IChhY2MuaW5jb21pbmdbZGVzdElkXSB8fCAwKSArIG1hZ25pdHVkZTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICByZXR1cm4gYWNjO1xuICAvLyAgICAgfSxcbiAgLy8gICAgIHtpbmNvbWluZzoge30sIG91dGdvaW5nOiB7fSwgaW50ZXJuYWw6IHt9fSxcbiAgLy8gICApO1xuICAvLyB9XG59XG5cbmZ1bmN0aW9uIGNhbGNMb2NhdGlvblRvdGFsc0V4dGVudChcbiAgbG9jYXRpb25Ub3RhbHM6IE1hcDxzdHJpbmcgfCBudW1iZXIsIExvY2F0aW9uVG90YWxzPiB8IHVuZGVmaW5lZCxcbiAgbG9jYXRpb25JZHNJblZpZXdwb3J0OiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB8IHVuZGVmaW5lZCxcbikge1xuICBpZiAoIWxvY2F0aW9uVG90YWxzKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgcnY6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW1xuICAgIGlkLFxuICAgIHtpbmNvbWluZ0NvdW50LCBvdXRnb2luZ0NvdW50LCBpbnRlcm5hbENvdW50fSxcbiAgXSBvZiBsb2NhdGlvblRvdGFscy5lbnRyaWVzKCkpIHtcbiAgICBpZiAobG9jYXRpb25JZHNJblZpZXdwb3J0ID09IG51bGwgfHwgbG9jYXRpb25JZHNJblZpZXdwb3J0LmhhcyhpZCkpIHtcbiAgICAgIGNvbnN0IGxvID0gTWF0aC5taW4oXG4gICAgICAgIGluY29taW5nQ291bnQgKyBpbnRlcm5hbENvdW50LFxuICAgICAgICBvdXRnb2luZ0NvdW50ICsgaW50ZXJuYWxDb3VudCxcbiAgICAgICAgaW50ZXJuYWxDb3VudCxcbiAgICAgICk7XG4gICAgICBjb25zdCBoaSA9IE1hdGgubWF4KFxuICAgICAgICBpbmNvbWluZ0NvdW50ICsgaW50ZXJuYWxDb3VudCxcbiAgICAgICAgb3V0Z29pbmdDb3VudCArIGludGVybmFsQ291bnQsXG4gICAgICAgIGludGVybmFsQ291bnQsXG4gICAgICApO1xuICAgICAgaWYgKCFydikge1xuICAgICAgICBydiA9IFtsbywgaGldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxvIDwgcnZbMF0pIHJ2WzBdID0gbG87XG4gICAgICAgIGlmIChoaSA+IHJ2WzFdKSBydlsxXSA9IGhpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcnY7XG59XG5cbi8vIGxvbmdpdHVkZS9sYXRpdHVkZSB0byBzcGhlcmljYWwgbWVyY2F0b3IgaW4gWzAuLjFdIHJhbmdlXG5mdW5jdGlvbiBsbmdYKGxuZzogbnVtYmVyKSB7XG4gIHJldHVybiBsbmcgLyAzNjAgKyAwLjU7XG59XG5cbmZ1bmN0aW9uIGxhdFkobGF0OiBudW1iZXIpIHtcbiAgY29uc3Qgc2luID0gTWF0aC5zaW4oKGxhdCAqIE1hdGguUEkpIC8gMTgwKTtcbiAgY29uc3QgeSA9IDAuNSAtICgwLjI1ICogTWF0aC5sb2coKDEgKyBzaW4pIC8gKDEgLSBzaW4pKSkgLyBNYXRoLlBJO1xuICByZXR1cm4geSA8IDAgPyAwIDogeSA+IDEgPyAxIDogeTtcbn1cblxuZnVuY3Rpb24gYWdncmVnYXRlRmxvd3M8Rj4oXG4gIGZsb3dzOiBGW10sXG4gIGZsb3dBY2Nlc3NvcnM6IEZsb3dBY2Nlc3NvcnM8Rj4sXG4pOiBBZ2dyZWdhdGVGbG93W10ge1xuICAvLyBTdW0gdXAgZmxvd3Mgd2l0aCBzYW1lIG9yaWdpbiwgZGVzdFxuICBjb25zdCBieU9yaWdpbkRlc3QgPSByb2xsdXAoXG4gICAgZmxvd3MsXG4gICAgKGZmOiBGW10pID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGZsb3dBY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGZmWzBdKTtcbiAgICAgIGNvbnN0IGRlc3QgPSBmbG93QWNjZXNzb3JzLmdldEZsb3dEZXN0SWQoZmZbMF0pO1xuICAgICAgLy8gY29uc3QgY29sb3IgPSBmZlswXS5jb2xvcjtcbiAgICAgIGNvbnN0IHJ2OiBBZ2dyZWdhdGVGbG93ID0ge1xuICAgICAgICBhZ2dyZWdhdGU6IHRydWUsXG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgZGVzdCxcbiAgICAgICAgY291bnQ6IGZmLnJlZHVjZSgobSwgZikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gZmxvd0FjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGYpO1xuICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgaWYgKCFpc05hTihjb3VudCkgJiYgaXNGaW5pdGUoY291bnQpKSByZXR1cm4gbSArIGNvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfSwgMCksXG4gICAgICAgIC8vIHRpbWU6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICAvLyBpZiAoY29sb3IpIHJ2LmNvbG9yID0gY29sb3I7XG4gICAgICByZXR1cm4gcnY7XG4gICAgfSxcbiAgICBmbG93QWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZCxcbiAgICBmbG93QWNjZXNzb3JzLmdldEZsb3dEZXN0SWQsXG4gICk7XG5cbiAgY29uc3QgcnY6IEFnZ3JlZ2F0ZUZsb3dbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbHVlcyBvZiBieU9yaWdpbkRlc3QudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcy52YWx1ZXMoKSkge1xuICAgICAgcnYucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydjtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIHVzZWQgdG8gYXVnbWVudCBob3ZlciBwaWNraW5nIGluZm8gc28gdGhhdCB3ZSBjYW4gZGlzcGxhY2UgbG9jYXRpb24gdG9vbHRpcFxuICogQHBhcmFtIGNpcmNsZUF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBpbmRleFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0ZXJDaXJjbGVSYWRpdXNCeUluZGV4KFxuICBjaXJjbGVBdHRyaWJ1dGVzOiBGbG93Q2lyY2xlc0xheWVyQXR0cmlidXRlcyxcbiAgaW5kZXg6IG51bWJlcixcbik6IG51bWJlciB7XG4gIGNvbnN0IHtnZXRJblJhZGl1cywgZ2V0T3V0UmFkaXVzfSA9IGNpcmNsZUF0dHJpYnV0ZXMuYXR0cmlidXRlcztcbiAgcmV0dXJuIE1hdGgubWF4KGdldEluUmFkaXVzLnZhbHVlW2luZGV4XSwgZ2V0T3V0UmFkaXVzLnZhbHVlW2luZGV4XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhdGlvbkNvb3Jkc0J5SW5kZXgoXG4gIGNpcmNsZUF0dHJpYnV0ZXM6IEZsb3dDaXJjbGVzTGF5ZXJBdHRyaWJ1dGVzLFxuICBpbmRleDogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHtnZXRQb3NpdGlvbn0gPSBjaXJjbGVBdHRyaWJ1dGVzLmF0dHJpYnV0ZXM7XG4gIHJldHVybiBbZ2V0UG9zaXRpb24udmFsdWVbaW5kZXggKiAyXSwgZ2V0UG9zaXRpb24udmFsdWVbaW5kZXggKiAyICsgMV1dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmxvd0xpbmVBdHRyaWJ1dGVzQnlJbmRleChcbiAgbGluZUF0dHJpYnV0ZXM6IEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcyxcbiAgaW5kZXg6IG51bWJlcixcbik6IEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcyB7XG4gIGNvbnN0IHtcbiAgICBnZXRDb2xvcixcbiAgICBnZXRFbmRwb2ludE9mZnNldHMsXG4gICAgZ2V0U291cmNlUG9zaXRpb24sXG4gICAgZ2V0VGFyZ2V0UG9zaXRpb24sXG4gICAgZ2V0VGhpY2tuZXNzLFxuICAgIGdldFN0YWdnZXJpbmcsXG4gIH0gPSBsaW5lQXR0cmlidXRlcy5hdHRyaWJ1dGVzO1xuICByZXR1cm4ge1xuICAgIGxlbmd0aDogMSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBnZXRDb2xvcjoge1xuICAgICAgICB2YWx1ZTogZ2V0Q29sb3IudmFsdWUuc3ViYXJyYXkoaW5kZXggKiA0LCAoaW5kZXggKyAxKSAqIDQpLFxuICAgICAgICBzaXplOiA0LFxuICAgICAgfSxcbiAgICAgIGdldEVuZHBvaW50T2Zmc2V0czoge1xuICAgICAgICB2YWx1ZTogZ2V0RW5kcG9pbnRPZmZzZXRzLnZhbHVlLnN1YmFycmF5KGluZGV4ICogMiwgKGluZGV4ICsgMSkgKiAyKSxcbiAgICAgICAgc2l6ZTogMixcbiAgICAgIH0sXG4gICAgICBnZXRTb3VyY2VQb3NpdGlvbjoge1xuICAgICAgICB2YWx1ZTogZ2V0U291cmNlUG9zaXRpb24udmFsdWUuc3ViYXJyYXkoaW5kZXggKiAyLCAoaW5kZXggKyAxKSAqIDIpLFxuICAgICAgICBzaXplOiAyLFxuICAgICAgfSxcbiAgICAgIGdldFRhcmdldFBvc2l0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBnZXRUYXJnZXRQb3NpdGlvbi52YWx1ZS5zdWJhcnJheShpbmRleCAqIDIsIChpbmRleCArIDEpICogMiksXG4gICAgICAgIHNpemU6IDIsXG4gICAgICB9LFxuICAgICAgZ2V0VGhpY2tuZXNzOiB7XG4gICAgICAgIHZhbHVlOiBnZXRUaGlja25lc3MudmFsdWUuc3ViYXJyYXkoaW5kZXgsIGluZGV4ICsgMSksXG4gICAgICAgIHNpemU6IDEsXG4gICAgICB9LFxuICAgICAgLi4uKGdldFN0YWdnZXJpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBnZXRTdGFnZ2VyaW5nOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRTdGFnZ2VyaW5nLnZhbHVlLnN1YmFycmF5KGluZGV4LCBpbmRleCArIDEpLFxuICAgICAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkKSxcbiAgICB9LFxuICB9O1xufVxuIl19