@carto/kepler.gl 0.0.39 → 0.0.40-alpha.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.
Files changed (36) hide show
  1. package/dist/components/index.js +10 -1
  2. package/dist/components/map-container.js +14 -1
  3. package/dist/components/side-panel/layer-panel/layer-configurator.js +9 -4
  4. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +106 -0
  5. package/dist/constants/default-settings.js +8 -3
  6. package/dist/layers/base-layer.js +11 -1
  7. package/dist/localization/ca.js +4 -1
  8. package/dist/localization/cn.js +4 -1
  9. package/dist/localization/en.js +4 -1
  10. package/dist/localization/es.js +4 -1
  11. package/dist/localization/fi.js +4 -1
  12. package/dist/localization/ja.js +4 -1
  13. package/dist/localization/pt.js +4 -1
  14. package/dist/localization/ru.js +4 -1
  15. package/dist/reducers/vis-state-merger.js +3 -2
  16. package/dist/schemas/vis-state-schema.js +5 -1
  17. package/package.json +1 -1
  18. package/src/components/index.js +1 -0
  19. package/src/components/map-container.js +14 -0
  20. package/src/components/side-panel/layer-panel/layer-configurator.js +7 -3
  21. package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.js +120 -0
  22. package/src/constants/default-settings.js +5 -0
  23. package/src/layers/base-layer.js +10 -3
  24. package/src/layers/index.d.ts +1 -0
  25. package/src/localization/ca.js +3 -0
  26. package/src/localization/cn.js +3 -0
  27. package/src/localization/en.js +3 -0
  28. package/src/localization/es.js +3 -0
  29. package/src/localization/fi.js +3 -0
  30. package/src/localization/ja.js +3 -0
  31. package/src/localization/pt.js +3 -0
  32. package/src/localization/ru.js +3 -0
  33. package/src/reducers/vis-state-merger.js +2 -1
  34. package/src/schemas/schema-manager.d.ts +1 -0
  35. package/src/schemas/vis-state-schema.js +2 -0
  36. package/umd/keplergl.min.js +31 -31
