@carto/kepler.gl 0.0.64 → 0.0.65-alpha.labels.2

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.
@@ -29,7 +29,7 @@ var _extensions = require("@deck.gl/extensions");
29
29
 
30
30
  var _core = require("@deck.gl/core");
31
31
 
32
- var _layers = require("@deck.gl/layers");
32
+ var _pointLabelLayer = require("../deckgl-layers/point-label-layer/point-label-layer");
33
33
 
34
34
  var _defaultLayerIcon = _interopRequireDefault(require("./default-layer-icon"));
35
35
 
@@ -118,6 +118,7 @@ var defaultDomain = [0, 1];
118
118
  var dataFilterExtension = new _extensions.DataFilterExtension({
119
119
  filterSize: _defaultSettings.MAX_GPU_FILTERS
120
120
  });
121
+ var collisionFilterExtension = new _extensions.CollisionFilterExtension();
121
122
 
122
123
  var defaultDataAccessor = function defaultDataAccessor(dc) {
123
124
  return function (d) {
@@ -1500,54 +1501,90 @@ var Layer = /*#__PURE__*/function () {
1500
1501
  }, {
1501
1502
  key: "renderTextLabelLayer",
1502
1503
  value: function renderTextLabelLayer(_ref12, renderOpts) {
1503
- var _this9 = this;
1504
+ var _textLabel$i$field;
1504
1505
 
1505
1506
  var getPosition = _ref12.getPosition,
1506
- getPixelOffset = _ref12.getPixelOffset,
1507
+ getRadius = _ref12.getRadius,
1508
+ radiusScale = _ref12.radiusScale,
1507
1509
  updateTriggers = _ref12.updateTriggers,
1508
1510
  sharedProps = _ref12.sharedProps;
1509
1511
  var data = renderOpts.data,
1510
1512
  mapState = renderOpts.mapState;
1511
1513
  var _this$config6 = this.config,
1512
1514
  textLabel = _this$config6.textLabel,
1513
- visibilityByZoom = _this$config6.visibilityByZoom;
1514
- return data.textLabels.reduce(function (accu, d, i) {
1515
- if (d.getText) {
1516
- var _textLabel$i$field, _textLabel$i$field2;
1517
-
1518
- accu.push(new _layers.TextLayer(_objectSpread(_objectSpread({}, sharedProps), {}, {
1519
- id: "".concat(_this9.id, "-label-").concat((_textLabel$i$field = textLabel[i].field) === null || _textLabel$i$field === void 0 ? void 0 : _textLabel$i$field.name),
1520
- data: data.data,
1521
- visibilityByZoom: visibilityByZoom,
1522
- getText: d.getText,
1523
- getPosition: getPosition,
1524
- characterSet: d.characterSet,
1525
- getPixelOffset: getPixelOffset(textLabel[i]),
1526
- getSize: 1,
1527
- sizeScale: textLabel[i].size,
1528
- getTextAnchor: textLabel[i].anchor,
1529
- getAlignmentBaseline: textLabel[i].alignment,
1530
- getColor: textLabel[i].color,
1531
- parameters: {
1532
- // text will always show on top of all layers
1533
- depthTest: false
1534
- },
1535
- getFilterValue: data.getFilterValue,
1536
- updateTriggers: _objectSpread(_objectSpread({}, updateTriggers), {}, {
1537
- getText: (_textLabel$i$field2 = textLabel[i].field) === null || _textLabel$i$field2 === void 0 ? void 0 : _textLabel$i$field2.name,
1538
- getPixelOffset: _objectSpread(_objectSpread(_objectSpread({}, updateTriggers.getPixelOffset), updateTriggers.getRadius), {}, {
1539
- anchor: textLabel[i].anchor,
1540
- alignment: textLabel[i].alignment
1541
- }),
1542
- getTextAnchor: textLabel[i].anchor,
1543
- getAlignmentBaseline: textLabel[i].alignment,
1544
- getColor: textLabel[i].color
1545
- })
1546
- })));
1547
- }
1515
+ visibilityByZoom = _this$config6.visibilityByZoom; // const extensions = [...sharedProps.extensions];
1516
+
1517
+ var extensions = [].concat((0, _toConsumableArray2["default"])(sharedProps.extensions), [collisionFilterExtension]);
1548
1518
 
1549
- return accu;
1550
- }, []);
1519
+ if (!data || !data.textLabels || !data.textLabels[0] || !data.textLabels[0].getText) {
1520
+ return null;
1521
+ } // TODO other labels
1522
+
1523
+
1524
+ var i = 0;
1525
+
1526
+ var _textLabel = (0, _slicedToArray2["default"])(textLabel, 2),
1527
+ mainLabel = _textLabel[0],
1528
+ secondaryLabel = _textLabel[1];
1529
+
1530
+ var alignment = mainLabel.alignment,
1531
+ anchor = mainLabel.anchor,
1532
+ getColor = mainLabel.color,
1533
+ outlineColor = mainLabel.outlineColor,
1534
+ sizeScale = mainLabel.size;
1535
+
1536
+ var _ref13 = secondaryLabel || {},
1537
+ getSecondaryColor = _ref13.color,
1538
+ secondaryOutlineColor = _ref13.outlineColor,
1539
+ secondarySizeScale = _ref13.size;
1540
+
1541
+ return [new _pointLabelLayer.PointLabelLayer(_objectSpread(_objectSpread(_objectSpread({}, sharedProps), {}, {
1542
+ id: "".concat(this.id, "-label"),
1543
+ data: data.data,
1544
+ visibilityByZoom: visibilityByZoom,
1545
+ characterSet: 'auto',
1546
+ extensions: extensions,
1547
+ collisionEnabled: true,
1548
+ collisionGroup: "".concat(this.id, "-labels"),
1549
+ getText: data.textLabels[0].getText,
1550
+ getColor: getColor,
1551
+ sizeScale: sizeScale,
1552
+ outlineColor: outlineColor
1553
+ }, secondaryLabel && {
1554
+ getSecondaryText: data.textLabels[1].getText,
1555
+ getSecondaryColor: getSecondaryColor,
1556
+ secondarySizeScale: secondarySizeScale,
1557
+ secondaryOutlineColor: secondaryOutlineColor
1558
+ }), {}, {
1559
+ // Position
1560
+ getPosition: getPosition,
1561
+ getRadius: getRadius,
1562
+ radiusScale: radiusScale,
1563
+ getTextAnchor: anchor,
1564
+ getAlignmentBaseline: alignment,
1565
+ // Style
1566
+ fontFamily: 'Inter, sans',
1567
+ fontSettings: {
1568
+ sdf: true
1569
+ },
1570
+ fontWeight: 500,
1571
+ outlineWidth: 4,
1572
+ parameters: {
1573
+ // text will always show on top of all layers
1574
+ depthTest: false
1575
+ },
1576
+ getFilterValue: data.getFilterValue,
1577
+ updateTriggers: _objectSpread(_objectSpread({}, updateTriggers), {}, {
1578
+ getText: (_textLabel$i$field = textLabel[i].field) === null || _textLabel$i$field === void 0 ? void 0 : _textLabel$i$field.name,
1579
+ getPixelOffset: _objectSpread(_objectSpread(_objectSpread({}, updateTriggers.getPixelOffset), updateTriggers.getRadius), {}, {
1580
+ anchor: mainLabel.anchor,
1581
+ alignment: mainLabel.alignment
1582
+ }),
1583
+ getTextAnchor: mainLabel.anchor,
1584
+ getAlignmentBaseline: mainLabel.alignment,
1585
+ getColor: textLabel[i].color
1586
+ })
1587
+ }))];
1551
1588
  }
1552
1589
  /**
1553
1590
  * Create deck.gl `IconLayer` "autoPack" mode accessor for custom markers.
@@ -1689,4 +1726,4 @@ var Layer = /*#__PURE__*/function () {
1689
1726
 
1690
1727
  var _default = Layer;
1691
1728
  exports["default"] = _default;
1692
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvYmFzZS1sYXllci5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUNvbG9yIiwiRGVja0xheWVyIiwiZGVmYXVsdFByb3BzIiwiZ2V0RmlsdGVyVmFsdWUiLCJ0eXBlIiwidmFsdWUiLCJkZWVwRXF1YWwiLCJhIiwiYiIsImtleSIsImFWYWx1ZSIsImJWYWx1ZSIsImVxdWFscyIsImxvYWRPcHRpb25zIiwib3B0aW9uYWwiLCJjb21wYXJlIiwiZXF1YWwiLCJMQVlFUl9JRF9MRU5HVEgiLCJGQUxMQkFDS19JQ09OIiwiTUFYX1NBTVBMRV9TSVpFIiwiZGVmYXVsdERvbWFpbiIsImRhdGFGaWx0ZXJFeHRlbnNpb24iLCJEYXRhRmlsdGVyRXh0ZW5zaW9uIiwiZmlsdGVyU2l6ZSIsIk1BWF9HUFVfRklMVEVSUyIsImRlZmF1bHREYXRhQWNjZXNzb3IiLCJkYyIsImQiLCJkZWZhdWx0R2V0RmllbGRWYWx1ZSIsImZpZWxkIiwidmFsdWVBY2Nlc3NvciIsInNjYWxlSWRlbnRpdHkiLCJ2IiwiT1ZFUkxBWV9UWVBFIiwiZGVja2dsIiwibWFwYm94Z2wiLCJsYXllckNvbG9ycyIsIk9iamVjdCIsInZhbHVlcyIsIkRhdGFWaXpDb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsImluZGV4IiwibGVuZ3RoIiwiY29sb3JNYWtlciIsIkxheWVyIiwicHJvcHMiLCJpZCIsIm1ldGEiLCJ2aXNDb25maWdTZXR0aW5ncyIsIl9pbnRlcmFjdGl2aXR5U2V0dGluZ3MiLCJjb25maWciLCJnZXREZWZhdWx0TGF5ZXJDb25maWciLCJjb2x1bW5zIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiRGVmYXVsdExheWVySWNvbiIsImNvbG9yIiwicHJvcGVydHkiLCJzY2FsZSIsImRvbWFpbiIsInJhbmdlIiwiY2hhbm5lbFNjYWxlVHlwZSIsIkNIQU5ORUxfU0NBTEVTIiwibnVsbFZhbHVlIiwiTk9fVkFMVUVfQ09MT1IiLCJkZWZhdWx0VmFsdWUiLCJzaXplIiwibGF0IiwicGFpciIsImZpZWxkUGFpcktleSIsImxuZyIsImxhdDAiLCJsbmcwIiwibGF0MSIsImxuZzEiLCJpbnRlcmFjdGl2aXR5U2V0dGluZ3MiLCJCb29sZWFuIiwiaG92ZXIiLCJmaWVsZHMiLCJjbGljayIsImhhc1Rvb2x0aXAiLCJlbmFibGVkIiwiZGF0YUlkIiwidmlzaWJpbGl0eUJ5Wm9vbSIsIm1pbiIsIlpPT01fTEVWRUxfTElNSVRTIiwibWF4IiwibGFiZWwiLCJERUZBVUxUX0xBWUVSX0xBQkVMIiwibmV4dCIsImlzVmlzaWJsZSIsImlzQ29uZmlnQWN0aXZlIiwiaGlnaGxpZ2h0Q29sb3IiLCJERUZBVUxUX0hJR0hMSUdIVF9DT0xPUiIsImhpZGRlbiIsImNvbG9yRmllbGQiLCJjb2xvckRvbWFpbiIsImNvbG9yU2NhbGUiLCJTQ0FMRV9UWVBFUyIsInF1YW50aWxlIiwic2l6ZURvbWFpbiIsInNpemVTY2FsZSIsImxpbmVhciIsInNpemVGaWVsZCIsInJhZGl1c0ZpZWxkIiwidmlzQ29uZmlnIiwidGV4dExhYmVsIiwiREVGQVVMVF9URVhUX0xBQkVMIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjb2xvclJhbmdlIiwiYW5pbWF0aW9uIiwidmlzdWFsQ2hhbm5lbHMiLCJtZWFzdXJlIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwiZGVmYXVsdE1lYXN1cmUiLCJ1cGRhdGUiLCJmaWVsZElkeCIsImNvbHVtblBhaXJzIiwicGFydG5lcktleSIsInBhcnRuZXJGaWVsZFBhaXJLZXkiLCJ6b29tIiwiem9vbU9mZnNldCIsIk1hdGgiLCJwb3ciLCJlbmFibGVFbGV2YXRpb25ab29tRmFjdG9yIiwiZGF0YXNldHMiLCJmaWx0ZXJlZEluZGV4Iiwib2JqZWN0IiwiZGF0YUNvbnRhaW5lciIsInJvdyIsImNvbmZpZ1RvQ29weSIsInNoYWxsb3dDb3B5IiwiY29uY2F0Iiwibm90VG9Db3B5IiwiZm9yRWFjaCIsImdyb3VwIiwicHVzaCIsImN1cnJlbnRDb25maWciLCJjb3BpZWQiLCJjb3B5TGF5ZXJDb25maWciLCJ1cGRhdGVMYXllckNvbmZpZyIsImtleXMiLCJjaGFubmVsIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwiaW5jbHVkZXMiLCJsYXllclZpc0NvbmZpZ3MiLCJpdGVtIiwiTEFZRVJfVklTX0NPTkZJR1MiLCJldmVyeSIsInAiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbHVtblZhbGlkYXRvcnMiLCJyZXF1aXJlZCIsInJlcXVpcmVkTGF5ZXJDb2x1bW5zIiwicmVkdWNlIiwiYWNjdSIsInZhbGlkYXRvciIsIm9wdGlvbmFsQ29sdW1ucyIsIm5ld0NvbmZpZyIsIm5ld1Zpc0NvbmZpZyIsInByb3AiLCJwcmV2aW91cyIsImNvbG9yVUlQcm9wIiwiZW50cmllcyIsImlzQ29sb3JSYW5nZSIsImNvbG9ycyIsInVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UiLCJ1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJIiwidXBkYXRlQ3VzdG9tUGFsZXR0ZSIsImNvbG9yUmFuZ2VDb25maWciLCJjdXN0b20iLCJjdXN0b21QYWxldHRlIiwic2hvd0Ryb3Bkb3duIiwic3RlcHMiLCJyZXZlcnNlZCIsInNob3VsZFVwZGF0ZSIsInNvbWUiLCJzYW1lR3JvdXAiLCJDT0xPUl9SQU5HRVMiLCJmaWx0ZXIiLCJjciIsImZpbmQiLCJjb2xvck1hcCIsInVwZGF0ZUNvbG9yTWFwIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJ1cGRhdGVDYXRlZ29yeUNvbG9yTWFwIiwidXBkYXRlTnVtZXJpY0NvbG9yTWFwIiwiYXNzaWduZWRDYXRlZ29yaWVzIiwibmV3Q29sb3JNYXAiLCJzbGljZSIsImNNYXAiLCJ1bmFzc2lnbmVkQ29sb3JzIiwiY2F0ZWdvcnkiLCJjb2xvck1hcFZhbHVlcyIsImMiLCJtYXhWYWx1ZSIsInByZXZWYWx1ZSIsInN0ZXAiLCJpIiwibGF5ZXJEYXRhIiwiZGF0YSIsImhhc0FsbENvbHVtbnMiLCJoYXNMYXllckRhdGEiLCJyZW5kZXJMYXllciIsIkFycmF5IiwiaXNBcnJheSIsIk1hcCIsImsiLCJzZXQiLCJTQ0FMRV9GVU5DIiwiZnJvbSIsInVua25vd24iLCJVTktOT1dOX0NPTE9SIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwiZmFsbGJhY2tJY29uIiwidW5rbm93blZhbHVlIiwibWFwcGluZyIsIm90aGVyc01hcmtlciIsIm1hcmtlck1hcCIsIm1hcmtlclVybCIsImRhdGFBY2Nlc3NvciIsImF0dHJpYnV0ZUFjY2Vzc29ycyIsImZpeGVkIiwiYWNjZXNzb3IiLCJnZXRBdHRyaWJ1dGVWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwic2hvdWxkR2V0U2NhbGUiLCJpZGVudGl0eSIsImFyZ3MiLCJpc0ZpeGVkIiwiZmllbGRDb25maWciLCJhZ2dyZWdhdGlvblZhbHVlIiwic2NhbGVGdW5jdGlvbiIsImdldENvbG9yU2NhbGUiLCJjdXN0b21NYXJrZXIiLCJnZXRDdXN0b21NYXJrZXJzU2NhbGUiLCJjdXN0b21NYXJrZXJzVXJsIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsIkNvbnNvbGUiLCJ3YXJuIiwib3JkaW5hbCIsImRvbWFpbklzSW5maW5pdGUiLCJJbmZpbml0eSIsInNjYWxlRmFjdG9yeSIsInJlc3VsdCIsImdldFBvc2l0aW9uIiwic2FtcGxlRGF0YSIsIm51bVJvd3MiLCJwb2ludHMiLCJtYXBJbmRleCIsImxhdEJvdW5kcyIsImxuZ0JvdW5kcyIsImRhdGFVcGRhdGVUcmlnZ2VycyIsInRyaWdnZXJDaGFuZ2VkIiwiX29sZERhdGFVcGRhdGVUcmlnZ2VycyIsIl9hZ2dyZWdhdGlvbiIsImdldFZhbHVlIiwiYXR0cmlidXRlVmFsdWUiLCJBTExfRklFTERfVFlQRVMiLCJ0aW1lc3RhbXAiLCJEYXRlIiwiYWxsRGF0YSIsImdldERhdGEiLCJkYXRhc2V0SWQiLCJnZXRNZXRhIiwidGwiLCJvbGRMYXllckRhdGEiLCJsYXllckRhdGFzZXQiLCJ1cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImdldERhdGFVcGRhdGVUcmlnZ2VycyIsImdldENoYW5nZWRUcmlnZ2VycyIsInVwZGF0ZUxheWVyTWV0YSIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJkYXRhc2V0Iiwib2xkRmllbGQiLCJuZXdEYXRhU2V0RmllbGQiLCJmZCIsIm5ld0ZpbHRlciIsInRhYmxlIiwiZ2V0RGF0YXNldCIsInNjYWxlVHlwZSIsInVwZGF0ZWREb21haW4iLCJjYWxjdWxhdGVMYXllckRvbWFpbiIsInZhbGlkYXRlRmllbGRUeXBlIiwidmFsaWRhdGVTY2FsZSIsInZpc3VhbENoYW5uZWwiLCJzdXBwb3J0ZWRGaWVsZFR5cGVzIiwiY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMiLCJDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMiLCJzY2FsZU9wdGlvbnMiLCJnZXRTY2FsZU9wdGlvbnMiLCJGSUVMRF9PUFRTIiwidXBkYXRlVHJpZ2dlcnMiLCJkYXRhU2V0RmllbGQiLCJmIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJvYmplY3RJbmZvIiwiaXNMYXllckhvdmVyZWQiLCJwaWNrZWQiLCJsYXllciIsIm1hcFN0YXRlIiwicmFkaXVzQ2hhbm5lbCIsInZjIiwicmFkaXVzIiwiZ2V0Wm9vbUZhY3RvciIsInJhZGl1c1JhbmdlIiwiY2VpbCIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImludGVyYWN0aW9uQ29uZmlnIiwiYnJ1c2hpbmdUYXJnZXQiLCJicnVzaCIsImF1dG9IaWdobGlnaHQiLCJicnVzaGluZ1JhZGl1cyIsImJydXNoaW5nRW5hYmxlZCIsImlkeCIsImdwdUZpbHRlciIsInZpc2libGUiLCJtYXNrUG9seWdvbiIsIm1hc2tFeHRlbnNpb25Qcm9wcyIsImNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkxOR0xBVCIsInBpY2thYmxlIiwiaGFzSW50ZXJhY3Rpdml0eSIsIndyYXBMb25naXR1ZGUiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiZHJhZ1JvdGF0ZSIsImVuYWJsZTNkIiwib3BhY2l0eSIsImV4dGVuc2lvbnMiLCJmaWx0ZXJSYW5nZSIsInVuZGVmaW5lZCIsInJlbmRlck9wdHMiLCJnZXRQaXhlbE9mZnNldCIsInNoYXJlZFByb3BzIiwidGV4dExhYmVscyIsImdldFRleHQiLCJUZXh0TGF5ZXIiLCJjaGFyYWN0ZXJTZXQiLCJnZXRTaXplIiwiZ2V0VGV4dEFuY2hvciIsImFuY2hvciIsImdldEFsaWdubWVudEJhc2VsaW5lIiwiYWxpZ25tZW50IiwiZ2V0Q29sb3IiLCJnZXRSYWRpdXMiLCJpY29uVXJsQWNjZXNzb3IiLCJtYXNrIiwibWF4SWNvblNpemUiLCJnZXRNYXhNYXJrZXJTaXplIiwid2FudGVkVXJsIiwiaWNvbk9rIiwidXJsIiwid2lkdGgiLCJoZWlnaHQiLCJrZXBsZXJUYWJsZSIsImZvdW5kTGF5ZXJzIiwiZGVmYXVsdEZpZWxkcyIsImFsbEZpZWxkcyIsInJlcXVpcmVkQ29sdW1ucyIsInByZXYiLCJyZXF1aXJlZEZpZWxkcyIsImdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMiLCJhbGxLZXlzIiwicG9pbnRlcnMiLCJjb3VudFBlcktleSIsInBhaXJzIiwiaW5jcmVtZW50UG9pbnRlcnMiLCJuZXdQYWlyIiwiY3V1ciIsInB0cyIsImNvdW50cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBZ0NBOztBQUNBOztBQUVBOztBQVlBOztBQUNBOztBQUNBOztBQVFBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7d0RBNEJVQSxhOztBQTFGVjtBQUNBQyxZQUFVQyxZQUFWLENBQXVCQyxjQUF2QixHQUF3QztBQUFDQyxFQUFBQSxJQUFJLEVBQUUsVUFBUDtBQUFtQkMsRUFBQUEsS0FBSyxFQUFFO0FBQTFCLENBQXhDLEMsQ0FFQTs7QUFDQSxTQUFTQyxTQUFULENBQW1CQyxDQUFuQixFQUFzQkMsQ0FBdEIsRUFBeUI7QUFDdkIsTUFBSUQsQ0FBQyxLQUFLQyxDQUFWLEVBQWE7QUFDWCxX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QixhQUFPLDBCQUFTQSxDQUFULENBQVA7QUFDRDs7Ozs7ZUFtakNZdkosSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBrZXltaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCB7RGF0YUZpbHRlckV4dGVuc2lvbn0gZnJvbSAnQGRlY2suZ2wvZXh0ZW5zaW9ucyc7XG5pbXBvcnQge0NPT1JESU5BVEVfU1lTVEVNLCBMYXllciBhcyBEZWNrTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtUZXh0TGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5cbi8vIFdvcmthcm91bmQgdW50aWwgaHR0cHM6Ly9naXRodWIuY29tL3Zpc2dsL2RlY2suZ2wvcHVsbC83NTEzIGlzIHJlbGVhc2VkXG5EZWNrTGF5ZXIuZGVmYXVsdFByb3BzLmdldEZpbHRlclZhbHVlID0ge3R5cGU6ICdhY2Nlc3NvcicsIHZhbHVlOiAwfTtcblxuLy8gV29ya2Fyb3VuZCB1bnRpbCBodHRwczovL2dpdGh1Yi5jb20vdmlzZ2wvZGVjay5nbC9wdWxsLzc1MDcgaXMgcmVsZWFzZWRcbmZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGEpIHtcbiAgICBjb25zdCBhVmFsdWUgPSBhW2tleV07XG4gICAgY29uc3QgYlZhbHVlID0gYltrZXldO1xuICAgIGNvbnN0IGVxdWFscyA9IGFWYWx1ZSA9PT0gYlZhbHVlIHx8IGRlZXBFcXVhbChhVmFsdWUsIGJWYWx1ZSk7XG4gICAgaWYgKCFlcXVhbHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbkRlY2tMYXllci5kZWZhdWx0UHJvcHMubG9hZE9wdGlvbnMgPSB7XG4gIHR5cGU6ICdvYmplY3QnLFxuICB2YWx1ZToge30sXG4gIG9wdGlvbmFsOiB0cnVlLFxuICBjb21wYXJlOiB0cnVlLFxuICBlcXVhbDogZGVlcEVxdWFsXG59O1xuXG5pbXBvcnQgRGVmYXVsdExheWVySWNvbiBmcm9tICcuL2RlZmF1bHQtbGF5ZXItaWNvbic7XG5pbXBvcnQge2RpZmZVcGRhdGVUcmlnZ2Vyc30gZnJvbSAnLi9sYXllci11cGRhdGUnO1xuXG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIE5PX1ZBTFVFX0NPTE9SLFxuICBTQ0FMRV9UWVBFUyxcbiAgQ0hBTk5FTF9TQ0FMRVMsXG4gIEZJRUxEX09QVFMsXG4gIFNDQUxFX0ZVTkMsXG4gIENIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEUyxcbiAgTUFYX0dQVV9GSUxURVJTLFxuICBVTktOT1dOX0NPTE9SLFxuICBaT09NX0xFVkVMX0xJTUlUU1xufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge0NPTE9SX1JBTkdFU30gZnJvbSAnY29uc3RhbnRzL2NvbG9yLXJhbmdlcyc7XG5pbXBvcnQge0RhdGFWaXpDb2xvcnN9IGZyb20gJ2NvbnN0YW50cy9jdXN0b20tY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7XG4gIExBWUVSX1ZJU19DT05GSUdTLFxuICBERUZBVUxUX1RFWFRfTEFCRUwsXG4gIERFRkFVTFRfQ09MT1JfVUksXG4gIERFRkFVTFRfSElHSExJR0hUX0NPTE9SLFxuICBERUZBVUxUX0xBWUVSX0xBQkVMXG59IGZyb20gJy4vbGF5ZXItZmFjdG9yeSc7XG5cbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWQsIGlzUGxhaW5PYmplY3R9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtnZXRMYXRMbmdCb3VuZHMsIG5vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge2dldFNhbXBsZURhdGF9IGZyb20gJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLXV0aWxzJztcblxuaW1wb3J0IHtoZXhUb1JnYiwgZ2V0Q29sb3JHcm91cEJ5TmFtZSwgcmV2ZXJzZUNvbG9yUmFuZ2V9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7Z2V0TWFza0V4dGVuc2lvblByb3BzfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5pbXBvcnQge3NjYWxlT3JkaW5hbH0gZnJvbSAnZDMtc2NhbGUnO1xuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLkxheWVyfSBMYXllckNsYXNzfSAqL1xuXG4vKipcbiAqIEFwcHJveC4gbnVtYmVyIG9mIHBvaW50cyB0byBzYW1wbGUgaW4gYSBsYXJnZSBkYXRhIHNldFxuICogQHR5cGUge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IExBWUVSX0lEX0xFTkdUSCA9IDY7XG5cbi8vIE5vdGUsIHRoaXMgaXMgaXMgU1ZHIG9mIHNvbGlkIGNpcmNsZSBlbmNvZGVkIGFzIGRhdGEtdXJpXG5jb25zdCBGQUxMQkFDS19JQ09OID1cbiAgJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxQSE4yWnlCMmFXVjNRbTk0UFNJd0lEQWdNVEF3SURFd01DSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNE5DaUFnUEdOcGNtTnNaU0JqZUQwaU5UQWlJR041UFNJMU1DSWdjajBpTlRBaUx6NE5Dand2YzNablBnPT0nO1xuXG5jb25zdCBNQVhfU0FNUExFX1NJWkUgPSA1MDAwO1xuY29uc3QgZGVmYXVsdERvbWFpbiA9IFswLCAxXTtcbmNvbnN0IGRhdGFGaWx0ZXJFeHRlbnNpb24gPSBuZXcgRGF0YUZpbHRlckV4dGVuc2lvbih7ZmlsdGVyU2l6ZTogTUFYX0dQVV9GSUxURVJTfSk7XG5cbmNvbnN0IGRlZmF1bHREYXRhQWNjZXNzb3IgPSBkYyA9PiBkID0+IGQ7XG5jb25zdCBkZWZhdWx0R2V0RmllbGRWYWx1ZSA9IChmaWVsZCwgZCkgPT4gZmllbGQudmFsdWVBY2Nlc3NvcihkKTtcbmNvbnN0IHNjYWxlSWRlbnRpdHkgPSB2ID0+IHY7XG5cbmV4cG9ydCBjb25zdCBPVkVSTEFZX1RZUEUgPSBrZXltaXJyb3Ioe1xuICBkZWNrZ2w6IG51bGwsXG4gIG1hcGJveGdsOiBudWxsXG59KTtcblxuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JzID0gT2JqZWN0LnZhbHVlcyhEYXRhVml6Q29sb3JzKS5tYXAoaGV4VG9SZ2IpO1xuZnVuY3Rpb24qIGdlbmVyYXRlQ29sb3IoKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxheWVyQ29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGxheWVyQ29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBsYXllckNvbG9yc1tpbmRleCsrXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuLyoqIEB0eXBlIHtMYXllckNsYXNzfSAqL1xuY2xhc3MgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG5cbiAgICAvLyBtZXRhXG4gICAgdGhpcy5tZXRhID0ge307XG5cbiAgICAvLyB2aXNDb25maWdTZXR0aW5nc1xuICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIGludGVyYWN0aXZpdHlTZXR0aW5nc1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IHt9O1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoe1xuICAgICAgY29sdW1uczogdGhpcy5nZXRMYXllckNvbHVtbnMoKSxcbiAgICAgIC4uLnByb3BzXG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBEZWZhdWx0TGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IG92ZXJsYXlUeXBlKCkge1xuICAgIHJldHVybiBPVkVSTEFZX1RZUEUuZGVja2dsO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0IGlzQWdncmVnYXRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29sdW1ucygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgbm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzKCkge1xuICAgIHJldHVybiBbJ2xhYmVsJywgJ29wYWNpdHknLCAndGhpY2tuZXNzJywgJ2lzVmlzaWJsZScsICdoaWRkZW4nXTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjb2xvcicsXG4gICAgICAgIGZpZWxkOiAnY29sb3JGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY29sb3JTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2NvbG9yRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgICAgICAga2V5OiAnY29sb3InLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgbnVsbFZhbHVlOiBOT19WQUxVRV9DT0xPUixcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICBwcm9wZXJ0eTogJ3NpemUnLFxuICAgICAgICBmaWVsZDogJ3NpemVGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnc2l6ZVNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc2l6ZURvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnc2l6ZVJhbmdlJyxcbiAgICAgICAga2V5OiAnc2l6ZScsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLnNpemUsXG4gICAgICAgIG51bGxWYWx1ZTogMCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIENvbHVtbiBwYWlycyBtYXBzIGxheWVyIGNvbHVtbiB0byBhIHNwZWNpZmljIGZpZWxkIHBhaXJzLFxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbnVsbFxuICAgKi9cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLypcbiAgICogRGVmYXVsdCBwb2ludCBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBwb2ludCBiYXNlZCBsYXllcnM6IHBvaW50LCBpY29uIGV0Yy5cbiAgICovXG4gIGdldCBkZWZhdWx0UG9pbnRDb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0OiB7cGFpcjogJ2xuZycsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nOiB7cGFpcjogJ2xhdCcsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgbGluayBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBsaW5rIGJhc2VkIGxheWVyczogYXJjLCBsaW5lIGV0Y1xuICAgKi9cbiAgZ2V0IGRlZmF1bHRMaW5rQ29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdDA6IHtwYWlyOiAnbG5nMCcsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nMDoge3BhaXI6ICdsYXQwJywgZmllbGRQYWlyS2V5OiAnbG5nJ30sXG4gICAgICBsYXQxOiB7cGFpcjogJ2xuZzEnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzE6IHtwYWlyOiAnbGF0MScsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBSZWFjdCBjb21wb25lbnQgZm9yIHRvIHJlbmRlciBsYXllciBpbnN0cnVjdGlvbnMgaW4gYSBtb2RhbFxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGFuIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiAgcmV0dXJuIHtcbiAgICogICAgaWQ6ICdpY29uSW5mbycsXG4gICAqICAgIHRlbXBsYXRlOiBJY29uSW5mb01vZGFsLFxuICAgKiAgICBtb2RhbFByb3BzOiB7XG4gICAqICAgICAgdGl0bGU6ICdIb3cgdG8gZHJhdyBpY29ucydcbiAgICogICB9O1xuICAgKiB9XG4gICAqL1xuICBnZXQgbGF5ZXJJbmZvTW9kYWwoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3M7XG4gIH1cblxuICBzZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKGludGVyYWN0aXZpdHlTZXR0aW5ncykge1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IGludGVyYWN0aXZpdHlTZXR0aW5ncztcbiAgfVxuXG4gIGdldCBoYXNUb29sdGlwKCkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmhvdmVyPy5maWVsZHMubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpdml0eVNldHRpbmdzPy5jbGljaz8uZmllbGRzLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzSW50ZXJhY3Rpdml0eSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmhhc1Rvb2x0aXAgJiYgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmVuYWJsZWQpO1xuICB9XG5cbiAgLypcbiAgICogR2l2ZW4gYSBkYXRhc2V0LCBhdXRvbWF0aWNhbGx5IGZpbmQgcHJvcHMgdG8gY3JlYXRlIGxheWVyIGJhc2VkIG9uIGl0XG4gICAqIGFuZCByZXR1cm4gdGhlIHByb3BzIGFuZCBwcmV2aW91cyBmb3VuZCBsYXllcnMuXG4gICAqIEJ5IGRlZmF1bHQsIG5vIGxheWVycyB3aWxsIGJlIGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIGZvdW5kTGF5ZXJzKSB7XG4gICAgcmV0dXJuIHtwcm9wczogW10sIGZvdW5kTGF5ZXJzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGFycmF5IG9mIHByZXNldCByZXF1aXJlZCBjb2x1bW4gbmFtZXNcbiAgICogZm91bmQgZmllbGQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0byBzZXQgYXMgbGF5ZXIgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkZWZhdWx0RmllbGRzXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IGFsbEZpZWxkc1xuICAgKiBAcmV0dXJucyB7b2JqZWN0W10gfCBudWxsfSBhbGwgcG9zc2libGUgcmVxdWlyZWQgbGF5ZXIgY29sdW1uIHBhaXJzXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRDb2x1bW5GaWVsZChkZWZhdWx0RmllbGRzLCBhbGxGaWVsZHMpIHtcbiAgICAvLyBmaW5kIGFsbCBtYXRjaGVkIGZpZWxkcyBmb3IgZWFjaCByZXF1aXJlZCBjb2xcbiAgICBjb25zdCByZXF1aXJlZENvbHVtbnMgPSBPYmplY3Qua2V5cyhkZWZhdWx0RmllbGRzKS5yZWR1Y2UoKHByZXYsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBhbGxGaWVsZHMuZmlsdGVyKFxuICAgICAgICBmID0+IGYubmFtZSA9PT0gZGVmYXVsdEZpZWxkc1trZXldIHx8IGRlZmF1bHRGaWVsZHNba2V5XS5pbmNsdWRlcyhmLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBwcmV2W2tleV0gPSByZXF1aXJlZEZpZWxkcy5sZW5ndGhcbiAgICAgICAgPyByZXF1aXJlZEZpZWxkcy5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgdmFsdWU6IGYubmFtZSxcbiAgICAgICAgICAgIGZpZWxkSWR4OiBmLmZpZWxkSWR4XG4gICAgICAgICAgfSkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhyZXF1aXJlZENvbHVtbnMpLmV2ZXJ5KEJvb2xlYW4pKSB7XG4gICAgICAvLyBpZiBhbnkgZmllbGQgbWlzc2luZywgcmV0dXJuIG51bGxcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMocmVxdWlyZWRDb2x1bW5zKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucykge1xuICAgIC8vIGZvciBtdWx0aXBsZSBtYXRjaGVkIGZpZWxkIGZvciBvbmUgcmVxdWlyZWQgY29sdW1uLCByZXR1cm4gbXVsdGlwbGVcbiAgICAvLyBjb21iaW5hdGlvbnMsIGUuIGcuIGlmIGNvbHVtbiBhIGhhcyAyIG1hdGNoZWQsIGNvbHVtbiBiIGhhcyAzIG1hdGNoZWRcbiAgICAvLyA2IHBvc3NpYmxlIGNvbHVtbiBwYWlycyB3aWxsIGJlIHJldHVybmVkXG4gICAgY29uc3QgYWxsS2V5cyA9IE9iamVjdC5rZXlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gICAgY29uc3QgcG9pbnRlcnMgPSBhbGxLZXlzLm1hcCgoaywgaSkgPT4gKChpID09PSBhbGxLZXlzLmxlbmd0aCAtIDEgPyAtMSA6IDApKSk7XG4gICAgY29uc3QgY291bnRQZXJLZXkgPSBhbGxLZXlzLm1hcChrID0+IHJlcXVpcmVkQ29sdW1uc1trXS5sZW5ndGgpO1xuICAgIGNvbnN0IHBhaXJzID0gW107XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICB3aGlsZSAoaW5jcmVtZW50UG9pbnRlcnMocG9pbnRlcnMsIGNvdW50UGVyS2V5LCBwb2ludGVycy5sZW5ndGggLSAxKSkge1xuICAgICAgY29uc3QgbmV3UGFpciA9IHBvaW50ZXJzLnJlZHVjZSgocHJldiwgY3V1ciwgaSkgPT4ge1xuICAgICAgICBwcmV2W2FsbEtleXNbaV1dID0gcmVxdWlyZWRDb2x1bW5zW2FsbEtleXNbaV1dW2N1dXJdO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcGFpcnMucHVzaChuZXdQYWlyKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuICAgIC8vIHJlY3Vyc2l2ZWx5IGluY3JlbWVudCBwb2ludGVyc1xuICAgIGZ1bmN0aW9uIGluY3JlbWVudFBvaW50ZXJzKHB0cywgY291bnRzLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSAwICYmIHB0c1swXSA9PT0gY291bnRzWzBdIC0gMSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGluY3JlbWVudFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdHNbaW5kZXhdICsgMSA8IGNvdW50c1tpbmRleF0pIHtcbiAgICAgICAgcHRzW2luZGV4XSA9IHB0c1tpbmRleF0gKyAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcHRzW2luZGV4XSA9IDA7XG4gICAgICByZXR1cm4gaW5jcmVtZW50UG9pbnRlcnMocHRzLCBjb3VudHMsIGluZGV4IC0gMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhaXJzO1xuICB9XG5cbiAgc3RhdGljIGhleFRvUmdiKGMpIHtcbiAgICByZXR1cm4gaGV4VG9SZ2IoYyk7XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhSWQ6IHByb3BzLmRhdGFJZCB8fCBudWxsLFxuICAgICAgdmlzaWJpbGl0eUJ5Wm9vbToge1xuICAgICAgICBtaW46IHByb3BzLnZpc2liaWxpdHlCeVpvb20/Lm1pbiB8fCBaT09NX0xFVkVMX0xJTUlUUy5taW4sXG4gICAgICAgIG1heDogcHJvcHMudmlzaWJpbGl0eUJ5Wm9vbT8ubWF4IHx8IFpPT01fTEVWRUxfTElNSVRTLm1heFxuICAgICAgfSxcbiAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCB8fCBERUZBVUxUX0xBWUVSX0xBQkVMLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yIHx8IGNvbG9yTWFrZXIubmV4dCgpLnZhbHVlLFxuICAgICAgY29sdW1uczogcHJvcHMuY29sdW1ucyB8fCBudWxsLFxuICAgICAgaXNWaXNpYmxlOiBwcm9wcy5pc1Zpc2libGUgfHwgZmFsc2UsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogcHJvcHMuaXNDb25maWdBY3RpdmUgfHwgZmFsc2UsXG4gICAgICBoaWdobGlnaHRDb2xvcjogcHJvcHMuaGlnaGxpZ2h0Q29sb3IgfHwgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gICAgICBoaWRkZW46IHByb3BzLmhpZGRlbiB8fCBmYWxzZSxcblxuICAgICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBpbnRvIHNlcGFyYXRlIHZpc3VhbCBDaGFubmVsIGNvbmZpZ1xuICAgICAgLy8gY29sb3IgYnkgZmllbGQsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIGNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBjb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgY29sb3JTY2FsZTogU0NBTEVfVFlQRVMucXVhbnRpbGUsXG5cbiAgICAgIC8vIGNvbG9yIGJ5IHNpemUsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIHNpemVEb21haW46IFswLCAxXSxcbiAgICAgIHNpemVTY2FsZTogU0NBTEVfVFlQRVMubGluZWFyLFxuICAgICAgc2l6ZUZpZWxkOiBudWxsLFxuICAgICAgcmFkaXVzRmllbGQ6IG51bGwsXG5cbiAgICAgIHZpc0NvbmZpZzoge30sXG5cbiAgICAgIHRleHRMYWJlbDogW0RFRkFVTFRfVEVYVF9MQUJFTF0sXG5cbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgY29sb3I6IERFRkFVTFRfQ09MT1JfVUksXG4gICAgICAgIGNvbG9yUmFuZ2U6IERFRkFVTFRfQ09MT1JfVUlcbiAgICAgIH0sXG4gICAgICBhbmltYXRpb246IHtlbmFibGVkOiBmYWxzZX1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgYSB2aXN1YWxDaGFubmVsIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zIHt7bGFiZWw6IHN0cmluZywgbWVhc3VyZTogKHN0cmluZ3xzdHJpbmcpfX1cbiAgICovXG4gIGdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbihrZXkpIHtcbiAgICAvLyBlLmcuIGxhYmVsOiBDb2xvciwgbWVhc3VyZTogVmVoaWNsZSBUeXBlXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5yYW5nZV0ubGFiZWwsXG4gICAgICBtZWFzdXJlOiB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdXG4gICAgICAgID8gKHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF0uZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdLm5hbWUpXG4gICAgICAgIDogdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmRlZmF1bHRNZWFzdXJlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCB0byBsYXllciBjb2x1bW4sIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBmaWVsZCAtIFNlbGVjdGVkIGZpZWxkXG4gICAqIEByZXR1cm5zIHt7fX0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW4oa2V5LCBmaWVsZCkge1xuICAgIC8vIGZpZWxkIHZhbHVlIGNvdWxkIGJlIG51bGwgZm9yIG9wdGlvbmFsIGNvbHVtbnNcbiAgICBjb25zdCB1cGRhdGUgPSBmaWVsZFxuICAgICAgPyB7XG4gICAgICAgICAgdmFsdWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGZpZWxkLmZpZWxkSWR4XG4gICAgICAgIH1cbiAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XToge1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zW2tleV0sXG4gICAgICAgIC4uLnVwZGF0ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgcGFpciB0byBjb2x1bW4gY29uZmlnLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gcGFpciAtIGZpZWxkIFBhaXJcbiAgICogQHJldHVybnMge29iamVjdH0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW5QYWlycyhrZXksIHBhaXIpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uUGFpcnMgfHwgIXRoaXMuY29sdW1uUGFpcnM/LltrZXldKSB7XG4gICAgICAvLyBzaG91bGQgbm90IGVuZCBpbiB0aGlzIHN0YXRlXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuY29sdW1ucztcbiAgICB9XG5cbiAgICBjb25zdCB7cGFpcjogcGFydG5lcktleSwgZmllbGRQYWlyS2V5fSA9IHRoaXMuY29sdW1uUGFpcnM/LltrZXldO1xuICAgIGNvbnN0IHtmaWVsZFBhaXJLZXk6IHBhcnRuZXJGaWVsZFBhaXJLZXl9ID0gdGhpcy5jb2x1bW5QYWlycz8uW3BhcnRuZXJLZXldO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XTogcGFpcltmaWVsZFBhaXJLZXldLFxuICAgICAgW3BhcnRuZXJLZXldOiBwYWlyW3BhcnRuZXJGaWVsZFBhaXJLZXldXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSByYWRpdXMgem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Wm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGgubWF4KDE0IC0gem9vbSArIHpvb21PZmZzZXQsIDApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSBlbGV2YXRpb24gem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0RWxldmF0aW9uWm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc0NvbmZpZy5lbmFibGVFbGV2YXRpb25ab29tRmFjdG9yXG4gICAgICA/IE1hdGgucG93KDIsIE1hdGgubWF4KDggLSB6b29tICsgem9vbU9mZnNldCwgMCkpXG4gICAgICA6IDE7XG4gIH1cblxuICBmb3JtYXRMYXllckRhdGEoZGF0YXNldHMsIGZpbHRlcmVkSW5kZXgpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZW5kZXJMYXllcigpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXRIb3ZlckRhdGEob2JqZWN0LCBkYXRhQ29udGFpbmVyKSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggZW50cnkgb2YgbGF5ZXJEYXRhIHNob3VsZCBoYXZlIGFuIGluZGV4IG9mIGEgcm93IGluIHRoZSBvcmlnaW5hbCBkYXRhIGNvbnRhaW5lci5cbiAgICAvLyBFYWNoIGxheWVyIGNhbiBpbXBsZW1lbnQgaXRzIG93biBnZXRIb3ZlckRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIGRhdGFDb250YWluZXIucm93KG9iamVjdC5pbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjaGFuZ2UgbGF5ZXIgdHlwZSwgdHJ5IHRvIGNvcHkgb3ZlciBsYXllciBjb25maWdzIGFzIG11Y2ggYXMgcG9zc2libGVcbiAgICogQHBhcmFtIGNvbmZpZ1RvQ29weSAtIGNvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHZpc0NvbmZpZ1NldHRpbmdzIC0gdmlzQ29uZmlnIHNldHRpbmdzIG9mIGNvbmZpZyB0byBjb3B5XG4gICAqL1xuICBhc3NpZ25Db25maWdUb0xheWVyKGNvbmZpZ1RvQ29weSwgdmlzQ29uZmlnU2V0dGluZ3MpIHtcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIHZpc3VhbENoYW5uZWwgZmllbGRcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIGNvbG9yIHJhbmdlLCByZXZlcnNlZDogaXMgbm90IGEga2V5IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBzaGFsbG93Q29weSA9IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ10uY29uY2F0KFxuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5tYXAodiA9PiB2LmZpZWxkKVxuICAgICk7XG5cbiAgICAvLyBkb24ndCBjb3B5IG92ZXIgZG9tYWluIGFuZCBhbmltYXRpb25cbiAgICBjb25zdCBub3RUb0NvcHkgPSBbJ2FuaW1hdGlvbiddLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLm1hcCh2ID0+IHYuZG9tYWluKSk7XG4gICAgLy8gaWYgcmFuZ2UgaXMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGdyb3VwIGNvcHkgaXQsIG90aGVyd2lzZSwgbm90IHRvIGNvcHlcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2godiA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZ1RvQ29weS52aXNDb25maWdbdi5yYW5nZV0gJiZcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXSAmJlxuICAgICAgICB2aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cCAhPT0gdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cFxuICAgICAgKSB7XG4gICAgICAgIG5vdFRvQ29weS5wdXNoKHYucmFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZG9uJ3QgY29weSBvdmVyIHZpc3VhbENoYW5uZWwgcmFuZ2VcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgY29waWVkID0gdGhpcy5jb3B5TGF5ZXJDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5LCB7XG4gICAgICBzaGFsbG93Q29weSxcbiAgICAgIG5vdFRvQ29weVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoY29waWVkKTtcbiAgICAvLyB2YWxpZGF0ZSB2aXN1YWxDaGFubmVsIGZpZWxkIHR5cGUgYW5kIHNjYWxlIHR5cGVzXG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICogUmVjdXJzaXZlbHkgY29weSBjb25maWcgb3ZlciB0byBhbiBlbXB0eSBsYXllclxuICAgKiB3aGVuIHJlY2VpdmVkIHNhdmVkIGNvbmZpZywgb3IgY29weSBjb25maWcgb3ZlciBmcm9tIGEgZGlmZmVyZW50IGxheWVyIHR5cGVcbiAgICogbWFrZSBzdXJlIHRvIG9ubHkgY29weSBvdmVyIHZhbHVlIHRvIGV4aXN0aW5nIGtleXNcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb25maWcgLSBleGlzdGluZyBjb25maWcgdG8gYmUgb3ZlcnJpZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1RvQ29weSAtIG5ldyBDb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNoYWxsb3dDb3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyB0byBub3QgdG8gYmUgZGVlcCBjb3BpZWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9Db3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyBub3QgdG8gY29weVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGNvcGllZCBjb25maWdcbiAgICovXG4gIGNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnLCBjb25maWdUb0NvcHksIHtzaGFsbG93Q29weSA9IFtdLCBub3RUb0NvcHkgPSBbXX0gPSB7fSkge1xuICAgIGNvbnN0IGNvcGllZCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50Q29uZmlnW2tleV0pICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY29uZmlnVG9Db3B5W2tleV0pICYmXG4gICAgICAgICFzaGFsbG93Q29weS5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGFzc2lnbiBvYmplY3QgdmFsdWVcbiAgICAgICAgY29waWVkW2tleV0gPSB0aGlzLmNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnW2tleV0sIGNvbmZpZ1RvQ29weVtrZXldLCB7XG4gICAgICAgICAgc2hhbGxvd0NvcHksXG4gICAgICAgICAgbm90VG9Db3B5XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChub3ROdWxsb3JVbmRlZmluZWQoY29uZmlnVG9Db3B5W2tleV0pICYmICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAvLyBjb3B5XG4gICAgICAgIGNvcGllZFtrZXldID0gY29uZmlnVG9Db3B5W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBrZWVwIGV4aXN0aW5nXG4gICAgICAgIGNvcGllZFtrZXldID0gY3VycmVudENvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuXG4gIHJlZ2lzdGVyVmlzQ29uZmlnKGxheWVyVmlzQ29uZmlncykge1xuICAgIE9iamVjdC5rZXlzKGxheWVyVmlzQ29uZmlncykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXSkge1xuICAgICAgICAvLyBpZiBhc3NpZ25lZCBvbmUgb2YgZGVmYXVsdCBMQVlFUl9DT05GSUdTXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2xheWVyVmlzQ29uZmlnc1tpdGVtXV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW2l0ZW1dID0gTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXTtcbiAgICAgIH0gZWxzZSBpZiAoWyd0eXBlJywgJ2RlZmF1bHRWYWx1ZSddLmV2ZXJ5KHAgPT4gbGF5ZXJWaXNDb25maWdzW2l0ZW1dLmhhc093blByb3BlcnR5KHApKSkge1xuICAgICAgICAvLyBpZiBwcm92aWRlZCBjdXN0b21pemVkIHZpc0NvbmZpZywgYW5kIGhhcyB0eXBlICYmIGRlZmF1bHRWYWx1ZVxuICAgICAgICAvLyBUT0RPOiBmdXJ0aGVyIGNoZWNrIGlmIGN1c3RvbWl6ZWQgdmlzQ29uZmlnIGlzIHZhbGlkXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IGxheWVyVmlzQ29uZmlnc1tpdGVtXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbaXRlbV0gPSBsYXllclZpc0NvbmZpZ3NbaXRlbV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXllckNvbHVtbnMoKSB7XG4gICAgY29uc3QgY29sdW1uVmFsaWRhdG9ycyA9IHRoaXMuY29sdW1uVmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCByZXF1aXJlZCA9IHRoaXMucmVxdWlyZWRMYXllckNvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtblZhbGlkYXRvcnNba2V5XVxuICAgICAgICAgID8ge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIHZhbGlkYXRvcjogY29sdW1uVmFsaWRhdG9yc1trZXldfVxuICAgICAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbCA9IHRoaXMub3B0aW9uYWxDb2x1bW5zLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7Li4ucmVxdWlyZWQsIC4uLm9wdGlvbmFsfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gey4uLnRoaXMuY29uZmlnLCAuLi5uZXdDb25maWd9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXNDb25maWcobmV3VmlzQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcudmlzQ29uZmlnID0gey4uLnRoaXMuY29uZmlnLnZpc0NvbmZpZywgLi4ubmV3VmlzQ29uZmlnfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpIHtcbiAgICBjb25zdCB7Y29sb3JVSTogcHJldmlvdXMsIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChuZXdDb25maWcpIHx8IHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JVSVByb3AgPSBPYmplY3QuZW50cmllcyhuZXdDb25maWcpLnJlZHVjZSgoYWNjdSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogaXNQbGFpbk9iamVjdChhY2N1W2tleV0pICYmIGlzUGxhaW5PYmplY3QodmFsdWUpID8gey4uLmFjY3Vba2V5XSwgLi4udmFsdWV9IDogdmFsdWVcbiAgICAgIH07XG4gICAgfSwgcHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSk7XG5cbiAgICBjb25zdCBjb2xvclVJID0ge1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICBbcHJvcF06IGNvbG9yVUlQcm9wXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe2NvbG9yVUl9KTtcbiAgICAvLyBpZiBjb2xvclVJW3Byb3BdIGlzIGNvbG9yUmFuZ2VcbiAgICBjb25zdCBpc0NvbG9yUmFuZ2UgPSB2aXNDb25maWdbcHJvcF0gJiYgdmlzQ29uZmlnW3Byb3BdLmNvbG9ycztcblxuICAgIGlmIChpc0NvbG9yUmFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sb3JVSUJ5Q29sb3JSYW5nZShuZXdDb25maWcsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21QYWxldHRlKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlQ3VzdG9tUGFsZXR0ZShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgaWYgKCFuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyB8fCAhbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuY3VzdG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghdmlzQ29uZmlnW3Byb3BdKSByZXR1cm47XG4gICAgY29uc3Qge2NvbG9yc30gPSB2aXNDb25maWdbcHJvcF07XG4gICAgY29uc3QgY3VzdG9tUGFsZXR0ZSA9IHtcbiAgICAgIC4uLmNvbG9yVUlbcHJvcF0uY3VzdG9tUGFsZXR0ZSxcbiAgICAgIG5hbWU6ICdDdXN0b20gUGFsZXR0ZScsXG4gICAgICBjb2xvcnM6IFsuLi5jb2xvcnNdXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uY29sb3JVSSxcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgLi4uY29sb3JVSVtwcm9wXSxcbiAgICAgICAgICBjdXN0b21QYWxldHRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogaWYgb3BlbiBkcm9wZG93biBhbmQgcHJvcCBpcyBjb2xvciByYW5nZVxuICAgKiBBdXRvbWF0aWNhbGx5IHNldCBjb2xvclJhbmdlQ29uZmlnJ3Mgc3RlcCwgcmV2ZXJzZWQgYW5kIHR5cGVcbiAgICogQHBhcmFtIHsqfSBuZXdDb25maWdcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICB1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlKG5ld0NvbmZpZywgcHJvcCkge1xuICAgIGlmICh0eXBlb2YgbmV3Q29uZmlnLnNob3dEcm9wZG93biAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIC4uLmNvbG9yVUksXG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0sXG4gICAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgICAgLi4uY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnLFxuICAgICAgICAgICAgdHlwZTogdmlzQ29uZmlnW3Byb3BdLnR5cGUsXG4gICAgICAgICAgICBzdGVwczogdmlzQ29uZmlnW3Byb3BdLmNvbG9ycy5sZW5ndGgsXG4gICAgICAgICAgICByZXZlcnNlZDogQm9vbGVhbih2aXNDb25maWdbcHJvcF0ucmV2ZXJzZWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICB1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApIHtcbiAgICAvLyBvbmx5IHVwZGF0ZSBjb2xvclJhbmdlIGlmIGNoYW5nZXMgaW4gVUkgaXMgbWFkZSB0byAncmV2ZXJzZWQnLCAnc3RlcHMnIG9yIHN0ZXBzXG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlID1cbiAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnICYmXG4gICAgICBbJ3JldmVyc2VkJywgJ3N0ZXBzJ10uc29tZShcbiAgICAgICAga2V5ID0+XG4gICAgICAgICAgbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnW2tleV0gIT09XG4gICAgICAgICAgICAocHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSkuY29sb3JSYW5nZUNvbmZpZ1trZXldXG4gICAgICApO1xuICAgIGlmICghc2hvdWxkVXBkYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtzdGVwcywgcmV2ZXJzZWR9ID0gY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnO1xuICAgIGNvbnN0IGNvbG9yUmFuZ2UgPSB2aXNDb25maWdbcHJvcF07XG4gICAgLy8gZmluZCBiYXNlZCBvbiBzdGVwIG9yIHJldmVyc2VkXG4gICAgbGV0IHVwZGF0ZTtcbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3N0ZXBzJykpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ2V0Q29sb3JHcm91cEJ5TmFtZShjb2xvclJhbmdlKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHNhbWVHcm91cCA9IENPTE9SX1JBTkdFUy5maWx0ZXIoY3IgPT4gZ2V0Q29sb3JHcm91cEJ5TmFtZShjcikgPT09IGdyb3VwKTtcblxuICAgICAgICB1cGRhdGUgPSBzYW1lR3JvdXAuZmluZChjciA9PiBjci5jb2xvcnMubGVuZ3RoID09PSBzdGVwcyk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSAmJiBjb2xvclJhbmdlLnJldmVyc2VkKSB7XG4gICAgICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UodHJ1ZSwgdXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5jb2xvck1hcCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHRoaXMudXBkYXRlQ29sb3JNYXAocHJvcCwgY29sb3JSYW5nZS5jb2xvck1hcCwgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncmV2ZXJzZWQnKSkge1xuICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UocmV2ZXJzZWQsIHVwZGF0ZSB8fCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHtbcHJvcF06IHVwZGF0ZX0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yTWFwLCBjb2xvclJhbmdlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHtmaWVsZCwgZG9tYWlufSA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YWx1ZSA9PiB2YWx1ZS5yYW5nZSA9PT0gcHJvcCk7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnW2ZpZWxkXT8udHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB0eXBlIG9yIHR5cGUgaXMgbm90IHN0cmluZywgYm9vbGVhbiBvciBkYXRlXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgfVxuXG4gIHVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgY29sb3JSYW5nZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IGNvbG9yUmFuZ2UuY29sb3JzO1xuICAgIGNvbnN0IGFzc2lnbmVkQ2F0ZWdvcmllcyA9IFtdO1xuICAgIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCkubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgYXNzaWduZWRDYXRlZ29yaWVzLnB1c2goY01hcFswXSk7XG4gICAgICByZXR1cm4gW2NNYXBbMF0sIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGZvciAoY29uc3QgY29sb3Igb2YgdW5hc3NpZ25lZENvbG9ycykge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBkb21haW4uZmluZChkID0+ICFhc3NpZ25lZENhdGVnb3JpZXMuaW5jbHVkZXMoZCkpO1xuICAgICAgaWYgKCFjYXRlZ29yeSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5KTtcbiAgICAgIG5ld0NvbG9yTWFwLnB1c2goW2NhdGVnb3J5LCBjb2xvcl0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVOdW1lcmljQ29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgdXBkYXRlKSB7XG4gICAgY29uc3QgY29sb3JzID0gdXBkYXRlLmNvbG9ycztcbiAgICBsZXQgbmV3Q29sb3JNYXAgPSBjb2xvck1hcC5zbGljZSgwLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIG5ld0NvbG9yTWFwID0gbmV3Q29sb3JNYXAubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmRleCA9PT0gbmV3Q29sb3JNYXAubGVuZ3RoIC0gMSA/IG51bGwgOiBjTWFwWzBdO1xuICAgICAgcmV0dXJuIFt2YWx1ZSwgY29sb3JzW2luZGV4XV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5hc3NpZ25lZENvbG9ycyA9IGNvbG9ycy5zbGljZShuZXdDb2xvck1hcC5sZW5ndGgsIGNvbG9ycy5sZW5ndGgpO1xuXG4gICAgaWYgKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sb3JNYXBWYWx1ZXMgPSBjb2xvck1hcC5tYXAoYyA9PiBjWzBdKS5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ251bWJlcicpO1xuICAgICAgY29uc3QgbWF4VmFsdWUgPSBNYXRoLm1heCguLi5jb2xvck1hcFZhbHVlcywgZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSk7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAyXVswXTtcbiAgICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBwcmV2VmFsdWUpIC8gKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoICsgMSk7XG4gICAgICBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAxXVswXSA9IHByZXZWYWx1ZSArIHN0ZXA7XG5cbiAgICAgIGZvciAoY29uc3QgW2ksIGNvbG9yXSBvZiB1bmFzc2lnbmVkQ29sb3JzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGkgPT09IHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoIC0gMSA/IG51bGwgOiBwcmV2VmFsdWUgKyAoc3RlcCAqIChpICsgMikpO1xuICAgICAgICBuZXdDb2xvck1hcC5wdXNoKFt2YWx1ZSwgY29sb3JdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBsYXllciBoYXMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzQWxsQ29sdW1ucygpIHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4gKFxuICAgICAgKGNvbHVtbnMgJiZcbiAgICAgIE9iamVjdC52YWx1ZXMoY29sdW1ucykuZXZlcnkodiA9PiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHYub3B0aW9uYWwgfHwgKHYudmFsdWUgJiYgdi5maWVsZElkeCA+IC0xKSk7XG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheSB8IE9iamVjdH0gbGF5ZXJEYXRhXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB5ZXMgb3Igbm9cbiAgICovXG4gIGhhc0xheWVyRGF0YShsYXllckRhdGEpIHtcbiAgICBpZiAoIWxheWVyRGF0YSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbihsYXllckRhdGEuZGF0YSAmJiBsYXllckRhdGEuZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgaXNWYWxpZFRvU2F2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlICYmIHRoaXMuaGFzQWxsQ29sdW1ucygpO1xuICB9XG5cbiAgc2hvdWxkUmVuZGVyTGF5ZXIoZGF0YSkge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy50eXBlICYmXG4gICAgICB0aGlzLmhhc0FsbENvbHVtbnMoKSAmJlxuICAgICAgdGhpcy5oYXNMYXllckRhdGEoZGF0YSkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLnJlbmRlckxheWVyID09PSAnZnVuY3Rpb24nKVxuICAgICk7XG4gIH1cblxuICBnZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3JSYW5nZS5jb2xvck1hcCkpIHtcbiAgICAgIGNvbnN0IGNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICBjb2xvclJhbmdlLmNvbG9yTWFwLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBjTWFwLnNldChrLCB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyBoZXhUb1JnYih2KSA6IHYpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgZDMgc2NhbGVcbiAgICAgIGNvbnN0IHNjYWxlID0gU0NBTEVfRlVOQ1tjb2xvclNjYWxlXSgpXG4gICAgICAgIC5kb21haW4oQXJyYXkuZnJvbShjTWFwLmtleXMoKSkpXG4gICAgICAgIC5yYW5nZShBcnJheS5mcm9tKGNNYXAudmFsdWVzKCkpKVxuICAgICAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoY29sb3JTY2FsZSwgY29sb3JEb21haW4sIGNvbG9yUmFuZ2UuY29sb3JzLm1hcChoZXhUb1JnYikpO1xuICB9XG5cbiAgZ2V0Q3VzdG9tTWFya2Vyc1NjYWxlKHJhbmdlLCBmYWxsYmFja0ljb24pIHtcbiAgICBsZXQgdW5rbm93blZhbHVlID0gZmFsbGJhY2tJY29uIHx8IEZBTExCQUNLX0lDT047XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgcmV0dXJuICgpID0+IHVua25vd25WYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXBwaW5nID0gbmV3IE1hcCgpO1xuXG4gICAgaWYgKHJhbmdlLm90aGVyc01hcmtlcikge1xuICAgICAgdW5rbm93blZhbHVlID0gcmFuZ2Uub3RoZXJzTWFya2VyO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHt2YWx1ZSwgbWFya2VyVXJsfSBvZiByYW5nZS5tYXJrZXJNYXApIHtcbiAgICAgIGlmIChtYXJrZXJVcmwpIHtcbiAgICAgICAgbWFwcGluZy5zZXQodmFsdWUsIG1hcmtlclVybCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZSBkMyBzY2FsZVxuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVPcmRpbmFsKClcbiAgICAgIC5kb21haW4oQXJyYXkuZnJvbShtYXBwaW5nLmtleXMoKSkpXG4gICAgICAucmFuZ2UoQXJyYXkuZnJvbShtYXBwaW5nLnZhbHVlcygpKSlcbiAgICAgIC51bmtub3duKHVua25vd25WYWx1ZSk7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSB2aXN1YWwgY2hhbm5lbHMgdG8gZGVjay5nbCBhY2Nlc29yc1xuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW0gUGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbS5kYXRhQWNjZXNzb3IgQWNjZXNzIGtlcGxlci5nbCBsYXllciBkYXRhIGZyb20gZGVjay5nbCBsYXllclxuICAgKiBAcGFyYW0ge2ltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZX0gcGFyYW0uZGF0YUNvbnRhaW5lciBEYXRhQ29udGFpbmVyIHRvIHVzZSB1c2Ugd2l0aCBkYXRhQWNjZXNzb3JcbiAgICogQHJldHVybiB7T2JqZWN0fSBhdHRyaWJ1dGVBY2Nlc3NvcnMgLSBkZWNrLmdsIGxheWVyIGF0dHJpYnV0ZSBhY2Nlc3NvcnNcbiAgICovXG4gIGdldEF0dHJpYnV0ZUFjY2Vzc29ycyh7ZGF0YUFjY2Vzc29yID0gZGVmYXVsdERhdGFBY2Nlc3NvciwgZGF0YUNvbnRhaW5lcn0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVBY2Nlc3NvcnMgPSB7fTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZpeGVkLFxuICAgICAgICBzY2FsZSxcbiAgICAgICAgZG9tYWluLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgICAgIG51bGxWYWx1ZSxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH0gPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuXG4gICAgICBjb25zdCBzaG91bGRHZXRTY2FsZSA9IEJvb2xlYW4oXG4gICAgICAgIChzY2FsZSB8fCBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5pZGVudGl0eSkgJiYgdGhpcy5jb25maWdbZmllbGRdXG4gICAgICApO1xuXG4gICAgICBpZiAoc2hvdWxkR2V0U2NhbGUpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IFt0aGlzLmNvbmZpZ1tzY2FsZV0sIHRoaXMuY29uZmlnW2RvbWFpbl0sIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV1dO1xuICAgICAgICBjb25zdCBpc0ZpeGVkID0gZml4ZWQgJiYgdGhpcy5jb25maWcudmlzQ29uZmlnW2ZpeGVkXTtcbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gZGVjbGFyZSBhcyBjb25zdCBhbGwgdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gYmUgdXNlIGluIHRoZSBnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlIGNhbGxcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgb2xkTGF5ZXJEYXRhIHBhcmFtZXRlciBpbiBmb3JtYXRMYXllckRhdGEgbWV0aG9kIHdpbGwgYmUgd3JvbmcgKHlvdSBjYW4gY2hlY2sgdGhlIGZvcm1hdExheWVyRGF0YSBUaWxlTGF5ZXIgbWV0aG9kIGluIEJ1aWxkZXIgYXMgZXhhbXBsZSlcbiAgICAgICAgY29uc3QgZmllbGRDb25maWcgPSB0aGlzLmNvbmZpZ1tmaWVsZF07XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uVmFsdWUgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbYWdncmVnYXRpb25dO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlRnVuY3Rpb24gPVxuICAgICAgICAgIGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmlkZW50aXR5XG4gICAgICAgICAgICA/IHNjYWxlSWRlbnRpdHlcbiAgICAgICAgICAgIDogY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuY29sb3JcbiAgICAgICAgICAgID8gdGhpcy5nZXRDb2xvclNjYWxlKC4uLmFyZ3MpXG4gICAgICAgICAgICA6IGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmN1c3RvbU1hcmtlclxuICAgICAgICAgICAgPyB0aGlzLmdldEN1c3RvbU1hcmtlcnNTY2FsZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdLFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZy5jdXN0b21NYXJrZXJzVXJsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoLi4uYXJncywgaXNGaXhlZCk7XG5cbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9IGQgPT5cbiAgICAgICAgICB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoXG4gICAgICAgICAgICBzY2FsZUZ1bmN0aW9uLFxuICAgICAgICAgICAgZGF0YUFjY2Vzc29yKGRhdGFDb250YWluZXIpKGQpLFxuICAgICAgICAgICAgZmllbGRDb25maWcsXG4gICAgICAgICAgICBhZ2dyZWdhdGlvblZhbHVlLFxuICAgICAgICAgICAgbnVsbFZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGdldEF0dHJpYnV0ZVZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGF0dHJpYnV0ZUFjY2Vzc29yc1thY2Nlc3Nvcl0gPSBnZXRBdHRyaWJ1dGVWYWx1ZSh0aGlzLmNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID1cbiAgICAgICAgICB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKHRoaXMuY29uZmlnKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoYWNjZXNzb3IgaW4gYXR0cmlidXRlQWNjZXNzb3JzKSkge1xuICAgICAgICBDb25zb2xlLndhcm4oYEZhaWxlZCB0byBwcm92aWRlIGFjY2Vzc29yIGZ1bmN0aW9uIGZvciAke2FjY2Vzc29yIHx8IGNoYW5uZWx9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXR0cmlidXRlQWNjZXNzb3JzO1xuICB9XG5cbiAgZ2V0VmlzQ2hhbm5lbFNjYWxlKHNjYWxlLCBkb21haW4sIHJhbmdlLCBmaXhlZCkge1xuICAgIGlmIChzY2FsZSA9PT0gU0NBTEVfVFlQRVMub3JkaW5hbCkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBkMy1zY2FsZSB0eXBlXG4gICAgICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZV0oKVxuICAgICAgICAuZG9tYWluKGRvbWFpbi5zbGljZSgwLCByYW5nZS5sZW5ndGgpKVxuICAgICAgICAucmFuZ2UocmFuZ2UpXG4gICAgICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuICAgIH1cblxuICAgIC8vIGZvciBgY291bnRgIGFnZ3JlZ2F0aW9uLCB3ZSBkb21haW4gaXMgYWN0dWFsbHkgYFswLCBJbmZpbml0eV1gIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZVxuICAgIC8vIHRvIHVzZSBpdCwgc28gc2tpcCBzcGVjeWZ5aW5nIHRoaXMgZG9tYWluc1xuICAgIGNvbnN0IGRvbWFpbklzSW5maW5pdGUgPSBkb21haW4gJiYgKGRvbWFpblswXSA9PT0gMCAmJiBkb21haW5bMV0gPT09IEluZmluaXR5KTtcbiAgICBjb25zdCBzY2FsZUZhY3RvcnkgPSBTQ0FMRV9GVU5DW2ZpeGVkID8gJ2xpbmVhcicgOiBzY2FsZV07XG4gICAgLy8gQHRzLWlnbm9yZSBkMy1zY2FsZSB0eXBlXG4gICAgbGV0IHJlc3VsdCA9IHNjYWxlRmFjdG9yeSgpO1xuICAgIGlmIChkb21haW4gJiYgIWRvbWFpbklzSW5maW5pdGUpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5kb21haW4oZG9tYWluKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5yYW5nZShmaXhlZCA/IGRvbWFpbiA6IHJhbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBib3VuZHMgb2YgdGhlIGRhdGEuXG4gICAqIEBwYXJhbSB7aW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlfSBkYXRhQ29udGFpbmVyIERhdGFDb250YWluZXIgdG8gY2FsY3VsYXRlIGJvdW5kcyBmb3IuXG4gICAqIEBwYXJhbSB7KGQ6IHtpbmRleDogbnVtYmVyfSwgZGM6IGltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT4gbnVtYmVyW119IGdldFBvc2l0aW9uIEFjY2VzcyBrZXBsZXIuZ2wgbGF5ZXIgZGF0YSBmcm9tIGRlY2suZ2wgbGF5ZXJcbiAgICogQHJldHVybiB7bnVtYmVyW118bnVsbH0gYm91bmRzIG9mIHRoZSBkYXRhLlxuICAgKi9cbiAgZ2V0UG9pbnRzQm91bmRzKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKSB7XG4gICAgLy8gbm8gbmVlZCB0byBsb29wIHRocm91Z2ggdGhlIGVudGlyZSBkYXRhc2V0XG4gICAgLy8gZ2V0IGEgc2FtcGxlIG9mIGRhdGEgdG8gY2FsY3VsYXRlIGJvdW5kc1xuICAgIGNvbnN0IHNhbXBsZURhdGEgPVxuICAgICAgZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkgPiBNQVhfU0FNUExFX1NJWkVcbiAgICAgICAgPyBnZXRTYW1wbGVEYXRhKGRhdGFDb250YWluZXIsIE1BWF9TQU1QTEVfU0laRSlcbiAgICAgICAgOiBkYXRhQ29udGFpbmVyO1xuXG4gICAgY29uc3QgcG9pbnRzID0gc2FtcGxlRGF0YS5tYXBJbmRleChnZXRQb3NpdGlvbik7XG5cbiAgICBjb25zdCBsYXRCb3VuZHMgPSBnZXRMYXRMbmdCb3VuZHMocG9pbnRzLCAxLCBbLTkwLCA5MF0pO1xuICAgIGNvbnN0IGxuZ0JvdW5kcyA9IGdldExhdExuZ0JvdW5kcyhwb2ludHMsIDAsIFstMTgwLCAxODBdKTtcblxuICAgIGlmICghbGF0Qm91bmRzIHx8ICFsbmdCb3VuZHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBbbG5nQm91bmRzWzBdLCBsYXRCb3VuZHNbMF0sIGxuZ0JvdW5kc1sxXSwgbGF0Qm91bmRzWzFdXTtcbiAgfVxuXG4gIGdldENoYW5nZWRUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMpIHtcbiAgICBjb25zdCB0cmlnZ2VyQ2hhbmdlZCA9IGRpZmZVcGRhdGVUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMsIHRoaXMuX29sZERhdGFVcGRhdGVUcmlnZ2Vycyk7XG4gICAgdGhpcy5fb2xkRGF0YVVwZGF0ZVRyaWdnZXJzID0gZGF0YVVwZGF0ZVRyaWdnZXJzO1xuXG4gICAgcmV0dXJuIHRyaWdnZXJDaGFuZ2VkO1xuICB9XG5cbiAgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShcbiAgICBzY2FsZSxcbiAgICBkYXRhLFxuICAgIGZpZWxkLFxuICAgIC8vIEluIGJ1aWxkZXIgd2Ugb3ZlcndyaXRlIHRoZSBnZXRWYWx1ZSBmdW5jdGlvbiBhbmQgd2UgdXNlIHRoZSBfYWdncmVnYXRpb24gcGFyYW1ldGVyIGluIHNwYXRpYWwgaW5kZXggbGF5ZXJzIGFzIHRoZSBRdWFka2V5TGF5ZXIuXG4gICAgX2FnZ3JlZ2F0aW9uLFxuICAgIG51bGxWYWx1ZSA9IE5PX1ZBTFVFX0NPTE9SLFxuICAgIGdldFZhbHVlID0gZGVmYXVsdEdldEZpZWxkVmFsdWVcbiAgKSB7XG4gICAgY29uc3Qge3R5cGV9ID0gZmllbGQ7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRWYWx1ZShmaWVsZCwgZGF0YSk7XG5cbiAgICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsVmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGF0dHJpYnV0ZVZhbHVlO1xuICAgIGlmICh0eXBlID09PSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wKSB7XG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjb252ZXJ0IGhlcmVcbiAgICAgIC8vIHNjYWxlIEZ1bmN0aW9uIHNob3VsZCB0YWtlIGNhcmUgb2YgaXRcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gc2NhbGUobmV3IERhdGUodmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmlidXRlVmFsdWUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCFub3ROdWxsb3JVbmRlZmluZWQoYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IG51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7XG4gIH1cblxuICB1cGRhdGVNZXRhKG1ldGEpIHtcbiAgICB0aGlzLm1ldGEgPSB7Li4udGhpcy5tZXRhLCAuLi5tZXRhfTtcbiAgfVxuXG4gIGdldERhdGFVcGRhdGVUcmlnZ2Vycyh7ZmlsdGVyZWRJbmRleCwgaWQsIGFsbERhdGF9KSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RGF0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnMsIGZpbHRlcmVkSW5kZXh9LFxuICAgICAgZ2V0TWV0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnN9LFxuICAgICAgLi4uKHRoaXMuY29uZmlnLnRleHRMYWJlbCB8fCBbXSkucmVkdWNlKFxuICAgICAgICAoYWNjdSwgdGwsIGkpID0+ICh7XG4gICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICBbYGdldExhYmVsQ2hhcmFjdGVyU2V0LSR7aX1gXTogdGwuZmllbGQgPyB0bC5maWVsZC5uYW1lIDogbnVsbFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgbGF5ZXJEYXRhc2V0ID0gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXTtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSBsYXllckRhdGFzZXQ7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc3VhbENoYW5uZWxGaWVsZHMobGF5ZXJEYXRhc2V0KTtcblxuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuICAgIGNvbnN0IGRhdGFVcGRhdGVUcmlnZ2VycyA9IHRoaXMuZ2V0RGF0YVVwZGF0ZVRyaWdnZXJzKGxheWVyRGF0YXNldCk7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSB0aGlzLmdldENoYW5nZWRUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMpO1xuXG4gICAgaWYgKHRyaWdnZXJDaGFuZ2VkLmdldE1ldGEpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YSA9IFtdO1xuXG4gICAgaWYgKCF0cmlnZ2VyQ2hhbmdlZC5nZXREYXRhICYmIG9sZExheWVyRGF0YSAmJiBvbGRMYXllckRhdGEuZGF0YSkge1xuICAgICAgLy8gc2FtZSBkYXRhXG4gICAgICBkYXRhID0gb2xkTGF5ZXJEYXRhLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0aGlzLmNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUobGF5ZXJEYXRhc2V0LCBnZXRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtkYXRhLCB0cmlnZ2VyQ2hhbmdlZH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHN0eWxlZCBmaWVsZHMgdG8gbWF0Y2ggb25lcyBmcm9tIG5ldyBkYXRhc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YXNldFxuICAgKi9cbiAgdXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyhkYXRhc2V0KSB7XG4gICAgZm9yIChjb25zdCB7ZmllbGR9IG9mIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykpIHtcbiAgICAgIGNvbnN0IG9sZEZpZWxkID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgaWYgKCFvbGRGaWVsZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdEYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IG9sZEZpZWxkLm5hbWUpIHx8IG51bGw7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZmllbGRdOiBuZXdEYXRhU2V0RmllbGR9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBvbmUgbGF5ZXIgZG9tYWluIHdoZW4gc3RhdGUuZGF0YSBjaGFuZ2VkXG4gICAqIGlmIHN0YXRlLmRhdGEgY2hhbmdlIGlzIGR1ZSBvdCB1cGRhdGUgZmlsdGVyLCBuZXdGaWxlciB3aWxsIGJlIHBhc3NlZFxuICAgKiBjYWxsZWQgYnkgdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0c1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmV3RmlsdGVyXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IGxheWVyXG4gICAqL1xuICB1cGRhdGVMYXllckRvbWFpbihkYXRhc2V0cywgbmV3RmlsdGVyKSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldERhdGFzZXQoZGF0YXNldHMpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBjb25zdCB7c2NhbGV9ID0gY2hhbm5lbDtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IHRoaXMuY29uZmlnW3NjYWxlXTtcbiAgICAgIC8vIG9yZGluYWwgZG9tYWluIGlzIGJhc2VkIG9uIGRhdGFDb250YWluZXIsIGlmIG9ubHkgZmlsdGVyIGNoYW5nZWRcbiAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlIG9yZGluYWwgZG9tYWluXG4gICAgICBpZiAoIW5ld0ZpbHRlciB8fCBzY2FsZVR5cGUgIT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgICAgY29uc3Qge2RvbWFpbn0gPSBjaGFubmVsO1xuICAgICAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbih0YWJsZSwgY2hhbm5lbCk7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tkb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldERhdGFzZXQoZGF0YXNldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdmlzdWFsIGNoYW5uZWwgZmllbGQgYW5kIHNjYWxlcyBiYXNlZCBvbiBzdXBwb3J0ZWQgZmllbGQgJiBzY2FsZSB0eXBlXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICB2YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRoaXMudmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCk7XG4gICAgdGhpcy52YWxpZGF0ZVNjYWxlKGNoYW5uZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpZWxkIHR5cGUgYmFzZWQgb24gY2hhbm5lbFNjYWxlVHlwZVxuICAgKi9cbiAgdmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtmaWVsZCwgY2hhbm5lbFNjYWxlVHlwZSwgc3VwcG9ydGVkRmllbGRUeXBlc30gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgLy8gaWYgZmllbGQgaXMgc2VsZWN0ZWQsIGNoZWNrIGlmIGZpZWxkIHR5cGUgaXMgc3VwcG9ydGVkXG4gICAgICBjb25zdCBjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyA9XG4gICAgICAgIHN1cHBvcnRlZEZpZWxkVHlwZXMgfHwgQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTW2NoYW5uZWxTY2FsZVR5cGVdO1xuXG4gICAgICBpZiAoIWNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzLmluY2x1ZGVzKHRoaXMuY29uZmlnW2ZpZWxkXS50eXBlKSkge1xuICAgICAgICAvLyBmaWVsZCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHNldCBpdCBiYWNrIHRvIG51bGxcbiAgICAgICAgLy8gc2V0IHNjYWxlIGJhY2sgdG8gZGVmYXVsdFxuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZmllbGRdOiBudWxsfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNjYWxlIHR5cGUgYmFzZWQgb24gYWdncmVnYXRpb25cbiAgICovXG4gIHZhbGlkYXRlU2NhbGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtzY2FsZX0gPSB2aXN1YWxDaGFubmVsO1xuICAgIGlmICghc2NhbGUpIHtcbiAgICAgIC8vIHZpc3VhbENoYW5uZWwgZG9lc24ndCBoYXZlIHNjYWxlXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlT3B0aW9ucyA9IHRoaXMuZ2V0U2NhbGVPcHRpb25zKGNoYW5uZWwpO1xuICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgc2VsZWN0ZWQgc2NhbGUgaXNcbiAgICAvLyBzdXBwb3J0ZWQsIGlmIG5vdCwgY2hhbmdlIHRvIGRlZmF1bHRcbiAgICBpZiAoIXNjYWxlT3B0aW9ucy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1tzY2FsZV0pKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbc2NhbGVdOiBzY2FsZU9wdGlvbnNbMF19KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNjYWxlIG9wdGlvbnMgYmFzZWQgb24gY3VycmVudCBmaWVsZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXRTY2FsZU9wdGlvbnMoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtmaWVsZCwgc2NhbGUsIGNoYW5uZWxTY2FsZVR5cGV9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZ1tmaWVsZF1cbiAgICAgID8gRklFTERfT1BUU1t0aGlzLmNvbmZpZ1tmaWVsZF0udHlwZV0uc2NhbGVbY2hhbm5lbFNjYWxlVHlwZV1cbiAgICAgIDogW3RoaXMuZ2V0RGVmYXVsdExheWVyQ29uZmlnKClbc2NhbGVdXTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbChkYXRhc2V0LCBjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgdGhpcy52YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCk7XG4gICAgLy8gY2FsY3VsYXRlIGxheWVyIGNoYW5uZWwgZG9tYWluXG4gICAgY29uc3QgdXBkYXRlZERvbWFpbiA9IHRoaXMuY2FsY3VsYXRlTGF5ZXJEb21haW4oZGF0YXNldCwgdmlzdWFsQ2hhbm5lbCk7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W3Zpc3VhbENoYW5uZWwuZG9tYWluXTogdXBkYXRlZERvbWFpbn0pO1xuICB9XG5cbiAgZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzKCkge1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKHZpc3VhbENoYW5uZWwgPT4ge1xuICAgICAgLy8gZmllbGQgcmFuZ2Ugc2NhbGUgZG9tYWluXG4gICAgICBjb25zdCB7YWNjZXNzb3IsIGZpZWxkLCBzY2FsZSwgZG9tYWluLCByYW5nZSwgZGVmYXVsdFZhbHVlLCBmaXhlZH0gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7XG4gICAgICAgIFtmaWVsZF06IHRoaXMuY29uZmlnW2ZpZWxkXSxcbiAgICAgICAgW3NjYWxlXTogdGhpcy5jb25maWdbc2NhbGVdLFxuICAgICAgICBbZG9tYWluXTogdGhpcy5jb25maWdbZG9tYWluXSxcbiAgICAgICAgW3JhbmdlXTogdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKHRoaXMuY29uZmlnKSA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgLi4uKGZpeGVkID8ge1tmaXhlZF06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF19IDoge30pXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGNhbGN1bGF0ZUxheWVyRG9tYWluKGRhdGFzZXQsIHZpc3VhbENoYW5uZWwpIHtcbiAgICBjb25zdCB7c2NhbGV9ID0gdmlzdWFsQ2hhbm5lbDtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnW3Zpc3VhbENoYW5uZWwuZmllbGRdO1xuICAgIGlmICghZmllbGQgfHwgIXNjYWxlKSB7XG4gICAgICAvLyBpZiBjb2xvckZpZWxkIG9yIHNpemVGaWVsZCB3ZXJlIHNldCBiYWNrIHRvIG51bGxcbiAgICAgIHJldHVybiBkZWZhdWx0RG9tYWluO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlVHlwZSA9IHRoaXMuY29uZmlnW3NjYWxlXTtcbiAgICBjb25zdCBkYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICBpZiAoIXNjYWxlVHlwZSB8fCAhZGF0YVNldEZpZWxkKSB7XG4gICAgICAvLyBpZiBuZXcgZGF0YXNldCBkb2Vzbid0IGNvbnRhaW4gcHJldmlvdXNseSBzZXQgZmllbGRcbiAgICAgIHJldHVybiBkZWZhdWx0RG9tYWluO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhc2V0LmdldENvbHVtbkxheWVyRG9tYWluKGRhdGFTZXRGaWVsZCwgc2NhbGVUeXBlKSB8fCBkZWZhdWx0RG9tYWluO1xuICB9XG5cbiAgaGFzSG92ZXJlZE9iamVjdChvYmplY3RJbmZvKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykgJiYgb2JqZWN0SW5mby5vYmplY3QgPyBvYmplY3RJbmZvLm9iamVjdCA6IG51bGw7XG4gIH1cblxuICBpc0xheWVySG92ZXJlZChvYmplY3RJbmZvKSB7XG4gICAgcmV0dXJuIG9iamVjdEluZm8/LnBpY2tlZCAmJiBvYmplY3RJbmZvPy5sYXllcj8ucHJvcHM/LmlkID09PSB0aGlzLmlkO1xuICB9XG5cbiAgZ2V0UmFkaXVzU2NhbGVCeVpvb20obWFwU3RhdGUpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzQ2hhbm5lbC5maWVsZDtcbiAgICBjb25zdCB7cmFkaXVzfSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZztcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnW2ZpZWxkXSA/IDEgOiByYWRpdXMpICogdGhpcy5nZXRab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlKCkge1xuICAgIGNvbnN0IHJhZGl1c0NoYW5uZWwgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmMgPT4gdmMucHJvcGVydHkgPT09ICdyYWRpdXMnKTtcblxuICAgIGlmICghcmFkaXVzQ2hhbm5lbCB8fCB0aGlzLmNvbmZpZ1tyYWRpdXNDaGFubmVsLmZpZWxkXSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWcucmFkaXVzO1xuICAgIH1cbiAgfVxuXG4gIGdldE1heE1hcmtlclNpemUoKSB7XG4gICAgY29uc3Qge3JhZGl1c0ZpZWxkLCBzaXplRmllbGQsIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7cmFkaXVzUmFuZ2UsIHJhZGl1c30gPSB2aXNDb25maWc7XG4gICAgY29uc3QgZmllbGQgPSByYWRpdXNGaWVsZCB8fCBzaXplRmllbGQ7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgoZmllbGQgJiYgcmFkaXVzUmFuZ2UgPyByYWRpdXNSYW5nZVsxXSA6IHJhZGl1cykpO1xuICB9XG5cbiAgc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnNvbWUocCA9PiAhdGhpcy5ub25lTGF5ZXJEYXRhQWZmZWN0aW5nUHJvcHMuaW5jbHVkZXMocCkpO1xuICB9XG5cbiAgZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZywgYnJ1c2hpbmdUYXJnZXQpIHtcbiAgICBjb25zdCB7YnJ1c2h9ID0gaW50ZXJhY3Rpb25Db25maWc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gYnJ1c2hpbmdcbiAgICAgIGF1dG9IaWdobGlnaHQ6ICFicnVzaC5lbmFibGVkLFxuICAgICAgYnJ1c2hpbmdSYWRpdXM6IGJydXNoLmNvbmZpZy5zaXplICogMTAwMCxcbiAgICAgIGJydXNoaW5nVGFyZ2V0OiBicnVzaGluZ1RhcmdldCB8fCAnc291cmNlJyxcbiAgICAgIGJydXNoaW5nRW5hYmxlZDogYnJ1c2guZW5hYmxlZFxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0RGVja0xheWVyUHJvcHMoe2lkeCwgZ3B1RmlsdGVyLCBtYXBTdGF0ZSwgdmlzaWJsZSwgbWFza1BvbHlnb259KSB7XG4gICAgY29uc3QgbWFza0V4dGVuc2lvblByb3BzID0gZ2V0TWFza0V4dGVuc2lvblByb3BzKG1hc2tQb2x5Z29uKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFza0V4dGVuc2lvblByb3BzLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpZHgsXG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVQsXG4gICAgICBwaWNrYWJsZTogdGhpcy5oYXNJbnRlcmFjdGl2aXR5LFxuICAgICAgd3JhcExvbmdpdHVkZTogdHJ1ZSxcbiAgICAgIHBhcmFtZXRlcnM6IHtkZXB0aFRlc3Q6IEJvb2xlYW4obWFwU3RhdGUuZHJhZ1JvdGF0ZSB8fCB0aGlzLmNvbmZpZy52aXNDb25maWcuZW5hYmxlM2QpfSxcbiAgICAgIGhpZGRlbjogdGhpcy5jb25maWcuaGlkZGVuLFxuICAgICAgdmlzaWJpbGl0eUJ5Wm9vbTogdGhpcy5jb25maWcudmlzaWJpbGl0eUJ5Wm9vbSxcbiAgICAgIC8vIHZpc2NvbmZpZ1xuICAgICAgb3BhY2l0eTogdGhpcy5jb25maWcudmlzQ29uZmlnLm9wYWNpdHksXG4gICAgICBoaWdobGlnaHRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAvLyBkYXRhIGZpbHRlcmluZ1xuICAgICAgZXh0ZW5zaW9uczogW2RhdGFGaWx0ZXJFeHRlbnNpb24sIC4uLm1hc2tFeHRlbnNpb25Qcm9wcy5leHRlbnNpb25zXSxcbiAgICAgIGZpbHRlclJhbmdlOiBncHVGaWx0ZXIgPyBncHVGaWx0ZXIuZmlsdGVyUmFuZ2UgOiB1bmRlZmluZWQsXG4gICAgICAvLyBsYXllciBzaG91bGQgYmUgdmlzaWJsZSBhbmQgaWYgc3BsaXRNYXAsIHNob3duIGluIHRvIG9uZSBvZiBwYW5lbFxuICAgICAgdmlzaWJsZTogdGhpcy5jb25maWcuaXNWaXNpYmxlICYmIHZpc2libGVcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke3RoaXMuaWR9LWhvdmVyZWRgLFxuICAgICAgcGlja2FibGU6IGZhbHNlLFxuICAgICAgd3JhcExvbmdpdHVkZTogdHJ1ZSxcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVFxuICAgIH07XG4gIH1cblxuICByZW5kZXJUZXh0TGFiZWxMYXllcih7Z2V0UG9zaXRpb24sIGdldFBpeGVsT2Zmc2V0LCB1cGRhdGVUcmlnZ2Vycywgc2hhcmVkUHJvcHN9LCByZW5kZXJPcHRzKSB7XG4gICAgY29uc3Qge2RhdGEsIG1hcFN0YXRlfSA9IHJlbmRlck9wdHM7XG4gICAgY29uc3Qge3RleHRMYWJlbCwgdmlzaWJpbGl0eUJ5Wm9vbX0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBkYXRhLnRleHRMYWJlbHMucmVkdWNlKChhY2N1LCBkLCBpKSA9PiB7XG4gICAgICBpZiAoZC5nZXRUZXh0KSB7XG4gICAgICAgIGFjY3UucHVzaChcbiAgICAgICAgICBuZXcgVGV4dExheWVyKHtcbiAgICAgICAgICAgIC4uLnNoYXJlZFByb3BzLFxuICAgICAgICAgICAgaWQ6IGAke3RoaXMuaWR9LWxhYmVsLSR7dGV4dExhYmVsW2ldLmZpZWxkPy5uYW1lfWAsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgICAgICB2aXNpYmlsaXR5Qnlab29tLFxuICAgICAgICAgICAgZ2V0VGV4dDogZC5nZXRUZXh0LFxuICAgICAgICAgICAgZ2V0UG9zaXRpb24sXG4gICAgICAgICAgICBjaGFyYWN0ZXJTZXQ6IGQuY2hhcmFjdGVyU2V0LFxuICAgICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IGdldFBpeGVsT2Zmc2V0KHRleHRMYWJlbFtpXSksXG4gICAgICAgICAgICBnZXRTaXplOiAxLFxuICAgICAgICAgICAgc2l6ZVNjYWxlOiB0ZXh0TGFiZWxbaV0uc2l6ZSxcbiAgICAgICAgICAgIGdldFRleHRBbmNob3I6IHRleHRMYWJlbFtpXS5hbmNob3IsXG4gICAgICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogdGV4dExhYmVsW2ldLmFsaWdubWVudCxcbiAgICAgICAgICAgIGdldENvbG9yOiB0ZXh0TGFiZWxbaV0uY29sb3IsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIC8vIHRleHQgd2lsbCBhbHdheXMgc2hvdyBvbiB0b3Agb2YgYWxsIGxheWVyc1xuICAgICAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogZGF0YS5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgICAgICBnZXRUZXh0OiB0ZXh0TGFiZWxbaV0uZmllbGQ/Lm5hbWUsXG4gICAgICAgICAgICAgIGdldFBpeGVsT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnMuZ2V0UGl4ZWxPZmZzZXQsXG4gICAgICAgICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnMuZ2V0UmFkaXVzLFxuICAgICAgICAgICAgICAgIGFuY2hvcjogdGV4dExhYmVsW2ldLmFuY2hvcixcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IHRleHRMYWJlbFtpXS5hbGlnbm1lbnRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZ2V0VGV4dEFuY2hvcjogdGV4dExhYmVsW2ldLmFuY2hvcixcbiAgICAgICAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6IHRleHRMYWJlbFtpXS5hbGlnbm1lbnQsXG4gICAgICAgICAgICAgIGdldENvbG9yOiB0ZXh0TGFiZWxbaV0uY29sb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3U7XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBkZWNrLmdsIGBJY29uTGF5ZXJgIFwiYXV0b1BhY2tcIiBtb2RlIGFjY2Vzc29yIGZvciBjdXN0b20gbWFya2Vycy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBpY29uVXJsQWNjZXNzb3IgZGVjay5nbCBhY2Nlc3NvciAob3IgdmFsdWUpIHRoYXQgcmVzb2x2ZXMgdG8gVVJMIG9mIGljb24gZm9yIGdpdmVuIHJvd1xuICAgKiBAcmV0dXJucyBkZWNrLmdsIGFjY2Vzc29yIHRoYXQgcmV0dXJucyBVbnBhY2tlZEljb24gcmVhZHkgdG8gY29uc3VtZSBieSBJY29uTGF5ZXJcbiAgICovXG4gIGdldEN1c3RvbU1hcmtlckljb25BY2Nlc3NvcihpY29uVXJsQWNjZXNzb3IsIG1hc2sgPSB0cnVlKSB7XG4gICAgY29uc3QgbWF4SWNvblNpemUgPSB0aGlzLmdldE1heE1hcmtlclNpemUoKTtcblxuICAgIHJldHVybiBkID0+IHtcbiAgICAgIGNvbnN0IHdhbnRlZFVybCA9XG4gICAgICAgICh0eXBlb2YgaWNvblVybEFjY2Vzc29yID09PSAnZnVuY3Rpb24nKSA/IGljb25VcmxBY2Nlc3NvcihkKSA6IGljb25VcmxBY2Nlc3NvcjtcbiAgICAgIGNvbnN0IGljb25PayA9IEJvb2xlYW4od2FudGVkVXJsKTtcbiAgICAgIG1hc2sgPSBpY29uT2sgPyBtYXNrIDogdHJ1ZTtcbiAgICAgIGNvbnN0IHVybCA9IGljb25PayA/IHdhbnRlZFVybCA6IEZBTExCQUNLX0lDT047XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogYCR7dXJsfUBAJHttYXhJY29uU2l6ZX1AJHttYXNrID8gJ20nIDogJ2MnfWAsXG4gICAgICAgIHVybCxcbiAgICAgICAgd2lkdGg6IG1heEljb25TaXplLFxuICAgICAgICBoZWlnaHQ6IG1heEljb25TaXplLFxuICAgICAgICBtYXNrXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKGtlcGxlclRhYmxlLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB1cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gIH1cblxuICBnZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gICAgcmV0dXJuICgpID0+IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXI7XG4iXX0=
1729
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvYmFzZS1sYXllci5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUNvbG9yIiwiRGVja0xheWVyIiwiZGVmYXVsdFByb3BzIiwiZ2V0RmlsdGVyVmFsdWUiLCJ0eXBlIiwidmFsdWUiLCJkZWVwRXF1YWwiLCJhIiwiYiIsImtleSIsImFWYWx1ZSIsImJWYWx1ZSIsImVxdWFscyIsImxvYWRPcHRpb25zIiwib3B0aW9uYWwiLCJjb21wYXJlIiwiZXF1YWwiLCJMQVlFUl9JRF9MRU5HVEgiLCJGQUxMQkFDS19JQ09OIiwiTUFYX1NBTVBMRV9TSVpFIiwiZGVmYXVsdERvbWFpbiIsImRhdGFGaWx0ZXJFeHRlbnNpb24iLCJEYXRhRmlsdGVyRXh0ZW5zaW9uIiwiZmlsdGVyU2l6ZSIsIk1BWF9HUFVfRklMVEVSUyIsImNvbGxpc2lvbkZpbHRlckV4dGVuc2lvbiIsIkNvbGxpc2lvbkZpbHRlckV4dGVuc2lvbiIsImRlZmF1bHREYXRhQWNjZXNzb3IiLCJkYyIsImQiLCJkZWZhdWx0R2V0RmllbGRWYWx1ZSIsImZpZWxkIiwidmFsdWVBY2Nlc3NvciIsInNjYWxlSWRlbnRpdHkiLCJ2IiwiT1ZFUkxBWV9UWVBFIiwiZGVja2dsIiwibWFwYm94Z2wiLCJsYXllckNvbG9ycyIsIk9iamVjdCIsInZhbHVlcyIsIkRhdGFWaXpDb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsImluZGV4IiwibGVuZ3RoIiwiY29sb3JNYWtlciIsIkxheWVyIiwicHJvcHMiLCJpZCIsIm1ldGEiLCJ2aXNDb25maWdTZXR0aW5ncyIsIl9pbnRlcmFjdGl2aXR5U2V0dGluZ3MiLCJjb25maWciLCJnZXREZWZhdWx0TGF5ZXJDb25maWciLCJjb2x1bW5zIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiRGVmYXVsdExheWVySWNvbiIsImNvbG9yIiwicHJvcGVydHkiLCJzY2FsZSIsImRvbWFpbiIsInJhbmdlIiwiY2hhbm5lbFNjYWxlVHlwZSIsIkNIQU5ORUxfU0NBTEVTIiwibnVsbFZhbHVlIiwiTk9fVkFMVUVfQ09MT1IiLCJkZWZhdWx0VmFsdWUiLCJzaXplIiwibGF0IiwicGFpciIsImZpZWxkUGFpcktleSIsImxuZyIsImxhdDAiLCJsbmcwIiwibGF0MSIsImxuZzEiLCJpbnRlcmFjdGl2aXR5U2V0dGluZ3MiLCJCb29sZWFuIiwiaG92ZXIiLCJmaWVsZHMiLCJjbGljayIsImhhc1Rvb2x0aXAiLCJlbmFibGVkIiwiZGF0YUlkIiwidmlzaWJpbGl0eUJ5Wm9vbSIsIm1pbiIsIlpPT01fTEVWRUxfTElNSVRTIiwibWF4IiwibGFiZWwiLCJERUZBVUxUX0xBWUVSX0xBQkVMIiwibmV4dCIsImlzVmlzaWJsZSIsImlzQ29uZmlnQWN0aXZlIiwiaGlnaGxpZ2h0Q29sb3IiLCJERUZBVUxUX0hJR0hMSUdIVF9DT0xPUiIsImhpZGRlbiIsImNvbG9yRmllbGQiLCJjb2xvckRvbWFpbiIsImNvbG9yU2NhbGUiLCJTQ0FMRV9UWVBFUyIsInF1YW50aWxlIiwic2l6ZURvbWFpbiIsInNpemVTY2FsZSIsImxpbmVhciIsInNpemVGaWVsZCIsInJhZGl1c0ZpZWxkIiwidmlzQ29uZmlnIiwidGV4dExhYmVsIiwiREVGQVVMVF9URVhUX0xBQkVMIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjb2xvclJhbmdlIiwiYW5pbWF0aW9uIiwidmlzdWFsQ2hhbm5lbHMiLCJtZWFzdXJlIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwiZGVmYXVsdE1lYXN1cmUiLCJ1cGRhdGUiLCJmaWVsZElkeCIsImNvbHVtblBhaXJzIiwicGFydG5lcktleSIsInBhcnRuZXJGaWVsZFBhaXJLZXkiLCJ6b29tIiwiem9vbU9mZnNldCIsIk1hdGgiLCJwb3ciLCJlbmFibGVFbGV2YXRpb25ab29tRmFjdG9yIiwiZGF0YXNldHMiLCJmaWx0ZXJlZEluZGV4Iiwib2JqZWN0IiwiZGF0YUNvbnRhaW5lciIsInJvdyIsImNvbmZpZ1RvQ29weSIsInNoYWxsb3dDb3B5IiwiY29uY2F0Iiwibm90VG9Db3B5IiwiZm9yRWFjaCIsImdyb3VwIiwicHVzaCIsImN1cnJlbnRDb25maWciLCJjb3BpZWQiLCJjb3B5TGF5ZXJDb25maWciLCJ1cGRhdGVMYXllckNvbmZpZyIsImtleXMiLCJjaGFubmVsIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwiaW5jbHVkZXMiLCJsYXllclZpc0NvbmZpZ3MiLCJpdGVtIiwiTEFZRVJfVklTX0NPTkZJR1MiLCJldmVyeSIsInAiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbHVtblZhbGlkYXRvcnMiLCJyZXF1aXJlZCIsInJlcXVpcmVkTGF5ZXJDb2x1bW5zIiwicmVkdWNlIiwiYWNjdSIsInZhbGlkYXRvciIsIm9wdGlvbmFsQ29sdW1ucyIsIm5ld0NvbmZpZyIsIm5ld1Zpc0NvbmZpZyIsInByb3AiLCJwcmV2aW91cyIsImNvbG9yVUlQcm9wIiwiZW50cmllcyIsImlzQ29sb3JSYW5nZSIsImNvbG9ycyIsInVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UiLCJ1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJIiwidXBkYXRlQ3VzdG9tUGFsZXR0ZSIsImNvbG9yUmFuZ2VDb25maWciLCJjdXN0b20iLCJjdXN0b21QYWxldHRlIiwic2hvd0Ryb3Bkb3duIiwic3RlcHMiLCJyZXZlcnNlZCIsInNob3VsZFVwZGF0ZSIsInNvbWUiLCJzYW1lR3JvdXAiLCJDT0xPUl9SQU5HRVMiLCJmaWx0ZXIiLCJjciIsImZpbmQiLCJjb2xvck1hcCIsInVwZGF0ZUNvbG9yTWFwIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJ1cGRhdGVDYXRlZ29yeUNvbG9yTWFwIiwidXBkYXRlTnVtZXJpY0NvbG9yTWFwIiwiYXNzaWduZWRDYXRlZ29yaWVzIiwibmV3Q29sb3JNYXAiLCJzbGljZSIsImNNYXAiLCJ1bmFzc2lnbmVkQ29sb3JzIiwiY2F0ZWdvcnkiLCJjb2xvck1hcFZhbHVlcyIsImMiLCJtYXhWYWx1ZSIsInByZXZWYWx1ZSIsInN0ZXAiLCJpIiwibGF5ZXJEYXRhIiwiZGF0YSIsImhhc0FsbENvbHVtbnMiLCJoYXNMYXllckRhdGEiLCJyZW5kZXJMYXllciIsIkFycmF5IiwiaXNBcnJheSIsIk1hcCIsImsiLCJzZXQiLCJTQ0FMRV9GVU5DIiwiZnJvbSIsInVua25vd24iLCJVTktOT1dOX0NPTE9SIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwiZmFsbGJhY2tJY29uIiwidW5rbm93blZhbHVlIiwibWFwcGluZyIsIm90aGVyc01hcmtlciIsIm1hcmtlck1hcCIsIm1hcmtlclVybCIsImRhdGFBY2Nlc3NvciIsImF0dHJpYnV0ZUFjY2Vzc29ycyIsImZpeGVkIiwiYWNjZXNzb3IiLCJnZXRBdHRyaWJ1dGVWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwic2hvdWxkR2V0U2NhbGUiLCJpZGVudGl0eSIsImFyZ3MiLCJpc0ZpeGVkIiwiZmllbGRDb25maWciLCJhZ2dyZWdhdGlvblZhbHVlIiwic2NhbGVGdW5jdGlvbiIsImdldENvbG9yU2NhbGUiLCJjdXN0b21NYXJrZXIiLCJnZXRDdXN0b21NYXJrZXJzU2NhbGUiLCJjdXN0b21NYXJrZXJzVXJsIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsIkNvbnNvbGUiLCJ3YXJuIiwib3JkaW5hbCIsImRvbWFpbklzSW5maW5pdGUiLCJJbmZpbml0eSIsInNjYWxlRmFjdG9yeSIsInJlc3VsdCIsImdldFBvc2l0aW9uIiwic2FtcGxlRGF0YSIsIm51bVJvd3MiLCJwb2ludHMiLCJtYXBJbmRleCIsImxhdEJvdW5kcyIsImxuZ0JvdW5kcyIsImRhdGFVcGRhdGVUcmlnZ2VycyIsInRyaWdnZXJDaGFuZ2VkIiwiX29sZERhdGFVcGRhdGVUcmlnZ2VycyIsIl9hZ2dyZWdhdGlvbiIsImdldFZhbHVlIiwiYXR0cmlidXRlVmFsdWUiLCJBTExfRklFTERfVFlQRVMiLCJ0aW1lc3RhbXAiLCJEYXRlIiwiYWxsRGF0YSIsImdldERhdGEiLCJkYXRhc2V0SWQiLCJnZXRNZXRhIiwidGwiLCJvbGRMYXllckRhdGEiLCJsYXllckRhdGFzZXQiLCJ1cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImdldERhdGFVcGRhdGVUcmlnZ2VycyIsImdldENoYW5nZWRUcmlnZ2VycyIsInVwZGF0ZUxheWVyTWV0YSIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJkYXRhc2V0Iiwib2xkRmllbGQiLCJuZXdEYXRhU2V0RmllbGQiLCJmZCIsIm5ld0ZpbHRlciIsInRhYmxlIiwiZ2V0RGF0YXNldCIsInNjYWxlVHlwZSIsInVwZGF0ZWREb21haW4iLCJjYWxjdWxhdGVMYXllckRvbWFpbiIsInZhbGlkYXRlRmllbGRUeXBlIiwidmFsaWRhdGVTY2FsZSIsInZpc3VhbENoYW5uZWwiLCJzdXBwb3J0ZWRGaWVsZFR5cGVzIiwiY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMiLCJDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMiLCJzY2FsZU9wdGlvbnMiLCJnZXRTY2FsZU9wdGlvbnMiLCJGSUVMRF9PUFRTIiwidXBkYXRlVHJpZ2dlcnMiLCJkYXRhU2V0RmllbGQiLCJmIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJvYmplY3RJbmZvIiwiaXNMYXllckhvdmVyZWQiLCJwaWNrZWQiLCJsYXllciIsIm1hcFN0YXRlIiwicmFkaXVzQ2hhbm5lbCIsInZjIiwicmFkaXVzIiwiZ2V0Wm9vbUZhY3RvciIsInJhZGl1c1JhbmdlIiwiY2VpbCIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImludGVyYWN0aW9uQ29uZmlnIiwiYnJ1c2hpbmdUYXJnZXQiLCJicnVzaCIsImF1dG9IaWdobGlnaHQiLCJicnVzaGluZ1JhZGl1cyIsImJydXNoaW5nRW5hYmxlZCIsImlkeCIsImdwdUZpbHRlciIsInZpc2libGUiLCJtYXNrUG9seWdvbiIsIm1hc2tFeHRlbnNpb25Qcm9wcyIsImNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkxOR0xBVCIsInBpY2thYmxlIiwiaGFzSW50ZXJhY3Rpdml0eSIsIndyYXBMb25naXR1ZGUiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiZHJhZ1JvdGF0ZSIsImVuYWJsZTNkIiwib3BhY2l0eSIsImV4dGVuc2lvbnMiLCJmaWx0ZXJSYW5nZSIsInVuZGVmaW5lZCIsInJlbmRlck9wdHMiLCJnZXRSYWRpdXMiLCJyYWRpdXNTY2FsZSIsInNoYXJlZFByb3BzIiwidGV4dExhYmVscyIsImdldFRleHQiLCJtYWluTGFiZWwiLCJzZWNvbmRhcnlMYWJlbCIsImFsaWdubWVudCIsImFuY2hvciIsImdldENvbG9yIiwib3V0bGluZUNvbG9yIiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlPdXRsaW5lQ29sb3IiLCJzZWNvbmRhcnlTaXplU2NhbGUiLCJQb2ludExhYmVsTGF5ZXIiLCJjaGFyYWN0ZXJTZXQiLCJjb2xsaXNpb25FbmFibGVkIiwiY29sbGlzaW9uR3JvdXAiLCJnZXRTZWNvbmRhcnlUZXh0IiwiZ2V0VGV4dEFuY2hvciIsImdldEFsaWdubWVudEJhc2VsaW5lIiwiZm9udEZhbWlseSIsImZvbnRTZXR0aW5ncyIsInNkZiIsImZvbnRXZWlnaHQiLCJvdXRsaW5lV2lkdGgiLCJnZXRQaXhlbE9mZnNldCIsImljb25VcmxBY2Nlc3NvciIsIm1hc2siLCJtYXhJY29uU2l6ZSIsImdldE1heE1hcmtlclNpemUiLCJ3YW50ZWRVcmwiLCJpY29uT2siLCJ1cmwiLCJ3aWR0aCIsImhlaWdodCIsImtlcGxlclRhYmxlIiwiZm91bmRMYXllcnMiLCJkZWZhdWx0RmllbGRzIiwiYWxsRmllbGRzIiwicmVxdWlyZWRDb2x1bW5zIiwicHJldiIsInJlcXVpcmVkRmllbGRzIiwiZ2V0QWxsUG9zc2libGVDb2x1bW5QYXJpcyIsImFsbEtleXMiLCJwb2ludGVycyIsImNvdW50UGVyS2V5IiwicGFpcnMiLCJpbmNyZW1lbnRQb2ludGVycyIsIm5ld1BhaXIiLCJjdXVyIiwicHRzIiwiY291bnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFnQ0E7O0FBQ0E7O0FBRUE7O0FBWUE7O0FBQ0E7O0FBQ0E7O0FBUUE7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozt3REE2QlVBLGE7O0FBM0ZWO0FBQ0FDLFlBQVVDLFlBQVYsQ0FBdUJDLGNBQXZCLEdBQXdDO0FBQUNDLEVBQUFBLElBQUksRUFBRSxVQUFQO0FBQW1CQyxFQUFBQSxLQUFLLEVBQUU7QUFBMUIsQ0FBeEMsQyxDQUVBOztBQUNBLFNBQVNDLFNBQVQsQ0FBbUJDLENBQW5CLEVBQXNCQyxDQUF0QixFQUF5QjtBQUN2QixNQUFJRCxDQUFDLEtBQUtDLENBQVYsRUFBYTtBQUNYLFdBQU8sSUFBUDtBQUNEOztBQUNELE1BQUksQ0FBQ0QsQ0FBRCxJQUFNLENBQUNDLENBQVgsRUFBYztBQUNaLFdBQU8sS0FBUDtBQUNEOztBQUNELE9BQUssSUFBTUMsR0FBWCxJQUFrQkYsQ0FBbEIsRUFBcUI7QUFDbkIsUUFBTUcsTUFBTSxHQUFHSCxDQUFDLENBQUNFLEdBQUQsQ0FBaEI7QUFDQSxRQUFNRSxNQUFNLEdBQUdILENBQUMsQ0FBQ0MsR0FBRCxDQUFoQjtBQUNBLFFBQU1HLE1BQU0sR0FBR0YsTUFBTSxLQUFLQyxNQUFYLElBQXFCTCxTQUFTLENBQUNJLE1BQUQsRUFBU0MsTUFBVCxDQUE3Qzs7QUFDQSxRQUFJLENBQUNDLE1BQUwsRUFBYTtBQUNYLGFBQU8sS0FBUDtBQUNEO0FBQ0Y7O0FBQ0QsU0FBTyxJQUFQO0FBQ0Q7O0FBRURYLFlBQVVDLFlBQVYsQ0FBdUJXLFdBQXZCLEdBQXFDO0FBQ25DVCxFQUFBQSxJQUFJLEVBQUUsUUFENkI7QUFFbkNDLEVBQUFBLEtBQUssRUFBRSxFQUY0QjtBQUduQ1MsRUFBQUEsUUFBUSxFQUFFLElBSHlCO0FBSW5DQyxFQUFBQSxPQUFPLEVBQUUsSUFKMEI7QUFLbkNDLEVBQUFBLEtBQUssRUFBRVY7QUFMNEIsQ0FBckM7O0FBMENBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTVcsZUFBZSxHQUFHLENBQXhCLEMsQ0FFUDs7O0FBQ0EsSUFBTUMsYUFBYSxHQUNqQiwwTEFERjtBQUdBLElBQU1DLGVBQWUsR0FBRyxJQUF4QjtBQUNBLElBQU1DLGFBQWEsR0FBRyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQXRCO0FBQ0EsSUFBTUMsbUJBQW1CLEdBQUcsSUFBSUMsK0JBQUosQ0FBd0I7QUFBQ0MsRUFBQUEsVUFBVSxFQUFFQztBQUFiLENBQXhCLENBQTVCO0FBQ0EsSUFBTUMsd0JBQXdCLEdBQUcsSUFBSUMsb0NBQUosRUFBakM7O0FBRUEsSUFBTUMsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFzQixDQUFBQyxFQUFFO0FBQUEsU0FBSSxVQUFBQyxDQUFDO0FBQUEsV0FBSUEsQ0FBSjtBQUFBLEdBQUw7QUFBQSxDQUE5Qjs7QUFDQSxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQXVCLENBQUNDLEtBQUQsRUFBUUYsQ0FBUjtBQUFBLFNBQWNFLEtBQUssQ0FBQ0MsYUFBTixDQUFvQkgsQ0FBcEIsQ0FBZDtBQUFBLENBQTdCOztBQUNBLElBQU1JLGFBQWEsR0FBRyxTQUFoQkEsYUFBZ0IsQ0FBQUMsQ0FBQztBQUFBLFNBQUlBLENBQUo7QUFBQSxDQUF2Qjs7QUFFTyxJQUFNQyxZQUFZLEdBQUcsMkJBQVU7QUFDcENDLEVBQUFBLE1BQU0sRUFBRSxJQUQ0QjtBQUVwQ0MsRUFBQUEsUUFBUSxFQUFFO0FBRjBCLENBQVYsQ0FBckI7O0FBS0EsSUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBY0MsZ0NBQWQsRUFBNkJDLEdBQTdCLENBQWlDQyxvQkFBakMsQ0FBcEI7OztBQUNQLFNBQVUzQyxhQUFWO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNNNEMsVUFBQUEsS0FETixHQUNjLENBRGQ7O0FBQUE7QUFBQSxnQkFFU0EsS0FBSyxHQUFHTixXQUFXLENBQUNPLE1BQVosR0FBcUIsQ0FGdEM7QUFBQTtBQUFBO0FBQUE7O0FBR0ksY0FBSUQsS0FBSyxLQUFLTixXQUFXLENBQUNPLE1BQTFCLEVBQWtDO0FBQ2hDRCxZQUFBQSxLQUFLLEdBQUcsQ0FBUjtBQUNEOztBQUxMO0FBTUksaUJBQU1OLFdBQVcsQ0FBQ00sS0FBSyxFQUFOLENBQWpCOztBQU5KO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFVTyxJQUFNRSxVQUFVLEdBQUc5QyxhQUFhLEVBQWhDO0FBRVA7Ozs7SUFDTStDLEs7QUFDSixtQkFBd0I7QUFBQSxRQUFaQyxLQUFZLHVFQUFKLEVBQUk7QUFBQTtBQUN0QixTQUFLQyxFQUFMLEdBQVVELEtBQUssQ0FBQ0MsRUFBTixJQUFZLDJCQUFlaEMsZUFBZixDQUF0QixDQURzQixDQUd0Qjs7QUFDQSxTQUFLaUMsSUFBTCxHQUFZLEVBQVosQ0FKc0IsQ0FNdEI7O0FBQ0EsU0FBS0MsaUJBQUwsR0FBeUIsRUFBekIsQ0FQc0IsQ0FTdEI7O0FBQ0EsU0FBS0Msc0JBQUwsR0FBOEIsRUFBOUIsQ0FWc0IsQ0FZdEI7O0FBQ0EsU0FBS0MsTUFBTCxHQUFjLEtBQUtDLHFCQUFMO0FBQ1pDLE1BQUFBLE9BQU8sRUFBRSxLQUFLQyxlQUFMO0FBREcsT0FFVFIsS0FGUyxFQUFkO0FBSUQ7Ozs7U0FFRCxlQUFnQjtBQUNkLGFBQU9TLDRCQUFQO0FBQ0Q7OztTQUVELGVBQWtCO0FBQ2hCLGFBQU90QixZQUFZLENBQUNDLE1BQXBCO0FBQ0Q7OztTQUVELGVBQVc7QUFDVCxhQUFPLElBQVA7QUFDRDs7O1NBRUQsZUFBVztBQUNULGFBQU8sS0FBS2hDLElBQVo7QUFDRDs7O1NBRUQsZUFBbUI7QUFDakIsYUFBTyxLQUFQO0FBQ0Q7OztTQUVELGVBQTJCO0FBQ3pCLGFBQU8sRUFBUDtBQUNEOzs7U0FFRCxlQUFzQjtBQUNwQixhQUFPLEVBQVA7QUFDRDs7O1NBRUQsZUFBa0M7QUFDaEMsYUFBTyxDQUFDLE9BQUQsRUFBVSxTQUFWLEVBQXFCLFdBQXJCLEVBQWtDLFdBQWxDLEVBQStDLFFBQS9DLENBQVA7QUFDRDs7O1NBRUQsZUFBcUI7QUFDbkIsYUFBTztBQUNMc0QsUUFBQUEsS0FBSyxFQUFFO0FBQ0xDLFVBQUFBLFFBQVEsRUFBRSxPQURMO0FBRUw1QixVQUFBQSxLQUFLLEVBQUUsWUFGRjtBQUdMNkIsVUFBQUEsS0FBSyxFQUFFLFlBSEY7QUFJTEMsVUFBQUEsTUFBTSxFQUFFLGFBSkg7QUFLTEMsVUFBQUEsS0FBSyxFQUFFLFlBTEY7QUFNTHJELFVBQUFBLEdBQUcsRUFBRSxPQU5BO0FBT0xzRCxVQUFBQSxnQkFBZ0IsRUFBRUMsZ0NBQWVOLEtBUDVCO0FBUUxPLFVBQUFBLFNBQVMsRUFBRUMsK0JBUk47QUFTTEMsVUFBQUEsWUFBWSxFQUFFLHNCQUFBZCxNQUFNO0FBQUEsbUJBQUlBLE1BQU0sQ0FBQ0ssS0FBWDtBQUFBO0FBVGYsU0FERjtBQVlMVSxRQUFBQSxJQUFJLEVBQUU7QUFDSlQsVUFBQUEsUUFBUSxFQUFFLE1BRE47QUFFSjVCLFVBQUFBLEtBQUssRUFBRSxXQUZIO0FBR0o2QixVQUFBQSxLQUFLLEVBQUUsV0FISDtBQUlKQyxVQUFBQSxNQUFNLEVBQUUsWUFKSjtBQUtKQyxVQUFBQSxLQUFLLEVBQUUsV0FMSDtBQU1KckQsVUFBQUEsR0FBRyxFQUFFLE1BTkQ7QUFPSnNELFVBQUFBLGdCQUFnQixFQUFFQyxnQ0FBZUksSUFQN0I7QUFRSkgsVUFBQUEsU0FBUyxFQUFFLENBUlA7QUFTSkUsVUFBQUEsWUFBWSxFQUFFO0FBVFY7QUFaRCxPQUFQO0FBd0JEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7Ozs7U0FDRSxlQUFrQjtBQUNoQixhQUFPLElBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTs7OztTQUNFLGVBQThCO0FBQzVCLGFBQU87QUFDTEUsUUFBQUEsR0FBRyxFQUFFO0FBQUNDLFVBQUFBLElBQUksRUFBRSxLQUFQO0FBQWNDLFVBQUFBLFlBQVksRUFBRTtBQUE1QixTQURBO0FBRUxDLFFBQUFBLEdBQUcsRUFBRTtBQUFDRixVQUFBQSxJQUFJLEVBQUUsS0FBUDtBQUFjQyxVQUFBQSxZQUFZLEVBQUU7QUFBNUI7QUFGQSxPQUFQO0FBSUQ7QUFFRDtBQUNGO0FBQ0E7Ozs7U0FDRSxlQUE2QjtBQUMzQixhQUFPO0FBQ0xFLFFBQUFBLElBQUksRUFBRTtBQUFDSCxVQUFBQSxJQUFJLEVBQUUsTUFBUDtBQUFlQyxVQUFBQSxZQUFZLEVBQUU7QUFBN0IsU0FERDtBQUVMRyxRQUFBQSxJQUFJLEVBQUU7QUFBQ0osVUFBQUEsSUFBSSxFQUFFLE1BQVA7QUFBZUMsVUFBQUEsWUFBWSxFQUFFO0FBQTdCLFNBRkQ7QUFHTEksUUFBQUEsSUFBSSxFQUFFO0FBQUNMLFVBQUFBLElBQUksRUFBRSxNQUFQO0FBQWVDLFVBQUFBLFlBQVksRUFBRTtBQUE3QixTQUhEO0FBSUxLLFFBQUFBLElBQUksRUFBRTtBQUFDTixVQUFBQSxJQUFJLEVBQUUsTUFBUDtBQUFlQyxVQUFBQSxZQUFZLEVBQUU7QUFBN0I7QUFKRCxPQUFQO0FBTUQ7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7U0FDRSxlQUFxQjtBQUNuQixhQUFPLElBQVA7QUFDRDs7O1NBRUQsZUFBNEI7QUFDMUIsYUFBTyxLQUFLbkIsc0JBQVo7QUFDRCxLO1NBRUQsYUFBMEJ5QixxQkFBMUIsRUFBaUQ7QUFDL0MsV0FBS3pCLHNCQUFMLEdBQThCeUIscUJBQTlCO0FBQ0Q7OztTQUVELGVBQWlCO0FBQUE7O0FBQ2YsYUFBT0MsT0FBTyxDQUNaLCtCQUFLRCxxQkFBTCwwR0FBNEJFLEtBQTVCLGtGQUFtQ0MsTUFBbkMsQ0FBMENuQyxNQUExQyxnQ0FDRSxLQUFLZ0MscUJBRFAscUZBQ0UsdUJBQTRCSSxLQUQ5QiwyREFDRSx1QkFBbUNELE1BQW5DLENBQTBDbkMsTUFENUMsQ0FEWSxDQUFkO0FBSUQ7OztTQUVELGVBQXVCO0FBQUE7O0FBQ3JCLGFBQU9pQyxPQUFPLENBQUMsS0FBS0ksVUFBTCwrQkFBbUIsS0FBS0wscUJBQXhCLDJEQUFtQix1QkFBNEJNLE9BQS9DLENBQUQsQ0FBZDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OztXQWdGRSxpQ0FBa0M7QUFBQTs7QUFBQSxVQUFabkMsS0FBWSx1RUFBSixFQUFJO0FBQ2hDLGFBQU87QUFDTG9DLFFBQUFBLE1BQU0sRUFBRXBDLEtBQUssQ0FBQ29DLE1BQU4sSUFBZ0IsSUFEbkI7QUFFTEMsUUFBQUEsZ0JBQWdCLEVBQUU7QUFDaEJDLFVBQUFBLEdBQUcsRUFBRSwwQkFBQXRDLEtBQUssQ0FBQ3FDLGdCQUFOLGdGQUF3QkMsR0FBeEIsS0FBK0JDLG1DQUFrQkQsR0FEdEM7QUFFaEJFLFVBQUFBLEdBQUcsRUFBRSwyQkFBQXhDLEtBQUssQ0FBQ3FDLGdCQUFOLGtGQUF3QkcsR0FBeEIsS0FBK0JELG1DQUFrQkM7QUFGdEMsU0FGYjtBQU1MQyxRQUFBQSxLQUFLLEVBQUV6QyxLQUFLLENBQUN5QyxLQUFOLElBQWVDLGlDQU5qQjtBQU9MaEMsUUFBQUEsS0FBSyxFQUFFVixLQUFLLENBQUNVLEtBQU4sSUFBZVosVUFBVSxDQUFDNkMsSUFBWCxHQUFrQnRGLEtBUG5DO0FBUUxrRCxRQUFBQSxPQUFPLEVBQUVQLEtBQUssQ0FBQ08sT0FBTixJQUFpQixJQVJyQjtBQVNMcUMsUUFBQUEsU0FBUyxFQUFFNUMsS0FBSyxDQUFDNEMsU0FBTixJQUFtQixLQVR6QjtBQVVMQyxRQUFBQSxjQUFjLEVBQUU3QyxLQUFLLENBQUM2QyxjQUFOLElBQXdCLEtBVm5DO0FBV0xDLFFBQUFBLGNBQWMsRUFBRTlDLEtBQUssQ0FBQzhDLGNBQU4sSUFBd0JDLHFDQVhuQztBQVlMQyxRQUFBQSxNQUFNLEVBQUVoRCxLQUFLLENBQUNnRCxNQUFOLElBQWdCLEtBWm5CO0FBY0w7QUFDQTtBQUNBQyxRQUFBQSxVQUFVLEVBQUUsSUFoQlA7QUFpQkxDLFFBQUFBLFdBQVcsRUFBRSxDQUFDLENBQUQsRUFBSSxDQUFKLENBakJSO0FBa0JMQyxRQUFBQSxVQUFVLEVBQUVDLDZCQUFZQyxRQWxCbkI7QUFvQkw7QUFDQUMsUUFBQUEsVUFBVSxFQUFFLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FyQlA7QUFzQkxDLFFBQUFBLFNBQVMsRUFBRUgsNkJBQVlJLE1BdEJsQjtBQXVCTEMsUUFBQUEsU0FBUyxFQUFFLElBdkJOO0FBd0JMQyxRQUFBQSxXQUFXLEVBQUUsSUF4QlI7QUEwQkxDLFFBQUFBLFNBQVMsRUFBRSxFQTFCTjtBQTRCTEMsUUFBQUEsU0FBUyxFQUFFLENBQUNDLGdDQUFELENBNUJOO0FBOEJMQyxRQUFBQSxPQUFPLEVBQUU7QUFDUHBELFVBQUFBLEtBQUssRUFBRXFELDhCQURBO0FBRVBDLFVBQUFBLFVBQVUsRUFBRUQ7QUFGTCxTQTlCSjtBQWtDTEUsUUFBQUEsU0FBUyxFQUFFO0FBQUM5QixVQUFBQSxPQUFPLEVBQUU7QUFBVjtBQWxDTixPQUFQO0FBb0NEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OztXQUNFLHFDQUE0QjFFLEdBQTVCLEVBQWlDO0FBQy9CO0FBQ0EsYUFBTztBQUNMZ0YsUUFBQUEsS0FBSyxFQUFFLEtBQUt0QyxpQkFBTCxDQUF1QixLQUFLK0QsY0FBTCxDQUFvQnpHLEdBQXBCLEVBQXlCcUQsS0FBaEQsRUFBdUQyQixLQUR6RDtBQUVMMEIsUUFBQUEsT0FBTyxFQUFFLEtBQUs5RCxNQUFMLENBQVksS0FBSzZELGNBQUwsQ0FBb0J6RyxHQUFwQixFQUF5QnNCLEtBQXJDLElBQ0osS0FBS3NCLE1BQUwsQ0FBWSxLQUFLNkQsY0FBTCxDQUFvQnpHLEdBQXBCLEVBQXlCc0IsS0FBckMsRUFBNENxRixXQUE1QyxJQUNELEtBQUsvRCxNQUFMLENBQVksS0FBSzZELGNBQUwsQ0FBb0J6RyxHQUFwQixFQUF5QnNCLEtBQXJDLEVBQTRDc0YsSUFGdkMsR0FHTCxLQUFLSCxjQUFMLENBQW9CekcsR0FBcEIsRUFBeUI2RztBQUx4QixPQUFQO0FBT0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7V0FDRSxzQkFBYTdHLEdBQWIsRUFBa0JzQixLQUFsQixFQUF5QjtBQUN2QjtBQUNBLFVBQU13RixNQUFNLEdBQUd4RixLQUFLLEdBQ2hCO0FBQ0UxQixRQUFBQSxLQUFLLEVBQUUwQixLQUFLLENBQUNzRixJQURmO0FBRUVHLFFBQUFBLFFBQVEsRUFBRXpGLEtBQUssQ0FBQ3lGO0FBRmxCLE9BRGdCLEdBS2hCO0FBQUNuSCxRQUFBQSxLQUFLLEVBQUUsSUFBUjtBQUFjbUgsUUFBQUEsUUFBUSxFQUFFLENBQUM7QUFBekIsT0FMSjtBQU9BLDZDQUNLLEtBQUtuRSxNQUFMLENBQVlFLE9BRGpCLDRDQUVHOUMsR0FGSCxrQ0FHTyxLQUFLNEMsTUFBTCxDQUFZRSxPQUFaLENBQW9COUMsR0FBcEIsQ0FIUCxHQUlPOEcsTUFKUDtBQU9EO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UsMkJBQWtCOUcsR0FBbEIsRUFBdUI2RCxJQUF2QixFQUE2QjtBQUFBOztBQUMzQixVQUFJLENBQUMsS0FBS21ELFdBQU4sSUFBcUIsdUJBQUMsS0FBS0EsV0FBTiw4Q0FBQyxrQkFBbUJoSCxHQUFuQixDQUFELENBQXpCLEVBQW1EO0FBQ2pEO0FBQ0EsZUFBTyxLQUFLNEMsTUFBTCxDQUFZRSxPQUFuQjtBQUNEOztBQUowQix3REFNYyxLQUFLa0UsV0FObkIsdURBTWMsbUJBQW1CaEgsR0FBbkIsQ0FOZDtBQUFBLFVBTWRpSCxVQU5jLHlCQU1wQnBELElBTm9CO0FBQUEsVUFNRkMsWUFORSx5QkFNRkEsWUFORTs7QUFBQSx3REFPaUIsS0FBS2tELFdBUHRCLHVEQU9pQixtQkFBbUJDLFVBQW5CLENBUGpCO0FBQUEsVUFPTkMsbUJBUE0seUJBT3BCcEQsWUFQb0I7O0FBUzNCLDZDQUNLLEtBQUtsQixNQUFMLENBQVlFLE9BRGpCLDhFQUVHOUMsR0FGSCxFQUVTNkQsSUFBSSxDQUFDQyxZQUFELENBRmIsb0RBR0dtRCxVQUhILEVBR2dCcEQsSUFBSSxDQUFDcUQsbUJBQUQsQ0FIcEI7QUFLRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UsNkJBQXNDO0FBQUEsVUFBdkJDLElBQXVCLFFBQXZCQSxJQUF1QjtBQUFBLGlDQUFqQkMsVUFBaUI7QUFBQSxVQUFqQkEsVUFBaUIsZ0NBQUosQ0FBSTtBQUNwQyxhQUFPQyxJQUFJLENBQUNDLEdBQUwsQ0FBUyxDQUFULEVBQVlELElBQUksQ0FBQ3RDLEdBQUwsQ0FBUyxLQUFLb0MsSUFBTCxHQUFZQyxVQUFyQixFQUFpQyxDQUFqQyxDQUFaLENBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UsdUNBQStDO0FBQUEsVUFBdkJELElBQXVCLFNBQXZCQSxJQUF1QjtBQUFBLG1DQUFqQkMsVUFBaUI7QUFBQSxVQUFqQkEsVUFBaUIsaUNBQUosQ0FBSTtBQUM3QyxhQUFPLEtBQUt4RSxNQUFMLENBQVlzRCxTQUFaLENBQXNCcUIseUJBQXRCLEdBQ0hGLElBQUksQ0FBQ0MsR0FBTCxDQUFTLENBQVQsRUFBWUQsSUFBSSxDQUFDdEMsR0FBTCxDQUFTLElBQUlvQyxJQUFKLEdBQVdDLFVBQXBCLEVBQWdDLENBQWhDLENBQVosQ0FERyxHQUVILENBRko7QUFHRDs7O1dBRUQseUJBQWdCSSxRQUFoQixFQUEwQkMsYUFBMUIsRUFBeUM7QUFDdkMsYUFBTyxFQUFQO0FBQ0Q7OztXQUVELHVCQUFjO0FBQ1osYUFBTyxFQUFQO0FBQ0Q7OztXQUVELHNCQUFhQyxNQUFiLEVBQXFCQyxhQUFyQixFQUFvQztBQUNsQyxVQUFJLENBQUNELE1BQUwsRUFBYTtBQUNYLGVBQU8sSUFBUDtBQUNELE9BSGlDLENBS2xDO0FBQ0E7OztBQUNBLGFBQU9DLGFBQWEsQ0FBQ0MsR0FBZCxDQUFrQkYsTUFBTSxDQUFDdkYsS0FBekIsQ0FBUDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OztXQUNFLDZCQUFvQjBGLFlBQXBCLEVBQWtDbkYsaUJBQWxDLEVBQXFEO0FBQUE7O0FBQ25EO0FBQ0E7QUFDQSxVQUFNb0YsV0FBVyxHQUFHLENBQUMsWUFBRCxFQUFlLGtCQUFmLEVBQW1DQyxNQUFuQyxDQUNsQmpHLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEtBQUswRSxjQUFuQixFQUFtQ3hFLEdBQW5DLENBQXVDLFVBQUFSLENBQUM7QUFBQSxlQUFJQSxDQUFDLENBQUNILEtBQU47QUFBQSxPQUF4QyxDQURrQixDQUFwQixDQUhtRCxDQU9uRDs7QUFDQSxVQUFNMEcsU0FBUyxHQUFHLENBQUMsV0FBRCxFQUFjRCxNQUFkLENBQXFCakcsTUFBTSxDQUFDQyxNQUFQLENBQWMsS0FBSzBFLGNBQW5CLEVBQW1DeEUsR0FBbkMsQ0FBdUMsVUFBQVIsQ0FBQztBQUFBLGVBQUlBLENBQUMsQ0FBQzJCLE1BQU47QUFBQSxPQUF4QyxDQUFyQixDQUFsQixDQVJtRCxDQVNuRDs7QUFDQXRCLE1BQUFBLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEtBQUswRSxjQUFuQixFQUFtQ3dCLE9BQW5DLENBQTJDLFVBQUF4RyxDQUFDLEVBQUk7QUFDOUMsWUFDRW9HLFlBQVksQ0FBQzNCLFNBQWIsQ0FBdUJ6RSxDQUFDLENBQUM0QixLQUF6QixLQUNBLEtBQUksQ0FBQ1gsaUJBQUwsQ0FBdUJqQixDQUFDLENBQUM0QixLQUF6QixDQURBLElBRUFYLGlCQUFpQixDQUFDakIsQ0FBQyxDQUFDNEIsS0FBSCxDQUFqQixDQUEyQjZFLEtBQTNCLEtBQXFDLEtBQUksQ0FBQ3hGLGlCQUFMLENBQXVCakIsQ0FBQyxDQUFDNEIsS0FBekIsRUFBZ0M2RSxLQUh2RSxFQUlFO0FBQ0FGLFVBQUFBLFNBQVMsQ0FBQ0csSUFBVixDQUFlMUcsQ0FBQyxDQUFDNEIsS0FBakI7QUFDRDtBQUNGLE9BUkQsRUFWbUQsQ0FvQm5EOztBQUNBLFVBQU0rRSxhQUFhLEdBQUcsS0FBS3hGLE1BQTNCO0FBQ0EsVUFBTXlGLE1BQU0sR0FBRyxLQUFLQyxlQUFMLENBQXFCRixhQUFyQixFQUFvQ1AsWUFBcEMsRUFBa0Q7QUFDL0RDLFFBQUFBLFdBQVcsRUFBWEEsV0FEK0Q7QUFFL0RFLFFBQUFBLFNBQVMsRUFBVEE7QUFGK0QsT0FBbEQsQ0FBZjtBQUlBLFdBQUtPLGlCQUFMLENBQXVCRixNQUF2QixFQTFCbUQsQ0EyQm5EOztBQUNBdkcsTUFBQUEsTUFBTSxDQUFDMEcsSUFBUCxDQUFZLEtBQUsvQixjQUFqQixFQUFpQ3dCLE9BQWpDLENBQXlDLFVBQUFRLE9BQU8sRUFBSTtBQUNsRCxRQUFBLEtBQUksQ0FBQ0MscUJBQUwsQ0FBMkJELE9BQTNCO0FBQ0QsT0FGRDtBQUdEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7V0FDRSx5QkFBZ0JMLGFBQWhCLEVBQStCUCxZQUEvQixFQUFzRjtBQUFBOztBQUFBLHNGQUFKLEVBQUk7QUFBQSxvQ0FBeENDLFdBQXdDO0FBQUEsVUFBeENBLFdBQXdDLGtDQUExQixFQUEwQjtBQUFBLGtDQUF0QkUsU0FBc0I7QUFBQSxVQUF0QkEsU0FBc0IsZ0NBQVYsRUFBVTs7QUFDcEYsVUFBTUssTUFBTSxHQUFHLEVBQWY7QUFDQXZHLE1BQUFBLE1BQU0sQ0FBQzBHLElBQVAsQ0FBWUosYUFBWixFQUEyQkgsT0FBM0IsQ0FBbUMsVUFBQWpJLEdBQUcsRUFBSTtBQUN4QyxZQUNFLDBCQUFjb0ksYUFBYSxDQUFDcEksR0FBRCxDQUEzQixLQUNBLDBCQUFjNkgsWUFBWSxDQUFDN0gsR0FBRCxDQUExQixDQURBLElBRUEsQ0FBQzhILFdBQVcsQ0FBQ2EsUUFBWixDQUFxQjNJLEdBQXJCLENBRkQsSUFHQSxDQUFDZ0ksU0FBUyxDQUFDVyxRQUFWLENBQW1CM0ksR0FBbkIsQ0FKSCxFQUtFO0FBQ0E7QUFDQXFJLFVBQUFBLE1BQU0sQ0FBQ3JJLEdBQUQsQ0FBTixHQUFjLE1BQUksQ0FBQ3NJLGVBQUwsQ0FBcUJGLGFBQWEsQ0FBQ3BJLEdBQUQsQ0FBbEMsRUFBeUM2SCxZQUFZLENBQUM3SCxHQUFELENBQXJELEVBQTREO0FBQ3hFOEgsWUFBQUEsV0FBVyxFQUFYQSxXQUR3RTtBQUV4RUUsWUFBQUEsU0FBUyxFQUFUQTtBQUZ3RSxXQUE1RCxDQUFkO0FBSUQsU0FYRCxNQVdPLElBQUksbUNBQW1CSCxZQUFZLENBQUM3SCxHQUFELENBQS9CLEtBQXlDLENBQUNnSSxTQUFTLENBQUNXLFFBQVYsQ0FBbUIzSSxHQUFuQixDQUE5QyxFQUF1RTtBQUM1RTtBQUNBcUksVUFBQUEsTUFBTSxDQUFDckksR0FBRCxDQUFOLEdBQWM2SCxZQUFZLENBQUM3SCxHQUFELENBQTFCO0FBQ0QsU0FITSxNQUdBO0FBQ0w7QUFDQXFJLFVBQUFBLE1BQU0sQ0FBQ3JJLEdBQUQsQ0FBTixHQUFjb0ksYUFBYSxDQUFDcEksR0FBRCxDQUEzQjtBQUNEO0FBQ0YsT0FuQkQ7QUFxQkEsYUFBT3FJLE1BQVA7QUFDRDs7O1dBRUQsMkJBQWtCTyxlQUFsQixFQUFtQztBQUFBOztBQUNqQzlHLE1BQUFBLE1BQU0sQ0FBQzBHLElBQVAsQ0FBWUksZUFBWixFQUE2QlgsT0FBN0IsQ0FBcUMsVUFBQVksSUFBSSxFQUFJO0FBQzNDLFlBQUksT0FBT0EsSUFBUCxLQUFnQixRQUFoQixJQUE0QkMsZ0NBQWtCRixlQUFlLENBQUNDLElBQUQsQ0FBakMsQ0FBaEMsRUFBMEU7QUFDeEU7QUFDQSxVQUFBLE1BQUksQ0FBQ2pHLE1BQUwsQ0FBWXNELFNBQVosQ0FBc0IyQyxJQUF0QixJQUE4QkMsZ0NBQWtCRixlQUFlLENBQUNDLElBQUQsQ0FBakMsRUFBeUNuRixZQUF2RTtBQUNBLFVBQUEsTUFBSSxDQUFDaEIsaUJBQUwsQ0FBdUJtRyxJQUF2QixJQUErQkMsZ0NBQWtCRixlQUFlLENBQUNDLElBQUQsQ0FBakMsQ0FBL0I7QUFDRCxTQUpELE1BSU8sSUFBSSxDQUFDLE1BQUQsRUFBUyxjQUFULEVBQXlCRSxLQUF6QixDQUErQixVQUFBQyxDQUFDO0FBQUEsaUJBQUlKLGVBQWUsQ0FBQ0MsSUFBRCxDQUFmLENBQXNCSSxjQUF0QixDQUFxQ0QsQ0FBckMsQ0FBSjtBQUFBLFNBQWhDLENBQUosRUFBa0Y7QUFDdkY7QUFDQTtBQUNBLFVBQUEsTUFBSSxDQUFDcEcsTUFBTCxDQUFZc0QsU0FBWixDQUFzQjJDLElBQXRCLElBQThCRCxlQUFlLENBQUNDLElBQUQsQ0FBZixDQUFzQm5GLFlBQXBEO0FBQ0EsVUFBQSxNQUFJLENBQUNoQixpQkFBTCxDQUF1Qm1HLElBQXZCLElBQStCRCxlQUFlLENBQUNDLElBQUQsQ0FBOUM7QUFDRDtBQUNGLE9BWEQ7QUFZRDs7O1dBRUQsMkJBQWtCO0FBQ2hCLFVBQU1LLGdCQUFnQixHQUFHLEtBQUtBLGdCQUFMLElBQXlCLEVBQWxEO0FBQ0EsVUFBTUMsUUFBUSxHQUFHLEtBQUtDLG9CQUFMLENBQTBCQyxNQUExQixDQUNmLFVBQUNDLElBQUQsRUFBT3RKLEdBQVA7QUFBQSwrQ0FDS3NKLElBREwsNENBRUd0SixHQUZILEVBRVNrSixnQkFBZ0IsQ0FBQ2xKLEdBQUQsQ0FBaEIsR0FDSDtBQUFDSixVQUFBQSxLQUFLLEVBQUUsSUFBUjtBQUFjbUgsVUFBQUEsUUFBUSxFQUFFLENBQUMsQ0FBekI7QUFBNEJ3QyxVQUFBQSxTQUFTLEVBQUVMLGdCQUFnQixDQUFDbEosR0FBRDtBQUF2RCxTQURHLEdBRUg7QUFBQ0osVUFBQUEsS0FBSyxFQUFFLElBQVI7QUFBY21ILFVBQUFBLFFBQVEsRUFBRSxDQUFDO0FBQXpCLFNBSk47QUFBQSxPQURlLEVBT2YsRUFQZSxDQUFqQjtBQVNBLFVBQU0xRyxRQUFRLEdBQUcsS0FBS21KLGVBQUwsQ0FBcUJILE1BQXJCLENBQ2YsVUFBQ0MsSUFBRCxFQUFPdEosR0FBUDtBQUFBLCtDQUNLc0osSUFETCw0Q0FFR3RKLEdBRkgsRUFFUztBQUFDSixVQUFBQSxLQUFLLEVBQUUsSUFBUjtBQUFjbUgsVUFBQUEsUUFBUSxFQUFFLENBQUMsQ0FBekI7QUFBNEIxRyxVQUFBQSxRQUFRLEVBQUU7QUFBdEMsU0FGVDtBQUFBLE9BRGUsRUFLZixFQUxlLENBQWpCO0FBUUEsNkNBQVc4SSxRQUFYLEdBQXdCOUksUUFBeEI7QUFDRDs7O1dBRUQsMkJBQWtCb0osU0FBbEIsRUFBNkI7QUFDM0IsV0FBSzdHLE1BQUwsbUNBQWtCLEtBQUtBLE1BQXZCLEdBQWtDNkcsU0FBbEM7QUFDQSxhQUFPLElBQVA7QUFDRDs7O1dBRUQsOEJBQXFCQyxZQUFyQixFQUFtQztBQUNqQyxXQUFLOUcsTUFBTCxDQUFZc0QsU0FBWixtQ0FBNEIsS0FBS3RELE1BQUwsQ0FBWXNELFNBQXhDLEdBQXNEd0QsWUFBdEQ7QUFDQSxhQUFPLElBQVA7QUFDRDs7O1dBRUQsNEJBQW1CQyxJQUFuQixFQUF5QkYsU0FBekIsRUFBb0M7QUFBQSx5QkFDSyxLQUFLN0csTUFEVjtBQUFBLFVBQ2xCZ0gsUUFEa0IsZ0JBQzNCdkQsT0FEMkI7QUFBQSxVQUNSSCxTQURRLGdCQUNSQSxTQURROztBQUdsQyxVQUFJLENBQUMsMEJBQWN1RCxTQUFkLENBQUQsSUFBNkIsT0FBT0UsSUFBUCxLQUFnQixRQUFqRCxFQUEyRDtBQUN6RCxlQUFPLElBQVA7QUFDRDs7QUFFRCxVQUFNRSxXQUFXLEdBQUcvSCxNQUFNLENBQUNnSSxPQUFQLENBQWVMLFNBQWYsRUFBMEJKLE1BQTFCLENBQWlDLFVBQUNDLElBQUQsU0FBd0I7QUFBQTtBQUFBLFlBQWhCdEosR0FBZ0I7QUFBQSxZQUFYSixLQUFXOztBQUMzRSwrQ0FDSzBKLElBREwsNENBRUd0SixHQUZILEVBRVMsMEJBQWNzSixJQUFJLENBQUN0SixHQUFELENBQWxCLEtBQTRCLDBCQUFjSixLQUFkLENBQTVCLG1DQUF1RDBKLElBQUksQ0FBQ3RKLEdBQUQsQ0FBM0QsR0FBcUVKLEtBQXJFLElBQThFQSxLQUZ2RjtBQUlELE9BTG1CLEVBS2pCZ0ssUUFBUSxDQUFDRCxJQUFELENBQVIsSUFBa0JyRCw4QkFMRCxDQUFwQjs7QUFPQSxVQUFNRCxPQUFPLG1DQUNSdUQsUUFEUSw0Q0FFVkQsSUFGVSxFQUVIRSxXQUZHLEVBQWI7O0FBS0EsV0FBS3RCLGlCQUFMLENBQXVCO0FBQUNsQyxRQUFBQSxPQUFPLEVBQVBBO0FBQUQsT0FBdkIsRUFuQmtDLENBb0JsQzs7QUFDQSxVQUFNMEQsWUFBWSxHQUFHN0QsU0FBUyxDQUFDeUQsSUFBRCxDQUFULElBQW1CekQsU0FBUyxDQUFDeUQsSUFBRCxDQUFULENBQWdCSyxNQUF4RDs7QUFFQSxVQUFJRCxZQUFKLEVBQWtCO0FBQ2hCLGFBQUtFLHlCQUFMLENBQStCUixTQUEvQixFQUEwQ0UsSUFBMUM7QUFDQSxhQUFLTyx5QkFBTCxDQUErQlQsU0FBL0IsRUFBMENHLFFBQTFDLEVBQW9ERCxJQUFwRDtBQUNBLGFBQUtRLG1CQUFMLENBQXlCVixTQUF6QixFQUFvQ0csUUFBcEMsRUFBOENELElBQTlDO0FBQ0Q7O0FBRUQsYUFBTyxJQUFQO0FBQ0Q7OztXQUVELDZCQUFvQkYsU0FBcEIsRUFBK0JHLFFBQS9CLEVBQXlDRCxJQUF6QyxFQUErQztBQUM3QyxVQUFJLENBQUNGLFNBQVMsQ0FBQ1csZ0JBQVgsSUFBK0IsQ0FBQ1gsU0FBUyxDQUFDVyxnQkFBVixDQUEyQkMsTUFBL0QsRUFBdUU7QUFDckU7QUFDRDs7QUFINEMsMEJBS2hCLEtBQUt6SCxNQUxXO0FBQUEsVUFLdEN5RCxPQUxzQyxpQkFLdENBLE9BTHNDO0FBQUEsVUFLN0JILFNBTDZCLGlCQUs3QkEsU0FMNkI7QUFPN0MsVUFBSSxDQUFDQSxTQUFTLENBQUN5RCxJQUFELENBQWQsRUFBc0I7QUFQdUIsVUFRdENLLE1BUnNDLEdBUTVCOUQsU0FBUyxDQUFDeUQsSUFBRCxDQVJtQixDQVF0Q0ssTUFSc0M7O0FBUzdDLFVBQU1NLGFBQWEsbUNBQ2RqRSxPQUFPLENBQUNzRCxJQUFELENBQVAsQ0FBY1csYUFEQTtBQUVqQjFELFFBQUFBLElBQUksRUFBRSxnQkFGVztBQUdqQm9ELFFBQUFBLE1BQU0sc0NBQU1BLE1BQU47QUFIVyxRQUFuQjs7QUFLQSxXQUFLekIsaUJBQUwsQ0FBdUI7QUFDckJsQyxRQUFBQSxPQUFPLGtDQUNGQSxPQURFLDRDQUVKc0QsSUFGSSxrQ0FHQXRELE9BQU8sQ0FBQ3NELElBQUQsQ0FIUDtBQUlIVyxVQUFBQSxhQUFhLEVBQWJBO0FBSkc7QUFEYyxPQUF2QjtBQVNEO0FBQ0Q7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UsbUNBQTBCYixTQUExQixFQUFxQ0UsSUFBckMsRUFBMkM7QUFDekMsVUFBSSxPQUFPRixTQUFTLENBQUNjLFlBQWpCLEtBQWtDLFFBQXRDLEVBQWdEO0FBRFAsMEJBR1osS0FBSzNILE1BSE87QUFBQSxVQUdsQ3lELE9BSGtDLGlCQUdsQ0EsT0FIa0M7QUFBQSxVQUd6QkgsU0FIeUIsaUJBR3pCQSxTQUh5QjtBQUl6QyxXQUFLcUMsaUJBQUwsQ0FBdUI7QUFDckJsQyxRQUFBQSxPQUFPLGtDQUNGQSxPQURFLDRDQUVKc0QsSUFGSSxrQ0FHQXRELE9BQU8sQ0FBQ3NELElBQUQsQ0FIUDtBQUlIUyxVQUFBQSxnQkFBZ0Isa0NBQ1gvRCxPQUFPLENBQUNzRCxJQUFELENBQVAsQ0FBY1MsZ0JBREg7QUFFZHpLLFlBQUFBLElBQUksRUFBRXVHLFNBQVMsQ0FBQ3lELElBQUQsQ0FBVCxDQUFnQmhLLElBRlI7QUFHZDZLLFlBQUFBLEtBQUssRUFBRXRFLFNBQVMsQ0FBQ3lELElBQUQsQ0FBVCxDQUFnQkssTUFBaEIsQ0FBdUI1SCxNQUhoQjtBQUlkcUksWUFBQUEsUUFBUSxFQUFFcEcsT0FBTyxDQUFDNkIsU0FBUyxDQUFDeUQsSUFBRCxDQUFULENBQWdCYyxRQUFqQjtBQUpIO0FBSmI7QUFEYyxPQUF2QjtBQWNELEssQ0FFRDs7OztXQUNBLG1DQUEwQmhCLFNBQTFCLEVBQXFDRyxRQUFyQyxFQUErQ0QsSUFBL0MsRUFBcUQ7QUFDbkQ7QUFDQSxVQUFNZSxZQUFZLEdBQ2hCakIsU0FBUyxDQUFDVyxnQkFBVixJQUNBLENBQUMsVUFBRCxFQUFhLE9BQWIsRUFBc0JPLElBQXRCLENBQ0UsVUFBQTNLLEdBQUc7QUFBQSxlQUNEeUosU0FBUyxDQUFDVyxnQkFBVixDQUEyQm5CLGNBQTNCLENBQTBDakosR0FBMUMsS0FDQXlKLFNBQVMsQ0FBQ1csZ0JBQVYsQ0FBMkJwSyxHQUEzQixNQUNFLENBQUM0SixRQUFRLENBQUNELElBQUQsQ0FBUixJQUFrQnJELDhCQUFuQixFQUFxQzhELGdCQUFyQyxDQUFzRHBLLEdBQXRELENBSEQ7QUFBQSxPQURMLENBRkY7QUFRQSxVQUFJLENBQUMwSyxZQUFMLEVBQW1CO0FBVmdDLDBCQVl0QixLQUFLOUgsTUFaaUI7QUFBQSxVQVk1Q3lELE9BWjRDLGlCQVk1Q0EsT0FaNEM7QUFBQSxVQVluQ0gsU0FabUMsaUJBWW5DQSxTQVptQztBQUFBLGtDQWF6QkcsT0FBTyxDQUFDc0QsSUFBRCxDQUFQLENBQWNTLGdCQWJXO0FBQUEsVUFhNUNJLEtBYjRDLHlCQWE1Q0EsS0FiNEM7QUFBQSxVQWFyQ0MsUUFicUMseUJBYXJDQSxRQWJxQztBQWNuRCxVQUFNbEUsVUFBVSxHQUFHTCxTQUFTLENBQUN5RCxJQUFELENBQTVCLENBZG1ELENBZW5EOztBQUNBLFVBQUk3QyxNQUFKOztBQUNBLFVBQUkyQyxTQUFTLENBQUNXLGdCQUFWLENBQTJCbkIsY0FBM0IsQ0FBMEMsT0FBMUMsQ0FBSixFQUF3RDtBQUN0RCxZQUFNZixLQUFLLEdBQUcscUNBQW9CM0IsVUFBcEIsQ0FBZDs7QUFFQSxZQUFJMkIsS0FBSixFQUFXO0FBQ1QsY0FBTTBDLFNBQVMsR0FBR0MsMEJBQWFDLE1BQWIsQ0FBb0IsVUFBQUMsRUFBRTtBQUFBLG1CQUFJLHFDQUFvQkEsRUFBcEIsTUFBNEI3QyxLQUFoQztBQUFBLFdBQXRCLENBQWxCOztBQUVBcEIsVUFBQUEsTUFBTSxHQUFHOEQsU0FBUyxDQUFDSSxJQUFWLENBQWUsVUFBQUQsRUFBRTtBQUFBLG1CQUFJQSxFQUFFLENBQUNmLE1BQUgsQ0FBVTVILE1BQVYsS0FBcUJvSSxLQUF6QjtBQUFBLFdBQWpCLENBQVQ7O0FBRUEsY0FBSTFELE1BQU0sSUFBSVAsVUFBVSxDQUFDa0UsUUFBekIsRUFBbUM7QUFDakMzRCxZQUFBQSxNQUFNLEdBQUcsbUNBQWtCLElBQWxCLEVBQXdCQSxNQUF4QixDQUFUO0FBQ0Q7O0FBRUQsY0FBSUEsTUFBTSxJQUFJUCxVQUFVLENBQUMwRSxRQUF6QixFQUFtQztBQUNqQ25FLFlBQUFBLE1BQU0sR0FBRyxLQUFLb0UsY0FBTCxDQUFvQnZCLElBQXBCLEVBQTBCcEQsVUFBVSxDQUFDMEUsUUFBckMsRUFBK0NuRSxNQUEvQyxDQUFUO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFVBQUkyQyxTQUFTLENBQUNXLGdCQUFWLENBQTJCbkIsY0FBM0IsQ0FBMEMsVUFBMUMsQ0FBSixFQUEyRDtBQUN6RG5DLFFBQUFBLE1BQU0sR0FBRyxtQ0FBa0IyRCxRQUFsQixFQUE0QjNELE1BQU0sSUFBSVAsVUFBdEMsQ0FBVDtBQUNEOztBQUVELFVBQUlPLE1BQUosRUFBWTtBQUNWLGFBQUtxRSxvQkFBTCxzQ0FBNEJ4QixJQUE1QixFQUFtQzdDLE1BQW5DO0FBQ0Q7QUFDRjs7O1dBRUQsd0JBQWU2QyxJQUFmLEVBQXFCc0IsUUFBckIsRUFBK0IxRSxVQUEvQixFQUEyQztBQUFBOztBQUN6QztBQUR5QyxnQ0FFakJ6RSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLMEUsY0FBbkIsRUFBbUN1RSxJQUFuQyxDQUF3QyxVQUFBcEwsS0FBSztBQUFBLGVBQUlBLEtBQUssQ0FBQ3lELEtBQU4sS0FBZ0JzRyxJQUFwQjtBQUFBLE9BQTdDLENBRmlCO0FBQUEsVUFFbENySSxLQUZrQyx1QkFFbENBLEtBRmtDO0FBQUEsVUFFM0I4QixNQUYyQix1QkFFM0JBLE1BRjJCOztBQUd6QyxVQUFNekQsSUFBSSx5QkFBRyxLQUFLaUQsTUFBTCxDQUFZdEIsS0FBWixDQUFILHVEQUFHLG1CQUFvQjNCLElBQWpDOztBQUVBLFVBQUlBLElBQUksS0FBSyxRQUFULElBQXFCQSxJQUFJLEtBQUssU0FBOUIsSUFBMkNBLElBQUksS0FBSyxNQUF4RCxFQUFnRTtBQUM5RCxlQUFPLEtBQUt5TCxzQkFBTCxDQUE0QkgsUUFBNUIsRUFBc0MsS0FBS3JJLE1BQUwsQ0FBWVEsTUFBWixDQUF0QyxFQUEyRG1ELFVBQTNELENBQVA7QUFDRCxPQVB3QyxDQVN6Qzs7O0FBQ0EsYUFBTyxLQUFLOEUscUJBQUwsQ0FBMkJKLFFBQTNCLEVBQXFDLEtBQUtySSxNQUFMLENBQVlRLE1BQVosQ0FBckMsRUFBMERtRCxVQUExRCxDQUFQO0FBQ0Q7OztXQUVELGdDQUF1QjBFLFFBQXZCLEVBQWlDN0gsTUFBakMsRUFBeUNtRCxVQUF6QyxFQUFxRDtBQUNuRCxVQUFNeUQsTUFBTSxHQUFHekQsVUFBVSxDQUFDeUQsTUFBMUI7QUFDQSxVQUFNc0Isa0JBQWtCLEdBQUcsRUFBM0I7QUFDQSxVQUFNQyxXQUFXLEdBQUdOLFFBQVEsQ0FBQ08sS0FBVCxDQUFlLENBQWYsRUFBa0J4QixNQUFNLENBQUM1SCxNQUF6QixFQUFpQ0gsR0FBakMsQ0FBcUMsVUFBQ3dKLElBQUQsRUFBT3RKLEtBQVAsRUFBaUI7QUFDeEVtSixRQUFBQSxrQkFBa0IsQ0FBQ25ELElBQW5CLENBQXdCc0QsSUFBSSxDQUFDLENBQUQsQ0FBNUI7QUFDQSxlQUFPLENBQUNBLElBQUksQ0FBQyxDQUFELENBQUwsRUFBVXpCLE1BQU0sQ0FBQzdILEtBQUQsQ0FBaEIsQ0FBUDtBQUNELE9BSG1CLENBQXBCO0FBSUEsVUFBTXVKLGdCQUFnQixHQUFHMUIsTUFBTSxDQUFDd0IsS0FBUCxDQUFhRCxXQUFXLENBQUNuSixNQUF6QixFQUFpQzRILE1BQU0sQ0FBQzVILE1BQXhDLENBQXpCOztBQVBtRCxpREFTL0JzSixnQkFUK0I7QUFBQTs7QUFBQTtBQVNuRCw0REFBc0M7QUFBQSxjQUEzQnpJLEtBQTJCO0FBQ3BDLGNBQU0wSSxRQUFRLEdBQUd2SSxNQUFNLENBQUM0SCxJQUFQLENBQVksVUFBQTVKLENBQUM7QUFBQSxtQkFBSSxDQUFDa0ssa0JBQWtCLENBQUMzQyxRQUFuQixDQUE0QnZILENBQTVCLENBQUw7QUFBQSxXQUFiLENBQWpCOztBQUNBLGNBQUksQ0FBQ3VLLFFBQUwsRUFBZTtBQUNiO0FBQ0Q7O0FBQ0RMLFVBQUFBLGtCQUFrQixDQUFDbkQsSUFBbkIsQ0FBd0J3RCxRQUF4QjtBQUNBSixVQUFBQSxXQUFXLENBQUNwRCxJQUFaLENBQWlCLENBQUN3RCxRQUFELEVBQVcxSSxLQUFYLENBQWpCO0FBQ0Q7QUFoQmtEO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBaUJuRCw2Q0FDS3NELFVBREw7QUFFRTBFLFFBQUFBLFFBQVEsRUFBRU07QUFGWjtBQUlEOzs7V0FFRCwrQkFBc0JOLFFBQXRCLEVBQWdDN0gsTUFBaEMsRUFBd0MwRCxNQUF4QyxFQUFnRDtBQUM5QyxVQUFNa0QsTUFBTSxHQUFHbEQsTUFBTSxDQUFDa0QsTUFBdEI7QUFDQSxVQUFJdUIsV0FBVyxHQUFHTixRQUFRLENBQUNPLEtBQVQsQ0FBZSxDQUFmLEVBQWtCeEIsTUFBTSxDQUFDNUgsTUFBekIsQ0FBbEI7QUFFQW1KLE1BQUFBLFdBQVcsR0FBR0EsV0FBVyxDQUFDdEosR0FBWixDQUFnQixVQUFDd0osSUFBRCxFQUFPdEosS0FBUCxFQUFpQjtBQUM3QyxZQUFNdkMsS0FBSyxHQUFHdUMsS0FBSyxLQUFLb0osV0FBVyxDQUFDbkosTUFBWixHQUFxQixDQUEvQixHQUFtQyxJQUFuQyxHQUEwQ3FKLElBQUksQ0FBQyxDQUFELENBQTVEO0FBQ0EsZUFBTyxDQUFDN0wsS0FBRCxFQUFRb0ssTUFBTSxDQUFDN0gsS0FBRCxDQUFkLENBQVA7QUFDRCxPQUhhLENBQWQ7QUFJQSxVQUFNdUosZ0JBQWdCLEdBQUcxQixNQUFNLENBQUN3QixLQUFQLENBQWFELFdBQVcsQ0FBQ25KLE1BQXpCLEVBQWlDNEgsTUFBTSxDQUFDNUgsTUFBeEMsQ0FBekI7O0FBRUEsVUFBSXNKLGdCQUFnQixDQUFDdEosTUFBakIsR0FBMEIsQ0FBOUIsRUFBaUM7QUFDL0IsWUFBTXdKLGNBQWMsR0FBR1gsUUFBUSxDQUFDaEosR0FBVCxDQUFhLFVBQUE0SixDQUFDO0FBQUEsaUJBQUlBLENBQUMsQ0FBQyxDQUFELENBQUw7QUFBQSxTQUFkLEVBQXdCZixNQUF4QixDQUErQixVQUFBZSxDQUFDO0FBQUEsaUJBQUksT0FBT0EsQ0FBUCxLQUFhLFFBQWpCO0FBQUEsU0FBaEMsQ0FBdkI7QUFDQSxZQUFNQyxRQUFRLEdBQUd6RSxJQUFJLENBQUN0QyxHQUFMLE9BQUFzQyxJQUFJLHNDQUFRdUUsY0FBUixVQUF3QnhJLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDaEIsTUFBUCxHQUFnQixDQUFqQixDQUE5QixHQUFyQjtBQUNBLFlBQU0ySixTQUFTLEdBQUdSLFdBQVcsQ0FBQ0EsV0FBVyxDQUFDbkosTUFBWixHQUFxQixDQUF0QixDQUFYLENBQW9DLENBQXBDLENBQWxCO0FBQ0EsWUFBTTRKLElBQUksR0FBRyxDQUFDRixRQUFRLEdBQUdDLFNBQVosS0FBMEJMLGdCQUFnQixDQUFDdEosTUFBakIsR0FBMEIsQ0FBcEQsQ0FBYjtBQUNBbUosUUFBQUEsV0FBVyxDQUFDQSxXQUFXLENBQUNuSixNQUFaLEdBQXFCLENBQXRCLENBQVgsQ0FBb0MsQ0FBcEMsSUFBeUMySixTQUFTLEdBQUdDLElBQXJEOztBQUwrQixvREFPTk4sZ0JBQWdCLENBQUM1QixPQUFqQixFQVBNO0FBQUE7O0FBQUE7QUFPL0IsaUVBQXFEO0FBQUE7QUFBQSxnQkFBekNtQyxDQUF5QztBQUFBLGdCQUF0Q2hKLEtBQXNDOztBQUNuRCxnQkFBTXJELEtBQUssR0FBR3FNLENBQUMsS0FBS1AsZ0JBQWdCLENBQUN0SixNQUFqQixHQUEwQixDQUFoQyxHQUFvQyxJQUFwQyxHQUEyQzJKLFNBQVMsR0FBSUMsSUFBSSxJQUFJQyxDQUFDLEdBQUcsQ0FBUixDQUExRTtBQUNBVixZQUFBQSxXQUFXLENBQUNwRCxJQUFaLENBQWlCLENBQUN2SSxLQUFELEVBQVFxRCxLQUFSLENBQWpCO0FBQ0Q7QUFWOEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdoQzs7QUFDRCw2Q0FDSzZELE1BREw7QUFFRW1FLFFBQUFBLFFBQVEsRUFBRU07QUFGWjtBQUlEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7Ozs7V0FDRSx5QkFBZ0I7QUFBQSxVQUNQekksT0FETyxHQUNJLEtBQUtGLE1BRFQsQ0FDUEUsT0FETztBQUVkLGFBQ0dBLE9BQU8sSUFDUmhCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjZSxPQUFkLEVBQXVCaUcsS0FBdkIsQ0FBNkIsVUFBQXRILENBQUMsRUFBSTtBQUNoQyxlQUFPNEMsT0FBTyxDQUFDNUMsQ0FBQyxDQUFDcEIsUUFBRixJQUFlb0IsQ0FBQyxDQUFDN0IsS0FBRixJQUFXNkIsQ0FBQyxDQUFDc0YsUUFBRixHQUFhLENBQUMsQ0FBekMsQ0FBZDtBQUNELE9BRkQsQ0FGRjtBQU1EO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0Usc0JBQWFtRixTQUFiLEVBQXdCO0FBQ3RCLFVBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkLGVBQU8sS0FBUDtBQUNEOztBQUNELGFBQU83SCxPQUFPLENBQUM2SCxTQUFTLENBQUNDLElBQVYsSUFBa0JELFNBQVMsQ0FBQ0MsSUFBVixDQUFlL0osTUFBbEMsQ0FBZDtBQUNEOzs7V0FFRCx5QkFBZ0I7QUFDZCxhQUFPLEtBQUt6QyxJQUFMLElBQWEsS0FBS3lNLGFBQUwsRUFBcEI7QUFDRDs7O1dBRUQsMkJBQWtCRCxJQUFsQixFQUF3QjtBQUN0QixhQUNHLEtBQUt4TSxJQUFMLElBQ0QsS0FBS3lNLGFBQUwsRUFEQyxJQUVELEtBQUtDLFlBQUwsQ0FBa0JGLElBQWxCLENBRkMsSUFHRCxPQUFPLEtBQUtHLFdBQVosS0FBNEIsVUFKOUI7QUFNRDs7O1dBRUQsdUJBQWM1RyxVQUFkLEVBQTBCRCxXQUExQixFQUF1Q2MsVUFBdkMsRUFBbUQ7QUFDakQsVUFBSWdHLEtBQUssQ0FBQ0MsT0FBTixDQUFjakcsVUFBVSxDQUFDMEUsUUFBekIsQ0FBSixFQUF3QztBQUN0QyxZQUFNUSxJQUFJLEdBQUcsSUFBSWdCLEdBQUosRUFBYjtBQUNBbEcsUUFBQUEsVUFBVSxDQUFDMEUsUUFBWCxDQUFvQmhELE9BQXBCLENBQTRCLGlCQUFZO0FBQUE7QUFBQSxjQUFWeUUsQ0FBVTtBQUFBLGNBQVBqTCxDQUFPOztBQUN0Q2dLLFVBQUFBLElBQUksQ0FBQ2tCLEdBQUwsQ0FBU0QsQ0FBVCxFQUFZLE9BQU9qTCxDQUFQLEtBQWEsUUFBYixHQUF3QiwwQkFBU0EsQ0FBVCxDQUF4QixHQUFzQ0EsQ0FBbEQ7QUFDRCxTQUZELEVBRnNDLENBTXRDOztBQUNBLFlBQU0wQixLQUFLLEdBQUd5Siw0QkFBV2xILFVBQVgsSUFDWHRDLE1BRFcsQ0FDSm1KLEtBQUssQ0FBQ00sSUFBTixDQUFXcEIsSUFBSSxDQUFDakQsSUFBTCxFQUFYLENBREksRUFFWG5GLEtBRlcsQ0FFTGtKLEtBQUssQ0FBQ00sSUFBTixDQUFXcEIsSUFBSSxDQUFDMUosTUFBTCxFQUFYLENBRkssRUFHWCtLLE9BSFcsQ0FHSEMsOEJBSEcsQ0FBZDs7QUFJQSxlQUFPNUosS0FBUDtBQUNEOztBQUVELGFBQU8sS0FBSzZKLGtCQUFMLENBQXdCdEgsVUFBeEIsRUFBb0NELFdBQXBDLEVBQWlEYyxVQUFVLENBQUN5RCxNQUFYLENBQWtCL0gsR0FBbEIsQ0FBc0JDLG9CQUF0QixDQUFqRCxDQUFQO0FBQ0Q7OztXQUVELCtCQUFzQm1CLEtBQXRCLEVBQTZCNEosWUFBN0IsRUFBMkM7QUFDekMsVUFBSUMsWUFBWSxHQUFHRCxZQUFZLElBQUl4TSxhQUFuQzs7QUFDQSxVQUFJLENBQUM0QyxLQUFMLEVBQVk7QUFDVixlQUFPO0FBQUEsaUJBQU02SixZQUFOO0FBQUEsU0FBUDtBQUNEOztBQUVELFVBQU1DLE9BQU8sR0FBRyxJQUFJVixHQUFKLEVBQWhCOztBQUVBLFVBQUlwSixLQUFLLENBQUMrSixZQUFWLEVBQXdCO0FBQ3RCRixRQUFBQSxZQUFZLEdBQUc3SixLQUFLLENBQUMrSixZQUFyQjtBQUNEOztBQVZ3QyxrREFXUi9KLEtBQUssQ0FBQ2dLLFNBWEU7QUFBQTs7QUFBQTtBQVd6QywrREFBa0Q7QUFBQTtBQUFBLGNBQXRDek4sS0FBc0MsZ0JBQXRDQSxLQUFzQztBQUFBLGNBQS9CME4sU0FBK0IsZ0JBQS9CQSxTQUErQjs7QUFDaEQsY0FBSUEsU0FBSixFQUFlO0FBQ2JILFlBQUFBLE9BQU8sQ0FBQ1IsR0FBUixDQUFZL00sS0FBWixFQUFtQjBOLFNBQW5CO0FBQ0Q7QUFDRixTQWZ3QyxDQWlCekM7O0FBakJ5QztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQWtCekMsVUFBTW5LLEtBQUssR0FBRyw2QkFDWEMsTUFEVyxDQUNKbUosS0FBSyxDQUFDTSxJQUFOLENBQVdNLE9BQU8sQ0FBQzNFLElBQVIsRUFBWCxDQURJLEVBRVhuRixLQUZXLENBRUxrSixLQUFLLENBQUNNLElBQU4sQ0FBV00sT0FBTyxDQUFDcEwsTUFBUixFQUFYLENBRkssRUFHWCtLLE9BSFcsQ0FHSEksWUFIRyxDQUFkO0FBSUEsYUFBTy9KLEtBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0Usc0NBQTJFO0FBQUE7O0FBQUEscUNBQXBEb0ssWUFBb0Q7QUFBQSxVQUFwREEsWUFBb0QsbUNBQXJDck0sbUJBQXFDO0FBQUEsVUFBaEJ5RyxhQUFnQixTQUFoQkEsYUFBZ0I7QUFDekUsVUFBTTZGLGtCQUFrQixHQUFHLEVBQTNCLENBRHlFLENBR3pFOztBQUNBMUwsTUFBQUEsTUFBTSxDQUFDMEcsSUFBUCxDQUFZLEtBQUsvQixjQUFqQixFQUFpQ3dCLE9BQWpDLENBQXlDLFVBQUFRLE9BQU8sRUFBSTtBQUFBLG9DQWE5QyxNQUFJLENBQUNoQyxjQUFMLENBQW9CZ0MsT0FBcEIsQ0FiOEM7QUFBQSxZQUVoRG5ILEtBRmdELHlCQUVoREEsS0FGZ0Q7QUFBQSxZQUdoRG1NLEtBSGdELHlCQUdoREEsS0FIZ0Q7QUFBQSxZQUloRHRLLEtBSmdELHlCQUloREEsS0FKZ0Q7QUFBQSxZQUtoREMsTUFMZ0QseUJBS2hEQSxNQUxnRDtBQUFBLFlBTWhEQyxLQU5nRCx5QkFNaERBLEtBTmdEO0FBQUEsWUFPaERxSyxRQVBnRCx5QkFPaERBLFFBUGdEO0FBQUEsWUFRaERoSyxZQVJnRCx5QkFRaERBLFlBUmdEO0FBQUEsWUFTaERpSyxpQkFUZ0QseUJBU2hEQSxpQkFUZ0Q7QUFBQSxZQVVoRG5LLFNBVmdELHlCQVVoREEsU0FWZ0Q7QUFBQSxZQVdoREYsZ0JBWGdELHlCQVdoREEsZ0JBWGdEO0FBQUEsWUFZaERzSyxXQVpnRCx5QkFZaERBLFdBWmdEO0FBZWxELFlBQU1DLGNBQWMsR0FBR3hKLE9BQU8sQ0FDNUIsQ0FBQ2xCLEtBQUssSUFBSUcsZ0JBQWdCLEtBQUtDLGdDQUFldUssUUFBOUMsS0FBMkQsTUFBSSxDQUFDbEwsTUFBTCxDQUFZdEIsS0FBWixDQUQvQixDQUE5Qjs7QUFJQSxZQUFJdU0sY0FBSixFQUFvQjtBQUNsQixjQUFNRSxJQUFJLEdBQUcsQ0FBQyxNQUFJLENBQUNuTCxNQUFMLENBQVlPLEtBQVosQ0FBRCxFQUFxQixNQUFJLENBQUNQLE1BQUwsQ0FBWVEsTUFBWixDQUFyQixFQUEwQyxNQUFJLENBQUNSLE1BQUwsQ0FBWXNELFNBQVosQ0FBc0I3QyxLQUF0QixDQUExQyxDQUFiO0FBQ0EsY0FBTTJLLE9BQU8sR0FBR1AsS0FBSyxJQUFJLE1BQUksQ0FBQzdLLE1BQUwsQ0FBWXNELFNBQVosQ0FBc0J1SCxLQUF0QixDQUF6QixDQUZrQixDQUdsQjtBQUNBOztBQUNBLGNBQU1RLFdBQVcsR0FBRyxNQUFJLENBQUNyTCxNQUFMLENBQVl0QixLQUFaLENBQXBCO0FBQ0EsY0FBTTRNLGdCQUFnQixHQUFHLE1BQUksQ0FBQ3RMLE1BQUwsQ0FBWXNELFNBQVosQ0FBc0IwSCxXQUF0QixDQUF6QjtBQUVBLGNBQU1PLGFBQWEsR0FDakI3SyxnQkFBZ0IsS0FBS0MsZ0NBQWV1SyxRQUFwQyxHQUNJdE0sYUFESixHQUVJOEIsZ0JBQWdCLEtBQUtDLGdDQUFlTixLQUFwQyxHQUNBLE1BQUksQ0FBQ21MLGFBQUwsT0FBQSxNQUFJLEVBQWtCTCxJQUFsQixDQURKLEdBRUF6SyxnQkFBZ0IsS0FBS0MsZ0NBQWU4SyxZQUFwQyxHQUNBLE1BQUksQ0FBQ0MscUJBQUwsQ0FDRSxNQUFJLENBQUMxTCxNQUFMLENBQVlzRCxTQUFaLENBQXNCN0MsS0FBdEIsQ0FERixFQUVFLE1BQUksQ0FBQ1QsTUFBTCxDQUFZc0QsU0FBWixDQUFzQnFJLGdCQUZ4QixDQURBLEdBS0EsTUFBSSxDQUFDdkIsa0JBQUwsT0FBQSxNQUFJLEVBQXVCZSxJQUF2QixTQUE2QkMsT0FBN0IsR0FWVjs7QUFZQVIsVUFBQUEsa0JBQWtCLENBQUNFLFFBQUQsQ0FBbEIsR0FBK0IsVUFBQXRNLENBQUM7QUFBQSxtQkFDOUIsTUFBSSxDQUFDb04sc0JBQUwsQ0FDRUwsYUFERixFQUVFWixZQUFZLENBQUM1RixhQUFELENBQVosQ0FBNEJ2RyxDQUE1QixDQUZGLEVBR0U2TSxXQUhGLEVBSUVDLGdCQUpGLEVBS0UxSyxTQUxGLENBRDhCO0FBQUEsV0FBaEM7QUFRRCxTQTVCRCxNQTRCTyxJQUFJLE9BQU9tSyxpQkFBUCxLQUE2QixVQUFqQyxFQUE2QztBQUNsREgsVUFBQUEsa0JBQWtCLENBQUNFLFFBQUQsQ0FBbEIsR0FBK0JDLGlCQUFpQixDQUFDLE1BQUksQ0FBQy9LLE1BQU4sQ0FBaEQ7QUFDRCxTQUZNLE1BRUE7QUFDTDRLLFVBQUFBLGtCQUFrQixDQUFDRSxRQUFELENBQWxCLEdBQ0UsT0FBT2hLLFlBQVAsS0FBd0IsVUFBeEIsR0FBcUNBLFlBQVksQ0FBQyxNQUFJLENBQUNkLE1BQU4sQ0FBakQsR0FBaUVjLFlBRG5FO0FBRUQ7O0FBRUQsWUFBSSxFQUFFZ0ssUUFBUSxJQUFJRixrQkFBZCxDQUFKLEVBQXVDO0FBQ3JDaUIsMEJBQVFDLElBQVIsbURBQXdEaEIsUUFBUSxJQUFJakYsT0FBcEU7QUFDRDtBQUNGLE9BekREO0FBMkRBLGFBQU8rRSxrQkFBUDtBQUNEOzs7V0FFRCw0QkFBbUJySyxLQUFuQixFQUEwQkMsTUFBMUIsRUFBa0NDLEtBQWxDLEVBQXlDb0ssS0FBekMsRUFBZ0Q7QUFDOUMsVUFBSXRLLEtBQUssS0FBS3dDLDZCQUFZZ0osT0FBMUIsRUFBbUM7QUFDakM7QUFDQSxlQUFPL0IsNEJBQVd6SixLQUFYLElBQ0pDLE1BREksQ0FDR0EsTUFBTSxDQUFDb0ksS0FBUCxDQUFhLENBQWIsRUFBZ0JuSSxLQUFLLENBQUNqQixNQUF0QixDQURILEVBRUppQixLQUZJLENBRUVBLEtBRkYsRUFHSnlKLE9BSEksQ0FHSUMsOEJBSEosQ0FBUDtBQUlELE9BUDZDLENBUzlDO0FBQ0E7OztBQUNBLFVBQU02QixnQkFBZ0IsR0FBR3hMLE1BQU0sSUFBS0EsTUFBTSxDQUFDLENBQUQsQ0FBTixLQUFjLENBQWQsSUFBbUJBLE1BQU0sQ0FBQyxDQUFELENBQU4sS0FBY3lMLFFBQXJFO0FBQ0EsVUFBTUMsWUFBWSxHQUFHbEMsNEJBQVdhLEtBQUssR0FBRyxRQUFILEdBQWN0SyxLQUE5QixDQUFyQixDQVo4QyxDQWE5Qzs7QUFDQSxVQUFJNEwsTUFBTSxHQUFHRCxZQUFZLEVBQXpCOztBQUNBLFVBQUkxTCxNQUFNLElBQUksQ0FBQ3dMLGdCQUFmLEVBQWlDO0FBQy9CRyxRQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQzNMLE1BQVAsQ0FBY0EsTUFBZCxDQUFUO0FBQ0Q7O0FBQ0QsYUFBTzJMLE1BQU0sQ0FBQzFMLEtBQVAsQ0FBYW9LLEtBQUssR0FBR3JLLE1BQUgsR0FBWUMsS0FBOUIsQ0FBUDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UseUJBQWdCc0UsYUFBaEIsRUFBK0JxSCxXQUEvQixFQUE0QztBQUMxQztBQUNBO0FBQ0EsVUFBTUMsVUFBVSxHQUNkdEgsYUFBYSxDQUFDdUgsT0FBZCxLQUEwQnhPLGVBQTFCLEdBQ0ksdUNBQWNpSCxhQUFkLEVBQTZCakgsZUFBN0IsQ0FESixHQUVJaUgsYUFITjtBQUtBLFVBQU13SCxNQUFNLEdBQUdGLFVBQVUsQ0FBQ0csUUFBWCxDQUFvQkosV0FBcEIsQ0FBZjtBQUVBLFVBQU1LLFNBQVMsR0FBRyxnQ0FBZ0JGLE1BQWhCLEVBQXdCLENBQXhCLEVBQTJCLENBQUMsQ0FBQyxFQUFGLEVBQU0sRUFBTixDQUEzQixDQUFsQjtBQUNBLFVBQU1HLFNBQVMsR0FBRyxnQ0FBZ0JILE1BQWhCLEVBQXdCLENBQXhCLEVBQTJCLENBQUMsQ0FBQyxHQUFGLEVBQU8sR0FBUCxDQUEzQixDQUFsQjs7QUFFQSxVQUFJLENBQUNFLFNBQUQsSUFBYyxDQUFDQyxTQUFuQixFQUE4QjtBQUM1QixlQUFPLElBQVA7QUFDRDs7QUFFRCxhQUFPLENBQUNBLFNBQVMsQ0FBQyxDQUFELENBQVYsRUFBZUQsU0FBUyxDQUFDLENBQUQsQ0FBeEIsRUFBNkJDLFNBQVMsQ0FBQyxDQUFELENBQXRDLEVBQTJDRCxTQUFTLENBQUMsQ0FBRCxDQUFwRCxDQUFQO0FBQ0Q7OztXQUVELDRCQUFtQkUsa0JBQW5CLEVBQXVDO0FBQ3JDLFVBQU1DLGNBQWMsR0FBRyxxQ0FBbUJELGtCQUFuQixFQUF1QyxLQUFLRSxzQkFBNUMsQ0FBdkI7QUFDQSxXQUFLQSxzQkFBTCxHQUE4QkYsa0JBQTlCO0FBRUEsYUFBT0MsY0FBUDtBQUNEOzs7V0FFRCxnQ0FDRXJNLEtBREYsRUFFRWdKLElBRkYsRUFHRTdLLEtBSEYsRUFJRTtBQUNBb08sSUFBQUEsWUFMRixFQVFFO0FBQUEsVUFGQWxNLFNBRUEsdUVBRllDLCtCQUVaO0FBQUEsVUFEQWtNLFFBQ0EsdUVBRFd0TyxvQkFDWDtBQUFBLFVBQ08xQixJQURQLEdBQ2UyQixLQURmLENBQ08zQixJQURQO0FBRUEsVUFBTUMsS0FBSyxHQUFHK1AsUUFBUSxDQUFDck8sS0FBRCxFQUFRNkssSUFBUixDQUF0Qjs7QUFFQSxVQUFJLENBQUMsbUNBQW1Cdk0sS0FBbkIsQ0FBTCxFQUFnQztBQUM5QixlQUFPNEQsU0FBUDtBQUNEOztBQUVELFVBQUlvTSxjQUFKOztBQUNBLFVBQUlqUSxJQUFJLEtBQUtrUSxpQ0FBZ0JDLFNBQTdCLEVBQXdDO0FBQ3RDO0FBQ0E7QUFDQUYsUUFBQUEsY0FBYyxHQUFHek0sS0FBSyxDQUFDLElBQUk0TSxJQUFKLENBQVNuUSxLQUFULENBQUQsQ0FBdEI7QUFDRCxPQUpELE1BSU87QUFDTGdRLFFBQUFBLGNBQWMsR0FBR3pNLEtBQUssQ0FBQ3ZELEtBQUQsQ0FBdEI7QUFDRDs7QUFFRCxVQUFJLENBQUMsbUNBQW1CZ1EsY0FBbkIsQ0FBTCxFQUF5QztBQUN2Q0EsUUFBQUEsY0FBYyxHQUFHcE0sU0FBakI7QUFDRDs7QUFFRCxhQUFPb00sY0FBUDtBQUNEOzs7V0FFRCxvQkFBV25OLElBQVgsRUFBaUI7QUFDZixXQUFLQSxJQUFMLG1DQUFnQixLQUFLQSxJQUFyQixHQUE4QkEsSUFBOUI7QUFDRDs7O1dBRUQsc0NBQW9EO0FBQUEsVUFBN0JnRixhQUE2QixTQUE3QkEsYUFBNkI7QUFBQSxVQUFkakYsRUFBYyxTQUFkQSxFQUFjO0FBQUEsVUFBVndOLE9BQVUsU0FBVkEsT0FBVTtBQUFBLFVBQzNDbE4sT0FEMkMsR0FDaEMsS0FBS0YsTUFEMkIsQ0FDM0NFLE9BRDJDO0FBR2xEO0FBQ0VtTixRQUFBQSxPQUFPLEVBQUU7QUFBQ0MsVUFBQUEsU0FBUyxFQUFFMU4sRUFBWjtBQUFnQndOLFVBQUFBLE9BQU8sRUFBUEEsT0FBaEI7QUFBeUJsTixVQUFBQSxPQUFPLEVBQVBBLE9BQXpCO0FBQWtDMkUsVUFBQUEsYUFBYSxFQUFiQTtBQUFsQyxTQURYO0FBRUUwSSxRQUFBQSxPQUFPLEVBQUU7QUFBQ0QsVUFBQUEsU0FBUyxFQUFFMU4sRUFBWjtBQUFnQndOLFVBQUFBLE9BQU8sRUFBUEEsT0FBaEI7QUFBeUJsTixVQUFBQSxPQUFPLEVBQVBBO0FBQXpCO0FBRlgsU0FHSyxDQUFDLEtBQUtGLE1BQUwsQ0FBWXVELFNBQVosSUFBeUIsRUFBMUIsRUFBOEJrRCxNQUE5QixDQUNELFVBQUNDLElBQUQsRUFBTzhHLEVBQVAsRUFBV25FLENBQVg7QUFBQSwrQ0FDSzNDLElBREwsMkVBRTJCMkMsQ0FGM0IsR0FFaUNtRSxFQUFFLENBQUM5TyxLQUFILEdBQVc4TyxFQUFFLENBQUM5TyxLQUFILENBQVNzRixJQUFwQixHQUEyQixJQUY1RDtBQUFBLE9BREMsRUFLRCxFQUxDLENBSEw7QUFXRDs7O1dBRUQsb0JBQVdZLFFBQVgsRUFBcUI2SSxZQUFyQixFQUFtQztBQUNqQyxVQUFJLENBQUMsS0FBS3pOLE1BQUwsQ0FBWStCLE1BQWpCLEVBQXlCO0FBQ3ZCLGVBQU8sRUFBUDtBQUNEOztBQUNELFVBQU0yTCxZQUFZLEdBQUc5SSxRQUFRLENBQUMsS0FBSzVFLE1BQUwsQ0FBWStCLE1BQWIsQ0FBN0I7QUFKaUMsVUFLMUJnRCxhQUwwQixHQUtUMkksWUFMUyxDQUsxQjNJLGFBTDBCO0FBT2pDLFdBQUs0SSx5QkFBTCxDQUErQkQsWUFBL0I7QUFFQSxVQUFNdEIsV0FBVyxHQUFHLEtBQUt3QixtQkFBTCxDQUF5QjdJLGFBQXpCLENBQXBCO0FBQ0EsVUFBTTRILGtCQUFrQixHQUFHLEtBQUtrQixxQkFBTCxDQUEyQkgsWUFBM0IsQ0FBM0I7QUFDQSxVQUFNZCxjQUFjLEdBQUcsS0FBS2tCLGtCQUFMLENBQXdCbkIsa0JBQXhCLENBQXZCOztBQUVBLFVBQUlDLGNBQWMsQ0FBQ1csT0FBbkIsRUFBNEI7QUFDMUIsYUFBS1EsZUFBTCxDQUFxQmhKLGFBQXJCLEVBQW9DcUgsV0FBcEM7QUFDRDs7QUFFRCxVQUFJN0MsSUFBSSxHQUFHLEVBQVg7O0FBRUEsVUFBSSxDQUFDcUQsY0FBYyxDQUFDUyxPQUFoQixJQUEyQkksWUFBM0IsSUFBMkNBLFlBQVksQ0FBQ2xFLElBQTVELEVBQWtFO0FBQ2hFO0FBQ0FBLFFBQUFBLElBQUksR0FBR2tFLFlBQVksQ0FBQ2xFLElBQXBCO0FBQ0QsT0FIRCxNQUdPO0FBQ0xBLFFBQUFBLElBQUksR0FBRyxLQUFLeUUsc0JBQUwsQ0FBNEJOLFlBQTVCLEVBQTBDdEIsV0FBMUMsQ0FBUDtBQUNEOztBQUVELGFBQU87QUFBQzdDLFFBQUFBLElBQUksRUFBSkEsSUFBRDtBQUFPcUQsUUFBQUEsY0FBYyxFQUFkQTtBQUFQLE9BQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7V0FDRSxtQ0FBMEJxQixPQUExQixFQUFtQztBQUFBOztBQUFBO0FBQUEsWUFDckJ2UCxLQURxQixzQkFDckJBLEtBRHFCO0FBRS9CLFlBQU13UCxRQUFRLEdBQUcsTUFBSSxDQUFDbE8sTUFBTCxDQUFZdEIsS0FBWixDQUFqQjs7QUFDQSxZQUFJLENBQUN3UCxRQUFMLEVBQWU7QUFDYjtBQUFBO0FBQUE7QUFDRDs7QUFDRCxZQUFNQyxlQUFlLEdBQUdGLE9BQU8sQ0FBQ3RNLE1BQVIsQ0FBZXlHLElBQWYsQ0FBb0IsVUFBQWdHLEVBQUU7QUFBQSxpQkFBSUEsRUFBRSxDQUFDcEssSUFBSCxLQUFZa0ssUUFBUSxDQUFDbEssSUFBekI7QUFBQSxTQUF0QixLQUF3RCxJQUFoRjs7QUFDQSxRQUFBLE1BQUksQ0FBQzJCLGlCQUFMLHNDQUF5QmpILEtBQXpCLEVBQWlDeVAsZUFBakM7QUFQK0I7O0FBQ2pDLHdDQUFzQmpQLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEtBQUswRSxjQUFuQixDQUF0QixvQ0FBMEQ7QUFBQTs7QUFBQTtBQU96RDtBQUNGO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztXQUNFLDJCQUFrQmUsUUFBbEIsRUFBNEJ5SixTQUE1QixFQUF1QztBQUFBOztBQUNyQyxVQUFNQyxLQUFLLEdBQUcsS0FBS0MsVUFBTCxDQUFnQjNKLFFBQWhCLENBQWQ7O0FBQ0EsVUFBSSxDQUFDMEosS0FBTCxFQUFZO0FBQ1YsZUFBTyxJQUFQO0FBQ0Q7O0FBQ0RwUCxNQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLMEUsY0FBbkIsRUFBbUN3QixPQUFuQyxDQUEyQyxVQUFBUSxPQUFPLEVBQUk7QUFBQSxZQUM3Q3RGLEtBRDZDLEdBQ3BDc0YsT0FEb0MsQ0FDN0N0RixLQUQ2QztBQUVwRCxZQUFNaU8sU0FBUyxHQUFHLE1BQUksQ0FBQ3hPLE1BQUwsQ0FBWU8sS0FBWixDQUFsQixDQUZvRCxDQUdwRDtBQUNBOztBQUNBLFlBQUksQ0FBQzhOLFNBQUQsSUFBY0csU0FBUyxLQUFLekwsNkJBQVlnSixPQUE1QyxFQUFxRDtBQUFBLGNBQzVDdkwsTUFENEMsR0FDbENxRixPQURrQyxDQUM1Q3JGLE1BRDRDOztBQUVuRCxjQUFNaU8sYUFBYSxHQUFHLE1BQUksQ0FBQ0Msb0JBQUwsQ0FBMEJKLEtBQTFCLEVBQWlDekksT0FBakMsQ0FBdEI7O0FBQ0EsVUFBQSxNQUFJLENBQUNGLGlCQUFMLHNDQUF5Qm5GLE1BQXpCLEVBQWtDaU8sYUFBbEM7QUFDRDtBQUNGLE9BVkQ7QUFZQSxhQUFPLElBQVA7QUFDRDs7O1dBRUQsb0JBQVc3SixRQUFYLEVBQXFCO0FBQ25CLGFBQU8sS0FBSzVFLE1BQUwsQ0FBWStCLE1BQVosR0FBcUI2QyxRQUFRLENBQUMsS0FBSzVFLE1BQUwsQ0FBWStCLE1BQWIsQ0FBN0IsR0FBb0QsSUFBM0Q7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBOzs7O1dBQ0UsK0JBQXNCOEQsT0FBdEIsRUFBK0I7QUFDN0IsV0FBSzhJLGlCQUFMLENBQXVCOUksT0FBdkI7QUFDQSxXQUFLK0ksYUFBTCxDQUFtQi9JLE9BQW5CO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7Ozs7V0FDRSwyQkFBa0JBLE9BQWxCLEVBQTJCO0FBQ3pCLFVBQU1nSixhQUFhLEdBQUcsS0FBS2hMLGNBQUwsQ0FBb0JnQyxPQUFwQixDQUF0QjtBQUR5QixVQUVsQm5ILEtBRmtCLEdBRThCbVEsYUFGOUIsQ0FFbEJuUSxLQUZrQjtBQUFBLFVBRVhnQyxnQkFGVyxHQUU4Qm1PLGFBRjlCLENBRVhuTyxnQkFGVztBQUFBLFVBRU9vTyxtQkFGUCxHQUU4QkQsYUFGOUIsQ0FFT0MsbUJBRlA7O0FBSXpCLFVBQUksS0FBSzlPLE1BQUwsQ0FBWXRCLEtBQVosQ0FBSixFQUF3QjtBQUN0QjtBQUNBLFlBQU1xUSwwQkFBMEIsR0FDOUJELG1CQUFtQixJQUFJRSxnREFBK0J0TyxnQkFBL0IsQ0FEekI7O0FBR0EsWUFBSSxDQUFDcU8sMEJBQTBCLENBQUNoSixRQUEzQixDQUFvQyxLQUFLL0YsTUFBTCxDQUFZdEIsS0FBWixFQUFtQjNCLElBQXZELENBQUwsRUFBbUU7QUFDakU7QUFDQTtBQUNBLGVBQUs0SSxpQkFBTCxzQ0FBeUJqSCxLQUF6QixFQUFpQyxJQUFqQztBQUNEO0FBQ0Y7QUFDRjtBQUVEO0FBQ0Y7QUFDQTs7OztXQUNFLHVCQUFjbUgsT0FBZCxFQUF1QjtBQUNyQixVQUFNZ0osYUFBYSxHQUFHLEtBQUtoTCxjQUFMLENBQW9CZ0MsT0FBcEIsQ0FBdEI7QUFEcUIsVUFFZHRGLEtBRmMsR0FFTHNPLGFBRkssQ0FFZHRPLEtBRmM7O0FBR3JCLFVBQUksQ0FBQ0EsS0FBTCxFQUFZO0FBQ1Y7QUFDQTtBQUNEOztBQUNELFVBQU0wTyxZQUFZLEdBQUcsS0FBS0MsZUFBTCxDQUFxQnJKLE9BQXJCLENBQXJCLENBUHFCLENBUXJCO0FBQ0E7O0FBQ0EsVUFBSSxDQUFDb0osWUFBWSxDQUFDbEosUUFBYixDQUFzQixLQUFLL0YsTUFBTCxDQUFZTyxLQUFaLENBQXRCLENBQUwsRUFBZ0Q7QUFDOUMsYUFBS29GLGlCQUFMLHNDQUF5QnBGLEtBQXpCLEVBQWlDME8sWUFBWSxDQUFDLENBQUQsQ0FBN0M7QUFDRDtBQUNGO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OztXQUNFLHlCQUFnQnBKLE9BQWhCLEVBQXlCO0FBQ3ZCLFVBQU1nSixhQUFhLEdBQUcsS0FBS2hMLGNBQUwsQ0FBb0JnQyxPQUFwQixDQUF0QjtBQUR1QixVQUVoQm5ILEtBRmdCLEdBRWtCbVEsYUFGbEIsQ0FFaEJuUSxLQUZnQjtBQUFBLFVBRVQ2QixLQUZTLEdBRWtCc08sYUFGbEIsQ0FFVHRPLEtBRlM7QUFBQSxVQUVGRyxnQkFGRSxHQUVrQm1PLGFBRmxCLENBRUZuTyxnQkFGRTtBQUl2QixhQUFPLEtBQUtWLE1BQUwsQ0FBWXRCLEtBQVosSUFDSHlRLDRCQUFXLEtBQUtuUCxNQUFMLENBQVl0QixLQUFaLEVBQW1CM0IsSUFBOUIsRUFBb0N3RCxLQUFwQyxDQUEwQ0csZ0JBQTFDLENBREcsR0FFSCxDQUFDLEtBQUtULHFCQUFMLEdBQTZCTSxLQUE3QixDQUFELENBRko7QUFHRDs7O1dBRUQsa0NBQXlCME4sT0FBekIsRUFBa0NwSSxPQUFsQyxFQUEyQztBQUN6QyxVQUFNZ0osYUFBYSxHQUFHLEtBQUtoTCxjQUFMLENBQW9CZ0MsT0FBcEIsQ0FBdEI7QUFDQSxXQUFLQyxxQkFBTCxDQUEyQkQsT0FBM0IsRUFGeUMsQ0FHekM7O0FBQ0EsVUFBTTRJLGFBQWEsR0FBRyxLQUFLQyxvQkFBTCxDQUEwQlQsT0FBMUIsRUFBbUNZLGFBQW5DLENBQXRCO0FBQ0EsV0FBS2xKLGlCQUFMLHNDQUF5QmtKLGFBQWEsQ0FBQ3JPLE1BQXZDLEVBQWdEaU8sYUFBaEQ7QUFDRDs7O1dBRUQsMENBQWlDO0FBQUE7O0FBQy9CLFVBQU1XLGNBQWMsR0FBRyxFQUF2QjtBQUNBbFEsTUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWMsS0FBSzBFLGNBQW5CLEVBQW1Dd0IsT0FBbkMsQ0FBMkMsVUFBQXdKLGFBQWEsRUFBSTtBQUFBOztBQUMxRDtBQUQwRCxZQUVuRC9ELFFBRm1ELEdBRVcrRCxhQUZYLENBRW5EL0QsUUFGbUQ7QUFBQSxZQUV6Q3BNLEtBRnlDLEdBRVdtUSxhQUZYLENBRXpDblEsS0FGeUM7QUFBQSxZQUVsQzZCLEtBRmtDLEdBRVdzTyxhQUZYLENBRWxDdE8sS0FGa0M7QUFBQSxZQUUzQkMsTUFGMkIsR0FFV3FPLGFBRlgsQ0FFM0JyTyxNQUYyQjtBQUFBLFlBRW5CQyxLQUZtQixHQUVXb08sYUFGWCxDQUVuQnBPLEtBRm1CO0FBQUEsWUFFWkssWUFGWSxHQUVXK04sYUFGWCxDQUVaL04sWUFGWTtBQUFBLFlBRUUrSixLQUZGLEdBRVdnRSxhQUZYLENBRUVoRSxLQUZGO0FBSTFEdUUsUUFBQUEsY0FBYyxDQUFDdEUsUUFBRCxDQUFkLDBGQUNHcE0sS0FESCxFQUNXLE1BQUksQ0FBQ3NCLE1BQUwsQ0FBWXRCLEtBQVosQ0FEWCxxREFFRzZCLEtBRkgsRUFFVyxNQUFJLENBQUNQLE1BQUwsQ0FBWU8sS0FBWixDQUZYLHFEQUdHQyxNQUhILEVBR1ksTUFBSSxDQUFDUixNQUFMLENBQVlRLE1BQVosQ0FIWixxREFJR0MsS0FKSCxFQUlXLE1BQUksQ0FBQ1QsTUFBTCxDQUFZc0QsU0FBWixDQUFzQjdDLEtBQXRCLENBSlgscUVBS2dCLE9BQU9LLFlBQVAsS0FBd0IsVUFBeEIsR0FBcUNBLFlBQVksQ0FBQyxNQUFJLENBQUNkLE1BQU4sQ0FBakQsR0FBaUVjLFlBTGpGLHFCQU1NK0osS0FBSyx3Q0FBS0EsS0FBTCxFQUFhLE1BQUksQ0FBQzdLLE1BQUwsQ0FBWXNELFNBQVosQ0FBc0J1SCxLQUF0QixDQUFiLElBQTZDLEVBTnhEO0FBUUQsT0FaRDtBQWFBLGFBQU91RSxjQUFQO0FBQ0Q7OztXQUVELDhCQUFxQm5CLE9BQXJCLEVBQThCWSxhQUE5QixFQUE2QztBQUFBLFVBQ3BDdE8sS0FEb0MsR0FDM0JzTyxhQUQyQixDQUNwQ3RPLEtBRG9DO0FBRTNDLFVBQU03QixLQUFLLEdBQUcsS0FBS3NCLE1BQUwsQ0FBWTZPLGFBQWEsQ0FBQ25RLEtBQTFCLENBQWQ7O0FBQ0EsVUFBSSxDQUFDQSxLQUFELElBQVUsQ0FBQzZCLEtBQWYsRUFBc0I7QUFDcEI7QUFDQSxlQUFPeEMsYUFBUDtBQUNEOztBQUVELFVBQU15USxTQUFTLEdBQUcsS0FBS3hPLE1BQUwsQ0FBWU8sS0FBWixDQUFsQjtBQUNBLFVBQU04TyxZQUFZLEdBQUdwQixPQUFPLENBQUN0TSxNQUFSLENBQWV5RyxJQUFmLENBQW9CLFVBQUFrSCxDQUFDO0FBQUEsZUFBSUEsQ0FBQyxDQUFDdEwsSUFBRixLQUFXdEYsS0FBSyxDQUFDc0YsSUFBckI7QUFBQSxPQUFyQixDQUFyQjs7QUFDQSxVQUFJLENBQUN3SyxTQUFELElBQWMsQ0FBQ2EsWUFBbkIsRUFBaUM7QUFDL0I7QUFDQSxlQUFPdFIsYUFBUDtBQUNEOztBQUVELGFBQU9rUSxPQUFPLENBQUNzQixvQkFBUixDQUE2QkYsWUFBN0IsRUFBMkNiLFNBQTNDLEtBQXlEelEsYUFBaEU7QUFDRDs7O1dBRUQsMEJBQWlCeVIsVUFBakIsRUFBNkI7QUFDM0IsYUFBTyxLQUFLQyxjQUFMLENBQW9CRCxVQUFwQixLQUFtQ0EsVUFBVSxDQUFDMUssTUFBOUMsR0FBdUQwSyxVQUFVLENBQUMxSyxNQUFsRSxHQUEyRSxJQUFsRjtBQUNEOzs7V0FFRCx3QkFBZTBLLFVBQWYsRUFBMkI7QUFBQTs7QUFDekIsYUFBTyxDQUFBQSxVQUFVLFNBQVYsSUFBQUEsVUFBVSxXQUFWLFlBQUFBLFVBQVUsQ0FBRUUsTUFBWixLQUFzQixDQUFBRixVQUFVLFNBQVYsSUFBQUEsVUFBVSxXQUFWLGlDQUFBQSxVQUFVLENBQUVHLEtBQVosaUdBQW1CaFEsS0FBbkIsZ0ZBQTBCQyxFQUExQixNQUFpQyxLQUFLQSxFQUFuRTtBQUNEOzs7V0FFRCw4QkFBcUJnUSxRQUFyQixFQUErQjtBQUM3QixVQUFNQyxhQUFhLEdBQUczUSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLMEUsY0FBbkIsRUFBbUN1RSxJQUFuQyxDQUF3QyxVQUFBMEgsRUFBRTtBQUFBLGVBQUlBLEVBQUUsQ0FBQ3hQLFFBQUgsS0FBZ0IsUUFBcEI7QUFBQSxPQUExQyxDQUF0Qjs7QUFFQSxVQUFJLENBQUN1UCxhQUFMLEVBQW9CO0FBQ2xCLGVBQU8sQ0FBUDtBQUNEOztBQUVELFVBQU1uUixLQUFLLEdBQUdtUixhQUFhLENBQUNuUixLQUE1QjtBQVA2QixVQVF0QnFSLE1BUnNCLEdBUVosS0FBSy9QLE1BQUwsQ0FBWXNELFNBUkEsQ0FRdEJ5TSxNQVJzQixFQVU3Qjs7QUFDQSxhQUFPLENBQUMsS0FBSy9QLE1BQUwsQ0FBWXRCLEtBQVosSUFBcUIsQ0FBckIsR0FBeUJxUixNQUExQixJQUFvQyxLQUFLQyxhQUFMLENBQW1CSixRQUFuQixDQUEzQztBQUNEOzs7V0FFRCwwQkFBaUI7QUFDZixVQUFNQyxhQUFhLEdBQUczUSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLMEUsY0FBbkIsRUFBbUN1RSxJQUFuQyxDQUF3QyxVQUFBMEgsRUFBRTtBQUFBLGVBQUlBLEVBQUUsQ0FBQ3hQLFFBQUgsS0FBZ0IsUUFBcEI7QUFBQSxPQUExQyxDQUF0Qjs7QUFFQSxVQUFJLENBQUN1UCxhQUFELElBQWtCLEtBQUs3UCxNQUFMLENBQVk2UCxhQUFhLENBQUNuUixLQUExQixDQUF0QixFQUF3RDtBQUN0RCxlQUFPLENBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxlQUFPLEtBQUtzQixNQUFMLENBQVlzRCxTQUFaLENBQXNCeU0sTUFBN0I7QUFDRDtBQUNGOzs7V0FFRCw0QkFBbUI7QUFBQSwwQkFDMkIsS0FBSy9QLE1BRGhDO0FBQUEsVUFDVnFELFdBRFUsaUJBQ1ZBLFdBRFU7QUFBQSxVQUNHRCxTQURILGlCQUNHQSxTQURIO0FBQUEsVUFDY0UsU0FEZCxpQkFDY0EsU0FEZDtBQUFBLFVBRVYyTSxXQUZVLEdBRWEzTSxTQUZiLENBRVYyTSxXQUZVO0FBQUEsVUFFR0YsTUFGSCxHQUVhek0sU0FGYixDQUVHeU0sTUFGSDtBQUdqQixVQUFNclIsS0FBSyxHQUFHMkUsV0FBVyxJQUFJRCxTQUE3QjtBQUNBLGFBQU9xQixJQUFJLENBQUN5TCxJQUFMLENBQVd4UixLQUFLLElBQUl1UixXQUFULEdBQXVCQSxXQUFXLENBQUMsQ0FBRCxDQUFsQyxHQUF3Q0YsTUFBbkQsQ0FBUDtBQUNEOzs7V0FFRCxrQ0FBeUJwUSxLQUF6QixFQUFnQztBQUFBOztBQUM5QixhQUFPQSxLQUFLLENBQUNvSSxJQUFOLENBQVcsVUFBQTNCLENBQUM7QUFBQSxlQUFJLENBQUMsTUFBSSxDQUFDK0osMkJBQUwsQ0FBaUNwSyxRQUFqQyxDQUEwQ0ssQ0FBMUMsQ0FBTDtBQUFBLE9BQVosQ0FBUDtBQUNEOzs7V0FFRCxtQ0FBMEJnSyxpQkFBMUIsRUFBNkNDLGNBQTdDLEVBQTZEO0FBQUEsVUFDcERDLEtBRG9ELEdBQzNDRixpQkFEMkMsQ0FDcERFLEtBRG9EO0FBRzNELGFBQU87QUFDTDtBQUNBQyxRQUFBQSxhQUFhLEVBQUUsQ0FBQ0QsS0FBSyxDQUFDeE8sT0FGakI7QUFHTDBPLFFBQUFBLGNBQWMsRUFBRUYsS0FBSyxDQUFDdFEsTUFBTixDQUFhZSxJQUFiLEdBQW9CLElBSC9CO0FBSUxzUCxRQUFBQSxjQUFjLEVBQUVBLGNBQWMsSUFBSSxRQUo3QjtBQUtMSSxRQUFBQSxlQUFlLEVBQUVILEtBQUssQ0FBQ3hPO0FBTGxCLE9BQVA7QUFPRDs7O1dBRUQsMENBQTJFO0FBQUEsVUFBakQ0TyxHQUFpRCxVQUFqREEsR0FBaUQ7QUFBQSxVQUE1Q0MsU0FBNEMsVUFBNUNBLFNBQTRDO0FBQUEsVUFBakNmLFFBQWlDLFVBQWpDQSxRQUFpQztBQUFBLFVBQXZCZ0IsT0FBdUIsVUFBdkJBLE9BQXVCO0FBQUEsVUFBZEMsV0FBYyxVQUFkQSxXQUFjO0FBQ3pFLFVBQU1DLGtCQUFrQixHQUFHLHVDQUFzQkQsV0FBdEIsQ0FBM0I7QUFDQSw2Q0FDS0Msa0JBREw7QUFFRWxSLFFBQUFBLEVBQUUsRUFBRSxLQUFLQSxFQUZYO0FBR0U4USxRQUFBQSxHQUFHLEVBQUhBLEdBSEY7QUFJRUssUUFBQUEsZ0JBQWdCLEVBQUVDLHdCQUFrQkMsTUFKdEM7QUFLRUMsUUFBQUEsUUFBUSxFQUFFLEtBQUtDLGdCQUxqQjtBQU1FQyxRQUFBQSxhQUFhLEVBQUUsSUFOakI7QUFPRUMsUUFBQUEsVUFBVSxFQUFFO0FBQUNDLFVBQUFBLFNBQVMsRUFBRTdQLE9BQU8sQ0FBQ21PLFFBQVEsQ0FBQzJCLFVBQVQsSUFBdUIsS0FBS3ZSLE1BQUwsQ0FBWXNELFNBQVosQ0FBc0JrTyxRQUE5QztBQUFuQixTQVBkO0FBUUU3TyxRQUFBQSxNQUFNLEVBQUUsS0FBSzNDLE1BQUwsQ0FBWTJDLE1BUnRCO0FBU0VYLFFBQUFBLGdCQUFnQixFQUFFLEtBQUtoQyxNQUFMLENBQVlnQyxnQkFUaEM7QUFVRTtBQUNBeVAsUUFBQUEsT0FBTyxFQUFFLEtBQUt6UixNQUFMLENBQVlzRCxTQUFaLENBQXNCbU8sT0FYakM7QUFZRWhQLFFBQUFBLGNBQWMsRUFBRSxLQUFLekMsTUFBTCxDQUFZeUMsY0FaOUI7QUFhRTtBQUNBaVAsUUFBQUEsVUFBVSxHQUFHMVQsbUJBQUgsNkNBQTJCOFMsa0JBQWtCLENBQUNZLFVBQTlDLEVBZFo7QUFlRUMsUUFBQUEsV0FBVyxFQUFFaEIsU0FBUyxHQUFHQSxTQUFTLENBQUNnQixXQUFiLEdBQTJCQyxTQWZuRDtBQWdCRTtBQUNBaEIsUUFBQUEsT0FBTyxFQUFFLEtBQUs1USxNQUFMLENBQVl1QyxTQUFaLElBQXlCcU87QUFqQnBDO0FBbUJEOzs7V0FFRCxxQ0FBNEI7QUFDMUIsYUFBTztBQUNMaFIsUUFBQUEsRUFBRSxZQUFLLEtBQUtBLEVBQVYsYUFERztBQUVMc1IsUUFBQUEsUUFBUSxFQUFFLEtBRkw7QUFHTEUsUUFBQUEsYUFBYSxFQUFFLElBSFY7QUFJTEwsUUFBQUEsZ0JBQWdCLEVBQUVDLHdCQUFrQkM7QUFKL0IsT0FBUDtBQU1EOzs7V0FFRCxzQ0FFRVksVUFGRixFQUdFO0FBQUE7O0FBQUEsVUFGQ3pGLFdBRUQsVUFGQ0EsV0FFRDtBQUFBLFVBRmMwRixTQUVkLFVBRmNBLFNBRWQ7QUFBQSxVQUZ5QkMsV0FFekIsVUFGeUJBLFdBRXpCO0FBQUEsVUFGc0MzQyxjQUV0QyxVQUZzQ0EsY0FFdEM7QUFBQSxVQUZzRDRDLFdBRXRELFVBRnNEQSxXQUV0RDtBQUFBLFVBQ096SSxJQURQLEdBQ3lCc0ksVUFEekIsQ0FDT3RJLElBRFA7QUFBQSxVQUNhcUcsUUFEYixHQUN5QmlDLFVBRHpCLENBQ2FqQyxRQURiO0FBQUEsMEJBRXNDLEtBQUs1UCxNQUYzQztBQUFBLFVBRU91RCxTQUZQLGlCQUVPQSxTQUZQO0FBQUEsVUFFa0J2QixnQkFGbEIsaUJBRWtCQSxnQkFGbEIsRUFHQTs7QUFDQSxVQUFNMFAsVUFBVSxpREFBT00sV0FBVyxDQUFDTixVQUFuQixJQUErQnRULHdCQUEvQixFQUFoQjs7QUFFQSxVQUFJLENBQUNtTCxJQUFELElBQVMsQ0FBQ0EsSUFBSSxDQUFDMEksVUFBZixJQUE2QixDQUFDMUksSUFBSSxDQUFDMEksVUFBTCxDQUFnQixDQUFoQixDQUE5QixJQUFvRCxDQUFDMUksSUFBSSxDQUFDMEksVUFBTCxDQUFnQixDQUFoQixFQUFtQkMsT0FBNUUsRUFBcUY7QUFDbkYsZUFBTyxJQUFQO0FBQ0QsT0FSRCxDQVVBOzs7QUFDQSxVQUFNN0ksQ0FBQyxHQUFHLENBQVY7O0FBWEEsdURBYW9DOUYsU0FicEM7QUFBQSxVQWFPNE8sU0FiUDtBQUFBLFVBYWtCQyxjQWJsQjs7QUFBQSxVQWNPQyxTQWRQLEdBYzRFRixTQWQ1RSxDQWNPRSxTQWRQO0FBQUEsVUFja0JDLE1BZGxCLEdBYzRFSCxTQWQ1RSxDQWNrQkcsTUFkbEI7QUFBQSxVQWNpQ0MsUUFkakMsR0FjNEVKLFNBZDVFLENBYzBCOVIsS0FkMUI7QUFBQSxVQWMyQ21TLFlBZDNDLEdBYzRFTCxTQWQ1RSxDQWMyQ0ssWUFkM0M7QUFBQSxVQWMrRHRQLFNBZC9ELEdBYzRFaVAsU0FkNUUsQ0FjeURwUixJQWR6RDs7QUFBQSxtQkFtQklxUixjQUFjLElBQUksRUFuQnRCO0FBQUEsVUFnQlNLLGlCQWhCVCxVQWdCRXBTLEtBaEJGO0FBQUEsVUFpQmdCcVMscUJBakJoQixVQWlCRUYsWUFqQkY7QUFBQSxVQWtCUUcsa0JBbEJSLFVBa0JFNVIsSUFsQkY7O0FBcUJBLGFBQU8sQ0FDTCxJQUFJNlIsZ0NBQUosK0NBQ0taLFdBREw7QUFFRXBTLFFBQUFBLEVBQUUsWUFBSyxLQUFLQSxFQUFWLFdBRko7QUFHRTJKLFFBQUFBLElBQUksRUFBRUEsSUFBSSxDQUFDQSxJQUhiO0FBSUV2SCxRQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUpGO0FBS0U2USxRQUFBQSxZQUFZLEVBQUUsTUFMaEI7QUFPRW5CLFFBQUFBLFVBQVUsRUFBVkEsVUFQRjtBQVFFb0IsUUFBQUEsZ0JBQWdCLEVBQUUsSUFScEI7QUFTRUMsUUFBQUEsY0FBYyxZQUFLLEtBQUtuVCxFQUFWLFlBVGhCO0FBV0VzUyxRQUFBQSxPQUFPLEVBQUUzSSxJQUFJLENBQUMwSSxVQUFMLENBQWdCLENBQWhCLEVBQW1CQyxPQVg5QjtBQVlFSyxRQUFBQSxRQUFRLEVBQVJBLFFBWkY7QUFhRXJQLFFBQUFBLFNBQVMsRUFBVEEsU0FiRjtBQWNFc1AsUUFBQUEsWUFBWSxFQUFaQTtBQWRGLFNBZ0JNSixjQUFjLElBQUk7QUFDcEJZLFFBQUFBLGdCQUFnQixFQUFFekosSUFBSSxDQUFDMEksVUFBTCxDQUFnQixDQUFoQixFQUFtQkMsT0FEakI7QUFFcEJPLFFBQUFBLGlCQUFpQixFQUFqQkEsaUJBRm9CO0FBR3BCRSxRQUFBQSxrQkFBa0IsRUFBbEJBLGtCQUhvQjtBQUlwQkQsUUFBQUEscUJBQXFCLEVBQXJCQTtBQUpvQixPQWhCeEI7QUF1QkU7QUFDQXRHLFFBQUFBLFdBQVcsRUFBWEEsV0F4QkY7QUF5QkUwRixRQUFBQSxTQUFTLEVBQVRBLFNBekJGO0FBMEJFQyxRQUFBQSxXQUFXLEVBQVhBLFdBMUJGO0FBMkJFa0IsUUFBQUEsYUFBYSxFQUFFWCxNQTNCakI7QUE0QkVZLFFBQUFBLG9CQUFvQixFQUFFYixTQTVCeEI7QUE4QkU7QUFDQWMsUUFBQUEsVUFBVSxFQUFFLGFBL0JkO0FBZ0NFQyxRQUFBQSxZQUFZLEVBQUU7QUFBQ0MsVUFBQUEsR0FBRyxFQUFFO0FBQU4sU0FoQ2hCO0FBaUNFQyxRQUFBQSxVQUFVLEVBQUUsR0FqQ2Q7QUFrQ0VDLFFBQUFBLFlBQVksRUFBRSxDQWxDaEI7QUFtQ0VsQyxRQUFBQSxVQUFVLEVBQUU7QUFDVjtBQUNBQyxVQUFBQSxTQUFTLEVBQUU7QUFGRCxTQW5DZDtBQXdDRXhVLFFBQUFBLGNBQWMsRUFBRXlNLElBQUksQ0FBQ3pNLGNBeEN2QjtBQXlDRXNTLFFBQUFBLGNBQWMsa0NBQ1RBLGNBRFM7QUFFWjhDLFVBQUFBLE9BQU8sd0JBQUUzTyxTQUFTLENBQUM4RixDQUFELENBQVQsQ0FBYTNLLEtBQWYsdURBQUUsbUJBQW9Cc0YsSUFGakI7QUFHWndQLFVBQUFBLGNBQWMsZ0RBQ1RwRSxjQUFjLENBQUNvRSxjQUROLEdBRVRwRSxjQUFjLENBQUMwQyxTQUZOO0FBR1pRLFlBQUFBLE1BQU0sRUFBRUgsU0FBUyxDQUFDRyxNQUhOO0FBSVpELFlBQUFBLFNBQVMsRUFBRUYsU0FBUyxDQUFDRTtBQUpULFlBSEY7QUFTWlksVUFBQUEsYUFBYSxFQUFFZCxTQUFTLENBQUNHLE1BVGI7QUFVWlksVUFBQUEsb0JBQW9CLEVBQUVmLFNBQVMsQ0FBQ0UsU0FWcEI7QUFXWkUsVUFBQUEsUUFBUSxFQUFFaFAsU0FBUyxDQUFDOEYsQ0FBRCxDQUFULENBQWFoSjtBQVhYO0FBekNoQixTQURLLENBQVA7QUF5REQ7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7V0FDRSxxQ0FBNEJvVCxlQUE1QixFQUEwRDtBQUFBLFVBQWJDLElBQWEsdUVBQU4sSUFBTTtBQUN4RCxVQUFNQyxXQUFXLEdBQUcsS0FBS0MsZ0JBQUwsRUFBcEI7QUFFQSxhQUFPLFVBQUFwVixDQUFDLEVBQUk7QUFDVixZQUFNcVYsU0FBUyxHQUNaLE9BQU9KLGVBQVAsS0FBMkIsVUFBNUIsR0FBMENBLGVBQWUsQ0FBQ2pWLENBQUQsQ0FBekQsR0FBK0RpVixlQURqRTtBQUVBLFlBQU1LLE1BQU0sR0FBR3JTLE9BQU8sQ0FBQ29TLFNBQUQsQ0FBdEI7QUFDQUgsUUFBQUEsSUFBSSxHQUFHSSxNQUFNLEdBQUdKLElBQUgsR0FBVSxJQUF2QjtBQUNBLFlBQU1LLEdBQUcsR0FBR0QsTUFBTSxHQUFHRCxTQUFILEdBQWVoVyxhQUFqQztBQUNBLGVBQU87QUFDTCtCLFVBQUFBLEVBQUUsWUFBS21VLEdBQUwsZUFBYUosV0FBYixjQUE0QkQsSUFBSSxHQUFHLEdBQUgsR0FBUyxHQUF6QyxDQURHO0FBRUxLLFVBQUFBLEdBQUcsRUFBSEEsR0FGSztBQUdMQyxVQUFBQSxLQUFLLEVBQUVMLFdBSEY7QUFJTE0sVUFBQUEsTUFBTSxFQUFFTixXQUpIO0FBS0xELFVBQUFBLElBQUksRUFBSkE7QUFMSyxTQUFQO0FBT0QsT0FiRDtBQWNEOzs7V0FFRCxnQ0FBdUJRLFdBQXZCLEVBQW9DOUgsV0FBcEMsRUFBaUQ7QUFDL0M7QUFDQSxhQUFPLEVBQVA7QUFDRDs7O1dBRUQseUJBQWdCckgsYUFBaEIsRUFBK0JxSCxXQUEvQixFQUE0QyxDQUMxQztBQUNEOzs7V0FFRCw2QkFBb0JySCxhQUFwQixFQUFtQztBQUNqQztBQUNBLGFBQU87QUFBQSxlQUFNLElBQU47QUFBQSxPQUFQO0FBQ0Q7OztXQWpxQ0QsK0JBQTZCa0osT0FBN0IsRUFBc0NrRyxXQUF0QyxFQUFtRDtBQUNqRCxhQUFPO0FBQUN4VSxRQUFBQSxLQUFLLEVBQUUsRUFBUjtBQUFZd1UsUUFBQUEsV0FBVyxFQUFYQTtBQUFaLE9BQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7V0FDRSxnQ0FBOEJDLGFBQTlCLEVBQTZDQyxTQUE3QyxFQUF3RDtBQUN0RDtBQUNBLFVBQU1DLGVBQWUsR0FBR3BWLE1BQU0sQ0FBQzBHLElBQVAsQ0FBWXdPLGFBQVosRUFBMkIzTixNQUEzQixDQUFrQyxVQUFDOE4sSUFBRCxFQUFPblgsR0FBUCxFQUFlO0FBQ3ZFLFlBQU1vWCxjQUFjLEdBQUdILFNBQVMsQ0FBQ25NLE1BQVYsQ0FDckIsVUFBQW9ILENBQUM7QUFBQSxpQkFBSUEsQ0FBQyxDQUFDdEwsSUFBRixLQUFXb1EsYUFBYSxDQUFDaFgsR0FBRCxDQUF4QixJQUFpQ2dYLGFBQWEsQ0FBQ2hYLEdBQUQsQ0FBYixDQUFtQjJJLFFBQW5CLENBQTRCdUosQ0FBQyxDQUFDdEwsSUFBOUIsQ0FBckM7QUFBQSxTQURvQixDQUF2QjtBQUlBdVEsUUFBQUEsSUFBSSxDQUFDblgsR0FBRCxDQUFKLEdBQVlvWCxjQUFjLENBQUNoVixNQUFmLEdBQ1JnVixjQUFjLENBQUNuVixHQUFmLENBQW1CLFVBQUFpUSxDQUFDO0FBQUEsaUJBQUs7QUFDdkJ0UyxZQUFBQSxLQUFLLEVBQUVzUyxDQUFDLENBQUN0TCxJQURjO0FBRXZCRyxZQUFBQSxRQUFRLEVBQUVtTCxDQUFDLENBQUNuTDtBQUZXLFdBQUw7QUFBQSxTQUFwQixDQURRLEdBS1IsSUFMSjtBQU1BLGVBQU9vUSxJQUFQO0FBQ0QsT0FadUIsRUFZckIsRUFacUIsQ0FBeEI7O0FBY0EsVUFBSSxDQUFDclYsTUFBTSxDQUFDQyxNQUFQLENBQWNtVixlQUFkLEVBQStCbk8sS0FBL0IsQ0FBcUMxRSxPQUFyQyxDQUFMLEVBQW9EO0FBQ2xEO0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQsYUFBTyxLQUFLZ1QseUJBQUwsQ0FBK0JILGVBQS9CLENBQVA7QUFDRDs7O1dBRUQsbUNBQWlDQSxlQUFqQyxFQUFrRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxVQUFNSSxPQUFPLEdBQUd4VixNQUFNLENBQUMwRyxJQUFQLENBQVkwTyxlQUFaLENBQWhCO0FBQ0EsVUFBTUssUUFBUSxHQUFHRCxPQUFPLENBQUNyVixHQUFSLENBQVksVUFBQ3lLLENBQUQsRUFBSVQsQ0FBSjtBQUFBLGVBQVlBLENBQUMsS0FBS3FMLE9BQU8sQ0FBQ2xWLE1BQVIsR0FBaUIsQ0FBdkIsR0FBMkIsQ0FBQyxDQUE1QixHQUFnQyxDQUE1QztBQUFBLE9BQVosQ0FBakI7QUFDQSxVQUFNb1YsV0FBVyxHQUFHRixPQUFPLENBQUNyVixHQUFSLENBQVksVUFBQXlLLENBQUM7QUFBQSxlQUFJd0ssZUFBZSxDQUFDeEssQ0FBRCxDQUFmLENBQW1CdEssTUFBdkI7QUFBQSxPQUFiLENBQXBCO0FBQ0EsVUFBTXFWLEtBQUssR0FBRyxFQUFkO0FBRUE7O0FBQ0EsYUFBT0MsaUJBQWlCLENBQUNILFFBQUQsRUFBV0MsV0FBWCxFQUF3QkQsUUFBUSxDQUFDblYsTUFBVCxHQUFrQixDQUExQyxDQUF4QixFQUFzRTtBQUNwRSxZQUFNdVYsT0FBTyxHQUFHSixRQUFRLENBQUNsTyxNQUFULENBQWdCLFVBQUM4TixJQUFELEVBQU9TLElBQVAsRUFBYTNMLENBQWIsRUFBbUI7QUFDakRrTCxVQUFBQSxJQUFJLENBQUNHLE9BQU8sQ0FBQ3JMLENBQUQsQ0FBUixDQUFKLEdBQW1CaUwsZUFBZSxDQUFDSSxPQUFPLENBQUNyTCxDQUFELENBQVIsQ0FBZixDQUE0QjJMLElBQTVCLENBQW5CO0FBQ0EsaUJBQU9ULElBQVA7QUFDRCxTQUhlLEVBR2IsRUFIYSxDQUFoQjtBQUtBTSxRQUFBQSxLQUFLLENBQUN0UCxJQUFOLENBQVd3UCxPQUFYO0FBQ0Q7QUFDRDtBQUVBOzs7QUFDQSxlQUFTRCxpQkFBVCxDQUEyQkcsR0FBM0IsRUFBZ0NDLE1BQWhDLEVBQXdDM1YsS0FBeEMsRUFBK0M7QUFDN0MsWUFBSUEsS0FBSyxLQUFLLENBQVYsSUFBZTBWLEdBQUcsQ0FBQyxDQUFELENBQUgsS0FBV0MsTUFBTSxDQUFDLENBQUQsQ0FBTixHQUFZLENBQTFDLEVBQTZDO0FBQzNDO0FBQ0EsaUJBQU8sS0FBUDtBQUNEOztBQUVELFlBQUlELEdBQUcsQ0FBQzFWLEtBQUQsQ0FBSCxHQUFhLENBQWIsR0FBaUIyVixNQUFNLENBQUMzVixLQUFELENBQTNCLEVBQW9DO0FBQ2xDMFYsVUFBQUEsR0FBRyxDQUFDMVYsS0FBRCxDQUFILEdBQWEwVixHQUFHLENBQUMxVixLQUFELENBQUgsR0FBYSxDQUExQjtBQUNBLGlCQUFPLElBQVA7QUFDRDs7QUFFRDBWLFFBQUFBLEdBQUcsQ0FBQzFWLEtBQUQsQ0FBSCxHQUFhLENBQWI7QUFDQSxlQUFPdVYsaUJBQWlCLENBQUNHLEdBQUQsRUFBTUMsTUFBTixFQUFjM1YsS0FBSyxHQUFHLENBQXRCLENBQXhCO0FBQ0Q7O0FBRUQsYUFBT3NWLEtBQVA7QUFDRDs7O1dBRUQsa0JBQWdCNUwsQ0FBaEIsRUFBbUI7QUFDakIsYUFBTywwQkFBU0EsQ0FBVCxDQUFQO0FBQ0Q7Ozs7O2VBdWxDWXZKLEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQga2V5bWlycm9yIGZyb20gJ2tleW1pcnJvcic7XG5pbXBvcnQge0NvbGxpc2lvbkZpbHRlckV4dGVuc2lvbiwgRGF0YUZpbHRlckV4dGVuc2lvbn0gZnJvbSAnQGRlY2suZ2wvZXh0ZW5zaW9ucyc7XG5pbXBvcnQge0NPT1JESU5BVEVfU1lTVEVNLCBMYXllciBhcyBEZWNrTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtQb2ludExhYmVsTGF5ZXJ9IGZyb20gJy4uL2RlY2tnbC1sYXllcnMvcG9pbnQtbGFiZWwtbGF5ZXIvcG9pbnQtbGFiZWwtbGF5ZXInO1xuXG4vLyBXb3JrYXJvdW5kIHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS92aXNnbC9kZWNrLmdsL3B1bGwvNzUxMyBpcyByZWxlYXNlZFxuRGVja0xheWVyLmRlZmF1bHRQcm9wcy5nZXRGaWx0ZXJWYWx1ZSA9IHt0eXBlOiAnYWNjZXNzb3InLCB2YWx1ZTogMH07XG5cbi8vIFdvcmthcm91bmQgdW50aWwgaHR0cHM6Ly9naXRodWIuY29tL3Zpc2dsL2RlY2suZ2wvcHVsbC83NTA3IGlzIHJlbGVhc2VkXG5mdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XG4gICAgY29uc3QgYVZhbHVlID0gYVtrZXldO1xuICAgIGNvbnN0IGJWYWx1ZSA9IGJba2V5XTtcbiAgICBjb25zdCBlcXVhbHMgPSBhVmFsdWUgPT09IGJWYWx1ZSB8fCBkZWVwRXF1YWwoYVZhbHVlLCBiVmFsdWUpO1xuICAgIGlmICghZXF1YWxzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5EZWNrTGF5ZXIuZGVmYXVsdFByb3BzLmxvYWRPcHRpb25zID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHt9LFxuICBvcHRpb25hbDogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZXF1YWw6IGRlZXBFcXVhbFxufTtcblxuaW1wb3J0IERlZmF1bHRMYXllckljb24gZnJvbSAnLi9kZWZhdWx0LWxheWVyLWljb24nO1xuaW1wb3J0IHtkaWZmVXBkYXRlVHJpZ2dlcnN9IGZyb20gJy4vbGF5ZXItdXBkYXRlJztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBOT19WQUxVRV9DT0xPUixcbiAgU0NBTEVfVFlQRVMsXG4gIENIQU5ORUxfU0NBTEVTLFxuICBGSUVMRF9PUFRTLFxuICBTQ0FMRV9GVU5DLFxuICBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMsXG4gIE1BWF9HUFVfRklMVEVSUyxcbiAgVU5LTk9XTl9DT0xPUixcbiAgWk9PTV9MRVZFTF9MSU1JVFNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDT0xPUl9SQU5HRVN9IGZyb20gJ2NvbnN0YW50cy9jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtEYXRhVml6Q29sb3JzfSBmcm9tICdjb25zdGFudHMvY3VzdG9tLWNvbG9yLXJhbmdlcyc7XG5pbXBvcnQge1xuICBMQVlFUl9WSVNfQ09ORklHUyxcbiAgREVGQVVMVF9URVhUX0xBQkVMLFxuICBERUZBVUxUX0NPTE9SX1VJLFxuICBERUZBVUxUX0hJR0hMSUdIVF9DT0xPUixcbiAgREVGQVVMVF9MQVlFUl9MQUJFTFxufSBmcm9tICcuL2xheWVyLWZhY3RvcnknO1xuXG5pbXBvcnQge2dlbmVyYXRlSGFzaElkLCBpc1BsYWluT2JqZWN0fSBmcm9tICd1dGlscy91dGlscyc7XG5cbmltcG9ydCB7Z2V0TGF0TG5nQm91bmRzLCBub3ROdWxsb3JVbmRlZmluZWR9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtnZXRTYW1wbGVEYXRhfSBmcm9tICd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci11dGlscyc7XG5cbmltcG9ydCB7aGV4VG9SZ2IsIGdldENvbG9yR3JvdXBCeU5hbWUsIHJldmVyc2VDb2xvclJhbmdlfSBmcm9tICd1dGlscy9jb2xvci11dGlscyc7XG5pbXBvcnQge2dldE1hc2tFeHRlbnNpb25Qcm9wc30gZnJvbSAndXRpbHMvbGF5ZXItdXRpbHMnO1xuaW1wb3J0IHtzY2FsZU9yZGluYWx9IGZyb20gJ2QzLXNjYWxlJztcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4vaW5kZXgnKS5MYXllcn0gTGF5ZXJDbGFzc30gKi9cblxuLyoqXG4gKiBBcHByb3guIG51bWJlciBvZiBwb2ludHMgdG8gc2FtcGxlIGluIGEgbGFyZ2UgZGF0YSBzZXRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBMQVlFUl9JRF9MRU5HVEggPSA2O1xuXG4vLyBOb3RlLCB0aGlzIGlzIGlzIFNWRyBvZiBzb2xpZCBjaXJjbGUgZW5jb2RlZCBhcyBkYXRhLXVyaVxuY29uc3QgRkFMTEJBQ0tfSUNPTiA9XG4gICdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsUEhOMlp5QjJhV1YzUW05NFBTSXdJREFnTVRBd0lERXdNQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajROQ2lBZ1BHTnBjbU5zWlNCamVEMGlOVEFpSUdONVBTSTFNQ0lnY2owaU5UQWlMejROQ2p3dmMzWm5QZz09JztcblxuY29uc3QgTUFYX1NBTVBMRV9TSVpFID0gNTAwMDtcbmNvbnN0IGRlZmF1bHREb21haW4gPSBbMCwgMV07XG5jb25zdCBkYXRhRmlsdGVyRXh0ZW5zaW9uID0gbmV3IERhdGFGaWx0ZXJFeHRlbnNpb24oe2ZpbHRlclNpemU6IE1BWF9HUFVfRklMVEVSU30pO1xuY29uc3QgY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uID0gbmV3IENvbGxpc2lvbkZpbHRlckV4dGVuc2lvbigpO1xuXG5jb25zdCBkZWZhdWx0RGF0YUFjY2Vzc29yID0gZGMgPT4gZCA9PiBkO1xuY29uc3QgZGVmYXVsdEdldEZpZWxkVmFsdWUgPSAoZmllbGQsIGQpID0+IGZpZWxkLnZhbHVlQWNjZXNzb3IoZCk7XG5jb25zdCBzY2FsZUlkZW50aXR5ID0gdiA9PiB2O1xuXG5leHBvcnQgY29uc3QgT1ZFUkxBWV9UWVBFID0ga2V5bWlycm9yKHtcbiAgZGVja2dsOiBudWxsLFxuICBtYXBib3hnbDogbnVsbFxufSk7XG5cbmV4cG9ydCBjb25zdCBsYXllckNvbG9ycyA9IE9iamVjdC52YWx1ZXMoRGF0YVZpekNvbG9ycykubWFwKGhleFRvUmdiKTtcbmZ1bmN0aW9uKiBnZW5lcmF0ZUNvbG9yKCkge1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBsYXllckNvbG9ycy5sZW5ndGggKyAxKSB7XG4gICAgaWYgKGluZGV4ID09PSBsYXllckNvbG9ycy5sZW5ndGgpIHtcbiAgICAgIGluZGV4ID0gMDtcbiAgICB9XG4gICAgeWllbGQgbGF5ZXJDb2xvcnNbaW5kZXgrK107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbG9yTWFrZXIgPSBnZW5lcmF0ZUNvbG9yKCk7XG5cbi8qKiBAdHlwZSB7TGF5ZXJDbGFzc30gKi9cbmNsYXNzIExheWVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBwcm9wcy5pZCB8fCBnZW5lcmF0ZUhhc2hJZChMQVlFUl9JRF9MRU5HVEgpO1xuXG4gICAgLy8gbWV0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgLy8gdmlzQ29uZmlnU2V0dGluZ3NcbiAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzID0ge307XG5cbiAgICAvLyBpbnRlcmFjdGl2aXR5U2V0dGluZ3NcbiAgICB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHtcbiAgICAgIGNvbHVtbnM6IHRoaXMuZ2V0TGF5ZXJDb2x1bW5zKCksXG4gICAgICAuLi5wcm9wc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gRGVmYXVsdExheWVySWNvbjtcbiAgfVxuXG4gIGdldCBvdmVybGF5VHlwZSgpIHtcbiAgICByZXR1cm4gT1ZFUkxBWV9UWVBFLmRlY2tnbDtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IG5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICByZXR1cm4gWydsYWJlbCcsICdvcGFjaXR5JywgJ3RoaWNrbmVzcycsICdpc1Zpc2libGUnLCAnaGlkZGVuJ107XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY29sb3InLFxuICAgICAgICBmaWVsZDogJ2NvbG9yRmllbGQnLFxuICAgICAgICBzY2FsZTogJ2NvbG9yU2NhbGUnLFxuICAgICAgICBkb21haW46ICdjb2xvckRvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY29sb3JSYW5nZScsXG4gICAgICAgIGtleTogJ2NvbG9yJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY29sb3IsXG4gICAgICAgIG51bGxWYWx1ZTogTk9fVkFMVUVfQ09MT1IsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy5jb2xvclxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzaXplJyxcbiAgICAgICAgZmllbGQ6ICdzaXplRmllbGQnLFxuICAgICAgICBzY2FsZTogJ3NpemVTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ3NpemVEb21haW4nLFxuICAgICAgICByYW5nZTogJ3NpemVSYW5nZScsXG4gICAgICAgIGtleTogJ3NpemUnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5zaXplLFxuICAgICAgICBudWxsVmFsdWU6IDAsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogMVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKlxuICAgKiBDb2x1bW4gcGFpcnMgbWFwcyBsYXllciBjb2x1bW4gdG8gYSBzcGVjaWZpYyBmaWVsZCBwYWlycyxcbiAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIG51bGxcbiAgICovXG4gIGdldCBjb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgcG9pbnQgY29sdW1uIHBhaXJzLCBjYW4gYmUgdXNlZCBmb3IgcG9pbnQgYmFzZWQgbGF5ZXJzOiBwb2ludCwgaWNvbiBldGMuXG4gICAqL1xuICBnZXQgZGVmYXVsdFBvaW50Q29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdDoge3BhaXI6ICdsbmcnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzoge3BhaXI6ICdsYXQnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfVxuICAgIH07XG4gIH1cblxuICAvKlxuICAgKiBEZWZhdWx0IGxpbmsgY29sdW1uIHBhaXJzLCBjYW4gYmUgdXNlZCBmb3IgbGluayBiYXNlZCBsYXllcnM6IGFyYywgbGluZSBldGNcbiAgICovXG4gIGdldCBkZWZhdWx0TGlua0NvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXQwOiB7cGFpcjogJ2xuZzAnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzA6IHtwYWlyOiAnbGF0MCcsIGZpZWxkUGFpcktleTogJ2xuZyd9LFxuICAgICAgbGF0MToge3BhaXI6ICdsbmcxJywgZmllbGRQYWlyS2V5OiAnbGF0J30sXG4gICAgICBsbmcxOiB7cGFpcjogJ2xhdDEnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgUmVhY3QgY29tcG9uZW50IGZvciB0byByZW5kZXIgbGF5ZXIgaW5zdHJ1Y3Rpb25zIGluIGEgbW9kYWxcbiAgICogQHJldHVybnMge29iamVjdH0gLSBhbiBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogIHJldHVybiB7XG4gICAqICAgIGlkOiAnaWNvbkluZm8nLFxuICAgKiAgICB0ZW1wbGF0ZTogSWNvbkluZm9Nb2RhbCxcbiAgICogICAgbW9kYWxQcm9wczoge1xuICAgKiAgICAgIHRpdGxlOiAnSG93IHRvIGRyYXcgaWNvbnMnXG4gICAqICAgfTtcbiAgICogfVxuICAgKi9cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IGludGVyYWN0aXZpdHlTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJhY3Rpdml0eVNldHRpbmdzO1xuICB9XG5cbiAgc2V0IGludGVyYWN0aXZpdHlTZXR0aW5ncyhpbnRlcmFjdGl2aXR5U2V0dGluZ3MpIHtcbiAgICB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3MgPSBpbnRlcmFjdGl2aXR5U2V0dGluZ3M7XG4gIH1cblxuICBnZXQgaGFzVG9vbHRpcCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHRoaXMuaW50ZXJhY3Rpdml0eVNldHRpbmdzPy5ob3Zlcj8uZmllbGRzLmxlbmd0aCB8fFxuICAgICAgICB0aGlzLmludGVyYWN0aXZpdHlTZXR0aW5ncz8uY2xpY2s/LmZpZWxkcy5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgZ2V0IGhhc0ludGVyYWN0aXZpdHkoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5oYXNUb29sdGlwICYmIHRoaXMuaW50ZXJhY3Rpdml0eVNldHRpbmdzPy5lbmFibGVkKTtcbiAgfVxuXG4gIC8qXG4gICAqIEdpdmVuIGEgZGF0YXNldCwgYXV0b21hdGljYWxseSBmaW5kIHByb3BzIHRvIGNyZWF0ZSBsYXllciBiYXNlZCBvbiBpdFxuICAgKiBhbmQgcmV0dXJuIHRoZSBwcm9wcyBhbmQgcHJldmlvdXMgZm91bmQgbGF5ZXJzLlxuICAgKiBCeSBkZWZhdWx0LCBubyBsYXllcnMgd2lsbCBiZSBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyhkYXRhc2V0LCBmb3VuZExheWVycykge1xuICAgIHJldHVybiB7cHJvcHM6IFtdLCBmb3VuZExheWVyc307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBhcnJheSBvZiBwcmVzZXQgcmVxdWlyZWQgY29sdW1uIG5hbWVzXG4gICAqIGZvdW5kIGZpZWxkIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdG8gc2V0IGFzIGxheWVyIGNvbHVtblxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGVmYXVsdEZpZWxkc1xuICAgKiBAcGFyYW0ge29iamVjdFtdfSBhbGxGaWVsZHNcbiAgICogQHJldHVybnMge29iamVjdFtdIHwgbnVsbH0gYWxsIHBvc3NpYmxlIHJlcXVpcmVkIGxheWVyIGNvbHVtbiBwYWlyc1xuICAgKi9cbiAgc3RhdGljIGZpbmREZWZhdWx0Q29sdW1uRmllbGQoZGVmYXVsdEZpZWxkcywgYWxsRmllbGRzKSB7XG4gICAgLy8gZmluZCBhbGwgbWF0Y2hlZCBmaWVsZHMgZm9yIGVhY2ggcmVxdWlyZWQgY29sXG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZGVmYXVsdEZpZWxkcykucmVkdWNlKChwcmV2LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gYWxsRmllbGRzLmZpbHRlcihcbiAgICAgICAgZiA9PiBmLm5hbWUgPT09IGRlZmF1bHRGaWVsZHNba2V5XSB8fCBkZWZhdWx0RmllbGRzW2tleV0uaW5jbHVkZXMoZi5uYW1lKVxuICAgICAgKTtcblxuICAgICAgcHJldltrZXldID0gcmVxdWlyZWRGaWVsZHMubGVuZ3RoXG4gICAgICAgID8gcmVxdWlyZWRGaWVsZHMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgIHZhbHVlOiBmLm5hbWUsXG4gICAgICAgICAgICBmaWVsZElkeDogZi5maWVsZElkeFxuICAgICAgICAgIH0pKVxuICAgICAgICA6IG51bGw7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9LCB7fSk7XG5cbiAgICBpZiAoIU9iamVjdC52YWx1ZXMocmVxdWlyZWRDb2x1bW5zKS5ldmVyeShCb29sZWFuKSkge1xuICAgICAgLy8gaWYgYW55IGZpZWxkIG1pc3NpbmcsIHJldHVybiBudWxsXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsUG9zc2libGVDb2x1bW5QYXJpcyhyZXF1aXJlZENvbHVtbnMpIHtcbiAgICAvLyBmb3IgbXVsdGlwbGUgbWF0Y2hlZCBmaWVsZCBmb3Igb25lIHJlcXVpcmVkIGNvbHVtbiwgcmV0dXJuIG11bHRpcGxlXG4gICAgLy8gY29tYmluYXRpb25zLCBlLiBnLiBpZiBjb2x1bW4gYSBoYXMgMiBtYXRjaGVkLCBjb2x1bW4gYiBoYXMgMyBtYXRjaGVkXG4gICAgLy8gNiBwb3NzaWJsZSBjb2x1bW4gcGFpcnMgd2lsbCBiZSByZXR1cm5lZFxuICAgIGNvbnN0IGFsbEtleXMgPSBPYmplY3Qua2V5cyhyZXF1aXJlZENvbHVtbnMpO1xuICAgIGNvbnN0IHBvaW50ZXJzID0gYWxsS2V5cy5tYXAoKGssIGkpID0+ICgoaSA9PT0gYWxsS2V5cy5sZW5ndGggLSAxID8gLTEgOiAwKSkpO1xuICAgIGNvbnN0IGNvdW50UGVyS2V5ID0gYWxsS2V5cy5tYXAoayA9PiByZXF1aXJlZENvbHVtbnNba10ubGVuZ3RoKTtcbiAgICBjb25zdCBwYWlycyA9IFtdO1xuXG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG4gICAgd2hpbGUgKGluY3JlbWVudFBvaW50ZXJzKHBvaW50ZXJzLCBjb3VudFBlcktleSwgcG9pbnRlcnMubGVuZ3RoIC0gMSkpIHtcbiAgICAgIGNvbnN0IG5ld1BhaXIgPSBwb2ludGVycy5yZWR1Y2UoKHByZXYsIGN1dXIsIGkpID0+IHtcbiAgICAgICAgcHJldlthbGxLZXlzW2ldXSA9IHJlcXVpcmVkQ29sdW1uc1thbGxLZXlzW2ldXVtjdXVyXTtcbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIHBhaXJzLnB1c2gobmV3UGFpcik7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cbiAgICAvLyByZWN1cnNpdmVseSBpbmNyZW1lbnQgcG9pbnRlcnNcbiAgICBmdW5jdGlvbiBpbmNyZW1lbnRQb2ludGVycyhwdHMsIGNvdW50cywgaW5kZXgpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBwdHNbMF0gPT09IGNvdW50c1swXSAtIDEpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBpbmNyZW1lbnRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHRzW2luZGV4XSArIDEgPCBjb3VudHNbaW5kZXhdKSB7XG4gICAgICAgIHB0c1tpbmRleF0gPSBwdHNbaW5kZXhdICsgMTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHB0c1tpbmRleF0gPSAwO1xuICAgICAgcmV0dXJuIGluY3JlbWVudFBvaW50ZXJzKHB0cywgY291bnRzLCBpbmRleCAtIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBwYWlycztcbiAgfVxuXG4gIHN0YXRpYyBoZXhUb1JnYihjKSB7XG4gICAgcmV0dXJuIGhleFRvUmdiKGMpO1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YUlkOiBwcm9wcy5kYXRhSWQgfHwgbnVsbCxcbiAgICAgIHZpc2liaWxpdHlCeVpvb206IHtcbiAgICAgICAgbWluOiBwcm9wcy52aXNpYmlsaXR5Qnlab29tPy5taW4gfHwgWk9PTV9MRVZFTF9MSU1JVFMubWluLFxuICAgICAgICBtYXg6IHByb3BzLnZpc2liaWxpdHlCeVpvb20/Lm1heCB8fCBaT09NX0xFVkVMX0xJTUlUUy5tYXhcbiAgICAgIH0sXG4gICAgICBsYWJlbDogcHJvcHMubGFiZWwgfHwgREVGQVVMVF9MQVlFUl9MQUJFTCxcbiAgICAgIGNvbG9yOiBwcm9wcy5jb2xvciB8fCBjb2xvck1ha2VyLm5leHQoKS52YWx1ZSxcbiAgICAgIGNvbHVtbnM6IHByb3BzLmNvbHVtbnMgfHwgbnVsbCxcbiAgICAgIGlzVmlzaWJsZTogcHJvcHMuaXNWaXNpYmxlIHx8IGZhbHNlLFxuICAgICAgaXNDb25maWdBY3RpdmU6IHByb3BzLmlzQ29uZmlnQWN0aXZlIHx8IGZhbHNlLFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6IHByb3BzLmhpZ2hsaWdodENvbG9yIHx8IERFRkFVTFRfSElHSExJR0hUX0NPTE9SLFxuICAgICAgaGlkZGVuOiBwcm9wcy5oaWRkZW4gfHwgZmFsc2UsXG5cbiAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRoaXMgaW50byBzZXBhcmF0ZSB2aXN1YWwgQ2hhbm5lbCBjb25maWdcbiAgICAgIC8vIGNvbG9yIGJ5IGZpZWxkLCBkb21haW4gaXMgc2V0IGJ5IGZpbHRlcnMsIGZpZWxkLCBzY2FsZSB0eXBlXG4gICAgICBjb2xvckZpZWxkOiBudWxsLFxuICAgICAgY29sb3JEb21haW46IFswLCAxXSxcbiAgICAgIGNvbG9yU2NhbGU6IFNDQUxFX1RZUEVTLnF1YW50aWxlLFxuXG4gICAgICAvLyBjb2xvciBieSBzaXplLCBkb21haW4gaXMgc2V0IGJ5IGZpbHRlcnMsIGZpZWxkLCBzY2FsZSB0eXBlXG4gICAgICBzaXplRG9tYWluOiBbMCwgMV0sXG4gICAgICBzaXplU2NhbGU6IFNDQUxFX1RZUEVTLmxpbmVhcixcbiAgICAgIHNpemVGaWVsZDogbnVsbCxcbiAgICAgIHJhZGl1c0ZpZWxkOiBudWxsLFxuXG4gICAgICB2aXNDb25maWc6IHt9LFxuXG4gICAgICB0ZXh0TGFiZWw6IFtERUZBVUxUX1RFWFRfTEFCRUxdLFxuXG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIGNvbG9yOiBERUZBVUxUX0NPTE9SX1VJLFxuICAgICAgICBjb2xvclJhbmdlOiBERUZBVUxUX0NPTE9SX1VJXG4gICAgICB9LFxuICAgICAgYW5pbWF0aW9uOiB7ZW5hYmxlZDogZmFsc2V9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIGEgdmlzdWFsQ2hhbm5lbCBjb25maWdcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcmV0dXJucyB7e2xhYmVsOiBzdHJpbmcsIG1lYXN1cmU6IChzdHJpbmd8c3RyaW5nKX19XG4gICAqL1xuICBnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oa2V5KSB7XG4gICAgLy8gZS5nLiBsYWJlbDogQ29sb3IsIG1lYXN1cmU6IFZlaGljbGUgVHlwZVxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogdGhpcy52aXNDb25maWdTZXR0aW5nc1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0ucmFuZ2VdLmxhYmVsLFxuICAgICAgbWVhc3VyZTogdGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmZpZWxkXVxuICAgICAgICA/ICh0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdLmRpc3BsYXlOYW1lIHx8XG4gICAgICAgICAgdGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmZpZWxkXS5uYW1lKVxuICAgICAgICA6IHRoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5kZWZhdWx0TWVhc3VyZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgdG8gbGF5ZXIgY29sdW1uLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gZmllbGQgLSBTZWxlY3RlZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7e319IC0gQ29sdW1uIGNvbmZpZ1xuICAgKi9cbiAgYXNzaWduQ29sdW1uKGtleSwgZmllbGQpIHtcbiAgICAvLyBmaWVsZCB2YWx1ZSBjb3VsZCBiZSBudWxsIGZvciBvcHRpb25hbCBjb2x1bW5zXG4gICAgY29uc3QgdXBkYXRlID0gZmllbGRcbiAgICAgID8ge1xuICAgICAgICAgIHZhbHVlOiBmaWVsZC5uYW1lLFxuICAgICAgICAgIGZpZWxkSWR4OiBmaWVsZC5maWVsZElkeFxuICAgICAgICB9XG4gICAgICA6IHt2YWx1ZTogbnVsbCwgZmllbGRJZHg6IC0xfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgW2tleV06IHtcbiAgICAgICAgLi4udGhpcy5jb25maWcuY29sdW1uc1trZXldLFxuICAgICAgICAuLi51cGRhdGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbiBhIGZpZWxkIHBhaXIgdG8gY29sdW1uIGNvbmZpZywgcmV0dXJuIGNvbHVtbiBjb25maWdcbiAgICogQHBhcmFtIGtleSAtIENvbHVtbiBLZXlcbiAgICogQHBhcmFtIHBhaXIgLSBmaWVsZCBQYWlyXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQ29sdW1uIGNvbmZpZ1xuICAgKi9cbiAgYXNzaWduQ29sdW1uUGFpcnMoa2V5LCBwYWlyKSB7XG4gICAgaWYgKCF0aGlzLmNvbHVtblBhaXJzIHx8ICF0aGlzLmNvbHVtblBhaXJzPy5ba2V5XSkge1xuICAgICAgLy8gc2hvdWxkIG5vdCBlbmQgaW4gdGhpcyBzdGF0ZVxuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvbHVtbnM7XG4gICAgfVxuXG4gICAgY29uc3Qge3BhaXI6IHBhcnRuZXJLZXksIGZpZWxkUGFpcktleX0gPSB0aGlzLmNvbHVtblBhaXJzPy5ba2V5XTtcbiAgICBjb25zdCB7ZmllbGRQYWlyS2V5OiBwYXJ0bmVyRmllbGRQYWlyS2V5fSA9IHRoaXMuY29sdW1uUGFpcnM/LltwYXJ0bmVyS2V5XTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgW2tleV06IHBhaXJbZmllbGRQYWlyS2V5XSxcbiAgICAgIFtwYXJ0bmVyS2V5XTogcGFpcltwYXJ0bmVyRmllbGRQYWlyS2V5XVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGEgcmFkaXVzIHpvb20gbXVsdGlwbGllciB0byByZW5kZXIgcG9pbnRzLCBzbyB0aGV5IGFyZSB2aXNpYmxlIGluIGFsbCB6b29tIGxldmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYXBTdGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWFwU3RhdGUuem9vbSAtIGFjdHVhbCB6b29tXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdm9pZH0gbWFwU3RhdGUuem9vbU9mZnNldCAtIHpvb21PZmZzZXQgd2hlbiByZW5kZXIgaW4gdGhlIHBsb3QgY29udGFpbmVyIGZvciBleHBvcnQgaW1hZ2VcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldFpvb21GYWN0b3Ioe3pvb20sIHpvb21PZmZzZXQgPSAwfSkge1xuICAgIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLm1heCgxNCAtIHpvb20gKyB6b29tT2Zmc2V0LCAwKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGEgZWxldmF0aW9uIHpvb20gbXVsdGlwbGllciB0byByZW5kZXIgcG9pbnRzLCBzbyB0aGV5IGFyZSB2aXNpYmxlIGluIGFsbCB6b29tIGxldmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYXBTdGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWFwU3RhdGUuem9vbSAtIGFjdHVhbCB6b29tXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdm9pZH0gbWFwU3RhdGUuem9vbU9mZnNldCAtIHpvb21PZmZzZXQgd2hlbiByZW5kZXIgaW4gdGhlIHBsb3QgY29udGFpbmVyIGZvciBleHBvcnQgaW1hZ2VcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldEVsZXZhdGlvblpvb21GYWN0b3Ioe3pvb20sIHpvb21PZmZzZXQgPSAwfSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWcuZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvclxuICAgICAgPyBNYXRoLnBvdygyLCBNYXRoLm1heCg4IC0gem9vbSArIHpvb21PZmZzZXQsIDApKVxuICAgICAgOiAxO1xuICB9XG5cbiAgZm9ybWF0TGF5ZXJEYXRhKGRhdGFzZXRzLCBmaWx0ZXJlZEluZGV4KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0SG92ZXJEYXRhKG9iamVjdCwgZGF0YUNvbnRhaW5lcikge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCBlYWNoIGVudHJ5IG9mIGxheWVyRGF0YSBzaG91bGQgaGF2ZSBhbiBpbmRleCBvZiBhIHJvdyBpbiB0aGUgb3JpZ2luYWwgZGF0YSBjb250YWluZXIuXG4gICAgLy8gRWFjaCBsYXllciBjYW4gaW1wbGVtZW50IGl0cyBvd24gZ2V0SG92ZXJEYXRhIG1ldGhvZFxuICAgIHJldHVybiBkYXRhQ29udGFpbmVyLnJvdyhvYmplY3QuaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gY2hhbmdlIGxheWVyIHR5cGUsIHRyeSB0byBjb3B5IG92ZXIgbGF5ZXIgY29uZmlncyBhcyBtdWNoIGFzIHBvc3NpYmxlXG4gICAqIEBwYXJhbSBjb25maWdUb0NvcHkgLSBjb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB2aXNDb25maWdTZXR0aW5ncyAtIHZpc0NvbmZpZyBzZXR0aW5ncyBvZiBjb25maWcgdG8gY29weVxuICAgKi9cbiAgYXNzaWduQ29uZmlnVG9MYXllcihjb25maWdUb0NvcHksIHZpc0NvbmZpZ1NldHRpbmdzKSB7XG4gICAgLy8gZG9uJ3QgZGVlcCBtZXJnZSB2aXN1YWxDaGFubmVsIGZpZWxkXG4gICAgLy8gZG9uJ3QgZGVlcCBtZXJnZSBjb2xvciByYW5nZSwgcmV2ZXJzZWQ6IGlzIG5vdCBhIGtleSBieSBkZWZhdWx0XG4gICAgY29uc3Qgc2hhbGxvd0NvcHkgPSBbJ2NvbG9yUmFuZ2UnLCAnc3Ryb2tlQ29sb3JSYW5nZSddLmNvbmNhdChcbiAgICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykubWFwKHYgPT4gdi5maWVsZClcbiAgICApO1xuXG4gICAgLy8gZG9uJ3QgY29weSBvdmVyIGRvbWFpbiBhbmQgYW5pbWF0aW9uXG4gICAgY29uc3Qgbm90VG9Db3B5ID0gWydhbmltYXRpb24nXS5jb25jYXQoT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5tYXAodiA9PiB2LmRvbWFpbikpO1xuICAgIC8vIGlmIHJhbmdlIGlzIGZvciB0aGUgc2FtZSBwcm9wZXJ0eSBncm91cCBjb3B5IGl0LCBvdGhlcndpc2UsIG5vdCB0byBjb3B5XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKHYgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBjb25maWdUb0NvcHkudmlzQ29uZmlnW3YucmFuZ2VdICYmXG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3Nbdi5yYW5nZV0gJiZcbiAgICAgICAgdmlzQ29uZmlnU2V0dGluZ3Nbdi5yYW5nZV0uZ3JvdXAgIT09IHRoaXMudmlzQ29uZmlnU2V0dGluZ3Nbdi5yYW5nZV0uZ3JvdXBcbiAgICAgICkge1xuICAgICAgICBub3RUb0NvcHkucHVzaCh2LnJhbmdlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGRvbid0IGNvcHkgb3ZlciB2aXN1YWxDaGFubmVsIHJhbmdlXG4gICAgY29uc3QgY3VycmVudENvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGNvcGllZCA9IHRoaXMuY29weUxheWVyQ29uZmlnKGN1cnJlbnRDb25maWcsIGNvbmZpZ1RvQ29weSwge1xuICAgICAgc2hhbGxvd0NvcHksXG4gICAgICBub3RUb0NvcHlcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKGNvcGllZCk7XG4gICAgLy8gdmFsaWRhdGUgdmlzdWFsQ2hhbm5lbCBmaWVsZCB0eXBlIGFuZCBzY2FsZSB0eXBlc1xuICAgIE9iamVjdC5rZXlzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChjaGFubmVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAqIFJlY3Vyc2l2ZWx5IGNvcHkgY29uZmlnIG92ZXIgdG8gYW4gZW1wdHkgbGF5ZXJcbiAgICogd2hlbiByZWNlaXZlZCBzYXZlZCBjb25maWcsIG9yIGNvcHkgY29uZmlnIG92ZXIgZnJvbSBhIGRpZmZlcmVudCBsYXllciB0eXBlXG4gICAqIG1ha2Ugc3VyZSB0byBvbmx5IGNvcHkgb3ZlciB2YWx1ZSB0byBleGlzdGluZyBrZXlzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjdXJyZW50Q29uZmlnIC0gZXhpc3RpbmcgY29uZmlnIHRvIGJlIG92ZXJyaWRlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdUb0NvcHkgLSBuZXcgQ29uZmlnIHRvIGNvcHkgb3ZlclxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzaGFsbG93Q29weSAtIGFycmF5IG9mIHByb3BlcnRpZXMgdG8gbm90IHRvIGJlIGRlZXAgY29waWVkXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IG5vdFRvQ29weSAtIGFycmF5IG9mIHByb3BlcnRpZXMgbm90IHRvIGNvcHlcbiAgICogQHJldHVybnMge29iamVjdH0gLSBjb3BpZWQgY29uZmlnXG4gICAqL1xuICBjb3B5TGF5ZXJDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5LCB7c2hhbGxvd0NvcHkgPSBbXSwgbm90VG9Db3B5ID0gW119ID0ge30pIHtcbiAgICBjb25zdCBjb3BpZWQgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY3VycmVudENvbmZpZ1trZXldKSAmJlxuICAgICAgICBpc1BsYWluT2JqZWN0KGNvbmZpZ1RvQ29weVtrZXldKSAmJlxuICAgICAgICAhc2hhbGxvd0NvcHkuaW5jbHVkZXMoa2V5KSAmJlxuICAgICAgICAhbm90VG9Db3B5LmluY2x1ZGVzKGtleSlcbiAgICAgICkge1xuICAgICAgICAvLyByZWN1cnNpdmVseSBhc3NpZ24gb2JqZWN0IHZhbHVlXG4gICAgICAgIGNvcGllZFtrZXldID0gdGhpcy5jb3B5TGF5ZXJDb25maWcoY3VycmVudENvbmZpZ1trZXldLCBjb25maWdUb0NvcHlba2V5XSwge1xuICAgICAgICAgIHNoYWxsb3dDb3B5LFxuICAgICAgICAgIG5vdFRvQ29weVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAobm90TnVsbG9yVW5kZWZpbmVkKGNvbmZpZ1RvQ29weVtrZXldKSAmJiAhbm90VG9Db3B5LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgLy8gY29weVxuICAgICAgICBjb3BpZWRba2V5XSA9IGNvbmZpZ1RvQ29weVtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8ga2VlcCBleGlzdGluZ1xuICAgICAgICBjb3BpZWRba2V5XSA9IGN1cnJlbnRDb25maWdba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb3BpZWQ7XG4gIH1cblxuICByZWdpc3RlclZpc0NvbmZpZyhsYXllclZpc0NvbmZpZ3MpIHtcbiAgICBPYmplY3Qua2V5cyhsYXllclZpc0NvbmZpZ3MpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmIExBWUVSX1ZJU19DT05GSUdTW2xheWVyVmlzQ29uZmlnc1tpdGVtXV0pIHtcbiAgICAgICAgLy8gaWYgYXNzaWduZWQgb25lIG9mIGRlZmF1bHQgTEFZRVJfQ09ORklHU1xuICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWdbaXRlbV0gPSBMQVlFUl9WSVNfQ09ORklHU1tsYXllclZpc0NvbmZpZ3NbaXRlbV1dLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2xheWVyVmlzQ29uZmlnc1tpdGVtXV07XG4gICAgICB9IGVsc2UgaWYgKFsndHlwZScsICdkZWZhdWx0VmFsdWUnXS5ldmVyeShwID0+IGxheWVyVmlzQ29uZmlnc1tpdGVtXS5oYXNPd25Qcm9wZXJ0eShwKSkpIHtcbiAgICAgICAgLy8gaWYgcHJvdmlkZWQgY3VzdG9taXplZCB2aXNDb25maWcsIGFuZCBoYXMgdHlwZSAmJiBkZWZhdWx0VmFsdWVcbiAgICAgICAgLy8gVE9ETzogZnVydGhlciBjaGVjayBpZiBjdXN0b21pemVkIHZpc0NvbmZpZyBpcyB2YWxpZFxuICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWdbaXRlbV0gPSBsYXllclZpc0NvbmZpZ3NbaXRlbV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW2l0ZW1dID0gbGF5ZXJWaXNDb25maWdzW2l0ZW1dO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0TGF5ZXJDb2x1bW5zKCkge1xuICAgIGNvbnN0IGNvbHVtblZhbGlkYXRvcnMgPSB0aGlzLmNvbHVtblZhbGlkYXRvcnMgfHwge307XG4gICAgY29uc3QgcmVxdWlyZWQgPSB0aGlzLnJlcXVpcmVkTGF5ZXJDb2x1bW5zLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBjb2x1bW5WYWxpZGF0b3JzW2tleV1cbiAgICAgICAgICA/IHt2YWx1ZTogbnVsbCwgZmllbGRJZHg6IC0xLCB2YWxpZGF0b3I6IGNvbHVtblZhbGlkYXRvcnNba2V5XX1cbiAgICAgICAgICA6IHt2YWx1ZTogbnVsbCwgZmllbGRJZHg6IC0xfVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsQ29sdW1ucy5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XToge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIG9wdGlvbmFsOiB0cnVlfVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG5cbiAgICByZXR1cm4gey4uLnJlcXVpcmVkLCAuLi5vcHRpb25hbH07XG4gIH1cblxuICB1cGRhdGVMYXllckNvbmZpZyhuZXdDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsuLi50aGlzLmNvbmZpZywgLi4ubmV3Q29uZmlnfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxheWVyVmlzQ29uZmlnKG5ld1Zpc0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZyA9IHsuLi50aGlzLmNvbmZpZy52aXNDb25maWcsIC4uLm5ld1Zpc0NvbmZpZ307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVMYXllckNvbG9yVUkocHJvcCwgbmV3Q29uZmlnKSB7XG4gICAgY29uc3Qge2NvbG9yVUk6IHByZXZpb3VzLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobmV3Q29uZmlnKSB8fCB0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yVUlQcm9wID0gT2JqZWN0LmVudHJpZXMobmV3Q29uZmlnKS5yZWR1Y2UoKGFjY3UsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGlzUGxhaW5PYmplY3QoYWNjdVtrZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHsuLi5hY2N1W2tleV0sIC4uLnZhbHVlfSA6IHZhbHVlXG4gICAgICB9O1xuICAgIH0sIHByZXZpb3VzW3Byb3BdIHx8IERFRkFVTFRfQ09MT1JfVUkpO1xuXG4gICAgY29uc3QgY29sb3JVSSA9IHtcbiAgICAgIC4uLnByZXZpb3VzLFxuICAgICAgW3Byb3BdOiBjb2xvclVJUHJvcFxuICAgIH07XG5cbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtjb2xvclVJfSk7XG4gICAgLy8gaWYgY29sb3JVSVtwcm9wXSBpcyBjb2xvclJhbmdlXG4gICAgY29uc3QgaXNDb2xvclJhbmdlID0gdmlzQ29uZmlnW3Byb3BdICYmIHZpc0NvbmZpZ1twcm9wXS5jb2xvcnM7XG5cbiAgICBpZiAoaXNDb2xvclJhbmdlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UobmV3Q29uZmlnLCBwcm9wKTtcbiAgICAgIHRoaXMudXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKTtcbiAgICAgIHRoaXMudXBkYXRlQ3VzdG9tUGFsZXR0ZShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUN1c3RvbVBhbGV0dGUobmV3Q29uZmlnLCBwcmV2aW91cywgcHJvcCkge1xuICAgIGlmICghbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcgfHwgIW5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmN1c3RvbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG5cbiAgICBpZiAoIXZpc0NvbmZpZ1twcm9wXSkgcmV0dXJuO1xuICAgIGNvbnN0IHtjb2xvcnN9ID0gdmlzQ29uZmlnW3Byb3BdO1xuICAgIGNvbnN0IGN1c3RvbVBhbGV0dGUgPSB7XG4gICAgICAuLi5jb2xvclVJW3Byb3BdLmN1c3RvbVBhbGV0dGUsXG4gICAgICBuYW1lOiAnQ3VzdG9tIFBhbGV0dGUnLFxuICAgICAgY29sb3JzOiBbLi4uY29sb3JzXVxuICAgIH07XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIC4uLmNvbG9yVUksXG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0sXG4gICAgICAgICAgY3VzdG9tUGFsZXR0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIGlmIG9wZW4gZHJvcGRvd24gYW5kIHByb3AgaXMgY29sb3IgcmFuZ2VcbiAgICogQXV0b21hdGljYWxseSBzZXQgY29sb3JSYW5nZUNvbmZpZydzIHN0ZXAsIHJldmVyc2VkIGFuZCB0eXBlXG4gICAqIEBwYXJhbSB7Kn0gbmV3Q29uZmlnXG4gICAqIEBwYXJhbSB7Kn0gcHJvcFxuICAgKi9cbiAgdXBkYXRlQ29sb3JVSUJ5Q29sb3JSYW5nZShuZXdDb25maWcsIHByb3ApIHtcbiAgICBpZiAodHlwZW9mIG5ld0NvbmZpZy5zaG93RHJvcGRvd24gIT09ICdudW1iZXInKSByZXR1cm47XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgY29sb3JVSToge1xuICAgICAgICAuLi5jb2xvclVJLFxuICAgICAgICBbcHJvcF06IHtcbiAgICAgICAgICAuLi5jb2xvclVJW3Byb3BdLFxuICAgICAgICAgIGNvbG9yUmFuZ2VDb25maWc6IHtcbiAgICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0uY29sb3JSYW5nZUNvbmZpZyxcbiAgICAgICAgICAgIHR5cGU6IHZpc0NvbmZpZ1twcm9wXS50eXBlLFxuICAgICAgICAgICAgc3RlcHM6IHZpc0NvbmZpZ1twcm9wXS5jb2xvcnMubGVuZ3RoLFxuICAgICAgICAgICAgcmV2ZXJzZWQ6IEJvb2xlYW4odmlzQ29uZmlnW3Byb3BdLnJldmVyc2VkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgdXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgLy8gb25seSB1cGRhdGUgY29sb3JSYW5nZSBpZiBjaGFuZ2VzIGluIFVJIGlzIG1hZGUgdG8gJ3JldmVyc2VkJywgJ3N0ZXBzJyBvciBzdGVwc1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9XG4gICAgICBuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyAmJlxuICAgICAgWydyZXZlcnNlZCcsICdzdGVwcyddLnNvbWUoXG4gICAgICAgIGtleSA9PlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmhhc093blByb3BlcnR5KGtleSkgJiZcbiAgICAgICAgICBuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZ1trZXldICE9PVxuICAgICAgICAgICAgKHByZXZpb3VzW3Byb3BdIHx8IERFRkFVTFRfQ09MT1JfVUkpLmNvbG9yUmFuZ2VDb25maWdba2V5XVxuICAgICAgKTtcbiAgICBpZiAoIXNob3VsZFVwZGF0ZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7c3RlcHMsIHJldmVyc2VkfSA9IGNvbG9yVUlbcHJvcF0uY29sb3JSYW5nZUNvbmZpZztcbiAgICBjb25zdCBjb2xvclJhbmdlID0gdmlzQ29uZmlnW3Byb3BdO1xuICAgIC8vIGZpbmQgYmFzZWQgb24gc3RlcCBvciByZXZlcnNlZFxuICAgIGxldCB1cGRhdGU7XG4gICAgaWYgKG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmhhc093blByb3BlcnR5KCdzdGVwcycpKSB7XG4gICAgICBjb25zdCBncm91cCA9IGdldENvbG9yR3JvdXBCeU5hbWUoY29sb3JSYW5nZSk7XG5cbiAgICAgIGlmIChncm91cCkge1xuICAgICAgICBjb25zdCBzYW1lR3JvdXAgPSBDT0xPUl9SQU5HRVMuZmlsdGVyKGNyID0+IGdldENvbG9yR3JvdXBCeU5hbWUoY3IpID09PSBncm91cCk7XG5cbiAgICAgICAgdXBkYXRlID0gc2FtZUdyb3VwLmZpbmQoY3IgPT4gY3IuY29sb3JzLmxlbmd0aCA9PT0gc3RlcHMpO1xuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5yZXZlcnNlZCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHJldmVyc2VDb2xvclJhbmdlKHRydWUsIHVwZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlICYmIGNvbG9yUmFuZ2UuY29sb3JNYXApIHtcbiAgICAgICAgICB1cGRhdGUgPSB0aGlzLnVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yUmFuZ2UuY29sb3JNYXAsIHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3JldmVyc2VkJykpIHtcbiAgICAgIHVwZGF0ZSA9IHJldmVyc2VDb2xvclJhbmdlKHJldmVyc2VkLCB1cGRhdGUgfHwgY29sb3JSYW5nZSk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllclZpc0NvbmZpZyh7W3Byb3BdOiB1cGRhdGV9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb2xvck1hcChwcm9wLCBjb2xvck1hcCwgY29sb3JSYW5nZSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7ZmllbGQsIGRvbWFpbn0gPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmFsdWUgPT4gdmFsdWUucmFuZ2UgPT09IHByb3ApO1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmNvbmZpZ1tmaWVsZF0/LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2F0ZWdvcnlDb2xvck1hcChjb2xvck1hcCwgdGhpcy5jb25maWdbZG9tYWluXSwgY29sb3JSYW5nZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gdHlwZSBvciB0eXBlIGlzIG5vdCBzdHJpbmcsIGJvb2xlYW4gb3IgZGF0ZVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZU51bWVyaWNDb2xvck1hcChjb2xvck1hcCwgdGhpcy5jb25maWdbZG9tYWluXSwgY29sb3JSYW5nZSk7XG4gIH1cblxuICB1cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCBkb21haW4sIGNvbG9yUmFuZ2UpIHtcbiAgICBjb25zdCBjb2xvcnMgPSBjb2xvclJhbmdlLmNvbG9ycztcbiAgICBjb25zdCBhc3NpZ25lZENhdGVnb3JpZXMgPSBbXTtcbiAgICBjb25zdCBuZXdDb2xvck1hcCA9IGNvbG9yTWFwLnNsaWNlKDAsIGNvbG9ycy5sZW5ndGgpLm1hcCgoY01hcCwgaW5kZXgpID0+IHtcbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNNYXBbMF0pO1xuICAgICAgcmV0dXJuIFtjTWFwWzBdLCBjb2xvcnNbaW5kZXhdXTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmFzc2lnbmVkQ29sb3JzID0gY29sb3JzLnNsaWNlKG5ld0NvbG9yTWFwLmxlbmd0aCwgY29sb3JzLmxlbmd0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIHVuYXNzaWduZWRDb2xvcnMpIHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5ID0gZG9tYWluLmZpbmQoZCA9PiAhYXNzaWduZWRDYXRlZ29yaWVzLmluY2x1ZGVzKGQpKTtcbiAgICAgIGlmICghY2F0ZWdvcnkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBhc3NpZ25lZENhdGVnb3JpZXMucHVzaChjYXRlZ29yeSk7XG4gICAgICBuZXdDb2xvck1hcC5wdXNoKFtjYXRlZ29yeSwgY29sb3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbG9yUmFuZ2UsXG4gICAgICBjb2xvck1hcDogbmV3Q29sb3JNYXBcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCBkb21haW4sIHVwZGF0ZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHVwZGF0ZS5jb2xvcnM7XG4gICAgbGV0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCk7XG5cbiAgICBuZXdDb2xvck1hcCA9IG5ld0NvbG9yTWFwLm1hcCgoY01hcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5kZXggPT09IG5ld0NvbG9yTWFwLmxlbmd0aCAtIDEgPyBudWxsIDogY01hcFswXTtcbiAgICAgIHJldHVybiBbdmFsdWUsIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGlmICh1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNvbG9yTWFwVmFsdWVzID0gY29sb3JNYXAubWFwKGMgPT4gY1swXSkuZmlsdGVyKGMgPT4gdHlwZW9mIGMgPT09ICdudW1iZXInKTtcbiAgICAgIGNvbnN0IG1heFZhbHVlID0gTWF0aC5tYXgoLi4uY29sb3JNYXBWYWx1ZXMsIGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0pO1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gbmV3Q29sb3JNYXBbbmV3Q29sb3JNYXAubGVuZ3RoIC0gMl1bMF07XG4gICAgICBjb25zdCBzdGVwID0gKG1heFZhbHVlIC0gcHJldlZhbHVlKSAvICh1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCArIDEpO1xuICAgICAgbmV3Q29sb3JNYXBbbmV3Q29sb3JNYXAubGVuZ3RoIC0gMV1bMF0gPSBwcmV2VmFsdWUgKyBzdGVwO1xuXG4gICAgICBmb3IgKGNvbnN0IFtpLCBjb2xvcl0gb2YgdW5hc3NpZ25lZENvbG9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpID09PSB1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCAtIDEgPyBudWxsIDogcHJldlZhbHVlICsgKHN0ZXAgKiAoaSArIDIpKTtcbiAgICAgICAgbmV3Q29sb3JNYXAucHVzaChbdmFsdWUsIGNvbG9yXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi51cGRhdGUsXG4gICAgICBjb2xvck1hcDogbmV3Q29sb3JNYXBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB5ZXMgb3Igbm9cbiAgICovXG4gIGhhc0FsbENvbHVtbnMoKSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG4gICAgcmV0dXJuIChcbiAgICAgIChjb2x1bW5zICYmXG4gICAgICBPYmplY3QudmFsdWVzKGNvbHVtbnMpLmV2ZXJ5KHYgPT4ge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih2Lm9wdGlvbmFsIHx8ICh2LnZhbHVlICYmIHYuZmllbGRJZHggPiAtMSkpO1xuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIGxheWVyIGhhcyBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBPYmplY3R9IGxheWVyRGF0YVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0geWVzIG9yIG5vXG4gICAqL1xuICBoYXNMYXllckRhdGEobGF5ZXJEYXRhKSB7XG4gICAgaWYgKCFsYXllckRhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4obGF5ZXJEYXRhLmRhdGEgJiYgbGF5ZXJEYXRhLmRhdGEubGVuZ3RoKTtcbiAgfVxuXG4gIGlzVmFsaWRUb1NhdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSAmJiB0aGlzLmhhc0FsbENvbHVtbnMoKTtcbiAgfVxuXG4gIHNob3VsZFJlbmRlckxheWVyKGRhdGEpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMudHlwZSAmJlxuICAgICAgdGhpcy5oYXNBbGxDb2x1bW5zKCkgJiZcbiAgICAgIHRoaXMuaGFzTGF5ZXJEYXRhKGRhdGEpICYmXG4gICAgICB0eXBlb2YgdGhpcy5yZW5kZXJMYXllciA9PT0gJ2Z1bmN0aW9uJylcbiAgICApO1xuICB9XG5cbiAgZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JSYW5nZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbG9yUmFuZ2UuY29sb3JNYXApKSB7XG4gICAgICBjb25zdCBjTWFwID0gbmV3IE1hcCgpO1xuICAgICAgY29sb3JSYW5nZS5jb2xvck1hcC5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgY01hcC5zZXQoaywgdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gaGV4VG9SZ2IodikgOiB2KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBAdHMtaWdub3JlIGQzIHNjYWxlXG4gICAgICBjb25zdCBzY2FsZSA9IFNDQUxFX0ZVTkNbY29sb3JTY2FsZV0oKVxuICAgICAgICAuZG9tYWluKEFycmF5LmZyb20oY01hcC5rZXlzKCkpKVxuICAgICAgICAucmFuZ2UoQXJyYXkuZnJvbShjTWFwLnZhbHVlcygpKSlcbiAgICAgICAgLnVua25vd24oVU5LTk9XTl9DT0xPUik7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpKTtcbiAgfVxuXG4gIGdldEN1c3RvbU1hcmtlcnNTY2FsZShyYW5nZSwgZmFsbGJhY2tJY29uKSB7XG4gICAgbGV0IHVua25vd25WYWx1ZSA9IGZhbGxiYWNrSWNvbiB8fCBGQUxMQkFDS19JQ09OO1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHJldHVybiAoKSA9PiB1bmtub3duVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXAoKTtcblxuICAgIGlmIChyYW5nZS5vdGhlcnNNYXJrZXIpIHtcbiAgICAgIHVua25vd25WYWx1ZSA9IHJhbmdlLm90aGVyc01hcmtlcjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7dmFsdWUsIG1hcmtlclVybH0gb2YgcmFuZ2UubWFya2VyTWFwKSB7XG4gICAgICBpZiAobWFya2VyVXJsKSB7XG4gICAgICAgIG1hcHBpbmcuc2V0KHZhbHVlLCBtYXJrZXJVcmwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmUgZDMgc2NhbGVcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlT3JkaW5hbCgpXG4gICAgICAuZG9tYWluKEFycmF5LmZyb20obWFwcGluZy5rZXlzKCkpKVxuICAgICAgLnJhbmdlKEFycmF5LmZyb20obWFwcGluZy52YWx1ZXMoKSkpXG4gICAgICAudW5rbm93bih1bmtub3duVmFsdWUpO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gdmlzdWFsIGNoYW5uZWxzIHRvIGRlY2suZ2wgYWNjZXNvcnNcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtIFBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW0uZGF0YUFjY2Vzc29yIEFjY2VzcyBrZXBsZXIuZ2wgbGF5ZXIgZGF0YSBmcm9tIGRlY2suZ2wgbGF5ZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2V9IHBhcmFtLmRhdGFDb250YWluZXIgRGF0YUNvbnRhaW5lciB0byB1c2UgdXNlIHdpdGggZGF0YUFjY2Vzc29yXG4gICAqIEByZXR1cm4ge09iamVjdH0gYXR0cmlidXRlQWNjZXNzb3JzIC0gZGVjay5nbCBsYXllciBhdHRyaWJ1dGUgYWNjZXNzb3JzXG4gICAqL1xuICBnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMoe2RhdGFBY2Nlc3NvciA9IGRlZmF1bHREYXRhQWNjZXNzb3IsIGRhdGFDb250YWluZXJ9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlQWNjZXNzb3JzID0ge307XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIE9iamVjdC5rZXlzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBmaXhlZCxcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgICAgICBudWxsVmFsdWUsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGUsXG4gICAgICAgIGFnZ3JlZ2F0aW9uXG4gICAgICB9ID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcblxuICAgICAgY29uc3Qgc2hvdWxkR2V0U2NhbGUgPSBCb29sZWFuKFxuICAgICAgICAoc2NhbGUgfHwgY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuaWRlbnRpdHkpICYmIHRoaXMuY29uZmlnW2ZpZWxkXVxuICAgICAgKTtcblxuICAgICAgaWYgKHNob3VsZEdldFNjYWxlKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbdGhpcy5jb25maWdbc2NhbGVdLCB0aGlzLmNvbmZpZ1tkb21haW5dLCB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdXTtcbiAgICAgICAgY29uc3QgaXNGaXhlZCA9IGZpeGVkICYmIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF07XG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGRlY2xhcmUgYXMgY29uc3QgYWxsIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGJlIHVzZSBpbiB0aGUgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSBjYWxsXG4gICAgICAgIC8vIG90aGVyd2lzZSwgdGhlIG9sZExheWVyRGF0YSBwYXJhbWV0ZXIgaW4gZm9ybWF0TGF5ZXJEYXRhIG1ldGhvZCB3aWxsIGJlIHdyb25nICh5b3UgY2FuIGNoZWNrIHRoZSBmb3JtYXRMYXllckRhdGEgVGlsZUxheWVyIG1ldGhvZCBpbiBCdWlsZGVyIGFzIGV4YW1wbGUpXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblZhbHVlID0gdGhpcy5jb25maWcudmlzQ29uZmlnW2FnZ3JlZ2F0aW9uXTtcblxuICAgICAgICBjb25zdCBzY2FsZUZ1bmN0aW9uID1cbiAgICAgICAgICBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5pZGVudGl0eVxuICAgICAgICAgICAgPyBzY2FsZUlkZW50aXR5XG4gICAgICAgICAgICA6IGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmNvbG9yXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29sb3JTY2FsZSguLi5hcmdzKVxuICAgICAgICAgICAgOiBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jdXN0b21NYXJrZXJcbiAgICAgICAgICAgID8gdGhpcy5nZXRDdXN0b21NYXJrZXJzU2NhbGUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWcuY3VzdG9tTWFya2Vyc1VybFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKC4uLmFyZ3MsIGlzRml4ZWQpO1xuXG4gICAgICAgIGF0dHJpYnV0ZUFjY2Vzc29yc1thY2Nlc3Nvcl0gPSBkID0+XG4gICAgICAgICAgdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKFxuICAgICAgICAgICAgc2NhbGVGdW5jdGlvbixcbiAgICAgICAgICAgIGRhdGFBY2Nlc3NvcihkYXRhQ29udGFpbmVyKShkKSxcbiAgICAgICAgICAgIGZpZWxkQ29uZmlnLFxuICAgICAgICAgICAgYWdncmVnYXRpb25WYWx1ZSxcbiAgICAgICAgICAgIG51bGxWYWx1ZVxuICAgICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBnZXRBdHRyaWJ1dGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZ2V0QXR0cmlidXRlVmFsdWUodGhpcy5jb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9XG4gICAgICAgICAgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGFjY2Vzc29yIGluIGF0dHJpYnV0ZUFjY2Vzc29ycykpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKGBGYWlsZWQgdG8gcHJvdmlkZSBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgJHthY2Nlc3NvciB8fCBjaGFubmVsfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUFjY2Vzc29ycztcbiAgfVxuXG4gIGdldFZpc0NoYW5uZWxTY2FsZShzY2FsZSwgZG9tYWluLCByYW5nZSwgZml4ZWQpIHtcbiAgICBpZiAoc2NhbGUgPT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgICAgcmV0dXJuIFNDQUxFX0ZVTkNbc2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihkb21haW4uc2xpY2UoMCwgcmFuZ2UubGVuZ3RoKSlcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgYGNvdW50YCBhZ2dyZWdhdGlvbiwgd2UgZG9tYWluIGlzIGFjdHVhbGx5IGBbMCwgSW5maW5pdHldYCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2VcbiAgICAvLyB0byB1c2UgaXQsIHNvIHNraXAgc3BlY3lmeWluZyB0aGlzIGRvbWFpbnNcbiAgICBjb25zdCBkb21haW5Jc0luZmluaXRlID0gZG9tYWluICYmIChkb21haW5bMF0gPT09IDAgJiYgZG9tYWluWzFdID09PSBJbmZpbml0eSk7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3J5ID0gU0NBTEVfRlVOQ1tmaXhlZCA/ICdsaW5lYXInIDogc2NhbGVdO1xuICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgIGxldCByZXN1bHQgPSBzY2FsZUZhY3RvcnkoKTtcbiAgICBpZiAoZG9tYWluICYmICFkb21haW5Jc0luZmluaXRlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZG9tYWluKGRvbWFpbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQucmFuZ2UoZml4ZWQgPyBkb21haW4gOiByYW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgYm91bmRzIG9mIHRoZSBkYXRhLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZX0gZGF0YUNvbnRhaW5lciBEYXRhQ29udGFpbmVyIHRvIGNhbGN1bGF0ZSBib3VuZHMgZm9yLlxuICAgKiBAcGFyYW0geyhkOiB7aW5kZXg6IG51bWJlcn0sIGRjOiBpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2UpID0+IG51bWJlcltdfSBnZXRQb3NpdGlvbiBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEByZXR1cm4ge251bWJlcltdfG51bGx9IGJvdW5kcyBvZiB0aGUgZGF0YS5cbiAgICovXG4gIGdldFBvaW50c0JvdW5kcyhkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB0aHJvdWdoIHRoZSBlbnRpcmUgZGF0YXNldFxuICAgIC8vIGdldCBhIHNhbXBsZSBvZiBkYXRhIHRvIGNhbGN1bGF0ZSBib3VuZHNcbiAgICBjb25zdCBzYW1wbGVEYXRhID1cbiAgICAgIGRhdGFDb250YWluZXIubnVtUm93cygpID4gTUFYX1NBTVBMRV9TSVpFXG4gICAgICAgID8gZ2V0U2FtcGxlRGF0YShkYXRhQ29udGFpbmVyLCBNQVhfU0FNUExFX1NJWkUpXG4gICAgICAgIDogZGF0YUNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHBvaW50cyA9IHNhbXBsZURhdGEubWFwSW5kZXgoZ2V0UG9zaXRpb24pO1xuXG4gICAgY29uc3QgbGF0Qm91bmRzID0gZ2V0TGF0TG5nQm91bmRzKHBvaW50cywgMSwgWy05MCwgOTBdKTtcbiAgICBjb25zdCBsbmdCb3VuZHMgPSBnZXRMYXRMbmdCb3VuZHMocG9pbnRzLCAwLCBbLTE4MCwgMTgwXSk7XG5cbiAgICBpZiAoIWxhdEJvdW5kcyB8fCAhbG5nQm91bmRzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gW2xuZ0JvdW5kc1swXSwgbGF0Qm91bmRzWzBdLCBsbmdCb3VuZHNbMV0sIGxhdEJvdW5kc1sxXV07XG4gIH1cblxuICBnZXRDaGFuZ2VkVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzKSB7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSBkaWZmVXBkYXRlVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzLCB0aGlzLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMpO1xuICAgIHRoaXMuX29sZERhdGFVcGRhdGVUcmlnZ2VycyA9IGRhdGFVcGRhdGVUcmlnZ2VycztcblxuICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlZDtcbiAgfVxuXG4gIGdldEVuY29kZWRDaGFubmVsVmFsdWUoXG4gICAgc2NhbGUsXG4gICAgZGF0YSxcbiAgICBmaWVsZCxcbiAgICAvLyBJbiBidWlsZGVyIHdlIG92ZXJ3cml0ZSB0aGUgZ2V0VmFsdWUgZnVuY3Rpb24gYW5kIHdlIHVzZSB0aGUgX2FnZ3JlZ2F0aW9uIHBhcmFtZXRlciBpbiBzcGF0aWFsIGluZGV4IGxheWVycyBhcyB0aGUgUXVhZGtleUxheWVyLlxuICAgIF9hZ2dyZWdhdGlvbixcbiAgICBudWxsVmFsdWUgPSBOT19WQUxVRV9DT0xPUixcbiAgICBnZXRWYWx1ZSA9IGRlZmF1bHRHZXRGaWVsZFZhbHVlXG4gICkge1xuICAgIGNvbnN0IHt0eXBlfSA9IGZpZWxkO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoZmllbGQsIGRhdGEpO1xuXG4gICAgaWYgKCFub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbFZhbHVlO1xuICAgIH1cblxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTtcbiAgICBpZiAodHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCkge1xuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gY29udmVydCBoZXJlXG4gICAgICAvLyBzY2FsZSBGdW5jdGlvbiBzaG91bGQgdGFrZSBjYXJlIG9mIGl0XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHNjYWxlKG5ldyBEYXRlKHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gc2NhbGUodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgYXR0cmlidXRlVmFsdWUgPSBudWxsVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlO1xuICB9XG5cbiAgdXBkYXRlTWV0YShtZXRhKSB7XG4gICAgdGhpcy5tZXRhID0gey4uLnRoaXMubWV0YSwgLi4ubWV0YX07XG4gIH1cblxuICBnZXREYXRhVXBkYXRlVHJpZ2dlcnMoe2ZpbHRlcmVkSW5kZXgsIGlkLCBhbGxEYXRhfSkge1xuICAgIGNvbnN0IHtjb2x1bW5zfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldERhdGE6IHtkYXRhc2V0SWQ6IGlkLCBhbGxEYXRhLCBjb2x1bW5zLCBmaWx0ZXJlZEluZGV4fSxcbiAgICAgIGdldE1ldGE6IHtkYXRhc2V0SWQ6IGlkLCBhbGxEYXRhLCBjb2x1bW5zfSxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy50ZXh0TGFiZWwgfHwgW10pLnJlZHVjZShcbiAgICAgICAgKGFjY3UsIHRsLCBpKSA9PiAoe1xuICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgW2BnZXRMYWJlbENoYXJhY3RlclNldC0ke2l9YF06IHRsLmZpZWxkID8gdGwuZmllbGQubmFtZSA6IG51bGxcbiAgICAgICAgfSksXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YXNldHMsIG9sZExheWVyRGF0YSkge1xuICAgIGlmICghdGhpcy5jb25maWcuZGF0YUlkKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGxheWVyRGF0YXNldCA9IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF07XG4gICAgY29uc3Qge2RhdGFDb250YWluZXJ9ID0gbGF5ZXJEYXRhc2V0O1xuXG4gICAgdGhpcy51cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzKGxheWVyRGF0YXNldCk7XG5cbiAgICBjb25zdCBnZXRQb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKTtcbiAgICBjb25zdCBkYXRhVXBkYXRlVHJpZ2dlcnMgPSB0aGlzLmdldERhdGFVcGRhdGVUcmlnZ2VycyhsYXllckRhdGFzZXQpO1xuICAgIGNvbnN0IHRyaWdnZXJDaGFuZ2VkID0gdGhpcy5nZXRDaGFuZ2VkVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzKTtcblxuICAgIGlmICh0cmlnZ2VyQ2hhbmdlZC5nZXRNZXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyTWV0YShkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgbGV0IGRhdGEgPSBbXTtcblxuICAgIGlmICghdHJpZ2dlckNoYW5nZWQuZ2V0RGF0YSAmJiBvbGRMYXllckRhdGEgJiYgb2xkTGF5ZXJEYXRhLmRhdGEpIHtcbiAgICAgIC8vIHNhbWUgZGF0YVxuICAgICAgZGF0YSA9IG9sZExheWVyRGF0YS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdGhpcy5jYWxjdWxhdGVEYXRhQXR0cmlidXRlKGxheWVyRGF0YXNldCwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB7ZGF0YSwgdHJpZ2dlckNoYW5nZWR9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdHlsZWQgZmllbGRzIHRvIG1hdGNoIG9uZXMgZnJvbSBuZXcgZGF0YXNldC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAgICovXG4gIHVwZGF0ZVZpc3VhbENoYW5uZWxGaWVsZHMoZGF0YXNldCkge1xuICAgIGZvciAoY29uc3Qge2ZpZWxkfSBvZiBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpKSB7XG4gICAgICBjb25zdCBvbGRGaWVsZCA9IHRoaXMuY29uZmlnW2ZpZWxkXTtcbiAgICAgIGlmICghb2xkRmllbGQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3RGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmZCA9PiBmZC5uYW1lID09PSBvbGRGaWVsZC5uYW1lKSB8fCBudWxsO1xuICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2ZpZWxkXTogbmV3RGF0YVNldEZpZWxkfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgb25lIGxheWVyIGRvbWFpbiB3aGVuIHN0YXRlLmRhdGEgY2hhbmdlZFxuICAgKiBpZiBzdGF0ZS5kYXRhIGNoYW5nZSBpcyBkdWUgb3QgdXBkYXRlIGZpbHRlciwgbmV3RmlsZXIgd2lsbCBiZSBwYXNzZWRcbiAgICogY2FsbGVkIGJ5IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YXNldHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG5ld0ZpbHRlclxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBsYXllclxuICAgKi9cbiAgdXBkYXRlTGF5ZXJEb21haW4oZGF0YXNldHMsIG5ld0ZpbHRlcikge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge3NjYWxlfSA9IGNoYW5uZWw7XG4gICAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG4gICAgICAvLyBvcmRpbmFsIGRvbWFpbiBpcyBiYXNlZCBvbiBkYXRhQ29udGFpbmVyLCBpZiBvbmx5IGZpbHRlciBjaGFuZ2VkXG4gICAgICAvLyBubyBuZWVkIHRvIHVwZGF0ZSBvcmRpbmFsIGRvbWFpblxuICAgICAgaWYgKCFuZXdGaWx0ZXIgfHwgc2NhbGVUeXBlICE9PSBTQ0FMRV9UWVBFUy5vcmRpbmFsKSB7XG4gICAgICAgIGNvbnN0IHtkb21haW59ID0gY2hhbm5lbDtcbiAgICAgICAgY29uc3QgdXBkYXRlZERvbWFpbiA9IHRoaXMuY2FsY3VsYXRlTGF5ZXJEb21haW4odGFibGUsIGNoYW5uZWwpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZG9tYWluXTogdXBkYXRlZERvbWFpbn0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXREYXRhc2V0KGRhdGFzZXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFJZCA/IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHZpc3VhbCBjaGFubmVsIGZpZWxkIGFuZCBzY2FsZXMgYmFzZWQgb24gc3VwcG9ydGVkIGZpZWxkICYgc2NhbGUgdHlwZVxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgdmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpIHtcbiAgICB0aGlzLnZhbGlkYXRlRmllbGRUeXBlKGNoYW5uZWwpO1xuICAgIHRoaXMudmFsaWRhdGVTY2FsZShjaGFubmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBmaWVsZCB0eXBlIGJhc2VkIG9uIGNoYW5uZWxTY2FsZVR5cGVcbiAgICovXG4gIHZhbGlkYXRlRmllbGRUeXBlKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7ZmllbGQsIGNoYW5uZWxTY2FsZVR5cGUsIHN1cHBvcnRlZEZpZWxkVHlwZXN9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgIGlmICh0aGlzLmNvbmZpZ1tmaWVsZF0pIHtcbiAgICAgIC8vIGlmIGZpZWxkIGlzIHNlbGVjdGVkLCBjaGVjayBpZiBmaWVsZCB0eXBlIGlzIHN1cHBvcnRlZFxuICAgICAgY29uc3QgY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMgPVxuICAgICAgICBzdXBwb3J0ZWRGaWVsZFR5cGVzIHx8IENIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEU1tjaGFubmVsU2NhbGVUeXBlXTtcblxuICAgICAgaWYgKCFjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1tmaWVsZF0udHlwZSkpIHtcbiAgICAgICAgLy8gZmllbGQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBzZXQgaXQgYmFjayB0byBudWxsXG4gICAgICAgIC8vIHNldCBzY2FsZSBiYWNrIHRvIGRlZmF1bHRcbiAgICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2ZpZWxkXTogbnVsbH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzY2FsZSB0eXBlIGJhc2VkIG9uIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICB2YWxpZGF0ZVNjYWxlKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7c2NhbGV9ID0gdmlzdWFsQ2hhbm5lbDtcbiAgICBpZiAoIXNjYWxlKSB7XG4gICAgICAvLyB2aXN1YWxDaGFubmVsIGRvZXNuJ3QgaGF2ZSBzY2FsZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZU9wdGlvbnMgPSB0aGlzLmdldFNjYWxlT3B0aW9ucyhjaGFubmVsKTtcbiAgICAvLyBjaGVjayBpZiBjdXJyZW50IHNlbGVjdGVkIHNjYWxlIGlzXG4gICAgLy8gc3VwcG9ydGVkLCBpZiBub3QsIGNoYW5nZSB0byBkZWZhdWx0XG4gICAgaWYgKCFzY2FsZU9wdGlvbnMuaW5jbHVkZXModGhpcy5jb25maWdbc2NhbGVdKSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W3NjYWxlXTogc2NhbGVPcHRpb25zWzBdfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzY2FsZSBvcHRpb25zIGJhc2VkIG9uIGN1cnJlbnQgZmllbGRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0U2NhbGVPcHRpb25zKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7ZmllbGQsIHNjYWxlLCBjaGFubmVsU2NhbGVUeXBlfSA9IHZpc3VhbENoYW5uZWw7XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWdbZmllbGRdXG4gICAgICA/IEZJRUxEX09QVFNbdGhpcy5jb25maWdbZmllbGRdLnR5cGVdLnNjYWxlW2NoYW5uZWxTY2FsZVR5cGVdXG4gICAgICA6IFt0aGlzLmdldERlZmF1bHRMYXllckNvbmZpZygpW3NjYWxlXV07XG4gIH1cblxuICB1cGRhdGVMYXllclZpc3VhbENoYW5uZWwoZGF0YXNldCwgY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIC8vIGNhbGN1bGF0ZSBsYXllciBjaGFubmVsIGRvbWFpblxuICAgIGNvbnN0IHVwZGF0ZWREb21haW4gPSB0aGlzLmNhbGN1bGF0ZUxheWVyRG9tYWluKGRhdGFzZXQsIHZpc3VhbENoYW5uZWwpO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1t2aXN1YWxDaGFubmVsLmRvbWFpbl06IHVwZGF0ZWREb21haW59KTtcbiAgfVxuXG4gIGdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycygpIHtcbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHt9O1xuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaCh2aXN1YWxDaGFubmVsID0+IHtcbiAgICAgIC8vIGZpZWxkIHJhbmdlIHNjYWxlIGRvbWFpblxuICAgICAgY29uc3Qge2FjY2Vzc29yLCBmaWVsZCwgc2NhbGUsIGRvbWFpbiwgcmFuZ2UsIGRlZmF1bHRWYWx1ZSwgZml4ZWR9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdID0ge1xuICAgICAgICBbZmllbGRdOiB0aGlzLmNvbmZpZ1tmaWVsZF0sXG4gICAgICAgIFtzY2FsZV06IHRoaXMuY29uZmlnW3NjYWxlXSxcbiAgICAgICAgW2RvbWFpbl06IHRoaXMuY29uZmlnW2RvbWFpbl0sXG4gICAgICAgIFtyYW5nZV06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIC4uLihmaXhlZCA/IHtbZml4ZWRdOiB0aGlzLmNvbmZpZy52aXNDb25maWdbZml4ZWRdfSA6IHt9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdXBkYXRlVHJpZ2dlcnM7XG4gIH1cblxuICBjYWxjdWxhdGVMYXllckRvbWFpbihkYXRhc2V0LCB2aXN1YWxDaGFubmVsKSB7XG4gICAgY29uc3Qge3NjYWxlfSA9IHZpc3VhbENoYW5uZWw7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZ1t2aXN1YWxDaGFubmVsLmZpZWxkXTtcbiAgICBpZiAoIWZpZWxkIHx8ICFzY2FsZSkge1xuICAgICAgLy8gaWYgY29sb3JGaWVsZCBvciBzaXplRmllbGQgd2VyZSBzZXQgYmFjayB0byBudWxsXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG4gICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgaWYgKCFzY2FsZVR5cGUgfHwgIWRhdGFTZXRGaWVsZCkge1xuICAgICAgLy8gaWYgbmV3IGRhdGFzZXQgZG9lc24ndCBjb250YWluIHByZXZpb3VzbHkgc2V0IGZpZWxkXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YXNldC5nZXRDb2x1bW5MYXllckRvbWFpbihkYXRhU2V0RmllbGQsIHNjYWxlVHlwZSkgfHwgZGVmYXVsdERvbWFpbjtcbiAgfVxuXG4gIGhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SW5mbykge1xuICAgIHJldHVybiB0aGlzLmlzTGF5ZXJIb3ZlcmVkKG9iamVjdEluZm8pICYmIG9iamVjdEluZm8ub2JqZWN0ID8gb2JqZWN0SW5mby5vYmplY3QgOiBudWxsO1xuICB9XG5cbiAgaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykge1xuICAgIHJldHVybiBvYmplY3RJbmZvPy5waWNrZWQgJiYgb2JqZWN0SW5mbz8ubGF5ZXI/LnByb3BzPy5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlQnlab29tKG1hcFN0YXRlKSB7XG4gICAgY29uc3QgcmFkaXVzQ2hhbm5lbCA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YyA9PiB2Yy5wcm9wZXJ0eSA9PT0gJ3JhZGl1cycpO1xuXG4gICAgaWYgKCFyYWRpdXNDaGFubmVsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHJhZGl1c0NoYW5uZWwuZmllbGQ7XG4gICAgY29uc3Qge3JhZGl1c30gPSB0aGlzLmNvbmZpZy52aXNDb25maWc7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZ1tmaWVsZF0gPyAxIDogcmFkaXVzKSAqIHRoaXMuZ2V0Wm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gIH1cblxuICBnZXRSYWRpdXNTY2FsZSgpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwgfHwgdGhpcy5jb25maWdbcmFkaXVzQ2hhbm5lbC5maWVsZF0pIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcudmlzQ29uZmlnLnJhZGl1cztcbiAgICB9XG4gIH1cblxuICBnZXRNYXhNYXJrZXJTaXplKCkge1xuICAgIGNvbnN0IHtyYWRpdXNGaWVsZCwgc2l6ZUZpZWxkLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge3JhZGl1c1JhbmdlLCByYWRpdXN9ID0gdmlzQ29uZmlnO1xuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzRmllbGQgfHwgc2l6ZUZpZWxkO1xuICAgIHJldHVybiBNYXRoLmNlaWwoKGZpZWxkICYmIHJhZGl1c1JhbmdlID8gcmFkaXVzUmFuZ2VbMV0gOiByYWRpdXMpKTtcbiAgfVxuXG4gIHNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy5zb21lKHAgPT4gIXRoaXMubm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzLmluY2x1ZGVzKHApKTtcbiAgfVxuXG4gIGdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMoaW50ZXJhY3Rpb25Db25maWcsIGJydXNoaW5nVGFyZ2V0KSB7XG4gICAgY29uc3Qge2JydXNofSA9IGludGVyYWN0aW9uQ29uZmlnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGJydXNoaW5nXG4gICAgICBhdXRvSGlnaGxpZ2h0OiAhYnJ1c2guZW5hYmxlZCxcbiAgICAgIGJydXNoaW5nUmFkaXVzOiBicnVzaC5jb25maWcuc2l6ZSAqIDEwMDAsXG4gICAgICBicnVzaGluZ1RhcmdldDogYnJ1c2hpbmdUYXJnZXQgfHwgJ3NvdXJjZScsXG4gICAgICBicnVzaGluZ0VuYWJsZWQ6IGJydXNoLmVuYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKHtpZHgsIGdwdUZpbHRlciwgbWFwU3RhdGUsIHZpc2libGUsIG1hc2tQb2x5Z29ufSkge1xuICAgIGNvbnN0IG1hc2tFeHRlbnNpb25Qcm9wcyA9IGdldE1hc2tFeHRlbnNpb25Qcm9wcyhtYXNrUG9seWdvbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1hc2tFeHRlbnNpb25Qcm9wcyxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaWR4LFxuICAgICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uTE5HTEFULFxuICAgICAgcGlja2FibGU6IHRoaXMuaGFzSW50ZXJhY3Rpdml0eSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBwYXJhbWV0ZXJzOiB7ZGVwdGhUZXN0OiBCb29sZWFuKG1hcFN0YXRlLmRyYWdSb3RhdGUgfHwgdGhpcy5jb25maWcudmlzQ29uZmlnLmVuYWJsZTNkKX0sXG4gICAgICBoaWRkZW46IHRoaXMuY29uZmlnLmhpZGRlbixcbiAgICAgIHZpc2liaWxpdHlCeVpvb206IHRoaXMuY29uZmlnLnZpc2liaWxpdHlCeVpvb20sXG4gICAgICAvLyB2aXNjb25maWdcbiAgICAgIG9wYWNpdHk6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vcGFjaXR5LFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgLy8gZGF0YSBmaWx0ZXJpbmdcbiAgICAgIGV4dGVuc2lvbnM6IFtkYXRhRmlsdGVyRXh0ZW5zaW9uLCAuLi5tYXNrRXh0ZW5zaW9uUHJvcHMuZXh0ZW5zaW9uc10sXG4gICAgICBmaWx0ZXJSYW5nZTogZ3B1RmlsdGVyID8gZ3B1RmlsdGVyLmZpbHRlclJhbmdlIDogdW5kZWZpbmVkLFxuICAgICAgLy8gbGF5ZXIgc2hvdWxkIGJlIHZpc2libGUgYW5kIGlmIHNwbGl0TWFwLCBzaG93biBpbiB0byBvbmUgb2YgcGFuZWxcbiAgICAgIHZpc2libGU6IHRoaXMuY29uZmlnLmlzVmlzaWJsZSAmJiB2aXNpYmxlXG4gICAgfTtcbiAgfVxuXG4gIGdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHt0aGlzLmlkfS1ob3ZlcmVkYCxcbiAgICAgIHBpY2thYmxlOiBmYWxzZSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVRcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyVGV4dExhYmVsTGF5ZXIoXG4gICAge2dldFBvc2l0aW9uLCBnZXRSYWRpdXMsIHJhZGl1c1NjYWxlLCB1cGRhdGVUcmlnZ2Vycywgc2hhcmVkUHJvcHN9LFxuICAgIHJlbmRlck9wdHNcbiAgKSB7XG4gICAgY29uc3Qge2RhdGEsIG1hcFN0YXRlfSA9IHJlbmRlck9wdHM7XG4gICAgY29uc3Qge3RleHRMYWJlbCwgdmlzaWJpbGl0eUJ5Wm9vbX0gPSB0aGlzLmNvbmZpZztcbiAgICAvLyBjb25zdCBleHRlbnNpb25zID0gWy4uLnNoYXJlZFByb3BzLmV4dGVuc2lvbnNdO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbLi4uc2hhcmVkUHJvcHMuZXh0ZW5zaW9ucywgY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uXTtcblxuICAgIGlmICghZGF0YSB8fCAhZGF0YS50ZXh0TGFiZWxzIHx8ICFkYXRhLnRleHRMYWJlbHNbMF0gfHwgIWRhdGEudGV4dExhYmVsc1swXS5nZXRUZXh0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUT0RPIG90aGVyIGxhYmVsc1xuICAgIGNvbnN0IGkgPSAwO1xuXG4gICAgY29uc3QgW21haW5MYWJlbCwgc2Vjb25kYXJ5TGFiZWxdID0gdGV4dExhYmVsO1xuICAgIGNvbnN0IHthbGlnbm1lbnQsIGFuY2hvciwgY29sb3I6IGdldENvbG9yLCBvdXRsaW5lQ29sb3IsIHNpemU6IHNpemVTY2FsZX0gPSBtYWluTGFiZWw7XG4gICAgY29uc3Qge1xuICAgICAgY29sb3I6IGdldFNlY29uZGFyeUNvbG9yLFxuICAgICAgb3V0bGluZUNvbG9yOiBzZWNvbmRhcnlPdXRsaW5lQ29sb3IsXG4gICAgICBzaXplOiBzZWNvbmRhcnlTaXplU2NhbGVcbiAgICB9ID0gc2Vjb25kYXJ5TGFiZWwgfHwge307XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFBvaW50TGFiZWxMYXllcih7XG4gICAgICAgIC4uLnNoYXJlZFByb3BzLFxuICAgICAgICBpZDogYCR7dGhpcy5pZH0tbGFiZWxgLFxuICAgICAgICBkYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgIHZpc2liaWxpdHlCeVpvb20sXG4gICAgICAgIGNoYXJhY3RlclNldDogJ2F1dG8nLFxuXG4gICAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAgIGNvbGxpc2lvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvbGxpc2lvbkdyb3VwOiBgJHt0aGlzLmlkfS1sYWJlbHNgLFxuXG4gICAgICAgIGdldFRleHQ6IGRhdGEudGV4dExhYmVsc1swXS5nZXRUZXh0LFxuICAgICAgICBnZXRDb2xvcixcbiAgICAgICAgc2l6ZVNjYWxlLFxuICAgICAgICBvdXRsaW5lQ29sb3IsXG5cbiAgICAgICAgLi4uKHNlY29uZGFyeUxhYmVsICYmIHtcbiAgICAgICAgICBnZXRTZWNvbmRhcnlUZXh0OiBkYXRhLnRleHRMYWJlbHNbMV0uZ2V0VGV4dCxcbiAgICAgICAgICBnZXRTZWNvbmRhcnlDb2xvcixcbiAgICAgICAgICBzZWNvbmRhcnlTaXplU2NhbGUsXG4gICAgICAgICAgc2Vjb25kYXJ5T3V0bGluZUNvbG9yXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIFBvc2l0aW9uXG4gICAgICAgIGdldFBvc2l0aW9uLFxuICAgICAgICBnZXRSYWRpdXMsXG4gICAgICAgIHJhZGl1c1NjYWxlLFxuICAgICAgICBnZXRUZXh0QW5jaG9yOiBhbmNob3IsXG4gICAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiBhbGlnbm1lbnQsXG5cbiAgICAgICAgLy8gU3R5bGVcbiAgICAgICAgZm9udEZhbWlseTogJ0ludGVyLCBzYW5zJyxcbiAgICAgICAgZm9udFNldHRpbmdzOiB7c2RmOiB0cnVlfSxcbiAgICAgICAgZm9udFdlaWdodDogNTAwLFxuICAgICAgICBvdXRsaW5lV2lkdGg6IDQsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAvLyB0ZXh0IHdpbGwgYWx3YXlzIHNob3cgb24gdG9wIG9mIGFsbCBsYXllcnNcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RmlsdGVyVmFsdWU6IGRhdGEuZ2V0RmlsdGVyVmFsdWUsXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgICAgZ2V0VGV4dDogdGV4dExhYmVsW2ldLmZpZWxkPy5uYW1lLFxuICAgICAgICAgIGdldFBpeGVsT2Zmc2V0OiB7XG4gICAgICAgICAgICAuLi51cGRhdGVUcmlnZ2Vycy5nZXRQaXhlbE9mZnNldCxcbiAgICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzLmdldFJhZGl1cyxcbiAgICAgICAgICAgIGFuY2hvcjogbWFpbkxhYmVsLmFuY2hvcixcbiAgICAgICAgICAgIGFsaWdubWVudDogbWFpbkxhYmVsLmFsaWdubWVudFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0VGV4dEFuY2hvcjogbWFpbkxhYmVsLmFuY2hvcixcbiAgICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogbWFpbkxhYmVsLmFsaWdubWVudCxcbiAgICAgICAgICBnZXRDb2xvcjogdGV4dExhYmVsW2ldLmNvbG9yXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZGVjay5nbCBgSWNvbkxheWVyYCBcImF1dG9QYWNrXCIgbW9kZSBhY2Nlc3NvciBmb3IgY3VzdG9tIG1hcmtlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gaWNvblVybEFjY2Vzc29yIGRlY2suZ2wgYWNjZXNzb3IgKG9yIHZhbHVlKSB0aGF0IHJlc29sdmVzIHRvIFVSTCBvZiBpY29uIGZvciBnaXZlbiByb3dcbiAgICogQHJldHVybnMgZGVjay5nbCBhY2Nlc3NvciB0aGF0IHJldHVybnMgVW5wYWNrZWRJY29uIHJlYWR5IHRvIGNvbnN1bWUgYnkgSWNvbkxheWVyXG4gICAqL1xuICBnZXRDdXN0b21NYXJrZXJJY29uQWNjZXNzb3IoaWNvblVybEFjY2Vzc29yLCBtYXNrID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1heEljb25TaXplID0gdGhpcy5nZXRNYXhNYXJrZXJTaXplKCk7XG5cbiAgICByZXR1cm4gZCA9PiB7XG4gICAgICBjb25zdCB3YW50ZWRVcmwgPVxuICAgICAgICAodHlwZW9mIGljb25VcmxBY2Nlc3NvciA9PT0gJ2Z1bmN0aW9uJykgPyBpY29uVXJsQWNjZXNzb3IoZCkgOiBpY29uVXJsQWNjZXNzb3I7XG4gICAgICBjb25zdCBpY29uT2sgPSBCb29sZWFuKHdhbnRlZFVybCk7XG4gICAgICBtYXNrID0gaWNvbk9rID8gbWFzayA6IHRydWU7XG4gICAgICBjb25zdCB1cmwgPSBpY29uT2sgPyB3YW50ZWRVcmwgOiBGQUxMQkFDS19JQ09OO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGAke3VybH1AQCR7bWF4SWNvblNpemV9QCR7bWFzayA/ICdtJyA6ICdjJ31gLFxuICAgICAgICB1cmwsXG4gICAgICAgIHdpZHRoOiBtYXhJY29uU2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBtYXhJY29uU2l6ZSxcbiAgICAgICAgbWFza1xuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZShrZXBsZXJUYWJsZSwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICB9XG5cbiAgZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICAgIHJldHVybiAoKSA9PiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExheWVyO1xuIl19