@@ -301,9 +301,15 @@ var Layer = /*#__PURE__*/function () {
301
301
  }, {
302
302
  key: "getDefaultLayerConfig",
303
303
  value: function getDefaultLayerConfig() {
304
+ var _props$visibilityByZo, _props$visibilityByZo2;
305
+
304
306
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
305
307
  return {
306
308
  dataId: props.dataId || null,
309
+ visibilityByZoom: {
310
+ min: ((_props$visibilityByZo = props.visibilityByZoom) === null || _props$visibilityByZo === void 0 ? void 0 : _props$visibilityByZo.min) || _defaultSettings.ZOOM_LEVEL_LIMITS.min,
311
+ max: ((_props$visibilityByZo2 = props.visibilityByZoom) === null || _props$visibilityByZo2 === void 0 ? void 0 : _props$visibilityByZo2.max) || _defaultSettings.ZOOM_LEVEL_LIMITS.max
312
+ },
307
313
  label: props.label || _layerFactory.DEFAULT_LAYER_LABEL,
308
314
  color: props.color || colorMaker.next().value,
309
315
  columns: props.columns || null,
@@ -1350,6 +1356,10 @@ var Layer = /*#__PURE__*/function () {
1350
1356
  depthTest: Boolean(mapState.dragRotate || this.config.visConfig.enable3d)
1351
1357
  },
1352
1358
  hidden: this.config.hidden,
1359
+ visibilityByZoom: {
1360
+ min: this.config.visibilityByZoom.min,
1361
+ max: this.config.visibilityByZoom.max
1362
+ },
1353
1363
  // visconfig
1354
1364
  opacity: this.config.visConfig.opacity,
1355
1365
  highlightColor: this.config.highlightColor,
@@ -1534,4 +1544,4 @@ var Layer = /*#__PURE__*/function () {
1534
1544
 
1535
1545
  var _default = Layer;
1536
1546
  exports["default"] = _default;
1537
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvYmFzZS1sYXllci5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUNvbG9yIiwiTEFZRVJfSURfTEVOR1RIIiwiTUFYX1NBTVBMRV9TSVpFIiwiZGVmYXVsdERvbWFpbiIsImRhdGFGaWx0ZXJFeHRlbnNpb24iLCJEYXRhRmlsdGVyRXh0ZW5zaW9uIiwiZmlsdGVyU2l6ZSIsIk1BWF9HUFVfRklMVEVSUyIsImRlZmF1bHREYXRhQWNjZXNzb3IiLCJkYyIsImQiLCJkZWZhdWx0R2V0RmllbGRWYWx1ZSIsImZpZWxkIiwidmFsdWVBY2Nlc3NvciIsIk9WRVJMQVlfVFlQRSIsImRlY2tnbCIsIm1hcGJveGdsIiwibGF5ZXJDb2xvcnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJEYXRhVml6Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJpbmRleCIsImxlbmd0aCIsImNvbG9yTWFrZXIiLCJMYXllciIsInByb3BzIiwiaWQiLCJtZXRhIiwidmlzQ29uZmlnU2V0dGluZ3MiLCJjb25maWciLCJnZXREZWZhdWx0TGF5ZXJDb25maWciLCJjb2x1bW5zIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiRGVmYXVsdExheWVySWNvbiIsInR5cGUiLCJjb2xvciIsInByb3BlcnR5Iiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImtleSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZGVmYXVsdFZhbHVlIiwic2l6ZSIsImxhdCIsInBhaXIiLCJmaWVsZFBhaXJLZXkiLCJsbmciLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwiZGF0YUlkIiwibGFiZWwiLCJERUZBVUxUX0xBWUVSX0xBQkVMIiwibmV4dCIsInZhbHVlIiwiaXNWaXNpYmxlIiwiaXNDb25maWdBY3RpdmUiLCJoaWdobGlnaHRDb2xvciIsIkRFRkFVTFRfSElHSExJR0hUX0NPTE9SIiwiaGlkZGVuIiwiY29sb3JGaWVsZCIsImNvbG9yRG9tYWluIiwiY29sb3JTY2FsZSIsIlNDQUxFX1RZUEVTIiwicXVhbnRpbGUiLCJzaXplRG9tYWluIiwic2l6ZVNjYWxlIiwibGluZWFyIiwic2l6ZUZpZWxkIiwidmlzQ29uZmlnIiwidGV4dExhYmVsIiwiREVGQVVMVF9URVhUX0xBQkVMIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjb2xvclJhbmdlIiwiYW5pbWF0aW9uIiwiZW5hYmxlZCIsInZpc3VhbENoYW5uZWxzIiwibWVhc3VyZSIsImRpc3BsYXlOYW1lIiwibmFtZSIsImRlZmF1bHRNZWFzdXJlIiwidXBkYXRlIiwiZmllbGRJZHgiLCJjb2x1bW5QYWlycyIsInBhcnRuZXJLZXkiLCJwYXJ0bmVyRmllbGRQYWlyS2V5Iiwiem9vbSIsInpvb21PZmZzZXQiLCJNYXRoIiwicG93IiwibWF4IiwiZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvciIsImRhdGFzZXRzIiwiZmlsdGVyZWRJbmRleCIsIm9iamVjdCIsImRhdGFDb250YWluZXIiLCJyb3ciLCJjb25maWdUb0NvcHkiLCJzaGFsbG93Q29weSIsImNvbmNhdCIsInYiLCJub3RUb0NvcHkiLCJmb3JFYWNoIiwiZ3JvdXAiLCJwdXNoIiwiY3VycmVudENvbmZpZyIsImNvcGllZCIsImNvcHlMYXllckNvbmZpZyIsInVwZGF0ZUxheWVyQ29uZmlnIiwia2V5cyIsImNoYW5uZWwiLCJ2YWxpZGF0ZVZpc3VhbENoYW5uZWwiLCJpbmNsdWRlcyIsImxheWVyVmlzQ29uZmlncyIsIml0ZW0iLCJMQVlFUl9WSVNfQ09ORklHUyIsImV2ZXJ5IiwicCIsImhhc093blByb3BlcnR5IiwiY29sdW1uVmFsaWRhdG9ycyIsInJlcXVpcmVkIiwicmVxdWlyZWRMYXllckNvbHVtbnMiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdG9yIiwib3B0aW9uYWwiLCJvcHRpb25hbENvbHVtbnMiLCJuZXdDb25maWciLCJuZXdWaXNDb25maWciLCJwcm9wIiwicHJldmlvdXMiLCJjb2xvclVJUHJvcCIsImVudHJpZXMiLCJpc0NvbG9yUmFuZ2UiLCJjb2xvcnMiLCJ1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlIiwidXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSSIsInVwZGF0ZUN1c3RvbVBhbGV0dGUiLCJjb2xvclJhbmdlQ29uZmlnIiwiY3VzdG9tIiwiY3VzdG9tUGFsZXR0ZSIsInNob3dEcm9wZG93biIsInN0ZXBzIiwicmV2ZXJzZWQiLCJCb29sZWFuIiwic2hvdWxkVXBkYXRlIiwic29tZSIsInNhbWVHcm91cCIsIkNPTE9SX1JBTkdFUyIsImZpbHRlciIsImNyIiwiZmluZCIsImNvbG9yTWFwIiwidXBkYXRlQ29sb3JNYXAiLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsInVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAiLCJ1cGRhdGVOdW1lcmljQ29sb3JNYXAiLCJhc3NpZ25lZENhdGVnb3JpZXMiLCJuZXdDb2xvck1hcCIsInNsaWNlIiwiY01hcCIsInVuYXNzaWduZWRDb2xvcnMiLCJjYXRlZ29yeSIsIm1heFZhbHVlIiwicHJldlZhbHVlIiwic3RlcCIsImkiLCJsYXllckRhdGEiLCJkYXRhIiwiaGFzQWxsQ29sdW1ucyIsImhhc0xheWVyRGF0YSIsInJlbmRlckxheWVyIiwiQXJyYXkiLCJpc0FycmF5IiwiTWFwIiwiayIsInNldCIsIlNDQUxFX0ZVTkMiLCJmcm9tIiwidW5rbm93biIsIlVOS05PV05fQ09MT1IiLCJnZXRWaXNDaGFubmVsU2NhbGUiLCJkYXRhQWNjZXNzb3IiLCJhdHRyaWJ1dGVBY2Nlc3NvcnMiLCJmaXhlZCIsImFjY2Vzc29yIiwiZ2V0QXR0cmlidXRlVmFsdWUiLCJhZ2dyZWdhdGlvbiIsInNob3VsZEdldFNjYWxlIiwiYXJncyIsImlzRml4ZWQiLCJmaWVsZENvbmZpZyIsImFnZ3JlZ2F0aW9uVmFsdWUiLCJzY2FsZUZ1bmN0aW9uIiwiZ2V0Q29sb3JTY2FsZSIsImdldEVuY29kZWRDaGFubmVsVmFsdWUiLCJDb25zb2xlIiwid2FybiIsIm9yZGluYWwiLCJnZXRQb3NpdGlvbiIsInNhbXBsZURhdGEiLCJudW1Sb3dzIiwicG9pbnRzIiwibWFwSW5kZXgiLCJsYXRCb3VuZHMiLCJsbmdCb3VuZHMiLCJkYXRhVXBkYXRlVHJpZ2dlcnMiLCJ0cmlnZ2VyQ2hhbmdlZCIsIl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMiLCJfYWdncmVnYXRpb24iLCJnZXRWYWx1ZSIsImF0dHJpYnV0ZVZhbHVlIiwiQUxMX0ZJRUxEX1RZUEVTIiwidGltZXN0YW1wIiwiRGF0ZSIsImFsbERhdGEiLCJnZXREYXRhIiwiZGF0YXNldElkIiwiZ2V0TWV0YSIsInRsIiwib2xkTGF5ZXJEYXRhIiwibGF5ZXJEYXRhc2V0IiwidXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyIsImdldFBvc2l0aW9uQWNjZXNzb3IiLCJnZXREYXRhVXBkYXRlVHJpZ2dlcnMiLCJnZXRDaGFuZ2VkVHJpZ2dlcnMiLCJ1cGRhdGVMYXllck1ldGEiLCJjYWxjdWxhdGVEYXRhQXR0cmlidXRlIiwiZGF0YXNldCIsIm9sZEZpZWxkIiwibmV3RGF0YVNldEZpZWxkIiwiZmllbGRzIiwiZmQiLCJuZXdGaWx0ZXIiLCJ0YWJsZSIsImdldERhdGFzZXQiLCJzY2FsZVR5cGUiLCJ1cGRhdGVkRG9tYWluIiwiY2FsY3VsYXRlTGF5ZXJEb21haW4iLCJ2YWxpZGF0ZUZpZWxkVHlwZSIsInZhbGlkYXRlU2NhbGUiLCJ2aXN1YWxDaGFubmVsIiwic3VwcG9ydGVkRmllbGRUeXBlcyIsImNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzIiwiQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwiRklFTERfT1BUUyIsInVwZGF0ZVRyaWdnZXJzIiwiZGF0YVNldEZpZWxkIiwiZiIsImdldENvbHVtbkxheWVyRG9tYWluIiwib2JqZWN0SW5mbyIsImlzTGF5ZXJIb3ZlcmVkIiwicGlja2VkIiwibGF5ZXIiLCJtYXBTdGF0ZSIsImZpeGVkUmFkaXVzIiwicmFkaXVzQ2hhbm5lbCIsInZjIiwidW5kZWZpbmVkIiwicmFkaXVzIiwiZ2V0Wm9vbUZhY3RvciIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImludGVyYWN0aW9uQ29uZmlnIiwiYnJ1c2hpbmdUYXJnZXQiLCJicnVzaCIsImF1dG9IaWdobGlnaHQiLCJicnVzaGluZ1JhZGl1cyIsImJydXNoaW5nRW5hYmxlZCIsImlkeCIsImdwdUZpbHRlciIsInZpc2libGUiLCJtYXNrUG9seWdvbiIsIm1hc2tFeHRlbnNpb25Qcm9wcyIsImNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkxOR0xBVCIsInBpY2thYmxlIiwid3JhcExvbmdpdHVkZSIsInBhcmFtZXRlcnMiLCJkZXB0aFRlc3QiLCJkcmFnUm90YXRlIiwiZW5hYmxlM2QiLCJvcGFjaXR5IiwiZXh0ZW5zaW9ucyIsImZpbHRlclJhbmdlIiwicmVuZGVyT3B0cyIsImdldFBpeGVsT2Zmc2V0Iiwic2hhcmVkUHJvcHMiLCJ0ZXh0TGFiZWxzIiwiZ2V0VGV4dCIsIlRleHRMYXllciIsImNoYXJhY3RlclNldCIsImdldFNpemUiLCJnZXRUZXh0QW5jaG9yIiwiYW5jaG9yIiwiZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJhbGlnbm1lbnQiLCJnZXRDb2xvciIsImdldEZpbHRlclZhbHVlIiwiZ2V0UmFkaXVzIiwia2VwbGVyVGFibGUiLCJmb3VuZExheWVycyIsImRlZmF1bHRGaWVsZHMiLCJhbGxGaWVsZHMiLCJyZXF1aXJlZENvbHVtbnMiLCJwcmV2IiwicmVxdWlyZWRGaWVsZHMiLCJnZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzIiwiYWxsS2V5cyIsInBvaW50ZXJzIiwiY291bnRQZXJLZXkiLCJwYWlycyIsImluY3JlbWVudFBvaW50ZXJzIiwibmV3UGFpciIsImN1dXIiLCJwdHMiLCJjb3VudHMiLCJjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFF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QzhTLFVBQUFBLEdBQUcsQ0FBQzlTLEtBQUQsQ0FBSCxHQUFhOFMsR0FBRyxDQUFDOVMsS0FBRCxDQUFILEdBQWEsQ0FBMUI7QUFDQSxpQkFBTyxJQUFQO0FBQ0Q7O0FBRUQ4UyxRQUFBQSxHQUFHLENBQUM5UyxLQUFELENBQUgsR0FBYSxDQUFiO0FBQ0EsZUFBTzJTLGlCQUFpQixDQUFDRyxHQUFELEVBQU1DLE1BQU4sRUFBYy9TLEtBQUssR0FBRyxDQUF0QixDQUF4QjtBQUNEOztBQUVELGFBQU8wUyxLQUFQO0FBQ0Q7OztXQUVELGtCQUFnQk0sQ0FBaEIsRUFBbUI7QUFDakIsYUFBTywwQkFBU0EsQ0FBVCxDQUFQO0FBQ0Q7Ozs7O2VBcS9CWTdTLEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQga2V5bWlycm9yIGZyb20gJ2tleW1pcnJvcic7XG5pbXBvcnQge0RhdGFGaWx0ZXJFeHRlbnNpb259IGZyb20gJ0BkZWNrLmdsL2V4dGVuc2lvbnMnO1xuaW1wb3J0IHtDT09SRElOQVRFX1NZU1RFTX0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1RleHRMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcblxuaW1wb3J0IERlZmF1bHRMYXllckljb24gZnJvbSAnLi9kZWZhdWx0LWxheWVyLWljb24nO1xuaW1wb3J0IHtkaWZmVXBkYXRlVHJpZ2dlcnN9IGZyb20gJy4vbGF5ZXItdXBkYXRlJztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBOT19WQUxVRV9DT0xPUixcbiAgU0NBTEVfVFlQRVMsXG4gIENIQU5ORUxfU0NBTEVTLFxuICBGSUVMRF9PUFRTLFxuICBTQ0FMRV9GVU5DLFxuICBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMsXG4gIE1BWF9HUFVfRklMVEVSUyxcbiAgVU5LTk9XTl9DT0xPUlxufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge0NPTE9SX1JBTkdFU30gZnJvbSAnY29uc3RhbnRzL2NvbG9yLXJhbmdlcyc7XG5pbXBvcnQge0RhdGFWaXpDb2xvcnN9IGZyb20gJ2NvbnN0YW50cy9jdXN0b20tY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7XG4gIExBWUVSX1ZJU19DT05GSUdTLFxuICBERUZBVUxUX1RFWFRfTEFCRUwsXG4gIERFRkFVTFRfQ09MT1JfVUksXG4gIERFRkFVTFRfSElHSExJR0hUX0NPTE9SLFxuICBERUZBVUxUX0xBWUVSX0xBQkVMXG59IGZyb20gJy4vbGF5ZXItZmFjdG9yeSc7XG5cbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWQsIGlzUGxhaW5PYmplY3R9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtnZXRMYXRMbmdCb3VuZHMsIG5vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge2dldFNhbXBsZURhdGF9IGZyb20gJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLXV0aWxzJztcblxuaW1wb3J0IHtoZXhUb1JnYiwgZ2V0Q29sb3JHcm91cEJ5TmFtZSwgcmV2ZXJzZUNvbG9yUmFuZ2V9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7Z2V0TWFza0V4dGVuc2lvblByb3BzfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2luZGV4JykuTGF5ZXJ9IExheWVyQ2xhc3N9ICovXG5cbi8qKlxuICogQXBwcm94LiBudW1iZXIgb2YgcG9pbnRzIHRvIHNhbXBsZSBpbiBhIGxhcmdlIGRhdGEgc2V0XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgTEFZRVJfSURfTEVOR1RIID0gNjtcblxuY29uc3QgTUFYX1NBTVBMRV9TSVpFID0gNTAwMDtcbmNvbnN0IGRlZmF1bHREb21haW4gPSBbMCwgMV07XG5jb25zdCBkYXRhRmlsdGVyRXh0ZW5zaW9uID0gbmV3IERhdGFGaWx0ZXJFeHRlbnNpb24oe2ZpbHRlclNpemU6IE1BWF9HUFVfRklMVEVSU30pO1xuXG5jb25zdCBkZWZhdWx0RGF0YUFjY2Vzc29yID0gZGMgPT4gZCA9PiBkO1xuY29uc3QgZGVmYXVsdEdldEZpZWxkVmFsdWUgPSAoZmllbGQsIGQpID0+IGZpZWxkLnZhbHVlQWNjZXNzb3IoZCk7XG5cbmV4cG9ydCBjb25zdCBPVkVSTEFZX1RZUEUgPSBrZXltaXJyb3Ioe1xuICBkZWNrZ2w6IG51bGwsXG4gIG1hcGJveGdsOiBudWxsXG59KTtcblxuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JzID0gT2JqZWN0LnZhbHVlcyhEYXRhVml6Q29sb3JzKS5tYXAoaGV4VG9SZ2IpO1xuZnVuY3Rpb24qIGdlbmVyYXRlQ29sb3IoKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxheWVyQ29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGxheWVyQ29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBsYXllckNvbG9yc1tpbmRleCsrXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuLyoqIEB0eXBlIHtMYXllckNsYXNzfSAqL1xuY2xhc3MgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG5cbiAgICAvLyBtZXRhXG4gICAgdGhpcy5tZXRhID0ge307XG5cbiAgICAvLyB2aXNDb25maWdTZXR0aW5nc1xuICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHtcbiAgICAgIGNvbHVtbnM6IHRoaXMuZ2V0TGF5ZXJDb2x1bW5zKCksXG4gICAgICAuLi5wcm9wc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gRGVmYXVsdExheWVySWNvbjtcbiAgfVxuXG4gIGdldCBvdmVybGF5VHlwZSgpIHtcbiAgICByZXR1cm4gT1ZFUkxBWV9UWVBFLmRlY2tnbDtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IG5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICByZXR1cm4gWydsYWJlbCcsICdvcGFjaXR5JywgJ3RoaWNrbmVzcycsICdpc1Zpc2libGUnLCAnaGlkZGVuJ107XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY29sb3InLFxuICAgICAgICBmaWVsZDogJ2NvbG9yRmllbGQnLFxuICAgICAgICBzY2FsZTogJ2NvbG9yU2NhbGUnLFxuICAgICAgICBkb21haW46ICdjb2xvckRvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY29sb3JSYW5nZScsXG4gICAgICAgIGtleTogJ2NvbG9yJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY29sb3IsXG4gICAgICAgIG51bGxWYWx1ZTogTk9fVkFMVUVfQ09MT1IsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy5jb2xvclxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzaXplJyxcbiAgICAgICAgZmllbGQ6ICdzaXplRmllbGQnLFxuICAgICAgICBzY2FsZTogJ3NpemVTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ3NpemVEb21haW4nLFxuICAgICAgICByYW5nZTogJ3NpemVSYW5nZScsXG4gICAgICAgIGtleTogJ3NpemUnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5zaXplLFxuICAgICAgICBudWxsVmFsdWU6IDAsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogMVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKlxuICAgKiBDb2x1bW4gcGFpcnMgbWFwcyBsYXllciBjb2x1bW4gdG8gYSBzcGVjaWZpYyBmaWVsZCBwYWlycyxcbiAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIG51bGxcbiAgICovXG4gIGdldCBjb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgcG9pbnQgY29sdW1uIHBhaXJzLCBjYW4gYmUgdXNlZCBmb3IgcG9pbnQgYmFzZWQgbGF5ZXJzOiBwb2ludCwgaWNvbiBldGMuXG4gICAqL1xuICBnZXQgZGVmYXVsdFBvaW50Q29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdDoge3BhaXI6ICdsbmcnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzoge3BhaXI6ICdsYXQnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfVxuICAgIH07XG4gIH1cblxuICAvKlxuICAgKiBEZWZhdWx0IGxpbmsgY29sdW1uIHBhaXJzLCBjYW4gYmUgdXNlZCBmb3IgbGluayBiYXNlZCBsYXllcnM6IGFyYywgbGluZSBldGNcbiAgICovXG4gIGdldCBkZWZhdWx0TGlua0NvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXQwOiB7cGFpcjogJ2xuZzAnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzA6IHtwYWlyOiAnbGF0MCcsIGZpZWxkUGFpcktleTogJ2xuZyd9LFxuICAgICAgbGF0MToge3BhaXI6ICdsbmcxJywgZmllbGRQYWlyS2V5OiAnbGF0J30sXG4gICAgICBsbmcxOiB7cGFpcjogJ2xhdDEnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgUmVhY3QgY29tcG9uZW50IGZvciB0byByZW5kZXIgbGF5ZXIgaW5zdHJ1Y3Rpb25zIGluIGEgbW9kYWxcbiAgICogQHJldHVybnMge29iamVjdH0gLSBhbiBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogIHJldHVybiB7XG4gICAqICAgIGlkOiAnaWNvbkluZm8nLFxuICAgKiAgICB0ZW1wbGF0ZTogSWNvbkluZm9Nb2RhbCxcbiAgICogICAgbW9kYWxQcm9wczoge1xuICAgKiAgICAgIHRpdGxlOiAnSG93IHRvIGRyYXcgaWNvbnMnXG4gICAqICAgfTtcbiAgICogfVxuICAgKi9cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qXG4gICAqIEdpdmVuIGEgZGF0YXNldCwgYXV0b21hdGljYWxseSBmaW5kIHByb3BzIHRvIGNyZWF0ZSBsYXllciBiYXNlZCBvbiBpdFxuICAgKiBhbmQgcmV0dXJuIHRoZSBwcm9wcyBhbmQgcHJldmlvdXMgZm91bmQgbGF5ZXJzLlxuICAgKiBCeSBkZWZhdWx0LCBubyBsYXllcnMgd2lsbCBiZSBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyhkYXRhc2V0LCBmb3VuZExheWVycykge1xuICAgIHJldHVybiB7cHJvcHM6IFtdLCBmb3VuZExheWVyc307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBhcnJheSBvZiBwcmVzZXQgcmVxdWlyZWQgY29sdW1uIG5hbWVzXG4gICAqIGZvdW5kIGZpZWxkIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdG8gc2V0IGFzIGxheWVyIGNvbHVtblxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGVmYXVsdEZpZWxkc1xuICAgKiBAcGFyYW0ge29iamVjdFtdfSBhbGxGaWVsZHNcbiAgICogQHJldHVybnMge29iamVjdFtdIHwgbnVsbH0gYWxsIHBvc3NpYmxlIHJlcXVpcmVkIGxheWVyIGNvbHVtbiBwYWlyc1xuICAgKi9cbiAgc3RhdGljIGZpbmREZWZhdWx0Q29sdW1uRmllbGQoZGVmYXVsdEZpZWxkcywgYWxsRmllbGRzKSB7XG4gICAgLy8gZmluZCBhbGwgbWF0Y2hlZCBmaWVsZHMgZm9yIGVhY2ggcmVxdWlyZWQgY29sXG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZGVmYXVsdEZpZWxkcykucmVkdWNlKChwcmV2LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gYWxsRmllbGRzLmZpbHRlcihcbiAgICAgICAgZiA9PiBmLm5hbWUgPT09IGRlZmF1bHRGaWVsZHNba2V5XSB8fCBkZWZhdWx0RmllbGRzW2tleV0uaW5jbHVkZXMoZi5uYW1lKVxuICAgICAgKTtcblxuICAgICAgcHJldltrZXldID0gcmVxdWlyZWRGaWVsZHMubGVuZ3RoXG4gICAgICAgID8gcmVxdWlyZWRGaWVsZHMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgIHZhbHVlOiBmLm5hbWUsXG4gICAgICAgICAgICBmaWVsZElkeDogZi5maWVsZElkeFxuICAgICAgICAgIH0pKVxuICAgICAgICA6IG51bGw7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9LCB7fSk7XG5cbiAgICBpZiAoIU9iamVjdC52YWx1ZXMocmVxdWlyZWRDb2x1bW5zKS5ldmVyeShCb29sZWFuKSkge1xuICAgICAgLy8gaWYgYW55IGZpZWxkIG1pc3NpbmcsIHJldHVybiBudWxsXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsUG9zc2libGVDb2x1bW5QYXJpcyhyZXF1aXJlZENvbHVtbnMpIHtcbiAgICAvLyBmb3IgbXVsdGlwbGUgbWF0Y2hlZCBmaWVsZCBmb3Igb25lIHJlcXVpcmVkIGNvbHVtbiwgcmV0dXJuIG11bHRpcGxlXG4gICAgLy8gY29tYmluYXRpb25zLCBlLiBnLiBpZiBjb2x1bW4gYSBoYXMgMiBtYXRjaGVkLCBjb2x1bW4gYiBoYXMgMyBtYXRjaGVkXG4gICAgLy8gNiBwb3NzaWJsZSBjb2x1bW4gcGFpcnMgd2lsbCBiZSByZXR1cm5lZFxuICAgIGNvbnN0IGFsbEtleXMgPSBPYmplY3Qua2V5cyhyZXF1aXJlZENvbHVtbnMpO1xuICAgIGNvbnN0IHBvaW50ZXJzID0gYWxsS2V5cy5tYXAoKGssIGkpID0+ICgoaSA9PT0gYWxsS2V5cy5sZW5ndGggLSAxID8gLTEgOiAwKSkpO1xuICAgIGNvbnN0IGNvdW50UGVyS2V5ID0gYWxsS2V5cy5tYXAoayA9PiByZXF1aXJlZENvbHVtbnNba10ubGVuZ3RoKTtcbiAgICBjb25zdCBwYWlycyA9IFtdO1xuXG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG4gICAgd2hpbGUgKGluY3JlbWVudFBvaW50ZXJzKHBvaW50ZXJzLCBjb3VudFBlcktleSwgcG9pbnRlcnMubGVuZ3RoIC0gMSkpIHtcbiAgICAgIGNvbnN0IG5ld1BhaXIgPSBwb2ludGVycy5yZWR1Y2UoKHByZXYsIGN1dXIsIGkpID0+IHtcbiAgICAgICAgcHJldlthbGxLZXlzW2ldXSA9IHJlcXVpcmVkQ29sdW1uc1thbGxLZXlzW2ldXVtjdXVyXTtcbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIHBhaXJzLnB1c2gobmV3UGFpcik7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cbiAgICAvLyByZWN1cnNpdmVseSBpbmNyZW1lbnQgcG9pbnRlcnNcbiAgICBmdW5jdGlvbiBpbmNyZW1lbnRQb2ludGVycyhwdHMsIGNvdW50cywgaW5kZXgpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBwdHNbMF0gPT09IGNvdW50c1swXSAtIDEpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBpbmNyZW1lbnRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHRzW2luZGV4XSArIDEgPCBjb3VudHNbaW5kZXhdKSB7XG4gICAgICAgIHB0c1tpbmRleF0gPSBwdHNbaW5kZXhdICsgMTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHB0c1tpbmRleF0gPSAwO1xuICAgICAgcmV0dXJuIGluY3JlbWVudFBvaW50ZXJzKHB0cywgY291bnRzLCBpbmRleCAtIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBwYWlycztcbiAgfVxuXG4gIHN0YXRpYyBoZXhUb1JnYihjKSB7XG4gICAgcmV0dXJuIGhleFRvUmdiKGMpO1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YUlkOiBwcm9wcy5kYXRhSWQgfHwgbnVsbCxcbiAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCB8fCBERUZBVUxUX0xBWUVSX0xBQkVMLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yIHx8IGNvbG9yTWFrZXIubmV4dCgpLnZhbHVlLFxuICAgICAgY29sdW1uczogcHJvcHMuY29sdW1ucyB8fCBudWxsLFxuICAgICAgaXNWaXNpYmxlOiBwcm9wcy5pc1Zpc2libGUgfHwgZmFsc2UsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogcHJvcHMuaXNDb25maWdBY3RpdmUgfHwgZmFsc2UsXG4gICAgICBoaWdobGlnaHRDb2xvcjogcHJvcHMuaGlnaGxpZ2h0Q29sb3IgfHwgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gICAgICBoaWRkZW46IHByb3BzLmhpZGRlbiB8fCBmYWxzZSxcblxuICAgICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBpbnRvIHNlcGFyYXRlIHZpc3VhbCBDaGFubmVsIGNvbmZpZ1xuICAgICAgLy8gY29sb3IgYnkgZmllbGQsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIGNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBjb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgY29sb3JTY2FsZTogU0NBTEVfVFlQRVMucXVhbnRpbGUsXG5cbiAgICAgIC8vIGNvbG9yIGJ5IHNpemUsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIHNpemVEb21haW46IFswLCAxXSxcbiAgICAgIHNpemVTY2FsZTogU0NBTEVfVFlQRVMubGluZWFyLFxuICAgICAgc2l6ZUZpZWxkOiBudWxsLFxuXG4gICAgICB2aXNDb25maWc6IHt9LFxuXG4gICAgICB0ZXh0TGFiZWw6IFtERUZBVUxUX1RFWFRfTEFCRUxdLFxuXG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIGNvbG9yOiBERUZBVUxUX0NPTE9SX1VJLFxuICAgICAgICBjb2xvclJhbmdlOiBERUZBVUxUX0NPTE9SX1VJXG4gICAgICB9LFxuICAgICAgYW5pbWF0aW9uOiB7ZW5hYmxlZDogZmFsc2V9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIGEgdmlzdWFsQ2hhbm5lbCBjb25maWdcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcmV0dXJucyB7e2xhYmVsOiBzdHJpbmcsIG1lYXN1cmU6IChzdHJpbmd8c3RyaW5nKX19XG4gICAqL1xuICBnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oa2V5KSB7XG4gICAgLy8gZS5nLiBsYWJlbDogQ29sb3IsIG1lYXN1cmU6IFZlaGljbGUgVHlwZVxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogdGhpcy52aXNDb25maWdTZXR0aW5nc1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0ucmFuZ2VdLmxhYmVsLFxuICAgICAgbWVhc3VyZTogdGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmZpZWxkXVxuICAgICAgICA/ICh0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdLmRpc3BsYXlOYW1lIHx8XG4gICAgICAgICAgdGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmZpZWxkXS5uYW1lKVxuICAgICAgICA6IHRoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5kZWZhdWx0TWVhc3VyZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgdG8gbGF5ZXIgY29sdW1uLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gZmllbGQgLSBTZWxlY3RlZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7e319IC0gQ29sdW1uIGNvbmZpZ1xuICAgKi9cbiAgYXNzaWduQ29sdW1uKGtleSwgZmllbGQpIHtcbiAgICAvLyBmaWVsZCB2YWx1ZSBjb3VsZCBiZSBudWxsIGZvciBvcHRpb25hbCBjb2x1bW5zXG4gICAgY29uc3QgdXBkYXRlID0gZmllbGRcbiAgICAgID8ge1xuICAgICAgICAgIHZhbHVlOiBmaWVsZC5uYW1lLFxuICAgICAgICAgIGZpZWxkSWR4OiBmaWVsZC5maWVsZElkeFxuICAgICAgICB9XG4gICAgICA6IHt2YWx1ZTogbnVsbCwgZmllbGRJZHg6IC0xfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgW2tleV06IHtcbiAgICAgICAgLi4udGhpcy5jb25maWcuY29sdW1uc1trZXldLFxuICAgICAgICAuLi51cGRhdGVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbiBhIGZpZWxkIHBhaXIgdG8gY29sdW1uIGNvbmZpZywgcmV0dXJuIGNvbHVtbiBjb25maWdcbiAgICogQHBhcmFtIGtleSAtIENvbHVtbiBLZXlcbiAgICogQHBhcmFtIHBhaXIgLSBmaWVsZCBQYWlyXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQ29sdW1uIGNvbmZpZ1xuICAgKi9cbiAgYXNzaWduQ29sdW1uUGFpcnMoa2V5LCBwYWlyKSB7XG4gICAgaWYgKCF0aGlzLmNvbHVtblBhaXJzIHx8ICF0aGlzLmNvbHVtblBhaXJzPy5ba2V5XSkge1xuICAgICAgLy8gc2hvdWxkIG5vdCBlbmQgaW4gdGhpcyBzdGF0ZVxuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvbHVtbnM7XG4gICAgfVxuXG4gICAgY29uc3Qge3BhaXI6IHBhcnRuZXJLZXksIGZpZWxkUGFpcktleX0gPSB0aGlzLmNvbHVtblBhaXJzPy5ba2V5XTtcbiAgICBjb25zdCB7ZmllbGRQYWlyS2V5OiBwYXJ0bmVyRmllbGRQYWlyS2V5fSA9IHRoaXMuY29sdW1uUGFpcnM/LltwYXJ0bmVyS2V5XTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgW2tleV06IHBhaXJbZmllbGRQYWlyS2V5XSxcbiAgICAgIFtwYXJ0bmVyS2V5XTogcGFpcltwYXJ0bmVyRmllbGRQYWlyS2V5XVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGEgcmFkaXVzIHpvb20gbXVsdGlwbGllciB0byByZW5kZXIgcG9pbnRzLCBzbyB0aGV5IGFyZSB2aXNpYmxlIGluIGFsbCB6b29tIGxldmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYXBTdGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWFwU3RhdGUuem9vbSAtIGFjdHVhbCB6b29tXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdm9pZH0gbWFwU3RhdGUuem9vbU9mZnNldCAtIHpvb21PZmZzZXQgd2hlbiByZW5kZXIgaW4gdGhlIHBsb3QgY29udGFpbmVyIGZvciBleHBvcnQgaW1hZ2VcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldFpvb21GYWN0b3Ioe3pvb20sIHpvb21PZmZzZXQgPSAwfSkge1xuICAgIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLm1heCgxNCAtIHpvb20gKyB6b29tT2Zmc2V0LCAwKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGEgZWxldmF0aW9uIHpvb20gbXVsdGlwbGllciB0byByZW5kZXIgcG9pbnRzLCBzbyB0aGV5IGFyZSB2aXNpYmxlIGluIGFsbCB6b29tIGxldmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYXBTdGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWFwU3RhdGUuem9vbSAtIGFjdHVhbCB6b29tXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdm9pZH0gbWFwU3RhdGUuem9vbU9mZnNldCAtIHpvb21PZmZzZXQgd2hlbiByZW5kZXIgaW4gdGhlIHBsb3QgY29udGFpbmVyIGZvciBleHBvcnQgaW1hZ2VcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldEVsZXZhdGlvblpvb21GYWN0b3Ioe3pvb20sIHpvb21PZmZzZXQgPSAwfSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWcuZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvclxuICAgICAgPyBNYXRoLnBvdygyLCBNYXRoLm1heCg4IC0gem9vbSArIHpvb21PZmZzZXQsIDApKVxuICAgICAgOiAxO1xuICB9XG5cbiAgZm9ybWF0TGF5ZXJEYXRhKGRhdGFzZXRzLCBmaWx0ZXJlZEluZGV4KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0SG92ZXJEYXRhKG9iamVjdCwgZGF0YUNvbnRhaW5lcikge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCBlYWNoIGVudHJ5IG9mIGxheWVyRGF0YSBzaG91bGQgaGF2ZSBhbiBpbmRleCBvZiBhIHJvdyBpbiB0aGUgb3JpZ2luYWwgZGF0YSBjb250YWluZXIuXG4gICAgLy8gRWFjaCBsYXllciBjYW4gaW1wbGVtZW50IGl0cyBvd24gZ2V0SG92ZXJEYXRhIG1ldGhvZFxuICAgIHJldHVybiBkYXRhQ29udGFpbmVyLnJvdyhvYmplY3QuaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gY2hhbmdlIGxheWVyIHR5cGUsIHRyeSB0byBjb3B5IG92ZXIgbGF5ZXIgY29uZmlncyBhcyBtdWNoIGFzIHBvc3NpYmxlXG4gICAqIEBwYXJhbSBjb25maWdUb0NvcHkgLSBjb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB2aXNDb25maWdTZXR0aW5ncyAtIHZpc0NvbmZpZyBzZXR0aW5ncyBvZiBjb25maWcgdG8gY29weVxuICAgKi9cbiAgYXNzaWduQ29uZmlnVG9MYXllcihjb25maWdUb0NvcHksIHZpc0NvbmZpZ1NldHRpbmdzKSB7XG4gICAgLy8gZG9uJ3QgZGVlcCBtZXJnZSB2aXN1YWxDaGFubmVsIGZpZWxkXG4gICAgLy8gZG9uJ3QgZGVlcCBtZXJnZSBjb2xvciByYW5nZSwgcmV2ZXJzZWQ6IGlzIG5vdCBhIGtleSBieSBkZWZhdWx0XG4gICAgY29uc3Qgc2hhbGxvd0NvcHkgPSBbJ2NvbG9yUmFuZ2UnLCAnc3Ryb2tlQ29sb3JSYW5nZSddLmNvbmNhdChcbiAgICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykubWFwKHYgPT4gdi5maWVsZClcbiAgICApO1xuXG4gICAgLy8gZG9uJ3QgY29weSBvdmVyIGRvbWFpbiBhbmQgYW5pbWF0aW9uXG4gICAgY29uc3Qgbm90VG9Db3B5ID0gWydhbmltYXRpb24nXS5jb25jYXQoT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5tYXAodiA9PiB2LmRvbWFpbikpO1xuICAgIC8vIGlmIHJhbmdlIGlzIGZvciB0aGUgc2FtZSBwcm9wZXJ0eSBncm91cCBjb3B5IGl0LCBvdGhlcndpc2UsIG5vdCB0byBjb3B5XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKHYgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBjb25maWdUb0NvcHkudmlzQ29uZmlnW3YucmFuZ2VdICYmXG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3Nbdi5yYW5nZV0gJiZcbiAgICAgICAgdmlzQ29uZmlnU2V0dGluZ3Nbdi5yYW5nZV0uZ3JvdXAgIT09IHRoaXMudmlzQ29uZmlnU2V0dGluZ3Nbdi5yYW5nZV0uZ3JvdXBcbiAgICAgICkge1xuICAgICAgICBub3RUb0NvcHkucHVzaCh2LnJhbmdlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGRvbid0IGNvcHkgb3ZlciB2aXN1YWxDaGFubmVsIHJhbmdlXG4gICAgY29uc3QgY3VycmVudENvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGNvcGllZCA9IHRoaXMuY29weUxheWVyQ29uZmlnKGN1cnJlbnRDb25maWcsIGNvbmZpZ1RvQ29weSwge1xuICAgICAgc2hhbGxvd0NvcHksXG4gICAgICBub3RUb0NvcHlcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoY29waWVkKTtcbiAgICAvLyB2YWxpZGF0ZSB2aXN1YWxDaGFubmVsIGZpZWxkIHR5cGUgYW5kIHNjYWxlIHR5cGVzXG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICogUmVjdXJzaXZlbHkgY29weSBjb25maWcgb3ZlciB0byBhbiBlbXB0eSBsYXllclxuICAgKiB3aGVuIHJlY2VpdmVkIHNhdmVkIGNvbmZpZywgb3IgY29weSBjb25maWcgb3ZlciBmcm9tIGEgZGlmZmVyZW50IGxheWVyIHR5cGVcbiAgICogbWFrZSBzdXJlIHRvIG9ubHkgY29weSBvdmVyIHZhbHVlIHRvIGV4aXN0aW5nIGtleXNcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb25maWcgLSBleGlzdGluZyBjb25maWcgdG8gYmUgb3ZlcnJpZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1RvQ29weSAtIG5ldyBDb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNoYWxsb3dDb3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyB0byBub3QgdG8gYmUgZGVlcCBjb3BpZWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9Db3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyBub3QgdG8gY29weVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGNvcGllZCBjb25maWdcbiAgICovXG4gIGNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnLCBjb25maWdUb0NvcHksIHtzaGFsbG93Q29weSA9IFtdLCBub3RUb0NvcHkgPSBbXX0gPSB7fSkge1xuICAgIGNvbnN0IGNvcGllZCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50Q29uZmlnW2tleV0pICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY29uZmlnVG9Db3B5W2tleV0pICYmXG4gICAgICAgICFzaGFsbG93Q29weS5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGFzc2lnbiBvYmplY3QgdmFsdWVcbiAgICAgICAgY29waWVkW2tleV0gPSB0aGlzLmNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnW2tleV0sIGNvbmZpZ1RvQ29weVtrZXldLCB7XG4gICAgICAgICAgc2hhbGxvd0NvcHksXG4gICAgICAgICAgbm90VG9Db3B5XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChub3ROdWxsb3JVbmRlZmluZWQoY29uZmlnVG9Db3B5W2tleV0pICYmICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAvLyBjb3B5XG4gICAgICAgIGNvcGllZFtrZXldID0gY29uZmlnVG9Db3B5W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBrZWVwIGV4aXN0aW5nXG4gICAgICAgIGNvcGllZFtrZXldID0gY3VycmVudENvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuXG4gIHJlZ2lzdGVyVmlzQ29uZmlnKGxheWVyVmlzQ29uZmlncykge1xuICAgIE9iamVjdC5rZXlzKGxheWVyVmlzQ29uZmlncykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXSkge1xuICAgICAgICAvLyBpZiBhc3NpZ25lZCBvbmUgb2YgZGVmYXVsdCBMQVlFUl9DT05GSUdTXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2xheWVyVmlzQ29uZmlnc1tpdGVtXV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW2l0ZW1dID0gTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXTtcbiAgICAgIH0gZWxzZSBpZiAoWyd0eXBlJywgJ2RlZmF1bHRWYWx1ZSddLmV2ZXJ5KHAgPT4gbGF5ZXJWaXNDb25maWdzW2l0ZW1dLmhhc093blByb3BlcnR5KHApKSkge1xuICAgICAgICAvLyBpZiBwcm92aWRlZCBjdXN0b21pemVkIHZpc0NvbmZpZywgYW5kIGhhcyB0eXBlICYmIGRlZmF1bHRWYWx1ZVxuICAgICAgICAvLyBUT0RPOiBmdXJ0aGVyIGNoZWNrIGlmIGN1c3RvbWl6ZWQgdmlzQ29uZmlnIGlzIHZhbGlkXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IGxheWVyVmlzQ29uZmlnc1tpdGVtXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbaXRlbV0gPSBsYXllclZpc0NvbmZpZ3NbaXRlbV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXllckNvbHVtbnMoKSB7XG4gICAgY29uc3QgY29sdW1uVmFsaWRhdG9ycyA9IHRoaXMuY29sdW1uVmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCByZXF1aXJlZCA9IHRoaXMucmVxdWlyZWRMYXllckNvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtblZhbGlkYXRvcnNba2V5XVxuICAgICAgICAgID8ge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIHZhbGlkYXRvcjogY29sdW1uVmFsaWRhdG9yc1trZXldfVxuICAgICAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbCA9IHRoaXMub3B0aW9uYWxDb2x1bW5zLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7Li4ucmVxdWlyZWQsIC4uLm9wdGlvbmFsfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gey4uLnRoaXMuY29uZmlnLCAuLi5uZXdDb25maWd9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXNDb25maWcobmV3VmlzQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcudmlzQ29uZmlnID0gey4uLnRoaXMuY29uZmlnLnZpc0NvbmZpZywgLi4ubmV3VmlzQ29uZmlnfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpIHtcbiAgICBjb25zdCB7Y29sb3JVSTogcHJldmlvdXMsIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChuZXdDb25maWcpIHx8IHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JVSVByb3AgPSBPYmplY3QuZW50cmllcyhuZXdDb25maWcpLnJlZHVjZSgoYWNjdSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogaXNQbGFpbk9iamVjdChhY2N1W2tleV0pICYmIGlzUGxhaW5PYmplY3QodmFsdWUpID8gey4uLmFjY3Vba2V5XSwgLi4udmFsdWV9IDogdmFsdWVcbiAgICAgIH07XG4gICAgfSwgcHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSk7XG5cbiAgICBjb25zdCBjb2xvclVJID0ge1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICBbcHJvcF06IGNvbG9yVUlQcm9wXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe2NvbG9yVUl9KTtcbiAgICAvLyBpZiBjb2xvclVJW3Byb3BdIGlzIGNvbG9yUmFuZ2VcbiAgICBjb25zdCBpc0NvbG9yUmFuZ2UgPSB2aXNDb25maWdbcHJvcF0gJiYgdmlzQ29uZmlnW3Byb3BdLmNvbG9ycztcblxuICAgIGlmIChpc0NvbG9yUmFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sb3JVSUJ5Q29sb3JSYW5nZShuZXdDb25maWcsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21QYWxldHRlKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlQ3VzdG9tUGFsZXR0ZShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgaWYgKCFuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyB8fCAhbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuY3VzdG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghdmlzQ29uZmlnW3Byb3BdKSByZXR1cm47XG4gICAgY29uc3Qge2NvbG9yc30gPSB2aXNDb25maWdbcHJvcF07XG4gICAgY29uc3QgY3VzdG9tUGFsZXR0ZSA9IHtcbiAgICAgIC4uLmNvbG9yVUlbcHJvcF0uY3VzdG9tUGFsZXR0ZSxcbiAgICAgIG5hbWU6ICdDdXN0b20gUGFsZXR0ZScsXG4gICAgICBjb2xvcnM6IFsuLi5jb2xvcnNdXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uY29sb3JVSSxcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgLi4uY29sb3JVSVtwcm9wXSxcbiAgICAgICAgICBjdXN0b21QYWxldHRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogaWYgb3BlbiBkcm9wZG93biBhbmQgcHJvcCBpcyBjb2xvciByYW5nZVxuICAgKiBBdXRvbWF0aWNhbGx5IHNldCBjb2xvclJhbmdlQ29uZmlnJ3Mgc3RlcCBhbmQgcmV2ZXJzZWRcbiAgICogQHBhcmFtIHsqfSBuZXdDb25maWdcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICB1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlKG5ld0NvbmZpZywgcHJvcCkge1xuICAgIGlmICh0eXBlb2YgbmV3Q29uZmlnLnNob3dEcm9wZG93biAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIC4uLmNvbG9yVUksXG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0sXG4gICAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgICAgLi4uY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnLFxuICAgICAgICAgICAgc3RlcHM6IHZpc0NvbmZpZ1twcm9wXS5jb2xvcnMubGVuZ3RoLFxuICAgICAgICAgICAgcmV2ZXJzZWQ6IEJvb2xlYW4odmlzQ29uZmlnW3Byb3BdLnJldmVyc2VkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgdXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgLy8gb25seSB1cGRhdGUgY29sb3JSYW5nZSBpZiBjaGFuZ2VzIGluIFVJIGlzIG1hZGUgdG8gJ3JldmVyc2VkJywgJ3N0ZXBzJyBvciBzdGVwc1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9XG4gICAgICBuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyAmJlxuICAgICAgWydyZXZlcnNlZCcsICdzdGVwcyddLnNvbWUoXG4gICAgICAgIGtleSA9PlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmhhc093blByb3BlcnR5KGtleSkgJiZcbiAgICAgICAgICBuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZ1trZXldICE9PVxuICAgICAgICAgICAgKHByZXZpb3VzW3Byb3BdIHx8IERFRkFVTFRfQ09MT1JfVUkpLmNvbG9yUmFuZ2VDb25maWdba2V5XVxuICAgICAgKTtcbiAgICBpZiAoIXNob3VsZFVwZGF0ZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7c3RlcHMsIHJldmVyc2VkfSA9IGNvbG9yVUlbcHJvcF0uY29sb3JSYW5nZUNvbmZpZztcbiAgICBjb25zdCBjb2xvclJhbmdlID0gdmlzQ29uZmlnW3Byb3BdO1xuICAgIC8vIGZpbmQgYmFzZWQgb24gc3RlcCBvciByZXZlcnNlZFxuICAgIGxldCB1cGRhdGU7XG4gICAgaWYgKG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmhhc093blByb3BlcnR5KCdzdGVwcycpKSB7XG4gICAgICBjb25zdCBncm91cCA9IGdldENvbG9yR3JvdXBCeU5hbWUoY29sb3JSYW5nZSk7XG5cbiAgICAgIGlmIChncm91cCkge1xuICAgICAgICBjb25zdCBzYW1lR3JvdXAgPSBDT0xPUl9SQU5HRVMuZmlsdGVyKGNyID0+IGdldENvbG9yR3JvdXBCeU5hbWUoY3IpID09PSBncm91cCk7XG5cbiAgICAgICAgdXBkYXRlID0gc2FtZUdyb3VwLmZpbmQoY3IgPT4gY3IuY29sb3JzLmxlbmd0aCA9PT0gc3RlcHMpO1xuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5yZXZlcnNlZCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHJldmVyc2VDb2xvclJhbmdlKHRydWUsIHVwZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlICYmIGNvbG9yUmFuZ2UuY29sb3JNYXApIHtcbiAgICAgICAgICB1cGRhdGUgPSB0aGlzLnVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yUmFuZ2UuY29sb3JNYXAsIHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3JldmVyc2VkJykpIHtcbiAgICAgIHVwZGF0ZSA9IHJldmVyc2VDb2xvclJhbmdlKHJldmVyc2VkLCB1cGRhdGUgfHwgY29sb3JSYW5nZSk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllclZpc0NvbmZpZyh7W3Byb3BdOiB1cGRhdGV9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb2xvck1hcChwcm9wLCBjb2xvck1hcCwgY29sb3JSYW5nZSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7ZmllbGQsIGRvbWFpbn0gPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmFsdWUgPT4gdmFsdWUucmFuZ2UgPT09IHByb3ApO1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmNvbmZpZ1tmaWVsZF0/LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2F0ZWdvcnlDb2xvck1hcChjb2xvck1hcCwgdGhpcy5jb25maWdbZG9tYWluXSwgY29sb3JSYW5nZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gdHlwZSBvciB0eXBlIGlzIG5vdCBzdHJpbmcsIGJvb2xlYW4gb3IgZGF0ZVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZU51bWVyaWNDb2xvck1hcChjb2xvck1hcCwgdGhpcy5jb25maWdbZG9tYWluXSwgY29sb3JSYW5nZSk7XG4gIH1cblxuICB1cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCBkb21haW4sIGNvbG9yUmFuZ2UpIHtcbiAgICBjb25zdCBjb2xvcnMgPSBjb2xvclJhbmdlLmNvbG9ycztcbiAgICBjb25zdCBhc3NpZ25lZENhdGVnb3JpZXMgPSBbXTtcbiAgICBjb25zdCBuZXdDb2xvck1hcCA9IGNvbG9yTWFwLnNsaWNlKDAsIGNvbG9ycy5sZW5ndGgpLm1hcCgoY01hcCwgaW5kZXgpID0+IHtcbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNNYXBbMF0pO1xuICAgICAgcmV0dXJuIFtjTWFwWzBdLCBjb2xvcnNbaW5kZXhdXTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmFzc2lnbmVkQ29sb3JzID0gY29sb3JzLnNsaWNlKG5ld0NvbG9yTWFwLmxlbmd0aCwgY29sb3JzLmxlbmd0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIHVuYXNzaWduZWRDb2xvcnMpIHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5ID0gZG9tYWluLmZpbmQoZCA9PiAhYXNzaWduZWRDYXRlZ29yaWVzLmluY2x1ZGVzKGQpKTtcbiAgICAgIGlmICghY2F0ZWdvcnkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBhc3NpZ25lZENhdGVnb3JpZXMucHVzaChjYXRlZ29yeSk7XG4gICAgICBuZXdDb2xvck1hcC5wdXNoKFtjYXRlZ29yeSwgY29sb3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbG9yUmFuZ2UsXG4gICAgICBjb2xvck1hcDogbmV3Q29sb3JNYXBcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCBkb21haW4sIHVwZGF0ZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHVwZGF0ZS5jb2xvcnM7XG4gICAgbGV0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCk7XG5cbiAgICBuZXdDb2xvck1hcCA9IG5ld0NvbG9yTWFwLm1hcCgoY01hcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5kZXggPT09IG5ld0NvbG9yTWFwLmxlbmd0aCAtIDEgPyBudWxsIDogY01hcFswXTtcbiAgICAgIHJldHVybiBbdmFsdWUsIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGlmICh1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1heFZhbHVlID0gZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IG5ld0NvbG9yTWFwW25ld0NvbG9yTWFwLmxlbmd0aCAtIDJdWzBdO1xuICAgICAgY29uc3Qgc3RlcCA9IChtYXhWYWx1ZSAtIHByZXZWYWx1ZSkgLyAodW5hc3NpZ25lZENvbG9ycy5sZW5ndGggKyAxKTtcbiAgICAgIG5ld0NvbG9yTWFwW25ld0NvbG9yTWFwLmxlbmd0aCAtIDFdWzBdID0gcHJldlZhbHVlICsgc3RlcDtcblxuICAgICAgZm9yIChjb25zdCBbaSwgY29sb3JdIG9mIHVuYXNzaWduZWRDb2xvcnMuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaSA9PT0gdW5hc3NpZ25lZENvbG9ycy5sZW5ndGggLSAxID8gbnVsbCA6IHByZXZWYWx1ZSArIChzdGVwICogKGkgKyAyKSk7XG4gICAgICAgIG5ld0NvbG9yTWFwLnB1c2goW3ZhbHVlLCBjb2xvcl0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4udXBkYXRlLFxuICAgICAgY29sb3JNYXA6IG5ld0NvbG9yTWFwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIGxheWVyIGhhcyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0geWVzIG9yIG5vXG4gICAqL1xuICBoYXNBbGxDb2x1bW5zKCkge1xuICAgIGNvbnN0IHtjb2x1bW5zfSA9IHRoaXMuY29uZmlnO1xuICAgIHJldHVybiAoXG4gICAgICAoY29sdW1ucyAmJlxuICAgICAgT2JqZWN0LnZhbHVlcyhjb2x1bW5zKS5ldmVyeSh2ID0+IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odi5vcHRpb25hbCB8fCAodi52YWx1ZSAmJiB2LmZpZWxkSWR4ID4gLTEpKTtcbiAgICAgIH0pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBsYXllciBoYXMgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5IHwgT2JqZWN0fSBsYXllckRhdGFcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzTGF5ZXJEYXRhKGxheWVyRGF0YSkge1xuICAgIGlmICghbGF5ZXJEYXRhKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBCb29sZWFuKGxheWVyRGF0YS5kYXRhICYmIGxheWVyRGF0YS5kYXRhLmxlbmd0aCk7XG4gIH1cblxuICBpc1ZhbGlkVG9TYXZlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgJiYgdGhpcy5oYXNBbGxDb2x1bW5zKCk7XG4gIH1cblxuICBzaG91bGRSZW5kZXJMYXllcihkYXRhKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnR5cGUgJiZcbiAgICAgIHRoaXMuaGFzQWxsQ29sdW1ucygpICYmXG4gICAgICB0aGlzLmhhc0xheWVyRGF0YShkYXRhKSAmJlxuICAgICAgdHlwZW9mIHRoaXMucmVuZGVyTGF5ZXIgPT09ICdmdW5jdGlvbicpXG4gICAgKTtcbiAgfVxuXG4gIGdldENvbG9yU2NhbGUoY29sb3JTY2FsZSwgY29sb3JEb21haW4sIGNvbG9yUmFuZ2UpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xvclJhbmdlLmNvbG9yTWFwKSkge1xuICAgICAgY29uc3QgY01hcCA9IG5ldyBNYXAoKTtcbiAgICAgIGNvbG9yUmFuZ2UuY29sb3JNYXAuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgIGNNYXAuc2V0KGssIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IGhleFRvUmdiKHYpIDogdik7XG4gICAgICB9KTtcblxuICAgICAgLy8gQHRzLWlnbm9yZSBkMyBzY2FsZVxuICAgICAgY29uc3Qgc2NhbGUgPSBTQ0FMRV9GVU5DW2NvbG9yU2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihBcnJheS5mcm9tKGNNYXAua2V5cygpKSlcbiAgICAgICAgLnJhbmdlKEFycmF5LmZyb20oY01hcC52YWx1ZXMoKSkpXG4gICAgICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JSYW5nZS5jb2xvcnMubWFwKGhleFRvUmdiKSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHZpc3VhbCBjaGFubmVscyB0byBkZWNrLmdsIGFjY2Vzb3JzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbSBQYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtLmRhdGFBY2Nlc3NvciBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlfSBwYXJhbS5kYXRhQ29udGFpbmVyIERhdGFDb250YWluZXIgdG8gdXNlIHVzZSB3aXRoIGRhdGFBY2Nlc3NvclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGF0dHJpYnV0ZUFjY2Vzc29ycyAtIGRlY2suZ2wgbGF5ZXIgYXR0cmlidXRlIGFjY2Vzc29yc1xuICAgKi9cbiAgZ2V0QXR0cmlidXRlQWNjZXNzb3JzKHtkYXRhQWNjZXNzb3IgPSBkZWZhdWx0RGF0YUFjY2Vzc29yLCBkYXRhQ29udGFpbmVyfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29ycyA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZpeGVkLFxuICAgICAgICBzY2FsZSxcbiAgICAgICAgZG9tYWluLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgICAgIG51bGxWYWx1ZSxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH0gPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuXG4gICAgICBjb25zdCBzaG91bGRHZXRTY2FsZSA9IHRoaXMuY29uZmlnW2ZpZWxkXTtcblxuICAgICAgaWYgKHNob3VsZEdldFNjYWxlKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbdGhpcy5jb25maWdbc2NhbGVdLCB0aGlzLmNvbmZpZ1tkb21haW5dLCB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdXTtcbiAgICAgICAgY29uc3QgaXNGaXhlZCA9IGZpeGVkICYmIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF07XG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGRlY2xhcmUgYXMgY29uc3QgYWxsIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGJlIHVzZSBpbiB0aGUgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSBjYWxsXG4gICAgICAgIC8vIG90aGVyd2lzZSwgdGhlIG9sZExheWVyRGF0YSBwYXJhbWV0ZXIgaW4gZm9ybWF0TGF5ZXJEYXRhIG1ldGhvZCB3aWxsIGJlIHdyb25nICh5b3UgY2FuIGNoZWNrIHRoZSBmb3JtYXRMYXllckRhdGEgVGlsZUxheWVyIG1ldGhvZCBpbiBCdWlsZGVyIGFzIGV4YW1wbGUpXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblZhbHVlID0gdGhpcy5jb25maWcudmlzQ29uZmlnW2FnZ3JlZ2F0aW9uXTtcblxuICAgICAgICBjb25zdCBzY2FsZUZ1bmN0aW9uID1cbiAgICAgICAgICBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jb2xvclxuICAgICAgICAgICAgPyB0aGlzLmdldENvbG9yU2NhbGUoLi4uYXJncylcbiAgICAgICAgICAgIDogdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoLi4uYXJncywgaXNGaXhlZCk7XG5cbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9IGQgPT5cbiAgICAgICAgICB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoXG4gICAgICAgICAgICBzY2FsZUZ1bmN0aW9uLFxuICAgICAgICAgICAgZGF0YUFjY2Vzc29yKGRhdGFDb250YWluZXIpKGQpLFxuICAgICAgICAgICAgZmllbGRDb25maWcsXG4gICAgICAgICAgICBhZ2dyZWdhdGlvblZhbHVlLFxuICAgICAgICAgICAgbnVsbFZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGdldEF0dHJpYnV0ZVZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGF0dHJpYnV0ZUFjY2Vzc29yc1thY2Nlc3Nvcl0gPSBnZXRBdHRyaWJ1dGVWYWx1ZSh0aGlzLmNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID1cbiAgICAgICAgICB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKHRoaXMuY29uZmlnKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdKSB7XG4gICAgICAgIENvbnNvbGUud2FybihgRmFpbGVkIHRvIHByb3ZpZGUgYWNjZXNzb3IgZnVuY3Rpb24gZm9yICR7YWNjZXNzb3IgfHwgY2hhbm5lbH1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhdHRyaWJ1dGVBY2Nlc3NvcnM7XG4gIH1cblxuICBnZXRWaXNDaGFubmVsU2NhbGUoc2NhbGUsIGRvbWFpbiwgcmFuZ2UsIGZpeGVkKSB7XG4gICAgaWYgKHNjYWxlID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIGQzLXNjYWxlIHR5cGVcbiAgICAgIHJldHVybiBTQ0FMRV9GVU5DW3NjYWxlXSgpXG4gICAgICAgIC5kb21haW4oZG9tYWluLnNsaWNlKDAsIHJhbmdlLmxlbmd0aCkpXG4gICAgICAgIC5yYW5nZShyYW5nZSlcbiAgICAgICAgLnVua25vd24oVU5LTk9XTl9DT0xPUik7XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZSBkMy1zY2FsZSB0eXBlXG4gICAgcmV0dXJuIFNDQUxFX0ZVTkNbZml4ZWQgPyAnbGluZWFyJyA6IHNjYWxlXSgpXG4gICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgIC5yYW5nZShmaXhlZCA/IGRvbWFpbiA6IHJhbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBib3VuZHMgb2YgdGhlIGRhdGEuXG4gICAqIEBwYXJhbSB7aW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlfSBkYXRhQ29udGFpbmVyIERhdGFDb250YWluZXIgdG8gY2FsY3VsYXRlIGJvdW5kcyBmb3IuXG4gICAqIEBwYXJhbSB7KGQ6IHtpbmRleDogbnVtYmVyfSwgZGM6IGltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT4gbnVtYmVyW119IGdldFBvc2l0aW9uIEFjY2VzcyBrZXBsZXIuZ2wgbGF5ZXIgZGF0YSBmcm9tIGRlY2suZ2wgbGF5ZXJcbiAgICogQHJldHVybiB7bnVtYmVyW118bnVsbH0gYm91bmRzIG9mIHRoZSBkYXRhLlxuICAgKi9cbiAgZ2V0UG9pbnRzQm91bmRzKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKSB7XG4gICAgLy8gbm8gbmVlZCB0byBsb29wIHRocm91Z2ggdGhlIGVudGlyZSBkYXRhc2V0XG4gICAgLy8gZ2V0IGEgc2FtcGxlIG9mIGRhdGEgdG8gY2FsY3VsYXRlIGJvdW5kc1xuICAgIGNvbnN0IHNhbXBsZURhdGEgPVxuICAgICAgZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkgPiBNQVhfU0FNUExFX1NJWkVcbiAgICAgICAgPyBnZXRTYW1wbGVEYXRhKGRhdGFDb250YWluZXIsIE1BWF9TQU1QTEVfU0laRSlcbiAgICAgICAgOiBkYXRhQ29udGFpbmVyO1xuXG4gICAgY29uc3QgcG9pbnRzID0gc2FtcGxlRGF0YS5tYXBJbmRleChnZXRQb3NpdGlvbik7XG5cbiAgICBjb25zdCBsYXRCb3VuZHMgPSBnZXRMYXRMbmdCb3VuZHMocG9pbnRzLCAxLCBbLTkwLCA5MF0pO1xuICAgIGNvbnN0IGxuZ0JvdW5kcyA9IGdldExhdExuZ0JvdW5kcyhwb2ludHMsIDAsIFstMTgwLCAxODBdKTtcblxuICAgIGlmICghbGF0Qm91bmRzIHx8ICFsbmdCb3VuZHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBbbG5nQm91bmRzWzBdLCBsYXRCb3VuZHNbMF0sIGxuZ0JvdW5kc1sxXSwgbGF0Qm91bmRzWzFdXTtcbiAgfVxuXG4gIGdldENoYW5nZWRUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMpIHtcbiAgICBjb25zdCB0cmlnZ2VyQ2hhbmdlZCA9IGRpZmZVcGRhdGVUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMsIHRoaXMuX29sZERhdGFVcGRhdGVUcmlnZ2Vycyk7XG4gICAgdGhpcy5fb2xkRGF0YVVwZGF0ZVRyaWdnZXJzID0gZGF0YVVwZGF0ZVRyaWdnZXJzO1xuXG4gICAgcmV0dXJuIHRyaWdnZXJDaGFuZ2VkO1xuICB9XG5cbiAgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShcbiAgICBzY2FsZSxcbiAgICBkYXRhLFxuICAgIGZpZWxkLFxuICAgIC8vIEluIGJ1aWxkZXIgd2Ugb3ZlcndyaXRlIHRoZSBnZXRWYWx1ZSBmdW5jdGlvbiBhbmQgd2UgdXNlIHRoZSBfYWdncmVnYXRpb24gcGFyYW1ldGVyIGluIHNwYXRpYWwgaW5kZXggbGF5ZXJzIGFzIHRoZSBRdWFka2V5TGF5ZXIuXG4gICAgX2FnZ3JlZ2F0aW9uLFxuICAgIG51bGxWYWx1ZSA9IE5PX1ZBTFVFX0NPTE9SLFxuICAgIGdldFZhbHVlID0gZGVmYXVsdEdldEZpZWxkVmFsdWVcbiAgKSB7XG4gICAgY29uc3Qge3R5cGV9ID0gZmllbGQ7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRWYWx1ZShmaWVsZCwgZGF0YSk7XG5cbiAgICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsVmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGF0dHJpYnV0ZVZhbHVlO1xuICAgIGlmICh0eXBlID09PSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wKSB7XG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjb252ZXJ0IGhlcmVcbiAgICAgIC8vIHNjYWxlIEZ1bmN0aW9uIHNob3VsZCB0YWtlIGNhcmUgb2YgaXRcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gc2NhbGUobmV3IERhdGUodmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmlidXRlVmFsdWUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCFub3ROdWxsb3JVbmRlZmluZWQoYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IG51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7XG4gIH1cblxuICB1cGRhdGVNZXRhKG1ldGEpIHtcbiAgICB0aGlzLm1ldGEgPSB7Li4udGhpcy5tZXRhLCAuLi5tZXRhfTtcbiAgfVxuXG4gIGdldERhdGFVcGRhdGVUcmlnZ2Vycyh7ZmlsdGVyZWRJbmRleCwgaWQsIGFsbERhdGF9KSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RGF0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnMsIGZpbHRlcmVkSW5kZXh9LFxuICAgICAgZ2V0TWV0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnN9LFxuICAgICAgLi4uKHRoaXMuY29uZmlnLnRleHRMYWJlbCB8fCBbXSkucmVkdWNlKFxuICAgICAgICAoYWNjdSwgdGwsIGkpID0+ICh7XG4gICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICBbYGdldExhYmVsQ2hhcmFjdGVyU2V0LSR7aX1gXTogdGwuZmllbGQgPyB0bC5maWVsZC5uYW1lIDogbnVsbFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgbGF5ZXJEYXRhc2V0ID0gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXTtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSBsYXllckRhdGFzZXQ7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc3VhbENoYW5uZWxGaWVsZHMobGF5ZXJEYXRhc2V0KTtcblxuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuICAgIGNvbnN0IGRhdGFVcGRhdGVUcmlnZ2VycyA9IHRoaXMuZ2V0RGF0YVVwZGF0ZVRyaWdnZXJzKGxheWVyRGF0YXNldCk7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSB0aGlzLmdldENoYW5nZWRUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMpO1xuXG4gICAgaWYgKHRyaWdnZXJDaGFuZ2VkLmdldE1ldGEpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YSA9IFtdO1xuXG4gICAgaWYgKCF0cmlnZ2VyQ2hhbmdlZC5nZXREYXRhICYmIG9sZExheWVyRGF0YSAmJiBvbGRMYXllckRhdGEuZGF0YSkge1xuICAgICAgLy8gc2FtZSBkYXRhXG4gICAgICBkYXRhID0gb2xkTGF5ZXJEYXRhLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0aGlzLmNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUobGF5ZXJEYXRhc2V0LCBnZXRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtkYXRhLCB0cmlnZ2VyQ2hhbmdlZH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHN0eWxlZCBmaWVsZHMgdG8gbWF0Y2ggb25lcyBmcm9tIG5ldyBkYXRhc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YXNldFxuICAgKi9cbiAgdXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyhkYXRhc2V0KSB7XG4gICAgZm9yIChjb25zdCB7ZmllbGR9IG9mIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykpIHtcbiAgICAgIGNvbnN0IG9sZEZpZWxkID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgaWYgKCFvbGRGaWVsZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdEYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IG9sZEZpZWxkLm5hbWUpIHx8IG51bGw7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZmllbGRdOiBuZXdEYXRhU2V0RmllbGR9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBvbmUgbGF5ZXIgZG9tYWluIHdoZW4gc3RhdGUuZGF0YSBjaGFuZ2VkXG4gICAqIGlmIHN0YXRlLmRhdGEgY2hhbmdlIGlzIGR1ZSBvdCB1cGRhdGUgZmlsdGVyLCBuZXdGaWxlciB3aWxsIGJlIHBhc3NlZFxuICAgKiBjYWxsZWQgYnkgdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0c1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmV3RmlsdGVyXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IGxheWVyXG4gICAqL1xuICB1cGRhdGVMYXllckRvbWFpbihkYXRhc2V0cywgbmV3RmlsdGVyKSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldERhdGFzZXQoZGF0YXNldHMpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBjb25zdCB7c2NhbGV9ID0gY2hhbm5lbDtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IHRoaXMuY29uZmlnW3NjYWxlXTtcbiAgICAgIC8vIG9yZGluYWwgZG9tYWluIGlzIGJhc2VkIG9uIGRhdGFDb250YWluZXIsIGlmIG9ubHkgZmlsdGVyIGNoYW5nZWRcbiAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlIG9yZGluYWwgZG9tYWluXG4gICAgICBpZiAoIW5ld0ZpbHRlciB8fCBzY2FsZVR5cGUgIT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgICAgY29uc3Qge2RvbWFpbn0gPSBjaGFubmVsO1xuICAgICAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbih0YWJsZSwgY2hhbm5lbCk7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tkb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldERhdGFzZXQoZGF0YXNldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdmlzdWFsIGNoYW5uZWwgZmllbGQgYW5kIHNjYWxlcyBiYXNlZCBvbiBzdXBwb3J0ZWQgZmllbGQgJiBzY2FsZSB0eXBlXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICB2YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRoaXMudmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCk7XG4gICAgdGhpcy52YWxpZGF0ZVNjYWxlKGNoYW5uZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpZWxkIHR5cGUgYmFzZWQgb24gY2hhbm5lbFNjYWxlVHlwZVxuICAgKi9cbiAgdmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtmaWVsZCwgY2hhbm5lbFNjYWxlVHlwZSwgc3VwcG9ydGVkRmllbGRUeXBlc30gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgLy8gaWYgZmllbGQgaXMgc2VsZWN0ZWQsIGNoZWNrIGlmIGZpZWxkIHR5cGUgaXMgc3VwcG9ydGVkXG4gICAgICBjb25zdCBjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyA9XG4gICAgICAgIHN1cHBvcnRlZEZpZWxkVHlwZXMgfHwgQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTW2NoYW5uZWxTY2FsZVR5cGVdO1xuXG4gICAgICBpZiAoIWNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzLmluY2x1ZGVzKHRoaXMuY29uZmlnW2ZpZWxkXS50eXBlKSkge1xuICAgICAgICAvLyBmaWVsZCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHNldCBpdCBiYWNrIHRvIG51bGxcbiAgICAgICAgLy8gc2V0IHNjYWxlIGJhY2sgdG8gZGVmYXVsdFxuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZmllbGRdOiBudWxsfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNjYWxlIHR5cGUgYmFzZWQgb24gYWdncmVnYXRpb25cbiAgICovXG4gIHZhbGlkYXRlU2NhbGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtzY2FsZX0gPSB2aXN1YWxDaGFubmVsO1xuICAgIGlmICghc2NhbGUpIHtcbiAgICAgIC8vIHZpc3VhbENoYW5uZWwgZG9lc24ndCBoYXZlIHNjYWxlXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlT3B0aW9ucyA9IHRoaXMuZ2V0U2NhbGVPcHRpb25zKGNoYW5uZWwpO1xuICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgc2VsZWN0ZWQgc2NhbGUgaXNcbiAgICAvLyBzdXBwb3J0ZWQsIGlmIG5vdCwgY2hhbmdlIHRvIGRlZmF1bHRcbiAgICBpZiAoIXNjYWxlT3B0aW9ucy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1tzY2FsZV0pKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbc2NhbGVdOiBzY2FsZU9wdGlvbnNbMF19KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNjYWxlIG9wdGlvbnMgYmFzZWQgb24gY3VycmVudCBmaWVsZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXRTY2FsZU9wdGlvbnMoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtmaWVsZCwgc2NhbGUsIGNoYW5uZWxTY2FsZVR5cGV9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZ1tmaWVsZF1cbiAgICAgID8gRklFTERfT1BUU1t0aGlzLmNvbmZpZ1tmaWVsZF0udHlwZV0uc2NhbGVbY2hhbm5lbFNjYWxlVHlwZV1cbiAgICAgIDogW3RoaXMuZ2V0RGVmYXVsdExheWVyQ29uZmlnKClbc2NhbGVdXTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbChkYXRhc2V0LCBjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgdGhpcy52YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCk7XG4gICAgLy8gY2FsY3VsYXRlIGxheWVyIGNoYW5uZWwgZG9tYWluXG4gICAgY29uc3QgdXBkYXRlZERvbWFpbiA9IHRoaXMuY2FsY3VsYXRlTGF5ZXJEb21haW4oZGF0YXNldCwgdmlzdWFsQ2hhbm5lbCk7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W3Zpc3VhbENoYW5uZWwuZG9tYWluXTogdXBkYXRlZERvbWFpbn0pO1xuICB9XG5cbiAgZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzKCkge1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKHZpc3VhbENoYW5uZWwgPT4ge1xuICAgICAgLy8gZmllbGQgcmFuZ2Ugc2NhbGUgZG9tYWluXG4gICAgICBjb25zdCB7YWNjZXNzb3IsIGZpZWxkLCBzY2FsZSwgZG9tYWluLCByYW5nZSwgZGVmYXVsdFZhbHVlLCBmaXhlZH0gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7XG4gICAgICAgIFtmaWVsZF06IHRoaXMuY29uZmlnW2ZpZWxkXSxcbiAgICAgICAgW3NjYWxlXTogdGhpcy5jb25maWdbc2NhbGVdLFxuICAgICAgICBbZG9tYWluXTogdGhpcy5jb25maWdbZG9tYWluXSxcbiAgICAgICAgW3JhbmdlXTogdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKHRoaXMuY29uZmlnKSA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgLi4uKGZpeGVkID8ge1tmaXhlZF06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF19IDoge30pXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGNhbGN1bGF0ZUxheWVyRG9tYWluKGRhdGFzZXQsIHZpc3VhbENoYW5uZWwpIHtcbiAgICBjb25zdCB7c2NhbGV9ID0gdmlzdWFsQ2hhbm5lbDtcbiAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnW3Zpc3VhbENoYW5uZWwuZmllbGRdO1xuICAgIGlmICghZmllbGQpIHtcbiAgICAgIC8vIGlmIGNvbG9yRmllbGQgb3Igc2l6ZUZpZWxkIHdlcmUgc2V0IGJhY2sgdG8gbnVsbFxuICAgICAgcmV0dXJuIGRlZmF1bHREb21haW47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgaWYgKCFkYXRhU2V0RmllbGQpIHtcbiAgICAgIC8vIGlmIG5ldyBkYXRhc2V0IGRvZXNuJ3QgY29udGFpbiBwcmV2aW91c2x5IHNldCBmaWVsZFxuICAgICAgcmV0dXJuIGRlZmF1bHREb21haW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFzZXQuZ2V0Q29sdW1uTGF5ZXJEb21haW4oZGF0YVNldEZpZWxkLCBzY2FsZVR5cGUpIHx8IGRlZmF1bHREb21haW47XG4gIH1cblxuICBoYXNIb3ZlcmVkT2JqZWN0KG9iamVjdEluZm8pIHtcbiAgICByZXR1cm4gdGhpcy5pc0xheWVySG92ZXJlZChvYmplY3RJbmZvKSAmJiBvYmplY3RJbmZvLm9iamVjdCA/IG9iamVjdEluZm8ub2JqZWN0IDogbnVsbDtcbiAgfVxuXG4gIGlzTGF5ZXJIb3ZlcmVkKG9iamVjdEluZm8pIHtcbiAgICByZXR1cm4gb2JqZWN0SW5mbz8ucGlja2VkICYmIG9iamVjdEluZm8/LmxheWVyPy5wcm9wcz8uaWQgPT09IHRoaXMuaWQ7XG4gIH1cblxuICBnZXRSYWRpdXNTY2FsZUJ5Wm9vbShtYXBTdGF0ZSwgZml4ZWRSYWRpdXMpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzQ2hhbm5lbC5maWVsZDtcbiAgICBjb25zdCBmaXhlZCA9IGZpeGVkUmFkaXVzID09PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy52aXNDb25maWcuZml4ZWRSYWRpdXMgOiBmaXhlZFJhZGl1cztcbiAgICBjb25zdCB7cmFkaXVzfSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZztcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gZml4ZWQgPyAxIDogKHRoaXMuY29uZmlnW2ZpZWxkXSA/IDEgOiByYWRpdXMpICogdGhpcy5nZXRab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlKGZpeGVkUmFkaXVzKSB7XG4gICAgY29uc3QgcmFkaXVzQ2hhbm5lbCA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YyA9PiB2Yy5wcm9wZXJ0eSA9PT0gJ3JhZGl1cycpO1xuXG4gICAgaWYgKCFyYWRpdXNDaGFubmVsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHJhZGl1c0NoYW5uZWwuZmllbGQ7XG4gICAgY29uc3QgZml4ZWQgPSBmaXhlZFJhZGl1cyA9PT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcudmlzQ29uZmlnLmZpeGVkUmFkaXVzIDogZml4ZWRSYWRpdXM7XG4gICAgY29uc3Qge3JhZGl1c30gPSB0aGlzLmNvbmZpZy52aXNDb25maWc7XG5cbiAgICByZXR1cm4gZml4ZWQgPyAxIDogKHRoaXMuY29uZmlnW2ZpZWxkXSA/IDEgOiByYWRpdXMpO1xuICB9XG5cbiAgZ2V0UmFkaXVzVW5pdChmaXhlZFJhZGl1cykge1xuICAgIGNvbnN0IHJhZGl1c0NoYW5uZWwgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmMgPT4gdmMucHJvcGVydHkgPT09ICdyYWRpdXMnKTtcblxuICAgIGlmICghcmFkaXVzQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuICdwaXhlbHMnO1xuICAgIH1cblxuICAgIGNvbnN0IGZpeGVkID0gZml4ZWRSYWRpdXMgPT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maXhlZFJhZGl1cyA6IGZpeGVkUmFkaXVzO1xuXG4gICAgcmV0dXJuIGZpeGVkID8gJ21ldGVycycgOiAncGl4ZWxzJztcbiAgfVxuXG4gIHNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy5zb21lKHAgPT4gIXRoaXMubm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzLmluY2x1ZGVzKHApKTtcbiAgfVxuXG4gIGdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMoaW50ZXJhY3Rpb25Db25maWcsIGJydXNoaW5nVGFyZ2V0KSB7XG4gICAgY29uc3Qge2JydXNofSA9IGludGVyYWN0aW9uQ29uZmlnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGJydXNoaW5nXG4gICAgICBhdXRvSGlnaGxpZ2h0OiAhYnJ1c2guZW5hYmxlZCxcbiAgICAgIGJydXNoaW5nUmFkaXVzOiBicnVzaC5jb25maWcuc2l6ZSAqIDEwMDAsXG4gICAgICBicnVzaGluZ1RhcmdldDogYnJ1c2hpbmdUYXJnZXQgfHwgJ3NvdXJjZScsXG4gICAgICBicnVzaGluZ0VuYWJsZWQ6IGJydXNoLmVuYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKHtpZHgsIGdwdUZpbHRlciwgbWFwU3RhdGUsIHZpc2libGUsIG1hc2tQb2x5Z29ufSkge1xuICAgIGNvbnN0IG1hc2tFeHRlbnNpb25Qcm9wcyA9IGdldE1hc2tFeHRlbnNpb25Qcm9wcyhtYXNrUG9seWdvbik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFza0V4dGVuc2lvblByb3BzLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpZHgsXG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVQsXG4gICAgICBwaWNrYWJsZTogdHJ1ZSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBwYXJhbWV0ZXJzOiB7ZGVwdGhUZXN0OiBCb29sZWFuKG1hcFN0YXRlLmRyYWdSb3RhdGUgfHwgdGhpcy5jb25maWcudmlzQ29uZmlnLmVuYWJsZTNkKX0sXG4gICAgICBoaWRkZW46IHRoaXMuY29uZmlnLmhpZGRlbixcbiAgICAgIC8vIHZpc2NvbmZpZ1xuICAgICAgb3BhY2l0eTogdGhpcy5jb25maWcudmlzQ29uZmlnLm9wYWNpdHksXG4gICAgICBoaWdobGlnaHRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAvLyBkYXRhIGZpbHRlcmluZ1xuICAgICAgZXh0ZW5zaW9uczogW2RhdGFGaWx0ZXJFeHRlbnNpb24sIC4uLm1hc2tFeHRlbnNpb25Qcm9wcy5leHRlbnNpb25zXSxcbiAgICAgIGZpbHRlclJhbmdlOiBncHVGaWx0ZXIgPyBncHVGaWx0ZXIuZmlsdGVyUmFuZ2UgOiB1bmRlZmluZWQsXG4gICAgICAvLyBsYXllciBzaG91bGQgYmUgdmlzaWJsZSBhbmQgaWYgc3BsaXRNYXAsIHNob3duIGluIHRvIG9uZSBvZiBwYW5lbFxuICAgICAgdmlzaWJsZTogdGhpcy5jb25maWcuaXNWaXNpYmxlICYmIHZpc2libGVcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke3RoaXMuaWR9LWhvdmVyZWRgLFxuICAgICAgcGlja2FibGU6IGZhbHNlLFxuICAgICAgd3JhcExvbmdpdHVkZTogdHJ1ZSxcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVFxuICAgIH07XG4gIH1cblxuICByZW5kZXJUZXh0TGFiZWxMYXllcih7Z2V0UG9zaXRpb24sIGdldFBpeGVsT2Zmc2V0LCB1cGRhdGVUcmlnZ2Vycywgc2hhcmVkUHJvcHN9LCByZW5kZXJPcHRzKSB7XG4gICAgY29uc3Qge2RhdGEsIG1hcFN0YXRlfSA9IHJlbmRlck9wdHM7XG4gICAgY29uc3Qge3RleHRMYWJlbH0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBkYXRhLnRleHRMYWJlbHMucmVkdWNlKChhY2N1LCBkLCBpKSA9PiB7XG4gICAgICBpZiAoZC5nZXRUZXh0KSB7XG4gICAgICAgIGFjY3UucHVzaChcbiAgICAgICAgICBuZXcgVGV4dExheWVyKHtcbiAgICAgICAgICAgIC4uLnNoYXJlZFByb3BzLFxuICAgICAgICAgICAgaWQ6IGAke3RoaXMuaWR9LWxhYmVsLSR7dGV4dExhYmVsW2ldLmZpZWxkPy5uYW1lfWAsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgICAgICBnZXRUZXh0OiBkLmdldFRleHQsXG4gICAgICAgICAgICBnZXRQb3NpdGlvbixcbiAgICAgICAgICAgIGNoYXJhY3RlclNldDogZC5jaGFyYWN0ZXJTZXQsXG4gICAgICAgICAgICBnZXRQaXhlbE9mZnNldDogZ2V0UGl4ZWxPZmZzZXQodGV4dExhYmVsW2ldKSxcbiAgICAgICAgICAgIGdldFNpemU6IDEsXG4gICAgICAgICAgICBzaXplU2NhbGU6IHRleHRMYWJlbFtpXS5zaXplLFxuICAgICAgICAgICAgZ2V0VGV4dEFuY2hvcjogdGV4dExhYmVsW2ldLmFuY2hvcixcbiAgICAgICAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiB0ZXh0TGFiZWxbaV0uYWxpZ25tZW50LFxuICAgICAgICAgICAgZ2V0Q29sb3I6IHRleHRMYWJlbFtpXS5jb2xvcixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgLy8gdGV4dCB3aWxsIGFsd2F5cyBzaG93IG9uIHRvcCBvZiBhbGwgbGF5ZXJzXG4gICAgICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgICAgICAgIGdldFRleHQ6IHRleHRMYWJlbFtpXS5maWVsZD8ubmFtZSxcbiAgICAgICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAuLi51cGRhdGVUcmlnZ2Vycy5nZXRSYWRpdXMsXG4gICAgICAgICAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgICAgICAgICAgYW5jaG9yOiB0ZXh0TGFiZWxbaV0uYW5jaG9yLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogdGV4dExhYmVsW2ldLmFsaWdubWVudFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnZXRUZXh0QW5jaG9yOiB0ZXh0TGFiZWxbaV0uYW5jaG9yLFxuICAgICAgICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogdGV4dExhYmVsW2ldLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgZ2V0Q29sb3I6IHRleHRMYWJlbFtpXS5jb2xvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKGtlcGxlclRhYmxlLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB1cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gIH1cblxuICBnZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gICAgcmV0dXJuICgpID0+IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXI7XG4iXX0=
1547
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvYmFzZS1sYXllci5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUNvbG9yIiwiTEFZRVJfSURfTEVOR1RIIiwiTUFYX1NBTVBMRV9TSVpFIiwiZGVmYXVsdERvbWFpbiIsImRhdGFGaWx0ZXJFeHRlbnNpb24iLCJEYXRhRmlsdGVyRXh0ZW5zaW9uIiwiZmlsdGVyU2l6ZSIsIk1BWF9HUFVfRklMVEVSUyIsImRlZmF1bHREYXRhQWNjZXNzb3IiLCJkYyIsImQiLCJkZWZhdWx0R2V0RmllbGRWYWx1ZSIsImZpZWxkIiwidmFsdWVBY2Nlc3NvciIsIk9WRVJMQVlfVFlQRSIsImRlY2tnbCIsIm1hcGJveGdsIiwibGF5ZXJDb2xvcnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJEYXRhVml6Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJpbmRleCIsImxlbmd0aCIsImNvbG9yTWFrZXIiLCJMYXllciIsInByb3BzIiwiaWQiLCJtZXRhIiwidmlzQ29uZmlnU2V0dGluZ3MiLCJjb25maWciLCJnZXREZWZhdWx0TGF5ZXJDb25maWciLCJjb2x1bW5zIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiRGVmYXVsdExheWVySWNvbiIsInR5cGUiLCJjb2xvciIsInByb3BlcnR5Iiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImtleSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZGVmYXVsdFZhbHVlIiwic2l6ZSIsImxhdCIsInBhaXIiLCJmaWVsZFBhaXJLZXkiLCJsbmciLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwiZGF0YUlkIiwidmlzaWJpbGl0eUJ5Wm9vbSIsIm1pbiIsIlpPT01fTEVWRUxfTElNSVRTIiwibWF4IiwibGFiZWwiLCJERUZBVUxUX0xBWUVSX0xBQkVMIiwibmV4dCIsInZhbHVlIiwiaXNWaXNpYmxlIiwiaXNDb25maWdBY3RpdmUiLCJoaWdobGlnaHRDb2xvciIsIkRFRkFVTFRfSElHSExJR0hUX0NPTE9SIiwiaGlkZGVuIiwiY29sb3JGaWVsZCIsImNvbG9yRG9tYWluIiwiY29sb3JTY2FsZSIsIlNDQUxFX1RZUEVTIiwicXVhbnRpbGUiLCJzaXplRG9tYWluIiwic2l6ZVNjYWxlIiwibGluZWFyIiwic2l6ZUZpZWxkIiwidmlzQ29uZmlnIiwidGV4dExhYmVsIiwiREVGQVVMVF9URVhUX0xBQkVMIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjb2xvclJhbmdlIiwiYW5pbWF0aW9uIiwiZW5hYmxlZCIsInZpc3VhbENoYW5uZWxzIiwibWVhc3VyZSIsImRpc3BsYXlOYW1lIiwibmFtZSIsImRlZmF1bHRNZWFzdXJlIiwidXBkYXRlIiwiZmllbGRJZHgiLCJjb2x1bW5QYWlycyIsInBhcnRuZXJLZXkiLCJwYXJ0bmVyRmllbGRQYWlyS2V5Iiwiem9vbSIsInpvb21PZmZzZXQiLCJNYXRoIiwicG93IiwiZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvciIsImRhdGFzZXRzIiwiZmlsdGVyZWRJbmRleCIsIm9iamVjdCIsImRhdGFDb250YWluZXIiLCJyb3ciLCJjb25maWdUb0NvcHkiLCJzaGFsbG93Q29weSIsImNvbmNhdCIsInYiLCJub3RUb0NvcHkiLCJmb3JFYWNoIiwiZ3JvdXAiLCJwdXNoIiwiY3VycmVudENvbmZpZyIsImNvcGllZCIsImNvcHlMYXllckNvbmZpZyIsInVwZGF0ZUxheWVyQ29uZmlnIiwia2V5cyIsImNoYW5uZWwiLCJ2YWxpZGF0ZVZpc3VhbENoYW5uZWwiLCJpbmNsdWRlcyIsImxheWVyVmlzQ29uZmlncyIsIml0ZW0iLCJMQVlFUl9WSVNfQ09ORklHUyIsImV2ZXJ5IiwicCIsImhhc093blByb3BlcnR5IiwiY29sdW1uVmFsaWRhdG9ycyIsInJlcXVpcmVkIiwicmVxdWlyZWRMYXllckNvbHVtbnMiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdG9yIiwib3B0aW9uYWwiLCJvcHRpb25hbENvbHVtbnMiLCJuZXdDb25maWciLCJuZXdWaXNDb25maWciLCJwcm9wIiwicHJldmlvdXMiLCJjb2xvclVJUHJvcCIsImVudHJpZXMiLCJpc0NvbG9yUmFuZ2UiLCJjb2xvcnMiLCJ1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlIiwidXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSSIsInVwZGF0ZUN1c3RvbVBhbGV0dGUiLCJjb2xvclJhbmdlQ29uZmlnIiwiY3VzdG9tIiwiY3VzdG9tUGFsZXR0ZSIsInNob3dEcm9wZG93biIsInN0ZXBzIiwicmV2ZXJzZWQiLCJCb29sZWFuIiwic2hvdWxkVXBkYXRlIiwic29tZSIsInNhbWVHcm91cCIsIkNPTE9SX1JBTkdFUyIsImZpbHRlciIsImNyIiwiZmluZCIsImNvbG9yTWFwIiwidXBkYXRlQ29sb3JNYXAiLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsInVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAiLCJ1cGRhdGVOdW1lcmljQ29sb3JNYXAiLCJhc3NpZ25lZENhdGVnb3JpZXMiLCJuZXdDb2xvck1hcCIsInNsaWNlIiwiY01hcCIsInVuYXNzaWduZWRDb2xvcnMiLCJjYXRlZ29yeSIsIm1heFZhbHVlIiwicHJldlZhbHVlIiwic3RlcCIsImkiLCJsYXllckRhdGEiLCJkYXRhIiwiaGFzQWxsQ29sdW1ucyIsImhhc0xheWVyRGF0YSIsInJlbmRlckxheWVyIiwiQXJyYXkiLCJpc0FycmF5IiwiTWFwIiwiayIsInNldCIsIlNDQUxFX0ZVTkMiLCJmcm9tIiwidW5rbm93biIsIlVOS05PV05fQ09MT1IiLCJnZXRWaXNDaGFubmVsU2NhbGUiLCJkYXRhQWNjZXNzb3IiLCJhdHRyaWJ1dGVBY2Nlc3NvcnMiLCJmaXhlZCIsImFjY2Vzc29yIiwiZ2V0QXR0cmlidXRlVmFsdWUiLCJhZ2dyZWdhdGlvbiIsInNob3VsZEdldFNjYWxlIiwiYXJncyIsImlzRml4ZWQiLCJmaWVsZENvbmZpZyIsImFnZ3JlZ2F0aW9uVmFsdWUiLCJzY2FsZUZ1bmN0aW9uIiwiZ2V0Q29sb3JTY2FsZSIsImdldEVuY29kZWRDaGFubmVsVmFsdWUiLCJDb25zb2xlIiwid2FybiIsIm9yZGluYWwiLCJnZXRQb3NpdGlvbiIsInNhbXBsZURhdGEiLCJudW1Sb3dzIiwicG9pbnRzIiwibWFwSW5kZXgiLCJsYXRCb3VuZHMiLCJsbmdCb3VuZHMiLCJkYXRhVXBkYXRlVHJpZ2dlcnMiLCJ0cmlnZ2VyQ2hhbmdlZCIsIl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMiLCJfYWdncmVnYXRpb24iLCJnZXRWYWx1ZSIsImF0dHJpYnV0ZVZhbHVlIiwiQUxMX0ZJRUxEX1RZUEVTIiwidGltZXN0YW1wIiwiRGF0ZSIsImFsbERhdGEiLCJnZXREYXRhIiwiZGF0YXNldElkIiwiZ2V0TWV0YSIsInRsIiwib2xkTGF5ZXJEYXRhIiwibGF5ZXJEYXRhc2V0IiwidXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyIsImdldFBvc2l0aW9uQWNjZXNzb3IiLCJnZXREYXRhVXBkYXRlVHJpZ2dlcnMiLCJnZXRDaGFuZ2VkVHJpZ2dlcnMiLCJ1cGRhdGVMYXllck1ldGEiLCJjYWxjdWxhdGVEYXRhQXR0cmlidXRlIiwiZGF0YXNldCIsIm9sZEZpZWxkIiwibmV3RGF0YVNldEZpZWxkIiwiZmllbGRzIiwiZmQiLCJuZXdGaWx0ZXIiLCJ0YWJsZSIsImdldERhdGFzZXQiLCJzY2FsZVR5cGUiLCJ1cGRhdGVkRG9tYWluIiwiY2FsY3VsYXRlTGF5ZXJEb21haW4iLCJ2YWxpZGF0ZUZpZWxkVHlwZSIsInZhbGlkYXRlU2NhbGUiLCJ2aXN1YWxDaGFubmVsIiwic3VwcG9ydGVkRmllbGRUeXBlcyIsImNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzIiwiQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwiRklFTERfT1BUUyIsInVwZGF0ZVRyaWdnZXJzIiwiZGF0YVNldEZpZWxkIiwiZiIsImdldENvbHVtbkxheWVyRG9tYWluIiwib2JqZWN0SW5mbyIsImlzTGF5ZXJIb3ZlcmVkIiwicGlja2VkIiwibGF5ZXIiLCJtYXBTdGF0ZSIsImZpeGVkUmFkaXVzIiwicmFkaXVzQ2hhbm5lbCIsInZjIiwidW5kZWZpbmVkIiwicmFkaXVzIiwiZ2V0Wm9vbUZhY3RvciIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImludGVyYWN0aW9uQ29uZmlnIiwiYnJ1c2hpbmdUYXJnZXQiLCJicnVzaCIsImF1dG9IaWdobGlnaHQiLCJicnVzaGluZ1JhZGl1cyIsImJydXNoaW5nRW5hYmxlZCIsImlkeCIsImdwdUZpbHRlciIsInZpc2libGUiLCJtYXNrUG9seWdvbiIsIm1hc2tFeHRlbnNpb25Qcm9wcyIsImNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkxOR0xBVCIsInBpY2thYmxlIiwid3JhcExvbmdpdHVkZSIsInBhcmFtZXRlcnMiLCJkZXB0aFRlc3QiLCJkcmFnUm90YXRlIiwiZW5hYmxlM2QiLCJvcGFjaXR5IiwiZXh0ZW5zaW9ucyIsImZpbHRlclJhbmdlIiwicmVuZGVyT3B0cyIsImdldFBpeGVsT2Zmc2V0Iiwic2hhcmVkUHJvcHMiLCJ0ZXh0TGFiZWxzIiwiZ2V0VGV4dCIsIlRleHRMYXllciIsImNoYXJhY3RlclNldCIsImdldFNpemUiLCJnZXRUZXh0QW5jaG9yIiwiYW5jaG9yIiwiZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJhbGlnbm1lbnQiLCJnZXRDb2xvciIsImdldEZpbHRlclZhbHVlIiwiZ2V0UmFkaXVzIiwia2VwbGVyVGFibGUiLCJmb3VuZExheWVycyIsImRlZmF1bHRGaWVsZHMiLCJhbGxGaWVsZHMiLCJyZXF1aXJlZENvbHVtbnMiLCJwcmV2IiwicmVxdWlyZWRGaWVsZHMiLCJnZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzIiwiYWxsS2V5cyIsInBvaW50ZXJzIiwiY291bnRQZXJLZXkiLCJwYWlycyIsImluY3JlbWVudFBvaW50ZXJzIiwibmV3UGFpciIsImN1dXIiLCJwdHMiLCJjb3VudHMiLCJjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztB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QUNoSixDQUFELENBQVIsQ0FBZixDQUE0QnNKLElBQTVCLENBQW5CO0FBQ0EsaUJBQU9ULElBQVA7QUFDRCxTQUhlLEVBR2IsRUFIYSxDQUFoQjtBQUtBTSxRQUFBQSxLQUFLLENBQUNqTixJQUFOLENBQVdtTixPQUFYO0FBQ0Q7QUFDRDtBQUVBOzs7QUFDQSxlQUFTRCxpQkFBVCxDQUEyQkcsR0FBM0IsRUFBZ0NDLE1BQWhDLEVBQXdDbFQsS0FBeEMsRUFBK0M7QUFDN0MsWUFBSUEsS0FBSyxLQUFLLENBQVYsSUFBZWlULEdBQUcsQ0FBQyxDQUFELENBQUgsS0FBV0MsTUFBTSxDQUFDLENBQUQsQ0FBTixHQUFZLENBQTFDLEVBQTZDO0FBQzNDO0FBQ0EsaUJBQU8sS0FBUDtBQUNEOztBQUVELFlBQUlELEdBQUcsQ0FBQ2pULEtBQUQsQ0FBSCxHQUFhLENBQWIsR0FBaUJrVCxNQUFNLENBQUNsVCxLQUFELENBQTNCLEVBQW9DO0FBQ2xDaVQsVUFBQUEsR0FBRyxDQUFDalQsS0FBRCxDQUFILEdBQWFpVCxHQUFHLENBQUNqVCxLQUFELENBQUgsR0FBYSxDQUExQjtBQUNBLGlCQUFPLElBQVA7QUFDRDs7QUFFRGlULFFBQUFBLEdBQUcsQ0FBQ2pULEtBQUQsQ0FBSCxHQUFhLENBQWI7QUFDQSxlQUFPOFMsaUJBQWlCLENBQUNHLEdBQUQsRUFBTUMsTUFBTixFQUFjbFQsS0FBSyxHQUFHLENBQXRCLENBQXhCO0FBQ0Q7O0FBRUQsYUFBTzZTLEtBQVA7QUFDRDs7O1dBRUQsa0JBQWdCTSxDQUFoQixFQUFtQjtBQUNqQixhQUFPLDBCQUFTQSxDQUFULENBQVA7QUFDRDs7Ozs7ZUEyL0JZaFQsSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBrZXltaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCB7RGF0YUZpbHRlckV4dGVuc2lvbn0gZnJvbSAnQGRlY2suZ2wvZXh0ZW5zaW9ucyc7XG5pbXBvcnQge0NPT1JESU5BVEVfU1lTVEVNfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7VGV4dExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG5pbXBvcnQgRGVmYXVsdExheWVySWNvbiBmcm9tICcuL2RlZmF1bHQtbGF5ZXItaWNvbic7XG5pbXBvcnQge2RpZmZVcGRhdGVUcmlnZ2Vyc30gZnJvbSAnLi9sYXllci11cGRhdGUnO1xuXG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIE5PX1ZBTFVFX0NPTE9SLFxuICBTQ0FMRV9UWVBFUyxcbiAgQ0hBTk5FTF9TQ0FMRVMsXG4gIEZJRUxEX09QVFMsXG4gIFNDQUxFX0ZVTkMsXG4gIENIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEUyxcbiAgTUFYX0dQVV9GSUxURVJTLFxuICBVTktOT1dOX0NPTE9SLFxuICBaT09NX0xFVkVMX0xJTUlUU1xufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge0NPTE9SX1JBTkdFU30gZnJvbSAnY29uc3RhbnRzL2NvbG9yLXJhbmdlcyc7XG5pbXBvcnQge0RhdGFWaXpDb2xvcnN9IGZyb20gJ2NvbnN0YW50cy9jdXN0b20tY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7XG4gIExBWUVSX1ZJU19DT05GSUdTLFxuICBERUZBVUxUX1RFWFRfTEFCRUwsXG4gIERFRkFVTFRfQ09MT1JfVUksXG4gIERFRkFVTFRfSElHSExJR0hUX0NPTE9SLFxuICBERUZBVUxUX0xBWUVSX0xBQkVMXG59IGZyb20gJy4vbGF5ZXItZmFjdG9yeSc7XG5cbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWQsIGlzUGxhaW5PYmplY3R9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtnZXRMYXRMbmdCb3VuZHMsIG5vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge2dldFNhbXBsZURhdGF9IGZyb20gJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLXV0aWxzJztcblxuaW1wb3J0IHtoZXhUb1JnYiwgZ2V0Q29sb3JHcm91cEJ5TmFtZSwgcmV2ZXJzZUNvbG9yUmFuZ2V9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7Z2V0TWFza0V4dGVuc2lvblByb3BzfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2luZGV4JykuTGF5ZXJ9IExheWVyQ2xhc3N9ICovXG5cbi8qKlxuICogQXBwcm94LiBudW1iZXIgb2YgcG9pbnRzIHRvIHNhbXBsZSBpbiBhIGxhcmdlIGRhdGEgc2V0XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgTEFZRVJfSURfTEVOR1RIID0gNjtcblxuY29uc3QgTUFYX1NBTVBMRV9TSVpFID0gNTAwMDtcbmNvbnN0IGRlZmF1bHREb21haW4gPSBbMCwgMV07XG5jb25zdCBkYXRhRmlsdGVyRXh0ZW5zaW9uID0gbmV3IERhdGFGaWx0ZXJFeHRlbnNpb24oe2ZpbHRlclNpemU6IE1BWF9HUFVfRklMVEVSU30pO1xuXG5jb25zdCBkZWZhdWx0RGF0YUFjY2Vzc29yID0gZGMgPT4gZCA9PiBkO1xuY29uc3QgZGVmYXVsdEdldEZpZWxkVmFsdWUgPSAoZmllbGQsIGQpID0+IGZpZWxkLnZhbHVlQWNjZXNzb3IoZCk7XG5cbmV4cG9ydCBjb25zdCBPVkVSTEFZX1RZUEUgPSBrZXltaXJyb3Ioe1xuICBkZWNrZ2w6IG51bGwsXG4gIG1hcGJveGdsOiBudWxsXG59KTtcblxuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JzID0gT2JqZWN0LnZhbHVlcyhEYXRhVml6Q29sb3JzKS5tYXAoaGV4VG9SZ2IpO1xuZnVuY3Rpb24qIGdlbmVyYXRlQ29sb3IoKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxheWVyQ29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGxheWVyQ29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBsYXllckNvbG9yc1tpbmRleCsrXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuLyoqIEB0eXBlIHtMYXllckNsYXNzfSAqL1xuY2xhc3MgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG5cbiAgICAvLyBtZXRhXG4gICAgdGhpcy5tZXRhID0ge307XG5cbiAgICAvLyB2aXNDb25maWdTZXR0aW5nc1xuICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHtcbiAgICAgIGNvbHVtbnM6IHRoaXMuZ2V0TGF5ZXJDb2x1bW5zKCksXG4gICAgICAuLi5wcm9wc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gRGVmYXVsdExheWVySWNvbjtcbiAgfVxuXG4gIGdldCBvdmVybGF5VHlwZSgpIHtcbiAgICByZXR1cm4gT1ZFUkxBWV9UWVBFLmRlY2tnbDtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IG5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICByZXR1cm4gWydsYWJlbCcsICdvcGFjaXR5JywgJ3RoaWNrbmVzcycsICdpc1Zpc2libGUnLCAnaGlkZGVuJ107XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY29sb3InLFxuICAgICAgICBmaWVsZDogJ2NvbG9yRmllbGQnLFxuICAgICAgICBzY2FsZTogJ2NvbG9yU2NhbGUnLFxuICAgICAgICBkb21haW46ICdjb2xvckRvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY29sb3JSYW5nZScsXG4gICAgICAgIGtleTogJ2NvbG9yJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY29sb3IsXG4gICAgICAgIG51bGxWYWx1ZTogTk9fVkFMVUVfQ09MT1IsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy5jb2xvclxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzaXplJyxcbiAgICAgICAgZmllbGQ6ICdzaXplRmllbGQnLFxuICAgICAgICBzY2FsZTogJ3NpemVTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ3NpemVEb21haW4nLFxuICAgICAgICByYW5nZTogJ3NpemVSYW5nZScsXG4gICAgICAgIGtleTogJ3NpemUnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5zaXplLFxuICAgICAgICBudWxsVmFsdWU6IDAsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogMVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKlxuICAgKiBDb2x1bW4gcGFpcnMgbWFwcyBsYXllciBjb2x1bW4gdG8gYSBzcGVjaWZpYyBmaWVsZCBwYWlycyxcbiAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIG51bGxcbiAgICovXG4gIGdldCBjb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgcG9pbnQgY29sdW1uIHBhaXJzLCBjYW4gYmUgdXNlZCBmb3IgcG9pbnQgYmFzZWQgbGF5ZXJzOiBwb2ludCwgaWNvbiBldGMuXG4gICAqL1xuICBnZXQgZGVmYXVsdFBvaW50Q29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdDoge3BhaXI6ICdsbmcnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzoge3BhaXI6ICdsYXQnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfVxuICAgIH07XG4gIH1cblxuICAvKlxuICAgKiBEZWZhdWx0IGxpbmsgY29sdW1uIHBhaXJzLCBjYW4gYmUgdXNlZCBmb3IgbGluayBiYXNlZCBsYXllcnM6IGFyYywgbGluZSBldGNcbiAgICovXG4gIGdldCBkZWZhdWx0TGlua0NvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXQwOiB7cGFpcjogJ2xuZzAnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzA6IHtwYWlyOiAnbGF0MCcsIGZpZWxkUGFpcktleTogJ2xuZyd9LFxuICAgICAgbGF0MToge3BhaXI6ICdsbmcxJywgZmllbGRQYWlyS2V5OiAnbGF0J30sXG4gICAgICBsbmcxOiB7cGFpcjogJ2xhdDEnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgUmVhY3QgY29tcG9uZW50IGZvciB0byByZW5kZXIgbGF5ZXIgaW5zdHJ1Y3Rpb25zIGluIGEgbW9kYWxcbiAgICogQHJldHVybnMge29iamVjdH0gLSBhbiBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogIHJldHVybiB7XG4gICAqICAgIGlkOiAnaWNvbkluZm8nLFxuICAgKiAgICB0ZW1wbGF0ZTogSWNvbkluZm9Nb2RhbCxcbiAgICogICAgbW9kYWxQcm9wczoge1xuICAgKiAgICAgIHRpdGxlOiAnSG93IHRvIGRyYXcgaWNvbnMnXG4gICAqICAgfTtcbiAgICogfVxuICAgKi9cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qXG4gICAqIEdpdmVuIGEgZGF0YXNldCwgYXV0b21hdGljYWxseSBmaW5kIHByb3BzIHRvIGNyZWF0ZSBsYXllciBiYXNlZCBvbiBpdFxuICAgKiBhbmQgcmV0dXJuIHRoZSBwcm9wcyBhbmQgcHJldmlvdXMgZm91bmQgbGF5ZXJzLlxuICAgKiBCeSBkZWZhdWx0LCBubyBsYXllcnMgd2lsbCBiZSBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyhkYXRhc2V0LCBmb3VuZExheWVycykge1xuICAgIHJldHVybiB7cHJvcHM6IFtdLCBmb3VuZExheWVyc307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBhcnJheSBvZiBwcmVzZXQgcmVxdWlyZWQgY29sdW1uIG5hbWVzXG4gICAqIGZvdW5kIGZpZWxkIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdG8gc2V0IGFzIGxheWVyIGNvbHVtblxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGVmYXVsdEZpZWxkc1xuICAgKiBAcGFyYW0ge29iamVjdFtdfSBhbGxGaWVsZHNcbiAgICogQHJldHVybnMge29iamVjdFtdIHwgbnVsbH0gYWxsIHBvc3NpYmxlIHJlcXVpcmVkIGxheWVyIGNvbHVtbiBwYWlyc1xuICAgKi9cbiAgc3RhdGljIGZpbmREZWZhdWx0Q29sdW1uRmllbGQoZGVmYXVsdEZpZWxkcywgYWxsRmllbGRzKSB7XG4gICAgLy8gZmluZCBhbGwgbWF0Y2hlZCBmaWVsZHMgZm9yIGVhY2ggcmVxdWlyZWQgY29sXG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZGVmYXVsdEZpZWxkcykucmVkdWNlKChwcmV2LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gYWxsRmllbGRzLmZpbHRlcihcbiAgICAgICAgZiA9PiBmLm5hbWUgPT09IGRlZmF1bHRGaWVsZHNba2V5XSB8fCBkZWZhdWx0RmllbGRzW2tleV0uaW5jbHVkZXMoZi5uYW1lKVxuICAgICAgKTtcblxuICAgICAgcHJldltrZXldID0gcmVxdWlyZWRGaWVsZHMubGVuZ3RoXG4gICAgICAgID8gcmVxdWlyZWRGaWVsZHMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgIHZhbHVlOiBmLm5hbWUsXG4gICAgICAgICAgICBmaWVsZElkeDogZi5maWVsZElkeFxuICAgICAgICAgIH0pKVxuICAgICAgICA6IG51bGw7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9LCB7fSk7XG5cbiAgICBpZiAoIU9iamVjdC52YWx1ZXMocmVxdWlyZWRDb2x1bW5zKS5ldmVyeShCb29sZWFuKSkge1xuICAgICAgLy8gaWYgYW55IGZpZWxkIG1pc3NpbmcsIHJldHVybiBudWxsXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsUG9zc2libGVDb2x1bW5QYXJpcyhyZXF1aXJlZENvbHVtbnMpIHtcbiAgICAvLyBmb3IgbXVsdGlwbGUgbWF0Y2hlZCBmaWVsZCBmb3Igb25lIHJlcXVpcmVkIGNvbHVtbiwgcmV0dXJuIG11bHRpcGxlXG4gICAgLy8gY29tYmluYXRpb25zLCBlLiBnLiBpZiBjb2x1bW4gYSBoYXMgMiBtYXRjaGVkLCBjb2x1bW4gYiBoYXMgMyBtYXRjaGVkXG4gICAgLy8gNiBwb3NzaWJsZSBjb2x1bW4gcGFpcnMgd2lsbCBiZSByZXR1cm5lZFxuICAgIGNvbnN0IGFsbEtleXMgPSBPYmplY3Qua2V5cyhyZXF1aXJlZENvbHVtbnMpO1xuICAgIGNvbnN0IHBvaW50ZXJzID0gYWxsS2V5cy5tYXAoKGssIGkpID0+ICgoaSA9PT0gYWxsS2V5cy5sZW5ndGggLSAxID8gLTEgOiAwKSkpO1xuICAgIGNvbnN0IGNvdW50UGVyS2V5ID0gYWxsS2V5cy5tYXAoayA9PiByZXF1aXJlZENvbHVtbnNba10ubGVuZ3RoKTtcbiAgICBjb25zdCBwYWlycyA9IFtdO1xuXG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG4gICAgd2hpbGUgKGluY3JlbWVudFBvaW50ZXJzKHBvaW50ZXJzLCBjb3VudFBlcktleSwgcG9pbnRlcnMubGVuZ3RoIC0gMSkpIHtcbiAgICAgIGNvbnN0IG5ld1BhaXIgPSBwb2ludGVycy5yZWR1Y2UoKHByZXYsIGN1dXIsIGkpID0+IHtcbiAgICAgICAgcHJldlthbGxLZXlzW2ldXSA9IHJlcXVpcmVkQ29sdW1uc1thbGxLZXlzW2ldXVtjdXVyXTtcbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIHBhaXJzLnB1c2gobmV3UGFpcik7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cbiAgICAvLyByZWN1cnNpdmVseSBpbmNyZW1lbnQgcG9pbnRlcnNcbiAgICBmdW5jdGlvbiBpbmNyZW1lbnRQb2ludGVycyhwdHMsIGNvdW50cywgaW5kZXgpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBwdHNbMF0gPT09IGNvdW50c1swXSAtIDEpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBpbmNyZW1lbnRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHRzW2luZGV4XSArIDEgPCBjb3VudHNbaW5kZXhdKSB7XG4gICAgICAgIHB0c1tpbmRleF0gPSBwdHNbaW5kZXhdICsgMTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHB0c1tpbmRleF0gPSAwO1xuICAgICAgcmV0dXJuIGluY3JlbWVudFBvaW50ZXJzKHB0cywgY291bnRzLCBpbmRleCAtIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBwYWlycztcbiAgfVxuXG4gIHN0YXRpYyBoZXhUb1JnYihjKSB7XG4gICAgcmV0dXJuIGhleFRvUmdiKGMpO1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YUlkOiBwcm9wcy5kYXRhSWQgfHwgbnVsbCxcbiAgICAgIHZpc2liaWxpdHlCeVpvb206IHtcbiAgICAgICAgbWluOiBwcm9wcy52aXNpYmlsaXR5Qnlab29tPy5taW4gfHwgWk9PTV9MRVZFTF9MSU1JVFMubWluLFxuICAgICAgICBtYXg6IHByb3BzLnZpc2liaWxpdHlCeVpvb20/Lm1heCB8fCBaT09NX0xFVkVMX0xJTUlUUy5tYXhcbiAgICAgIH0sXG4gICAgICBsYWJlbDogcHJvcHMubGFiZWwgfHwgREVGQVVMVF9MQVlFUl9MQUJFTCxcbiAgICAgIGNvbG9yOiBwcm9wcy5jb2xvciB8fCBjb2xvck1ha2VyLm5leHQoKS52YWx1ZSxcbiAgICAgIGNvbHVtbnM6IHByb3BzLmNvbHVtbnMgfHwgbnVsbCxcbiAgICAgIGlzVmlzaWJsZTogcHJvcHMuaXNWaXNpYmxlIHx8IGZhbHNlLFxuICAgICAgaXNDb25maWdBY3RpdmU6IHByb3BzLmlzQ29uZmlnQWN0aXZlIHx8IGZhbHNlLFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6IHByb3BzLmhpZ2hsaWdodENvbG9yIHx8IERFRkFVTFRfSElHSExJR0hUX0NPTE9SLFxuICAgICAgaGlkZGVuOiBwcm9wcy5oaWRkZW4gfHwgZmFsc2UsXG5cbiAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRoaXMgaW50byBzZXBhcmF0ZSB2aXN1YWwgQ2hhbm5lbCBjb25maWdcbiAgICAgIC8vIGNvbG9yIGJ5IGZpZWxkLCBkb21haW4gaXMgc2V0IGJ5IGZpbHRlcnMsIGZpZWxkLCBzY2FsZSB0eXBlXG4gICAgICBjb2xvckZpZWxkOiBudWxsLFxuICAgICAgY29sb3JEb21haW46IFswLCAxXSxcbiAgICAgIGNvbG9yU2NhbGU6IFNDQUxFX1RZUEVTLnF1YW50aWxlLFxuXG4gICAgICAvLyBjb2xvciBieSBzaXplLCBkb21haW4gaXMgc2V0IGJ5IGZpbHRlcnMsIGZpZWxkLCBzY2FsZSB0eXBlXG4gICAgICBzaXplRG9tYWluOiBbMCwgMV0sXG4gICAgICBzaXplU2NhbGU6IFNDQUxFX1RZUEVTLmxpbmVhcixcbiAgICAgIHNpemVGaWVsZDogbnVsbCxcblxuICAgICAgdmlzQ29uZmlnOiB7fSxcblxuICAgICAgdGV4dExhYmVsOiBbREVGQVVMVF9URVhUX0xBQkVMXSxcblxuICAgICAgY29sb3JVSToge1xuICAgICAgICBjb2xvcjogREVGQVVMVF9DT0xPUl9VSSxcbiAgICAgICAgY29sb3JSYW5nZTogREVGQVVMVF9DT0xPUl9VSVxuICAgICAgfSxcbiAgICAgIGFuaW1hdGlvbjoge2VuYWJsZWQ6IGZhbHNlfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiBhIHZpc3VhbENoYW5uZWwgY29uZmlnXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnMge3tsYWJlbDogc3RyaW5nLCBtZWFzdXJlOiAoc3RyaW5nfHN0cmluZyl9fVxuICAgKi9cbiAgZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uKGtleSkge1xuICAgIC8vIGUuZy4gbGFiZWw6IENvbG9yLCBtZWFzdXJlOiBWZWhpY2xlIFR5cGVcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLnJhbmdlXS5sYWJlbCxcbiAgICAgIG1lYXN1cmU6IHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF1cbiAgICAgICAgPyAodGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmZpZWxkXS5kaXNwbGF5TmFtZSB8fFxuICAgICAgICAgIHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF0ubmFtZSlcbiAgICAgICAgOiB0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZGVmYXVsdE1lYXN1cmVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbiBhIGZpZWxkIHRvIGxheWVyIGNvbHVtbiwgcmV0dXJuIGNvbHVtbiBjb25maWdcbiAgICogQHBhcmFtIGtleSAtIENvbHVtbiBLZXlcbiAgICogQHBhcmFtIGZpZWxkIC0gU2VsZWN0ZWQgZmllbGRcbiAgICogQHJldHVybnMge3t9fSAtIENvbHVtbiBjb25maWdcbiAgICovXG4gIGFzc2lnbkNvbHVtbihrZXksIGZpZWxkKSB7XG4gICAgLy8gZmllbGQgdmFsdWUgY291bGQgYmUgbnVsbCBmb3Igb3B0aW9uYWwgY29sdW1uc1xuICAgIGNvbnN0IHVwZGF0ZSA9IGZpZWxkXG4gICAgICA/IHtcbiAgICAgICAgICB2YWx1ZTogZmllbGQubmFtZSxcbiAgICAgICAgICBmaWVsZElkeDogZmllbGQuZmllbGRJZHhcbiAgICAgICAgfVxuICAgICAgOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMX07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcuY29sdW1ucyxcbiAgICAgIFtrZXldOiB7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnNba2V5XSxcbiAgICAgICAgLi4udXBkYXRlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCBwYWlyIHRvIGNvbHVtbiBjb25maWcsIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBwYWlyIC0gZmllbGQgUGFpclxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIENvbHVtbiBjb25maWdcbiAgICovXG4gIGFzc2lnbkNvbHVtblBhaXJzKGtleSwgcGFpcikge1xuICAgIGlmICghdGhpcy5jb2x1bW5QYWlycyB8fCAhdGhpcy5jb2x1bW5QYWlycz8uW2tleV0pIHtcbiAgICAgIC8vIHNob3VsZCBub3QgZW5kIGluIHRoaXMgc3RhdGVcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5jb2x1bW5zO1xuICAgIH1cblxuICAgIGNvbnN0IHtwYWlyOiBwYXJ0bmVyS2V5LCBmaWVsZFBhaXJLZXl9ID0gdGhpcy5jb2x1bW5QYWlycz8uW2tleV07XG4gICAgY29uc3Qge2ZpZWxkUGFpcktleTogcGFydG5lckZpZWxkUGFpcktleX0gPSB0aGlzLmNvbHVtblBhaXJzPy5bcGFydG5lcktleV07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcuY29sdW1ucyxcbiAgICAgIFtrZXldOiBwYWlyW2ZpZWxkUGFpcktleV0sXG4gICAgICBbcGFydG5lcktleV06IHBhaXJbcGFydG5lckZpZWxkUGFpcktleV1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhIHJhZGl1cyB6b29tIG11bHRpcGxpZXIgdG8gcmVuZGVyIHBvaW50cywgc28gdGhleSBhcmUgdmlzaWJsZSBpbiBhbGwgem9vbSBsZXZlbFxuICAgKiBAcGFyYW0ge29iamVjdH0gbWFwU3RhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1hcFN0YXRlLnpvb20gLSBhY3R1YWwgem9vbVxuICAgKiBAcGFyYW0ge251bWJlciB8IHZvaWR9IG1hcFN0YXRlLnpvb21PZmZzZXQgLSB6b29tT2Zmc2V0IHdoZW4gcmVuZGVyIGluIHRoZSBwbG90IGNvbnRhaW5lciBmb3IgZXhwb3J0IGltYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRab29tRmFjdG9yKHt6b29tLCB6b29tT2Zmc2V0ID0gMH0pIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMiwgTWF0aC5tYXgoMTQgLSB6b29tICsgem9vbU9mZnNldCwgMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhIGVsZXZhdGlvbiB6b29tIG11bHRpcGxpZXIgdG8gcmVuZGVyIHBvaW50cywgc28gdGhleSBhcmUgdmlzaWJsZSBpbiBhbGwgem9vbSBsZXZlbFxuICAgKiBAcGFyYW0ge29iamVjdH0gbWFwU3RhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1hcFN0YXRlLnpvb20gLSBhY3R1YWwgem9vbVxuICAgKiBAcGFyYW0ge251bWJlciB8IHZvaWR9IG1hcFN0YXRlLnpvb21PZmZzZXQgLSB6b29tT2Zmc2V0IHdoZW4gcmVuZGVyIGluIHRoZSBwbG90IGNvbnRhaW5lciBmb3IgZXhwb3J0IGltYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRFbGV2YXRpb25ab29tRmFjdG9yKHt6b29tLCB6b29tT2Zmc2V0ID0gMH0pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudmlzQ29uZmlnLmVuYWJsZUVsZXZhdGlvblpvb21GYWN0b3JcbiAgICAgID8gTWF0aC5wb3coMiwgTWF0aC5tYXgoOCAtIHpvb20gKyB6b29tT2Zmc2V0LCAwKSlcbiAgICAgIDogMTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShkYXRhc2V0cywgZmlsdGVyZWRJbmRleCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldEhvdmVyRGF0YShvYmplY3QsIGRhdGFDb250YWluZXIpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBlbnRyeSBvZiBsYXllckRhdGEgc2hvdWxkIGhhdmUgYW4gaW5kZXggb2YgYSByb3cgaW4gdGhlIG9yaWdpbmFsIGRhdGEgY29udGFpbmVyLlxuICAgIC8vIEVhY2ggbGF5ZXIgY2FuIGltcGxlbWVudCBpdHMgb3duIGdldEhvdmVyRGF0YSBtZXRob2RcbiAgICByZXR1cm4gZGF0YUNvbnRhaW5lci5yb3cob2JqZWN0LmluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGNoYW5nZSBsYXllciB0eXBlLCB0cnkgdG8gY29weSBvdmVyIGxheWVyIGNvbmZpZ3MgYXMgbXVjaCBhcyBwb3NzaWJsZVxuICAgKiBAcGFyYW0gY29uZmlnVG9Db3B5IC0gY29uZmlnIHRvIGNvcHkgb3ZlclxuICAgKiBAcGFyYW0gdmlzQ29uZmlnU2V0dGluZ3MgLSB2aXNDb25maWcgc2V0dGluZ3Mgb2YgY29uZmlnIHRvIGNvcHlcbiAgICovXG4gIGFzc2lnbkNvbmZpZ1RvTGF5ZXIoY29uZmlnVG9Db3B5LCB2aXNDb25maWdTZXR0aW5ncykge1xuICAgIC8vIGRvbid0IGRlZXAgbWVyZ2UgdmlzdWFsQ2hhbm5lbCBmaWVsZFxuICAgIC8vIGRvbid0IGRlZXAgbWVyZ2UgY29sb3IgcmFuZ2UsIHJldmVyc2VkOiBpcyBub3QgYSBrZXkgYnkgZGVmYXVsdFxuICAgIGNvbnN0IHNoYWxsb3dDb3B5ID0gWydjb2xvclJhbmdlJywgJ3N0cm9rZUNvbG9yUmFuZ2UnXS5jb25jYXQoXG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLm1hcCh2ID0+IHYuZmllbGQpXG4gICAgKTtcblxuICAgIC8vIGRvbid0IGNvcHkgb3ZlciBkb21haW4gYW5kIGFuaW1hdGlvblxuICAgIGNvbnN0IG5vdFRvQ29weSA9IFsnYW5pbWF0aW9uJ10uY29uY2F0KE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykubWFwKHYgPT4gdi5kb21haW4pKTtcbiAgICAvLyBpZiByYW5nZSBpcyBmb3IgdGhlIHNhbWUgcHJvcGVydHkgZ3JvdXAgY29weSBpdCwgb3RoZXJ3aXNlLCBub3QgdG8gY29weVxuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaCh2ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnVG9Db3B5LnZpc0NvbmZpZ1t2LnJhbmdlXSAmJlxuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3YucmFuZ2VdICYmXG4gICAgICAgIHZpc0NvbmZpZ1NldHRpbmdzW3YucmFuZ2VdLmdyb3VwICE9PSB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3YucmFuZ2VdLmdyb3VwXG4gICAgICApIHtcbiAgICAgICAgbm90VG9Db3B5LnB1c2godi5yYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBkb24ndCBjb3B5IG92ZXIgdmlzdWFsQ2hhbm5lbCByYW5nZVxuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnLCBjb25maWdUb0NvcHksIHtcbiAgICAgIHNoYWxsb3dDb3B5LFxuICAgICAgbm90VG9Db3B5XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyhjb3BpZWQpO1xuICAgIC8vIHZhbGlkYXRlIHZpc3VhbENoYW5uZWwgZmllbGQgdHlwZSBhbmQgc2NhbGUgdHlwZXNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCk7XG4gICAgfSk7XG4gIH1cblxuICAvKlxuICAgKiBSZWN1cnNpdmVseSBjb3B5IGNvbmZpZyBvdmVyIHRvIGFuIGVtcHR5IGxheWVyXG4gICAqIHdoZW4gcmVjZWl2ZWQgc2F2ZWQgY29uZmlnLCBvciBjb3B5IGNvbmZpZyBvdmVyIGZyb20gYSBkaWZmZXJlbnQgbGF5ZXIgdHlwZVxuICAgKiBtYWtlIHN1cmUgdG8gb25seSBjb3B5IG92ZXIgdmFsdWUgdG8gZXhpc3Rpbmcga2V5c1xuICAgKiBAcGFyYW0ge29iamVjdH0gY3VycmVudENvbmZpZyAtIGV4aXN0aW5nIGNvbmZpZyB0byBiZSBvdmVycmlkZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnVG9Db3B5IC0gbmV3IENvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2hhbGxvd0NvcHkgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIHRvIG5vdCB0byBiZSBkZWVwIGNvcGllZFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBub3RUb0NvcHkgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIG5vdCB0byBjb3B5XG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gY29waWVkIGNvbmZpZ1xuICAgKi9cbiAgY29weUxheWVyQ29uZmlnKGN1cnJlbnRDb25maWcsIGNvbmZpZ1RvQ29weSwge3NoYWxsb3dDb3B5ID0gW10sIG5vdFRvQ29weSA9IFtdfSA9IHt9KSB7XG4gICAgY29uc3QgY29waWVkID0ge307XG4gICAgT2JqZWN0LmtleXMoY3VycmVudENvbmZpZykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc1BsYWluT2JqZWN0KGN1cnJlbnRDb25maWdba2V5XSkgJiZcbiAgICAgICAgaXNQbGFpbk9iamVjdChjb25maWdUb0NvcHlba2V5XSkgJiZcbiAgICAgICAgIXNoYWxsb3dDb3B5LmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgIW5vdFRvQ29weS5pbmNsdWRlcyhrZXkpXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgYXNzaWduIG9iamVjdCB2YWx1ZVxuICAgICAgICBjb3BpZWRba2V5XSA9IHRoaXMuY29weUxheWVyQ29uZmlnKGN1cnJlbnRDb25maWdba2V5XSwgY29uZmlnVG9Db3B5W2tleV0sIHtcbiAgICAgICAgICBzaGFsbG93Q29weSxcbiAgICAgICAgICBub3RUb0NvcHlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKG5vdE51bGxvclVuZGVmaW5lZChjb25maWdUb0NvcHlba2V5XSkgJiYgIW5vdFRvQ29weS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIC8vIGNvcHlcbiAgICAgICAgY29waWVkW2tleV0gPSBjb25maWdUb0NvcHlba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGtlZXAgZXhpc3RpbmdcbiAgICAgICAgY29waWVkW2tleV0gPSBjdXJyZW50Q29uZmlnW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29waWVkO1xuICB9XG5cbiAgcmVnaXN0ZXJWaXNDb25maWcobGF5ZXJWaXNDb25maWdzKSB7XG4gICAgT2JqZWN0LmtleXMobGF5ZXJWaXNDb25maWdzKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBMQVlFUl9WSVNfQ09ORklHU1tsYXllclZpc0NvbmZpZ3NbaXRlbV1dKSB7XG4gICAgICAgIC8vIGlmIGFzc2lnbmVkIG9uZSBvZiBkZWZhdWx0IExBWUVSX0NPTkZJR1NcbiAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnW2l0ZW1dID0gTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbaXRlbV0gPSBMQVlFUl9WSVNfQ09ORklHU1tsYXllclZpc0NvbmZpZ3NbaXRlbV1dO1xuICAgICAgfSBlbHNlIGlmIChbJ3R5cGUnLCAnZGVmYXVsdFZhbHVlJ10uZXZlcnkocCA9PiBsYXllclZpc0NvbmZpZ3NbaXRlbV0uaGFzT3duUHJvcGVydHkocCkpKSB7XG4gICAgICAgIC8vIGlmIHByb3ZpZGVkIGN1c3RvbWl6ZWQgdmlzQ29uZmlnLCBhbmQgaGFzIHR5cGUgJiYgZGVmYXVsdFZhbHVlXG4gICAgICAgIC8vIFRPRE86IGZ1cnRoZXIgY2hlY2sgaWYgY3VzdG9taXplZCB2aXNDb25maWcgaXMgdmFsaWRcbiAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnW2l0ZW1dID0gbGF5ZXJWaXNDb25maWdzW2l0ZW1dLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1tpdGVtXSA9IGxheWVyVmlzQ29uZmlnc1tpdGVtXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldExheWVyQ29sdW1ucygpIHtcbiAgICBjb25zdCBjb2x1bW5WYWxpZGF0b3JzID0gdGhpcy5jb2x1bW5WYWxpZGF0b3JzIHx8IHt9O1xuICAgIGNvbnN0IHJlcXVpcmVkID0gdGhpcy5yZXF1aXJlZExheWVyQ29sdW1ucy5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogY29sdW1uVmFsaWRhdG9yc1trZXldXG4gICAgICAgICAgPyB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgdmFsaWRhdG9yOiBjb2x1bW5WYWxpZGF0b3JzW2tleV19XG4gICAgICAgICAgOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMX1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbmFsID0gdGhpcy5vcHRpb25hbENvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IHt2YWx1ZTogbnVsbCwgZmllbGRJZHg6IC0xLCBvcHRpb25hbDogdHJ1ZX1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHsuLi5yZXF1aXJlZCwgLi4ub3B0aW9uYWx9O1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJDb25maWcobmV3Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7Li4udGhpcy5jb25maWcsIC4uLm5ld0NvbmZpZ307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVMYXllclZpc0NvbmZpZyhuZXdWaXNDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZy52aXNDb25maWcgPSB7Li4udGhpcy5jb25maWcudmlzQ29uZmlnLCAuLi5uZXdWaXNDb25maWd9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJDb2xvclVJKHByb3AsIG5ld0NvbmZpZykge1xuICAgIGNvbnN0IHtjb2xvclVJOiBwcmV2aW91cywgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KG5ld0NvbmZpZykgfHwgdHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvclVJUHJvcCA9IE9iamVjdC5lbnRyaWVzKG5ld0NvbmZpZykucmVkdWNlKChhY2N1LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBpc1BsYWluT2JqZWN0KGFjY3Vba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB7Li4uYWNjdVtrZXldLCAuLi52YWx1ZX0gOiB2YWx1ZVxuICAgICAgfTtcbiAgICB9LCBwcmV2aW91c1twcm9wXSB8fCBERUZBVUxUX0NPTE9SX1VJKTtcblxuICAgIGNvbnN0IGNvbG9yVUkgPSB7XG4gICAgICAuLi5wcmV2aW91cyxcbiAgICAgIFtwcm9wXTogY29sb3JVSVByb3BcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7Y29sb3JVSX0pO1xuICAgIC8vIGlmIGNvbG9yVUlbcHJvcF0gaXMgY29sb3JSYW5nZVxuICAgIGNvbnN0IGlzQ29sb3JSYW5nZSA9IHZpc0NvbmZpZ1twcm9wXSAmJiB2aXNDb25maWdbcHJvcF0uY29sb3JzO1xuXG4gICAgaWYgKGlzQ29sb3JSYW5nZSkge1xuICAgICAgdGhpcy51cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlKG5ld0NvbmZpZywgcHJvcCk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbG9yUmFuZ2VCeUNvbG9yVUkobmV3Q29uZmlnLCBwcmV2aW91cywgcHJvcCk7XG4gICAgICB0aGlzLnVwZGF0ZUN1c3RvbVBhbGV0dGUobmV3Q29uZmlnLCBwcmV2aW91cywgcHJvcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVDdXN0b21QYWxldHRlKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApIHtcbiAgICBpZiAoIW5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnIHx8ICFuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5jdXN0b20pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKCF2aXNDb25maWdbcHJvcF0pIHJldHVybjtcbiAgICBjb25zdCB7Y29sb3JzfSA9IHZpc0NvbmZpZ1twcm9wXTtcbiAgICBjb25zdCBjdXN0b21QYWxldHRlID0ge1xuICAgICAgLi4uY29sb3JVSVtwcm9wXS5jdXN0b21QYWxldHRlLFxuICAgICAgbmFtZTogJ0N1c3RvbSBQYWxldHRlJyxcbiAgICAgIGNvbG9yczogWy4uLmNvbG9yc11cbiAgICB9O1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgY29sb3JVSToge1xuICAgICAgICAuLi5jb2xvclVJLFxuICAgICAgICBbcHJvcF06IHtcbiAgICAgICAgICAuLi5jb2xvclVJW3Byb3BdLFxuICAgICAgICAgIGN1c3RvbVBhbGV0dGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBpZiBvcGVuIGRyb3Bkb3duIGFuZCBwcm9wIGlzIGNvbG9yIHJhbmdlXG4gICAqIEF1dG9tYXRpY2FsbHkgc2V0IGNvbG9yUmFuZ2VDb25maWcncyBzdGVwIGFuZCByZXZlcnNlZFxuICAgKiBAcGFyYW0geyp9IG5ld0NvbmZpZ1xuICAgKiBAcGFyYW0geyp9IHByb3BcbiAgICovXG4gIHVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UobmV3Q29uZmlnLCBwcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDb25maWcuc2hvd0Ryb3Bkb3duICE9PSAnbnVtYmVyJykgcmV0dXJuO1xuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uY29sb3JVSSxcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgLi4uY29sb3JVSVtwcm9wXSxcbiAgICAgICAgICBjb2xvclJhbmdlQ29uZmlnOiB7XG4gICAgICAgICAgICAuLi5jb2xvclVJW3Byb3BdLmNvbG9yUmFuZ2VDb25maWcsXG4gICAgICAgICAgICBzdGVwczogdmlzQ29uZmlnW3Byb3BdLmNvbG9ycy5sZW5ndGgsXG4gICAgICAgICAgICByZXZlcnNlZDogQm9vbGVhbih2aXNDb25maWdbcHJvcF0ucmV2ZXJzZWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICB1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApIHtcbiAgICAvLyBvbmx5IHVwZGF0ZSBjb2xvclJhbmdlIGlmIGNoYW5nZXMgaW4gVUkgaXMgbWFkZSB0byAncmV2ZXJzZWQnLCAnc3RlcHMnIG9yIHN0ZXBzXG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlID1cbiAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnICYmXG4gICAgICBbJ3JldmVyc2VkJywgJ3N0ZXBzJ10uc29tZShcbiAgICAgICAga2V5ID0+XG4gICAgICAgICAgbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnW2tleV0gIT09XG4gICAgICAgICAgICAocHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSkuY29sb3JSYW5nZUNvbmZpZ1trZXldXG4gICAgICApO1xuICAgIGlmICghc2hvdWxkVXBkYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtzdGVwcywgcmV2ZXJzZWR9ID0gY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnO1xuICAgIGNvbnN0IGNvbG9yUmFuZ2UgPSB2aXNDb25maWdbcHJvcF07XG4gICAgLy8gZmluZCBiYXNlZCBvbiBzdGVwIG9yIHJldmVyc2VkXG4gICAgbGV0IHVwZGF0ZTtcbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3N0ZXBzJykpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ2V0Q29sb3JHcm91cEJ5TmFtZShjb2xvclJhbmdlKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHNhbWVHcm91cCA9IENPTE9SX1JBTkdFUy5maWx0ZXIoY3IgPT4gZ2V0Q29sb3JHcm91cEJ5TmFtZShjcikgPT09IGdyb3VwKTtcblxuICAgICAgICB1cGRhdGUgPSBzYW1lR3JvdXAuZmluZChjciA9PiBjci5jb2xvcnMubGVuZ3RoID09PSBzdGVwcyk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSAmJiBjb2xvclJhbmdlLnJldmVyc2VkKSB7XG4gICAgICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UodHJ1ZSwgdXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5jb2xvck1hcCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHRoaXMudXBkYXRlQ29sb3JNYXAocHJvcCwgY29sb3JSYW5nZS5jb2xvck1hcCwgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncmV2ZXJzZWQnKSkge1xuICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UocmV2ZXJzZWQsIHVwZGF0ZSB8fCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHtbcHJvcF06IHVwZGF0ZX0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yTWFwLCBjb2xvclJhbmdlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHtmaWVsZCwgZG9tYWlufSA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YWx1ZSA9PiB2YWx1ZS5yYW5nZSA9PT0gcHJvcCk7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnW2ZpZWxkXT8udHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB0eXBlIG9yIHR5cGUgaXMgbm90IHN0cmluZywgYm9vbGVhbiBvciBkYXRlXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgfVxuXG4gIHVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgY29sb3JSYW5nZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IGNvbG9yUmFuZ2UuY29sb3JzO1xuICAgIGNvbnN0IGFzc2lnbmVkQ2F0ZWdvcmllcyA9IFtdO1xuICAgIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCkubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgYXNzaWduZWRDYXRlZ29yaWVzLnB1c2goY01hcFswXSk7XG4gICAgICByZXR1cm4gW2NNYXBbMF0sIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGZvciAoY29uc3QgY29sb3Igb2YgdW5hc3NpZ25lZENvbG9ycykge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBkb21haW4uZmluZChkID0+ICFhc3NpZ25lZENhdGVnb3JpZXMuaW5jbHVkZXMoZCkpO1xuICAgICAgaWYgKCFjYXRlZ29yeSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5KTtcbiAgICAgIG5ld0NvbG9yTWFwLnB1c2goW2NhdGVnb3J5LCBjb2xvcl0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVOdW1lcmljQ29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgdXBkYXRlKSB7XG4gICAgY29uc3QgY29sb3JzID0gdXBkYXRlLmNvbG9ycztcbiAgICBsZXQgbmV3Q29sb3JNYXAgPSBjb2xvck1hcC5zbGljZSgwLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIG5ld0NvbG9yTWFwID0gbmV3Q29sb3JNYXAubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmRleCA9PT0gbmV3Q29sb3JNYXAubGVuZ3RoIC0gMSA/IG51bGwgOiBjTWFwWzBdO1xuICAgICAgcmV0dXJuIFt2YWx1ZSwgY29sb3JzW2luZGV4XV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5hc3NpZ25lZENvbG9ycyA9IGNvbG9ycy5zbGljZShuZXdDb2xvck1hcC5sZW5ndGgsIGNvbG9ycy5sZW5ndGgpO1xuXG4gICAgaWYgKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWF4VmFsdWUgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gbmV3Q29sb3JNYXBbbmV3Q29sb3JNYXAubGVuZ3RoIC0gMl1bMF07XG4gICAgICBjb25zdCBzdGVwID0gKG1heFZhbHVlIC0gcHJldlZhbHVlKSAvICh1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCArIDEpO1xuICAgICAgbmV3Q29sb3JNYXBbbmV3Q29sb3JNYXAubGVuZ3RoIC0gMV1bMF0gPSBwcmV2VmFsdWUgKyBzdGVwO1xuXG4gICAgICBmb3IgKGNvbnN0IFtpLCBjb2xvcl0gb2YgdW5hc3NpZ25lZENvbG9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpID09PSB1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCAtIDEgPyBudWxsIDogcHJldlZhbHVlICsgKHN0ZXAgKiAoaSArIDIpKTtcbiAgICAgICAgbmV3Q29sb3JNYXAucHVzaChbdmFsdWUsIGNvbG9yXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi51cGRhdGUsXG4gICAgICBjb2xvck1hcDogbmV3Q29sb3JNYXBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB5ZXMgb3Igbm9cbiAgICovXG4gIGhhc0FsbENvbHVtbnMoKSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG4gICAgcmV0dXJuIChcbiAgICAgIChjb2x1bW5zICYmXG4gICAgICBPYmplY3QudmFsdWVzKGNvbHVtbnMpLmV2ZXJ5KHYgPT4ge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih2Lm9wdGlvbmFsIHx8ICh2LnZhbHVlICYmIHYuZmllbGRJZHggPiAtMSkpO1xuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIGxheWVyIGhhcyBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBPYmplY3R9IGxheWVyRGF0YVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0geWVzIG9yIG5vXG4gICAqL1xuICBoYXNMYXllckRhdGEobGF5ZXJEYXRhKSB7XG4gICAgaWYgKCFsYXllckRhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4obGF5ZXJEYXRhLmRhdGEgJiYgbGF5ZXJEYXRhLmRhdGEubGVuZ3RoKTtcbiAgfVxuXG4gIGlzVmFsaWRUb1NhdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSAmJiB0aGlzLmhhc0FsbENvbHVtbnMoKTtcbiAgfVxuXG4gIHNob3VsZFJlbmRlckxheWVyKGRhdGEpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMudHlwZSAmJlxuICAgICAgdGhpcy5oYXNBbGxDb2x1bW5zKCkgJiZcbiAgICAgIHRoaXMuaGFzTGF5ZXJEYXRhKGRhdGEpICYmXG4gICAgICB0eXBlb2YgdGhpcy5yZW5kZXJMYXllciA9PT0gJ2Z1bmN0aW9uJylcbiAgICApO1xuICB9XG5cbiAgZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JSYW5nZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbG9yUmFuZ2UuY29sb3JNYXApKSB7XG4gICAgICBjb25zdCBjTWFwID0gbmV3IE1hcCgpO1xuICAgICAgY29sb3JSYW5nZS5jb2xvck1hcC5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgY01hcC5zZXQoaywgdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gaGV4VG9SZ2IodikgOiB2KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBAdHMtaWdub3JlIGQzIHNjYWxlXG4gICAgICBjb25zdCBzY2FsZSA9IFNDQUxFX0ZVTkNbY29sb3JTY2FsZV0oKVxuICAgICAgICAuZG9tYWluKEFycmF5LmZyb20oY01hcC5rZXlzKCkpKVxuICAgICAgICAucmFuZ2UoQXJyYXkuZnJvbShjTWFwLnZhbHVlcygpKSlcbiAgICAgICAgLnVua25vd24oVU5LTk9XTl9DT0xPUik7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gdmlzdWFsIGNoYW5uZWxzIHRvIGRlY2suZ2wgYWNjZXNvcnNcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtIFBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW0uZGF0YUFjY2Vzc29yIEFjY2VzcyBrZXBsZXIuZ2wgbGF5ZXIgZGF0YSBmcm9tIGRlY2suZ2wgbGF5ZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2V9IHBhcmFtLmRhdGFDb250YWluZXIgRGF0YUNvbnRhaW5lciB0byB1c2UgdXNlIHdpdGggZGF0YUFjY2Vzc29yXG4gICAqIEByZXR1cm4ge09iamVjdH0gYXR0cmlidXRlQWNjZXNzb3JzIC0gZGVjay5nbCBsYXllciBhdHRyaWJ1dGUgYWNjZXNzb3JzXG4gICAqL1xuICBnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMoe2RhdGFBY2Nlc3NvciA9IGRlZmF1bHREYXRhQWNjZXNzb3IsIGRhdGFDb250YWluZXJ9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlQWNjZXNzb3JzID0ge307XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgZml4ZWQsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICBkb21haW4sXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBhY2Nlc3NvcixcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICAgICAgbnVsbFZhbHVlLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlLFxuICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgfSA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG5cbiAgICAgIGNvbnN0IHNob3VsZEdldFNjYWxlID0gdGhpcy5jb25maWdbZmllbGRdO1xuXG4gICAgICBpZiAoc2hvdWxkR2V0U2NhbGUpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IFt0aGlzLmNvbmZpZ1tzY2FsZV0sIHRoaXMuY29uZmlnW2RvbWFpbl0sIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV1dO1xuICAgICAgICBjb25zdCBpc0ZpeGVkID0gZml4ZWQgJiYgdGhpcy5jb25maWcudmlzQ29uZmlnW2ZpeGVkXTtcbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gZGVjbGFyZSBhcyBjb25zdCBhbGwgdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gYmUgdXNlIGluIHRoZSBnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlIGNhbGxcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgb2xkTGF5ZXJEYXRhIHBhcmFtZXRlciBpbiBmb3JtYXRMYXllckRhdGEgbWV0aG9kIHdpbGwgYmUgd3JvbmcgKHlvdSBjYW4gY2hlY2sgdGhlIGZvcm1hdExheWVyRGF0YSBUaWxlTGF5ZXIgbWV0aG9kIGluIEJ1aWxkZXIgYXMgZXhhbXBsZSlcbiAgICAgICAgY29uc3QgZmllbGRDb25maWcgPSB0aGlzLmNvbmZpZ1tmaWVsZF07XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uVmFsdWUgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbYWdncmVnYXRpb25dO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlRnVuY3Rpb24gPVxuICAgICAgICAgIGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmNvbG9yXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29sb3JTY2FsZSguLi5hcmdzKVxuICAgICAgICAgICAgOiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZSguLi5hcmdzLCBpc0ZpeGVkKTtcblxuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZCA9PlxuICAgICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShcbiAgICAgICAgICAgIHNjYWxlRnVuY3Rpb24sXG4gICAgICAgICAgICBkYXRhQWNjZXNzb3IoZGF0YUNvbnRhaW5lcikoZCksXG4gICAgICAgICAgICBmaWVsZENvbmZpZyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uVmFsdWUsXG4gICAgICAgICAgICBudWxsVmFsdWVcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZ2V0QXR0cmlidXRlVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9IGdldEF0dHJpYnV0ZVZhbHVlKHRoaXMuY29uZmlnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0dHJpYnV0ZUFjY2Vzc29yc1thY2Nlc3Nvcl0gPVxuICAgICAgICAgIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0VmFsdWUodGhpcy5jb25maWcpIDogZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWF0dHJpYnV0ZUFjY2Vzc29yc1thY2Nlc3Nvcl0pIHtcbiAgICAgICAgQ29uc29sZS53YXJuKGBGYWlsZWQgdG8gcHJvdmlkZSBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgJHthY2Nlc3NvciB8fCBjaGFubmVsfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUFjY2Vzc29ycztcbiAgfVxuXG4gIGdldFZpc0NoYW5uZWxTY2FsZShzY2FsZSwgZG9tYWluLCByYW5nZSwgZml4ZWQpIHtcbiAgICBpZiAoc2NhbGUgPT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgICAgcmV0dXJuIFNDQUxFX0ZVTkNbc2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihkb21haW4uc2xpY2UoMCwgcmFuZ2UubGVuZ3RoKSlcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlIGQzLXNjYWxlIHR5cGVcbiAgICByZXR1cm4gU0NBTEVfRlVOQ1tmaXhlZCA/ICdsaW5lYXInIDogc2NhbGVdKClcbiAgICAgIC5kb21haW4oZG9tYWluKVxuICAgICAgLnJhbmdlKGZpeGVkID8gZG9tYWluIDogcmFuZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGJvdW5kcyBvZiB0aGUgZGF0YS5cbiAgICogQHBhcmFtIHtpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2V9IGRhdGFDb250YWluZXIgRGF0YUNvbnRhaW5lciB0byBjYWxjdWxhdGUgYm91bmRzIGZvci5cbiAgICogQHBhcmFtIHsoZDoge2luZGV4OiBudW1iZXJ9LCBkYzogaW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PiBudW1iZXJbXX0gZ2V0UG9zaXRpb24gQWNjZXNzIGtlcGxlci5nbCBsYXllciBkYXRhIGZyb20gZGVjay5nbCBsYXllclxuICAgKiBAcmV0dXJuIHtudW1iZXJbXXxudWxsfSBib3VuZHMgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQb2ludHNCb3VuZHMoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBubyBuZWVkIHRvIGxvb3AgdGhyb3VnaCB0aGUgZW50aXJlIGRhdGFzZXRcbiAgICAvLyBnZXQgYSBzYW1wbGUgb2YgZGF0YSB0byBjYWxjdWxhdGUgYm91bmRzXG4gICAgY29uc3Qgc2FtcGxlRGF0YSA9XG4gICAgICBkYXRhQ29udGFpbmVyLm51bVJvd3MoKSA+IE1BWF9TQU1QTEVfU0laRVxuICAgICAgICA/IGdldFNhbXBsZURhdGEoZGF0YUNvbnRhaW5lciwgTUFYX1NBTVBMRV9TSVpFKVxuICAgICAgICA6IGRhdGFDb250YWluZXI7XG5cbiAgICBjb25zdCBwb2ludHMgPSBzYW1wbGVEYXRhLm1hcEluZGV4KGdldFBvc2l0aW9uKTtcblxuICAgIGNvbnN0IGxhdEJvdW5kcyA9IGdldExhdExuZ0JvdW5kcyhwb2ludHMsIDEsIFstOTAsIDkwXSk7XG4gICAgY29uc3QgbG5nQm91bmRzID0gZ2V0TGF0TG5nQm91bmRzKHBvaW50cywgMCwgWy0xODAsIDE4MF0pO1xuXG4gICAgaWYgKCFsYXRCb3VuZHMgfHwgIWxuZ0JvdW5kcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtsbmdCb3VuZHNbMF0sIGxhdEJvdW5kc1swXSwgbG5nQm91bmRzWzFdLCBsYXRCb3VuZHNbMV1dO1xuICB9XG5cbiAgZ2V0Q2hhbmdlZFRyaWdnZXJzKGRhdGFVcGRhdGVUcmlnZ2Vycykge1xuICAgIGNvbnN0IHRyaWdnZXJDaGFuZ2VkID0gZGlmZlVwZGF0ZVRyaWdnZXJzKGRhdGFVcGRhdGVUcmlnZ2VycywgdGhpcy5fb2xkRGF0YVVwZGF0ZVRyaWdnZXJzKTtcbiAgICB0aGlzLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMgPSBkYXRhVXBkYXRlVHJpZ2dlcnM7XG5cbiAgICByZXR1cm4gdHJpZ2dlckNoYW5nZWQ7XG4gIH1cblxuICBnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKFxuICAgIHNjYWxlLFxuICAgIGRhdGEsXG4gICAgZmllbGQsXG4gICAgLy8gSW4gYnVpbGRlciB3ZSBvdmVyd3JpdGUgdGhlIGdldFZhbHVlIGZ1bmN0aW9uIGFuZCB3ZSB1c2UgdGhlIF9hZ2dyZWdhdGlvbiBwYXJhbWV0ZXIgaW4gc3BhdGlhbCBpbmRleCBsYXllcnMgYXMgdGhlIFF1YWRrZXlMYXllci5cbiAgICBfYWdncmVnYXRpb24sXG4gICAgbnVsbFZhbHVlID0gTk9fVkFMVUVfQ09MT1IsXG4gICAgZ2V0VmFsdWUgPSBkZWZhdWx0R2V0RmllbGRWYWx1ZVxuICApIHtcbiAgICBjb25zdCB7dHlwZX0gPSBmaWVsZDtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKGZpZWxkLCBkYXRhKTtcblxuICAgIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXR0cmlidXRlVmFsdWU7XG4gICAgaWYgKHR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXApIHtcbiAgICAgIC8vIHNob3VsZG4ndCBuZWVkIHRvIGNvbnZlcnQgaGVyZVxuICAgICAgLy8gc2NhbGUgRnVuY3Rpb24gc2hvdWxkIHRha2UgY2FyZSBvZiBpdFxuICAgICAgYXR0cmlidXRlVmFsdWUgPSBzY2FsZShuZXcgRGF0ZSh2YWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZChhdHRyaWJ1dGVWYWx1ZSkpIHtcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gbnVsbFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTtcbiAgfVxuXG4gIHVwZGF0ZU1ldGEobWV0YSkge1xuICAgIHRoaXMubWV0YSA9IHsuLi50aGlzLm1ldGEsIC4uLm1ldGF9O1xuICB9XG5cbiAgZ2V0RGF0YVVwZGF0ZVRyaWdnZXJzKHtmaWx0ZXJlZEluZGV4LCBpZCwgYWxsRGF0YX0pIHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiB7XG4gICAgICBnZXREYXRhOiB7ZGF0YXNldElkOiBpZCwgYWxsRGF0YSwgY29sdW1ucywgZmlsdGVyZWRJbmRleH0sXG4gICAgICBnZXRNZXRhOiB7ZGF0YXNldElkOiBpZCwgYWxsRGF0YSwgY29sdW1uc30sXG4gICAgICAuLi4odGhpcy5jb25maWcudGV4dExhYmVsIHx8IFtdKS5yZWR1Y2UoXG4gICAgICAgIChhY2N1LCB0bCwgaSkgPT4gKHtcbiAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgIFtgZ2V0TGFiZWxDaGFyYWN0ZXJTZXQtJHtpfWBdOiB0bC5maWVsZCA/IHRsLmZpZWxkLm5hbWUgOiBudWxsXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRhdGFJZCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBsYXllckRhdGFzZXQgPSBkYXRhc2V0c1t0aGlzLmNvbmZpZy5kYXRhSWRdO1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyfSA9IGxheWVyRGF0YXNldDtcblxuICAgIHRoaXMudXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyhsYXllckRhdGFzZXQpO1xuXG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgY29uc3QgZGF0YVVwZGF0ZVRyaWdnZXJzID0gdGhpcy5nZXREYXRhVXBkYXRlVHJpZ2dlcnMobGF5ZXJEYXRhc2V0KTtcbiAgICBjb25zdCB0cmlnZ2VyQ2hhbmdlZCA9IHRoaXMuZ2V0Q2hhbmdlZFRyaWdnZXJzKGRhdGFVcGRhdGVUcmlnZ2Vycyk7XG5cbiAgICBpZiAodHJpZ2dlckNoYW5nZWQuZ2V0TWV0YSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIGxldCBkYXRhID0gW107XG5cbiAgICBpZiAoIXRyaWdnZXJDaGFuZ2VkLmdldERhdGEgJiYgb2xkTGF5ZXJEYXRhICYmIG9sZExheWVyRGF0YS5kYXRhKSB7XG4gICAgICAvLyBzYW1lIGRhdGFcbiAgICAgIGRhdGEgPSBvbGRMYXllckRhdGEuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IHRoaXMuY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZShsYXllckRhdGFzZXQsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2RhdGEsIHRyaWdnZXJDaGFuZ2VkfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgc3R5bGVkIGZpZWxkcyB0byBtYXRjaCBvbmVzIGZyb20gbmV3IGRhdGFzZXQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0XG4gICAqL1xuICB1cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzKGRhdGFzZXQpIHtcbiAgICBmb3IgKGNvbnN0IHtmaWVsZH0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKSkge1xuICAgICAgY29uc3Qgb2xkRmllbGQgPSB0aGlzLmNvbmZpZ1tmaWVsZF07XG4gICAgICBpZiAoIW9sZEZpZWxkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0RhdGFTZXRGaWVsZCA9IGRhdGFzZXQuZmllbGRzLmZpbmQoZmQgPT4gZmQubmFtZSA9PT0gb2xkRmllbGQubmFtZSkgfHwgbnVsbDtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tmaWVsZF06IG5ld0RhdGFTZXRGaWVsZH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBoZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIG9uZSBsYXllciBkb21haW4gd2hlbiBzdGF0ZS5kYXRhIGNoYW5nZWRcbiAgICogaWYgc3RhdGUuZGF0YSBjaGFuZ2UgaXMgZHVlIG90IHVwZGF0ZSBmaWx0ZXIsIG5ld0ZpbGVyIHdpbGwgYmUgcGFzc2VkXG4gICAqIGNhbGxlZCBieSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGFcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdGaWx0ZXJcbiAgICogQHJldHVybnMge29iamVjdH0gbGF5ZXJcbiAgICovXG4gIHVwZGF0ZUxheWVyRG9tYWluKGRhdGFzZXRzLCBuZXdGaWx0ZXIpIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2V0RGF0YXNldChkYXRhc2V0cyk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGNvbnN0IHtzY2FsZX0gPSBjaGFubmVsO1xuICAgICAgY29uc3Qgc2NhbGVUeXBlID0gdGhpcy5jb25maWdbc2NhbGVdO1xuICAgICAgLy8gb3JkaW5hbCBkb21haW4gaXMgYmFzZWQgb24gZGF0YUNvbnRhaW5lciwgaWYgb25seSBmaWx0ZXIgY2hhbmdlZFxuICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgb3JkaW5hbCBkb21haW5cbiAgICAgIGlmICghbmV3RmlsdGVyIHx8IHNjYWxlVHlwZSAhPT0gU0NBTEVfVFlQRVMub3JkaW5hbCkge1xuICAgICAgICBjb25zdCB7ZG9tYWlufSA9IGNoYW5uZWw7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREb21haW4gPSB0aGlzLmNhbGN1bGF0ZUxheWVyRG9tYWluKHRhYmxlLCBjaGFubmVsKTtcbiAgICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2RvbWFpbl06IHVwZGF0ZWREb21haW59KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0RGF0YXNldChkYXRhc2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhSWQgPyBkYXRhc2V0c1t0aGlzLmNvbmZpZy5kYXRhSWRdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB2aXN1YWwgY2hhbm5lbCBmaWVsZCBhbmQgc2NhbGVzIGJhc2VkIG9uIHN1cHBvcnRlZCBmaWVsZCAmIHNjYWxlIHR5cGVcbiAgICogQHBhcmFtIGNoYW5uZWxcbiAgICovXG4gIHZhbGlkYXRlVmlzdWFsQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdGhpcy52YWxpZGF0ZUZpZWxkVHlwZShjaGFubmVsKTtcbiAgICB0aGlzLnZhbGlkYXRlU2NhbGUoY2hhbm5lbCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmllbGQgdHlwZSBiYXNlZCBvbiBjaGFubmVsU2NhbGVUeXBlXG4gICAqL1xuICB2YWxpZGF0ZUZpZWxkVHlwZShjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgY29uc3Qge2ZpZWxkLCBjaGFubmVsU2NhbGVUeXBlLCBzdXBwb3J0ZWRGaWVsZFR5cGVzfSA9IHZpc3VhbENoYW5uZWw7XG5cbiAgICBpZiAodGhpcy5jb25maWdbZmllbGRdKSB7XG4gICAgICAvLyBpZiBmaWVsZCBpcyBzZWxlY3RlZCwgY2hlY2sgaWYgZmllbGQgdHlwZSBpcyBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IGNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzID1cbiAgICAgICAgc3VwcG9ydGVkRmllbGRUeXBlcyB8fCBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFNbY2hhbm5lbFNjYWxlVHlwZV07XG5cbiAgICAgIGlmICghY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMuaW5jbHVkZXModGhpcy5jb25maWdbZmllbGRdLnR5cGUpKSB7XG4gICAgICAgIC8vIGZpZWxkIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgc2V0IGl0IGJhY2sgdG8gbnVsbFxuICAgICAgICAvLyBzZXQgc2NhbGUgYmFjayB0byBkZWZhdWx0XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tmaWVsZF06IG51bGx9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2NhbGUgdHlwZSBiYXNlZCBvbiBhZ2dyZWdhdGlvblxuICAgKi9cbiAgdmFsaWRhdGVTY2FsZShjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgY29uc3Qge3NjYWxlfSA9IHZpc3VhbENoYW5uZWw7XG4gICAgaWYgKCFzY2FsZSkge1xuICAgICAgLy8gdmlzdWFsQ2hhbm5lbCBkb2Vzbid0IGhhdmUgc2NhbGVcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGVPcHRpb25zID0gdGhpcy5nZXRTY2FsZU9wdGlvbnMoY2hhbm5lbCk7XG4gICAgLy8gY2hlY2sgaWYgY3VycmVudCBzZWxlY3RlZCBzY2FsZSBpc1xuICAgIC8vIHN1cHBvcnRlZCwgaWYgbm90LCBjaGFuZ2UgdG8gZGVmYXVsdFxuICAgIGlmICghc2NhbGVPcHRpb25zLmluY2x1ZGVzKHRoaXMuY29uZmlnW3NjYWxlXSkpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tzY2FsZV06IHNjYWxlT3B0aW9uc1swXX0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2NhbGUgb3B0aW9ucyBiYXNlZCBvbiBjdXJyZW50IGZpZWxkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldFNjYWxlT3B0aW9ucyhjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgY29uc3Qge2ZpZWxkLCBzY2FsZSwgY2hhbm5lbFNjYWxlVHlwZX0gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnW2ZpZWxkXVxuICAgICAgPyBGSUVMRF9PUFRTW3RoaXMuY29uZmlnW2ZpZWxkXS50eXBlXS5zY2FsZVtjaGFubmVsU2NhbGVUeXBlXVxuICAgICAgOiBbdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoKVtzY2FsZV1dO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQsIGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICB0aGlzLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChjaGFubmVsKTtcbiAgICAvLyBjYWxjdWxhdGUgbGF5ZXIgY2hhbm5lbCBkb21haW5cbiAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbihkYXRhc2V0LCB2aXN1YWxDaGFubmVsKTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbdmlzdWFsQ2hhbm5lbC5kb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gIH1cblxuICBnZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKSB7XG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB7fTtcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2godmlzdWFsQ2hhbm5lbCA9PiB7XG4gICAgICAvLyBmaWVsZCByYW5nZSBzY2FsZSBkb21haW5cbiAgICAgIGNvbnN0IHthY2Nlc3NvciwgZmllbGQsIHNjYWxlLCBkb21haW4sIHJhbmdlLCBkZWZhdWx0VmFsdWUsIGZpeGVkfSA9IHZpc3VhbENoYW5uZWw7XG5cbiAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSA9IHtcbiAgICAgICAgW2ZpZWxkXTogdGhpcy5jb25maWdbZmllbGRdLFxuICAgICAgICBbc2NhbGVdOiB0aGlzLmNvbmZpZ1tzY2FsZV0sXG4gICAgICAgIFtkb21haW5dOiB0aGlzLmNvbmZpZ1tkb21haW5dLFxuICAgICAgICBbcmFuZ2VdOiB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0VmFsdWUodGhpcy5jb25maWcpIDogZGVmYXVsdFZhbHVlLFxuICAgICAgICAuLi4oZml4ZWQgPyB7W2ZpeGVkXTogdGhpcy5jb25maWcudmlzQ29uZmlnW2ZpeGVkXX0gOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHVwZGF0ZVRyaWdnZXJzO1xuICB9XG5cbiAgY2FsY3VsYXRlTGF5ZXJEb21haW4oZGF0YXNldCwgdmlzdWFsQ2hhbm5lbCkge1xuICAgIGNvbnN0IHtzY2FsZX0gPSB2aXN1YWxDaGFubmVsO1xuICAgIGNvbnN0IHNjYWxlVHlwZSA9IHRoaXMuY29uZmlnW3NjYWxlXTtcblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF07XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgLy8gaWYgY29sb3JGaWVsZCBvciBzaXplRmllbGQgd2VyZSBzZXQgYmFjayB0byBudWxsXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICBpZiAoIWRhdGFTZXRGaWVsZCkge1xuICAgICAgLy8gaWYgbmV3IGRhdGFzZXQgZG9lc24ndCBjb250YWluIHByZXZpb3VzbHkgc2V0IGZpZWxkXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YXNldC5nZXRDb2x1bW5MYXllckRvbWFpbihkYXRhU2V0RmllbGQsIHNjYWxlVHlwZSkgfHwgZGVmYXVsdERvbWFpbjtcbiAgfVxuXG4gIGhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SW5mbykge1xuICAgIHJldHVybiB0aGlzLmlzTGF5ZXJIb3ZlcmVkKG9iamVjdEluZm8pICYmIG9iamVjdEluZm8ub2JqZWN0ID8gb2JqZWN0SW5mby5vYmplY3QgOiBudWxsO1xuICB9XG5cbiAgaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykge1xuICAgIHJldHVybiBvYmplY3RJbmZvPy5waWNrZWQgJiYgb2JqZWN0SW5mbz8ubGF5ZXI/LnByb3BzPy5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlQnlab29tKG1hcFN0YXRlLCBmaXhlZFJhZGl1cykge1xuICAgIGNvbnN0IHJhZGl1c0NoYW5uZWwgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmMgPT4gdmMucHJvcGVydHkgPT09ICdyYWRpdXMnKTtcblxuICAgIGlmICghcmFkaXVzQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGQgPSByYWRpdXNDaGFubmVsLmZpZWxkO1xuICAgIGNvbnN0IGZpeGVkID0gZml4ZWRSYWRpdXMgPT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maXhlZFJhZGl1cyA6IGZpeGVkUmFkaXVzO1xuICAgIGNvbnN0IHtyYWRpdXN9ID0gdGhpcy5jb25maWcudmlzQ29uZmlnO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBmaXhlZCA/IDEgOiAodGhpcy5jb25maWdbZmllbGRdID8gMSA6IHJhZGl1cykgKiB0aGlzLmdldFpvb21GYWN0b3IobWFwU3RhdGUpO1xuICB9XG5cbiAgZ2V0UmFkaXVzU2NhbGUoZml4ZWRSYWRpdXMpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzQ2hhbm5lbC5maWVsZDtcbiAgICBjb25zdCBmaXhlZCA9IGZpeGVkUmFkaXVzID09PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy52aXNDb25maWcuZml4ZWRSYWRpdXMgOiBmaXhlZFJhZGl1cztcbiAgICBjb25zdCB7cmFkaXVzfSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZztcblxuICAgIHJldHVybiBmaXhlZCA/IDEgOiAodGhpcy5jb25maWdbZmllbGRdID8gMSA6IHJhZGl1cyk7XG4gIH1cblxuICBnZXRSYWRpdXNVbml0KGZpeGVkUmFkaXVzKSB7XG4gICAgY29uc3QgcmFkaXVzQ2hhbm5lbCA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YyA9PiB2Yy5wcm9wZXJ0eSA9PT0gJ3JhZGl1cycpO1xuXG4gICAgaWYgKCFyYWRpdXNDaGFubmVsKSB7XG4gICAgICByZXR1cm4gJ3BpeGVscyc7XG4gICAgfVxuXG4gICAgY29uc3QgZml4ZWQgPSBmaXhlZFJhZGl1cyA9PT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcudmlzQ29uZmlnLmZpeGVkUmFkaXVzIDogZml4ZWRSYWRpdXM7XG5cbiAgICByZXR1cm4gZml4ZWQgPyAnbWV0ZXJzJyA6ICdwaXhlbHMnO1xuICB9XG5cbiAgc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnNvbWUocCA9PiAhdGhpcy5ub25lTGF5ZXJEYXRhQWZmZWN0aW5nUHJvcHMuaW5jbHVkZXMocCkpO1xuICB9XG5cbiAgZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZywgYnJ1c2hpbmdUYXJnZXQpIHtcbiAgICBjb25zdCB7YnJ1c2h9ID0gaW50ZXJhY3Rpb25Db25maWc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gYnJ1c2hpbmdcbiAgICAgIGF1dG9IaWdobGlnaHQ6ICFicnVzaC5lbmFibGVkLFxuICAgICAgYnJ1c2hpbmdSYWRpdXM6IGJydXNoLmNvbmZpZy5zaXplICogMTAwMCxcbiAgICAgIGJydXNoaW5nVGFyZ2V0OiBicnVzaGluZ1RhcmdldCB8fCAnc291cmNlJyxcbiAgICAgIGJydXNoaW5nRW5hYmxlZDogYnJ1c2guZW5hYmxlZFxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0RGVja0xheWVyUHJvcHMoe2lkeCwgZ3B1RmlsdGVyLCBtYXBTdGF0ZSwgdmlzaWJsZSwgbWFza1BvbHlnb259KSB7XG4gICAgY29uc3QgbWFza0V4dGVuc2lvblByb3BzID0gZ2V0TWFza0V4dGVuc2lvblByb3BzKG1hc2tQb2x5Z29uKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFza0V4dGVuc2lvblByb3BzLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpZHgsXG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVQsXG4gICAgICBwaWNrYWJsZTogdHJ1ZSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBwYXJhbWV0ZXJzOiB7ZGVwdGhUZXN0OiBCb29sZWFuKG1hcFN0YXRlLmRyYWdSb3RhdGUgfHwgdGhpcy5jb25maWcudmlzQ29uZmlnLmVuYWJsZTNkKX0sXG4gICAgICBoaWRkZW46IHRoaXMuY29uZmlnLmhpZGRlbixcbiAgICAgIHZpc2liaWxpdHlCeVpvb206IHtcbiAgICAgICAgbWluOiB0aGlzLmNvbmZpZy52aXNpYmlsaXR5Qnlab29tLm1pbixcbiAgICAgICAgbWF4OiB0aGlzLmNvbmZpZy52aXNpYmlsaXR5Qnlab29tLm1heFxuICAgICAgfSxcbiAgICAgIC8vIHZpc2NvbmZpZ1xuICAgICAgb3BhY2l0eTogdGhpcy5jb25maWcudmlzQ29uZmlnLm9wYWNpdHksXG4gICAgICBoaWdobGlnaHRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAvLyBkYXRhIGZpbHRlcmluZ1xuICAgICAgZXh0ZW5zaW9uczogW2RhdGFGaWx0ZXJFeHRlbnNpb24sIC4uLm1hc2tFeHRlbnNpb25Qcm9wcy5leHRlbnNpb25zXSxcbiAgICAgIGZpbHRlclJhbmdlOiBncHVGaWx0ZXIgPyBncHVGaWx0ZXIuZmlsdGVyUmFuZ2UgOiB1bmRlZmluZWQsXG4gICAgICAvLyBsYXllciBzaG91bGQgYmUgdmlzaWJsZSBhbmQgaWYgc3BsaXRNYXAsIHNob3duIGluIHRvIG9uZSBvZiBwYW5lbFxuICAgICAgdmlzaWJsZTogdGhpcy5jb25maWcuaXNWaXNpYmxlICYmIHZpc2libGVcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke3RoaXMuaWR9LWhvdmVyZWRgLFxuICAgICAgcGlja2FibGU6IGZhbHNlLFxuICAgICAgd3JhcExvbmdpdHVkZTogdHJ1ZSxcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVFxuICAgIH07XG4gIH1cblxuICByZW5kZXJUZXh0TGFiZWxMYXllcih7Z2V0UG9zaXRpb24sIGdldFBpeGVsT2Zmc2V0LCB1cGRhdGVUcmlnZ2Vycywgc2hhcmVkUHJvcHN9LCByZW5kZXJPcHRzKSB7XG4gICAgY29uc3Qge2RhdGEsIG1hcFN0YXRlfSA9IHJlbmRlck9wdHM7XG4gICAgY29uc3Qge3RleHRMYWJlbH0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBkYXRhLnRleHRMYWJlbHMucmVkdWNlKChhY2N1LCBkLCBpKSA9PiB7XG4gICAgICBpZiAoZC5nZXRUZXh0KSB7XG4gICAgICAgIGFjY3UucHVzaChcbiAgICAgICAgICBuZXcgVGV4dExheWVyKHtcbiAgICAgICAgICAgIC4uLnNoYXJlZFByb3BzLFxuICAgICAgICAgICAgaWQ6IGAke3RoaXMuaWR9LWxhYmVsLSR7dGV4dExhYmVsW2ldLmZpZWxkPy5uYW1lfWAsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgICAgICBnZXRUZXh0OiBkLmdldFRleHQsXG4gICAgICAgICAgICBnZXRQb3NpdGlvbixcbiAgICAgICAgICAgIGNoYXJhY3RlclNldDogZC5jaGFyYWN0ZXJTZXQsXG4gICAgICAgICAgICBnZXRQaXhlbE9mZnNldDogZ2V0UGl4ZWxPZmZzZXQodGV4dExhYmVsW2ldKSxcbiAgICAgICAgICAgIGdldFNpemU6IDEsXG4gICAgICAgICAgICBzaXplU2NhbGU6IHRleHRMYWJlbFtpXS5zaXplLFxuICAgICAgICAgICAgZ2V0VGV4dEFuY2hvcjogdGV4dExhYmVsW2ldLmFuY2hvcixcbiAgICAgICAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiB0ZXh0TGFiZWxbaV0uYWxpZ25tZW50LFxuICAgICAgICAgICAgZ2V0Q29sb3I6IHRleHRMYWJlbFtpXS5jb2xvcixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgLy8gdGV4dCB3aWxsIGFsd2F5cyBzaG93IG9uIHRvcCBvZiBhbGwgbGF5ZXJzXG4gICAgICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgICAgICAgIGdldFRleHQ6IHRleHRMYWJlbFtpXS5maWVsZD8ubmFtZSxcbiAgICAgICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAuLi51cGRhdGVUcmlnZ2Vycy5nZXRSYWRpdXMsXG4gICAgICAgICAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgICAgICAgICAgYW5jaG9yOiB0ZXh0TGFiZWxbaV0uYW5jaG9yLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogdGV4dExhYmVsW2ldLmFsaWdubWVudFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnZXRUZXh0QW5jaG9yOiB0ZXh0TGFiZWxbaV0uYW5jaG9yLFxuICAgICAgICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogdGV4dExhYmVsW2ldLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgZ2V0Q29sb3I6IHRleHRMYWJlbFtpXS5jb2xvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKGtlcGxlclRhYmxlLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB1cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gIH1cblxuICBnZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gICAgcmV0dXJuICgpID0+IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXI7XG4iXX0=