iszolea-ui 1.2.8 → 1.2.9

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.
@@ -3712,6 +3712,8 @@
3712
3712
  onContentReady: (e) => {
3713
3713
  var _a3;
3714
3714
  const dataGrid = e.component;
3715
+ dataGrid.beginUpdate();
3716
+ console.log("BEGIN");
3715
3717
  if (!settings.disableSummaryColumnDetection) {
3716
3718
  updateSummaryColumnIfRequired(dataGrid);
3717
3719
  }
@@ -3769,6 +3771,8 @@
3769
3771
  if ((_a3 = settings.options) == null ? void 0 : _a3.onContentReady) {
3770
3772
  settings.options.onContentReady(e);
3771
3773
  }
3774
+ console.log("END 1");
3775
+ dataGrid.endUpdate();
3772
3776
  },
3773
3777
  onToolbarPreparing: (e) => {
3774
3778
  var _a3;
@@ -10396,4 +10400,4 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
10396
10400
  var Scripts_default = IszoleaUI;
10397
10401
  window.IszoleaUI = IszoleaUI;
10398
10402
  })();
10399
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvVXRpbHMvR3JpZEV4cG9ydC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvSGVhZGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvY2RtSW1wb3J0RmlsZU1vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9JR3JpZFN0YXRlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0Zvb3Rlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0F1dG9SZXNpemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9GdWxsU2NyZWVuLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVGhlbWUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9Ub29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRGVmYXVsdFRvb2xiYXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9QYW5lbEhlaWdodC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvQ3JlYXRlRnVsbFNjcmVlbkdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgd3JhcHBlckF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGlkZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICBvblNob3duOiAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hEcm9wRG93bi5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c0luOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5hZGRDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCAmJiB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQoKTtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoJ2lucHV0LmR4LXRleHRlZGl0b3ItaW5wdXQnKS52YWwoKSBhcyBzdHJpbmcpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZvY3VzT3V0OiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoJ2lucHV0LmR4LXRleHRlZGl0b3ItaW5wdXQnKS52YWwoKSkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuZWxlbWVudCgpLnJlbW92ZUNsYXNzKCdmb2N1c2VkJyk7XHJcbiAgICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbktleVVwOiAoZSkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZXZlbnQ6IEtleWJvYXJkRXZlbnQgPSBlLmV2ZW50IGFzIGFueTtcclxuXHJcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICAgIHRoaXMuY2hlY2tTZWFyY2hSZXN1dFBvcHVwVmlzaWJpbGl0eSh2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5zZWFyY2hCeVRleHQodmFsdWUpO1xyXG4gICAgICAgICAgY29uc3QgdHJpZ2dlcmVkRm9jdXNCdXR0b25zID0gWydUYWInLCAnRW50ZXInLCAnQXJyb3dEb3duJywgJ0Fycm93VXAnXTtcclxuICAgICAgICAgIGlmICh0cmlnZ2VyZWRGb2N1c0J1dHRvbnMuc29tZSgoYikgPT4gYiA9PT0gZXZlbnQua2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5mb2N1cyh0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5nZXRDZWxsRWxlbWVudCgwLCAnTmFtZScpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgb25LZXlEb3duOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tTZWFyY2hSZXN1dFBvcHVwVmlzaWJpbGl0eShlLnZhbHVlKTtcclxuICAgICAgfSxcclxuICAgIH0pLmFkZENsYXNzKFsnZm9ybS1jb250cm9sJywgJ21yLXNtLTInLCAnc2VhcmNoLWRyb3Bkb3duJ10pO1xyXG5cclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24gPSAkaW5wdXQuZHhEcm9wRG93bkJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICBmb3JtRWxlbWVudC5hcHBlbmRDaGlsZCgkaW5wdXRbMF0pO1xyXG4gICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZChmb3JtRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9NZW51SXRlbShtZW51SXRlbTogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGNvbnN0IHVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKG1lbnVJdGVtKTtcclxuXHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VTZWFyY2hEcm9wRG93bigpO1xyXG5cclxuICAgICAgY29uc3QgYXJnczogTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCA9IHtcclxuICAgICAgICBpdGVtOiBtZW51SXRlbSxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBudWxsLFxyXG4gICAgICAgIGNhbmNlbDogZmFsc2VcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMub25NZW51SXRlbUNsaWNrPy4oYXJncyk7XHJcblxyXG4gICAgICBpZiAoYXJncy5jYW5jZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub25NZW51SXRlbU9wZW5lZCAmJiB0aGlzLm9uTWVudUl0ZW1PcGVuZWQoeyBtZW51SXRlbSB9KTtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlU2VhcmNoRHJvcERvd24oKSB7XHJcbiAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5vcHRpb24oJ2ZvY3VzZWRSb3dLZXknLCB1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8ub3B0aW9uKCd2YWx1ZScsICcnKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/LmZvY3VzKCk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5ibHVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wZW4oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24/LmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERhdGFTb3VyY2VGb3JTZWFyY2goZHM6IElTZWFyY2hEYXRhU291cmNlKTogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIWRzKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ2V0UmVkdWNlciA9IChpc0dsb2JhbDogYm9vbGVhbikgPT4ge1xyXG4gICAgICBjb25zdCByZWR1Y2VyID0gKHJlczogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSwgaXRlbTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uSXRlbXMgJiYgaXRlbS5JdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGl0ZW0uSXRlbXMgPSBpdGVtLkl0ZW1zLnJlZHVjZShyZWR1Y2VyLCBbXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBpdGVtLlZpc2libGUgPT09IHVuZGVmaW5lZCB8fCBpdGVtLlZpc2libGUgPT09IG51bGwgfHwgaXRlbS5WaXNpYmxlID09PSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpdGVtLkRpc2FibGVkID09PSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoaXNWaXNpYmxlICYmICFpc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgICByZXMucHVzaCh7IC4uLml0ZW0sIGlzR2xvYmFsIH0gYXMgSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiByZWR1Y2VyO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoZHMucGVyc29uYWxJdGVtcyAmJiBkcy5wZXJzb25hbEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBnbG9iYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnR2xvYmFsIE1lbnUnLCBJZDogLTEsIGlzR2xvYmFsOiB0cnVlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLmdsb2FiYWxJdGVtcy5yZWR1Y2UoZ2V0UmVkdWNlcih0cnVlKSwgW10pXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBwZXJzb25hbE1lbnVSb290ID0ge1xyXG4gICAgICAgIE5hbWU6ICdQZXJzb25hbCBNZW51JywgSWQ6IC0yLCBpc0dsb2JhbDogZmFsc2UsIFR5cGU6IE1lbnVJdGVtVHlwZS5NZW51Tm9kZSxcclxuICAgICAgICBJdGVtczogZHMucGVyc29uYWxJdGVtcy5yZWR1Y2UoZ2V0UmVkdWNlcihmYWxzZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSA/IFtnbG9iYWxNZW51Um9vdCwgcGVyc29uYWxNZW51Um9vdF0gOiBbcGVyc29uYWxNZW51Um9vdCwgZ2xvYmFsTWVudVJvb3RdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRzLmdsb2FiYWxJdGVtcy5yZWR1Y2UoZ2V0UmVkdWNlcih0cnVlKSwgW10pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IHsgRGV2RXhwcmVzc0V2ZW50QXJncyB9IGZyb20gJy4vRGV2RXhwcmVzc0V2ZW50QXJncyc7XHJcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vRXZlbnRFbWl0dGVyJztcclxuZXhwb3J0IHsgZ2V0R2VuZXJhbFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSB9IGZyb20gJy4vR2VuZXJhbFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSc7XHJcbmV4cG9ydCB7IGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbiB9IGZyb20gJy4vR3JpZEV4cG9ydCc7XHJcbiIsICJcdUZFRkZleHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TGlzdGVuZXJzOiBhbnlbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb24oZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgaWYgKCF0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0pIHtcclxuICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1tldnRdID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ldmVudExpc3RlbmVyc1tldnRdLnB1c2gobGlzdGVuZXIpO1xyXG5cclxuICAgIHJldHVybiBsaXN0ZW5lcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbmNlKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIHRoaXMub24oZXZ0LCAoZSkgPT4ge1xyXG4gICAgICBsaXN0ZW5lcihlKTtcclxuICAgICAgdGhpcy5vZmYoZXZ0LCBsaXN0ZW5lcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0KGV2dCwgZSA9IG51bGwpIHtcclxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XTtcclxuXHJcbiAgICBpZiAobGlzdGVuZXJzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIpIHtcclxuICAgICAgICAgIGN1cnJlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9mZihldnQsIGxpc3RlbmVyKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBjdXJyZW50TGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRMaXN0ZW5lciAhPT0gbGlzdGVuZXIpIHtcclxuICAgICAgICAgIGZpbHRlcmVkLnB1c2goY3VycmVudExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IGZpbHRlcmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFkZEhhbmRsZXIoZXZlbnQ6IHN0cmluZywgb3JpZ2luSGFuZGxlciwgZ2V0QXJndW1lbnRzKSB7XHJcbiAgICBjb25zdCBpbnRlcm5hbEhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgIG9yaWdpbkhhbmRsZXIoXHJcbiAgICAgICAgZ2V0QXJndW1lbnRzKCksXHJcbiAgICAgICAgKCkgPT4gdGhpcy5vZmYoZXZlbnQsIGludGVybmFsSGFuZGxlcilcclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vbihldmVudCwgaW50ZXJuYWxIYW5kbGVyKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCBzYXZlQXMgZnJvbSAnZmlsZS1zYXZlcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uKHJlcG9ydE5hbWU6IHN0cmluZyk6IChlOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuRXhwb3J0aW5nRXZlbnQpID0+IHZvaWQge1xyXG4gIHJldHVybiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB7XHJcbiAgICBjb25zdCB3b3JrYm9vayA9IG5ldyAod2luZG93IGFzIGFueSkuRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gd29ya2Jvb2suYWRkV29ya3NoZWV0KHJlcG9ydE5hbWUpO1xyXG5cclxuICAgIERldkV4cHJlc3MuZXhjZWxFeHBvcnRlci5leHBvcnREYXRhR3JpZCh7XHJcbiAgICAgIHdvcmtzaGVldCxcclxuICAgICAgY29tcG9uZW50OiBlLmNvbXBvbmVudCxcclxuICAgICAgY3VzdG9taXplQ2VsbDogKG9wdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBleGNlbENlbGwgPSBvcHRpb25zLmV4Y2VsQ2VsbDtcclxuXHJcbiAgICAgICAgZXhjZWxDZWxsLmZvbnQgPSB7IG5hbWU6ICdBcmlhbCcsIHNpemU6IDEyIH07XHJcbiAgICAgICAgZXhjZWxDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2xlZnQnIH07XHJcbiAgICAgIH1cclxuICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGZ1bmN0aW9uKGJ1ZmZlcikge1xyXG4gICAgICAgIHNhdmVBcyhuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KSwgYCR7cmVwb3J0TmFtZX0ueGxzeGApO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgZS5jYW5jZWwgPSB0cnVlO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IsIE11dGFibGUgfSBmcm9tICcuLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBJTGF5b3V0QnJlYWtwb2ludCwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMsIGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IFVzZXJNZW51LCBVc2VyTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi9Vc2VyTWVudSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25NZW51LCBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi9OYXZpZ2F0aW9uTWVudSc7XHJcbmltcG9ydCB7IExvZ28gfSBmcm9tICcuL0xvZ28nO1xyXG5pbXBvcnQgeyBNZW51U3dpdGNoZXIgfSBmcm9tICcuL01lbnVTd2l0Y2hlcic7XHJcbmltcG9ydCB7IElVc2VyTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSVVzZXJNZW51SXRlbSc7XHJcbmltcG9ydCB7IElNZW51U2V0dGluZ3MgfSBmcm9tICcuL0lNZW51U2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBJQXBwTWVudU1vZGVsIH0gZnJvbSAnLi9JQXBwTWVudU1vZGVsJztcclxuaW1wb3J0IHsgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5pbXBvcnQgU2VhcmNoLCB7IElPcGVuUmVwb3J0RXZlbnRBcmdzLCBJU2VhcmNoRGF0YVNvdXJjZSB9IGZyb20gJy4vU2VhcmNoJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vVXRpbHMvSW5kZXgnO1xyXG5cclxuY29uc3QgSEVBREVSX0RBVEFfQ0FDSEVfRklFTEQgPSAnaXN6b2xlYS11aXxoZWFkZXItZGF0YS1jYWNoZSc7XHJcbmNvbnN0IFNIT1dfR0xPQkFMX01FTlVfS0VZID0gJ2lzem9sZWEtdWl8c2hvdy1nbG9iYWwtbWVudSc7XHJcblxyXG5jb25zdCBnZXREYXRhU291cmNlQ2FjaGVGaWVsZCA9ICh1c2VyTmFtZT86IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiBgJHtIRUFERVJfREFUQV9DQUNIRV9GSUVMRH0ke3VzZXJOYW1lID8gYHwke3VzZXJOYW1lfWAgOiAnJ31gO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgSGVhZGVyVGhlbWVzID0gJ2lzem9sZWEnO1xyXG5leHBvcnQgaW50ZXJmYWNlIElIZWFkZXJPcHRpb25zIHtcclxuICAkZWw6IEpRdWVyeTtcclxuICBtZW51U2V0dGluZ3M/OiBJTWVudVNldHRpbmdzO1xyXG4gIGxvZ29TZXR0aW5ncz86IElMb2dvU2V0dGluZ3MgfCBzdHJpbmc7XHJcbiAgZGlzcGxheVNlYXJjaD86IGJvb2xlYW47XHJcbiAgaW1tZWRpYXRlUmVuZGVyPzogYm9vbGVhbjtcclxuICB0aGVtZT86IEhlYWRlclRoZW1lcztcclxuICBvbkluaXQ/OiAoKSA9PiB2b2lkO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUhlYWRlckVsZW1lbnRzIHtcclxuICByZWFkb25seSByb290PzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgbG9nb0NvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IGNvbnRlbnRDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSB0b2dnbGVCdXR0b25Db250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSB0b2dnbGVCdXR0b24/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBtZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgbWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQWpheFBhZ2VNYXJrZXIge1xyXG4gIGlzTG9hZGVkQnlBamF4OiB0cnVlO1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIGlzTWVudVN3aXRjaGVyR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSGVhZGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQgPSAnbWVudS1zd2l0Y2hlci1pbml0aWFsaXplZC1ldmVudCc7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdMT0JBTF9VUkxfUkVHRVggPSBuZXcgUmVnRXhwKCdeKD86W2Etel0rOik/Ly8nLCAnaScpO1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERPQ1RZUEVfTUFSS0VSX1JFR0VYID0gbmV3IFJlZ0V4cCgnIURPQ1RZUEUgaHRtbD4nLCAnaScpO1xyXG5cclxuICBwdWJsaWMgdXNlck1lbnU6IFVzZXJNZW51IHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBuYXZpZ2F0aW9uTWVudTogTmF2aWdhdGlvbk1lbnUgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIG1lbnVTd2l0Y2hlcjogTWVudVN3aXRjaGVyIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBsb2dvOiBMb2dvIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBkYXRhOiBJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHRoZW1lOiBIZWFkZXJUaGVtZXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtZW51U2V0dGluZ3M6IElNZW51U2V0dGluZ3MgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5U2VhcmNoOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRQYW5lbDogRGV2RXhwcmVzcy51aS5keExvYWRQYW5lbDtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyOiBKUXVlcnkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25QYXJ0aWFsVmlld0xvYWRlZDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrSGFuZGxlciA9IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyID0gdGhpcy5vbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZC5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Vc2VyTWVudUl0ZW1DbGlja0hhbmRsZXIgPSB0aGlzLm9uVXNlck1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHNlYXJjaDogU2VhcmNoIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyBlbGVtZW50c1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGVsOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50czogTXV0YWJsZTxJSGVhZGVyRWxlbWVudHM+ID0ge307XHJcbiAgcHJpdmF0ZSAkbG9hZEJhcjogSlF1ZXJ5IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJSGVhZGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLiRlbCA9IG9wdGlvbnMuJGVsO1xyXG4gICAgdGhpcy5tZW51U2V0dGluZ3MgPSBvcHRpb25zLm1lbnVTZXR0aW5ncztcclxuICAgIHRoaXMubG9nb1NldHRpbmdzID0gb3B0aW9ucy5sb2dvU2V0dGluZ3M7XHJcbiAgICB0aGlzLnRoZW1lID0gb3B0aW9ucy50aGVtZSB8fCAnaXN6b2xlYSc7XHJcbiAgICB0aGlzLmRpc3BsYXlTZWFyY2ggPSBvcHRpb25zLmRpc3BsYXlTZWFyY2g7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcblxyXG4gICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlciA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5wYXJ0aWFsVmlld1BsYWNlSG9sZGVyO1xyXG4gICAgdGhpcy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LnVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmc7XHJcbiAgICB0aGlzLm9uUGFydGlhbFZpZXdMb2FkZWQgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8ub25QYXJ0aWFsVmlld0xvYWRlZDtcclxuICAgIHRoaXMuYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZztcclxuXHJcbiAgICB0aGlzLmxvYWRQYW5lbCA9IHRoaXMuY3JlYXRlTG9hZFBhbmVsKCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlUmVuZGVyID09PSBmYWxzZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS53YXJuKCdUaGUgXFwnaW1tZWRpYXRlUmVuZGVyID09PSBmYWxzZVxcJyBvcHRpb24gaXNuXFwndCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudC4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvL05PVEU6IFRvIG92ZXJyaWRlIGJvb3RzdHJhcCBoZWFkZXIgei1pbmRleCB3aGljaCBpcyAxNjAwXHJcbiAgICBEZXZFeHByZXNzLnVpLmR4T3ZlcmxheS5iYXNlWkluZGV4KDE3MDApO1xyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gICAgICAudGhlbigoKSA9PiBvcHRpb25zPy5vbkluaXQ/LigpKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZU9uSGlzdG9yeVBvcFN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpO1xyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICAvKipcclxuICAgICAqIDxSb290PlxyXG4gICAgICogIDxCcmFuZD5cclxuICAgICAqICAgIDxMb2dvIC8+XHJcbiAgICAgKiAgPC9CcmFuZD5cclxuICAgICAqICA8Q29udGVudFRvZ2dsZXIgLz5cclxuICAgICAqICA8Q29udGVudD5cclxuICAgICAqICAgIDxTZWFyY2ggLz5cclxuICAgICAqICAgIDxOYXZpZ2F0aW9uTWVudSAvPlxyXG4gICAgICogICAgPFVzZXJNZW51IC8+XHJcbiAgICAgKiAgPC9Db250ZW50PlxyXG4gICAgICogIDxNZW51U3dpdGNoZXIgLz5cclxuICAgICAqIDwvUm9vdD5cclxuICAgICAqIDxMb2FkQmFyIC8+XHJcbiAgICAgKi9cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVyQnJhbmQoKTtcclxuICAgIHRoaXMucmVuZGVyQ29udGVudFRvZ2dsZXIoKTtcclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gICAgdGhpcy5yZW5kZXJMb2FkQmFyKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3Vic2NyaWJlT25IaXN0b3J5UG9wU3RhdGUoKSB7XHJcbiAgICBpZiAodGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlcikge1xyXG4gICAgICAkKHdpbmRvdykuYmluZCgncG9wc3RhdGUnLCAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50IGFzIFBvcFN0YXRlRXZlbnQ7XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBldmVudC5zdGF0ZSBhcyBJQWpheFBhZ2VNYXJrZXI7XHJcbiAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLmlzTG9hZGVkQnlBamF4KSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRQYWdlVmlhQWpheENvcmUoc3RhdGUudXJsKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoc3RhdGUuaXNNZW51U3dpdGNoZXJHbG9iYWwpO1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUxvYWRQYW5lbCgpOiBEZXZFeHByZXNzLnVpLmR4TG9hZFBhbmVsIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhMb2FkUGFuZWwoe1xyXG4gICAgICBzaGFkaW5nQ29sb3I6ICdyZ2JhKDAsMCwwLDAuNCknLFxyXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgc2hvd0luZGljYXRvcjogdHJ1ZSxcclxuICAgICAgc2hvd1BhbmU6IHRydWUsXHJcbiAgICAgIHNoYWRpbmc6IHRydWUsXHJcbiAgICAgIGhpZGVPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRlbCkuZHhMb2FkUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QgPSB0aGlzLiRlbFswXTtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5jbGFzc0xpc3QuYWRkKCdoZWFkZXInLCB0aGlzLnRoZW1lLCAnbmF2YmFyJywgJ25hdmJhci1kYXJrJywgYG5hdmJhci1leHBhbmQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCcmFuZCgpIHtcclxuICAgIGlmICh0aGlzLmxvZ28gfHwgIXRoaXMubG9nb1NldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJyYW5kRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGJyYW5kRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2JyYW5kJywgJ25hdmJhci1icmFuZCcpO1xyXG4gICAgYnJhbmRFbGVtZW50LmhyZWYgPSAnLyc7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQoYnJhbmRFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIgPSBicmFuZEVsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5sb2dvID0gbmV3IExvZ28oJCh0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIpLCB0aGlzLmxvZ29TZXR0aW5ncyk7XHJcbiAgICB0aGlzLmxvZ28uaW5pdFdpZGdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJTZWFyY2goKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheVNlYXJjaCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xyXG4gICAgICAkY29udGFpbmVyOiAkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lciksXHJcbiAgICAgIGdldE1lbnVEYXRhU291cmNlOiAoKSA9PiB0aGlzLmdldFNlYXJjaERhdGFTb3VyY2UodGhpcy5kYXRhKSxcclxuICAgICAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSxcclxuICAgICAgb25EaW1lbnNpb25zQ2hhbmdlZDogKCkgPT4gdGhpcy5uYXZpZ2F0aW9uTWVudT8uYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpLFxyXG4gICAgICBvbk1lbnVJdGVtQ2xpY2s6IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgIG9uTWVudUl0ZW1PcGVuZWQ6IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlYXJjaC5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNHbG9iYWxNZW51U2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCkgfHwgIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQoZTogSU9wZW5SZXBvcnRFdmVudEFyZ3MpIHtcclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5tZW51SXRlbS5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIudmFsdWUgIT09IGlzR2xvYmFsKSB7XHJcbiAgICAgIHRoaXMubWVudVN3aXRjaGVyLnNldFZhbHVlKGlzR2xvYmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudFRvZ2dsZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCduYXZiYXItdG9nZ2xlcicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdjb2xsYXBzZScpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcsICcuaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0U2VhcmNoVGV4dCgnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyLWljb24nKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX190b2dnbGUtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmFwcGVuZENoaWxkKGljb24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2UnLCAnbmF2YmFyLWNvbGxhcHNlJywgJ2hlYWRlcl9fY29udGVudCcpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJTZWFyY2goKTtcclxuICAgIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUoW10pO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlck1lbnUoW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYXZpZ2F0aW9uTWVudShtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxNZW51ID0gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpO1xyXG5cclxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25NZW51KSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlRGF0YShtZW51SXRlbU1vZGVscywgaXNHbG9iYWxNZW51KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUgPSBuZXcgTmF2aWdhdGlvbk1lbnUoXHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLFxyXG4gICAgICAgIG1lbnVJdGVtTW9kZWxzLFxyXG4gICAgICAgIGlzR2xvYmFsTWVudSxcclxuICAgICAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblVzZXJNZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uVXNlck1lbnVDbGljaz8uKGUpO1xyXG4gICAgaWYgKGUuY2FuY2VsIHx8IHRoaXMuaXNLZXlQcmVzc2VkKGUub3JpZ2luYWxFdmVudCBhcyBNb3VzZUV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXJsID0gZS5pdGVtLlVybDtcclxuXHJcbiAgICBpZiAoZS5pdGVtLkFsd2F5c1JlbG9hZFBhZ2UpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlLmNhbmNlbCA9IHRoaXMudHJ5RG9QYXJ0aWFsUGFnZUxvYWRpbmcodXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncy5vbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUuaXRlbS5pc0dsb2JhbCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEoZS5pdGVtKTtcclxuICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0tleVByZXNzZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudCAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgJiYgdXJsICYmIHRoaXMuY2hlY2tJc0xvY2FsVXJsKHVybCkpIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlOiBJQWpheFBhZ2VNYXJrZXIgPSB7XHJcbiAgICAgICAgICBpc0xvYWRlZEJ5QWpheDogdHJ1ZSxcclxuICAgICAgICAgIGlzTWVudVN3aXRjaGVyR2xvYmFsOiAhIXRoaXMubWVudVN3aXRjaGVyPy52YWx1ZSxcclxuICAgICAgICAgIHVybFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHVybCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzTG9jYWxVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAhSGVhZGVyLkdMT0JBTF9VUkxfUkVHRVgudGVzdCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgIUhlYWRlci5ET0NUWVBFX01BUktFUl9SRUdFWC50ZXN0KGNvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZVZpYUFqYXhDb3JlKHVybDogc3RyaW5nKSB7XHJcbiAgICB3aW5kb3cuaXNJc296U2VydmVyRXhjZXB0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwuc2hvdygpO1xyXG5cclxuICAgIGNvbnN0IHVybEZvclBhcnRpYWxMb2FkaW5nID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgdXJsKTtcclxuICAgIHVybEZvclBhcnRpYWxMb2FkaW5nLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2lzb3pQYXJ0aWFsTG9hZGluZycsICd0cnVlJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsVXJsID0gdXJsRm9yUGFydGlhbExvYWRpbmcudG9TdHJpbmcoKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZz8uKCk7XHJcblxyXG4gICAgJC5hamF4KHBhcnRpYWxVcmwsIHsgZGF0YVR5cGU6ICdodG1sJyB9KS5hbHdheXMoKGRhdGEsIHRleHRTdGF0dXMpID0+IHtcclxuICAgICAgaWYgKHRleHRTdGF0dXMgIT09ICdzdWNjZXNzJyB8fCAhdGhpcy5jaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGRhdGEpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlci5odG1sKGRhdGEpO1xyXG4gICAgICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZD8uKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkUGFuZWwuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVXNlck1lbnUoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudXNlck1lbnUpIHtcclxuICAgICAgY29uc3QgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInKTtcclxuICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xyXG5cclxuICAgICAgdGhpcy51c2VyTWVudSA9IG5ldyBVc2VyTWVudSh7XHJcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgdXNlck5hbWU6IHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lLFxyXG4gICAgICAgIHVzZXJBdmF0YXI6IHRoaXMubWVudVNldHRpbmdzLnVzZXJBdmF0YXIsXHJcbiAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgICBnZXREaXNwbGF5ZWRVc2VySW5mbzogdGhpcy5tZW51U2V0dGluZ3MuZ2V0RGlzcGxheWVkVXNlckluZm9cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXNlck1lbnUucmVuZGVyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJNZW51LnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTWVudVN3aXRjaGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGE/LkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIpIHtcclxuICAgICAgaWYgKHRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/LnJlbW92ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCd0b2dnbGVCdXR0b25Db250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtZW51LXN3aXRjaGVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IG5ldyBNZW51U3dpdGNoZXIoe1xyXG4gICAgICBkZXNrdG9wQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsXHJcbiAgICAgIG1vYmlsZUNvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIsXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludDogdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQsXHJcbiAgICAgIHN0YXJ0VmFsdWU6IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpLFxyXG4gICAgICBvblN3aXRjaDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShuYXZpZ2F0aW9uSXRlbXMgfHwgW10pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tZW51U3dpdGNoZXIucmVuZGVyKCk7XHJcbiAgICB0aGlzLmVtaXQoSGVhZGVyLk1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLCB0aGlzLnVzZXJNZW51Py5yb290KTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciwgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMb2FkQmFyKCkge1xyXG4gICAgdGhpcy4kbG9hZEJhciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9hZC1iYXInKS5oaWRlKCkuYXBwZW5kVG8odGhpcy4kZWwpO1xyXG5cclxuICAgIGNvbnN0ICRsb2FkID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkJykuYXBwZW5kVG8odGhpcy4kbG9hZEJhcik7XHJcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2JhcicpLmFwcGVuZFRvKCRsb2FkKTtcclxuXHJcbiAgICBmdW5jdGlvbiByb3RhdGUoc2VsZWN0b3I6IHN0cmluZykge1xyXG4gICAgICAkKHNlbGVjdG9yKS5hbmltYXRlKHsgbGVmdDogJCgnLmxvYWQnKS53aWR0aCgpIH0sIDIwMDAsICgpID0+IHtcclxuICAgICAgICAkKHNlbGVjdG9yKS5jc3MoJ2xlZnQnLCBgJHstJChzZWxlY3Rvcikud2lkdGgoKSF9cHhgKTtcclxuICAgICAgICByb3RhdGUoc2VsZWN0b3IpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGUoJy5iYXInKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVyZW5kZXJNZW51cygpIHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCB1c2VySXRlbXMgPSB0aGlzLmdldFVzZXJJdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgLy8gSWYgaXRlbXMgYXJlIHVuZGVmaW5lZCB3ZSBkb24ndCB1cGRhdGUgbWVudXNcclxuICAgIG5hdmlnYXRpb25JdGVtcyAmJiB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyk7XHJcbiAgICB1c2VySXRlbXMgJiYgdGhpcy5yZW5kZXJVc2VyTWVudSh1c2VySXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyICYmICF0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCBpc1Zpc2libGUgPSAobmF2aWdhdGlvbkl0ZW1zICYmIG5hdmlnYXRpb25JdGVtcy5sZW5ndGggPiAwKVxyXG4gICAgICB8fCB0aGlzLm1lbnVTZXR0aW5ncz8udXNlck5hbWVcclxuICAgICAgfHwgKHVzZXJJdGVtcyAmJiB1c2VySXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUoISFpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTxJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGhlYWRlciBkb2VzblxcJ3QgaGF2ZSBtZW51IHNldHRpbmdzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhICE9PSAnc3RyaW5nJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5tZW51U2V0dGluZ3MuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LnNob3coKTtcclxuICAgICAgZGF0YSA9IGF3YWl0IHNlbmRSZXF1ZXN0PElBcHBNZW51TW9kZWw+KHRoaXMubWVudVNldHRpbmdzLmRhdGEpO1xyXG4gICAgICB0aGlzLmNhY2hlQXBwTWVudU1vZGVsKGRhdGEpO1xyXG4gICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKHRydWUpO1xyXG4gICAgICB0aGlzLiRsb2FkQmFyPy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25JdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hvd0dsb2JhbE1lbnUgPSB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKTtcclxuXHJcbiAgICByZXR1cm4gc2hvd0dsb2JhbE1lbnUgfHwgIWFwcE1lbnVNb2RlbC5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyXHJcbiAgICAgID8gYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtc1xyXG4gICAgICA6IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VhcmNoRGF0YVNvdXJjZShhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpOiBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgICBpZiAoIWFwcE1lbnVNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdsb2FiYWxJdGVtczogYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtcyxcclxuICAgICAgcGVyc29uYWxJdGVtczogYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIgPyBhcHBNZW51TW9kZWwuUGVyc29uYWxOYXZpZ2F0aW9uSXRlbXMgOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJJdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFwcE1lbnVNb2RlbC5Vc2VySXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENhY2hlZEFwcE1lbnVNb2RlbCgpOiBJQXBwTWVudU1vZGVsIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhd1ZhbHVlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gcmF3VmFsdWUgPT09IG51bGwgPyByYXdWYWx1ZSA6IEpTT04ucGFyc2UocmF3VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZUFwcE1lbnVNb2RlbChkYXRhOiBJQXBwTWVudU1vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvd0dsb2JhbE1lbnUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByYXdJc0dsb2JhbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTSE9XX0dMT0JBTF9NRU5VX0tFWSk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHJhd0lzR2xvYmFsID09PSBudWxsID8gcmF3SXNHbG9iYWwgYXMgbnVsbCA6IEpTT04ucGFyc2UocmF3SXNHbG9iYWwpIGFzIGJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIGlzR2xvYmFsID09PSBudWxsIHx8IGlzR2xvYmFsO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgZ3JpZENvbHVtblR5cGVzID0gWydkZWZhdWx0JywgJ3N0cmluZycsICdudW1iZXInLCAnZGF0ZScsICdib29sZWFuJywgJ29iamVjdCcsICdkYXRldGltZSddO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ3JpZENvbHVtblR5cGVzO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gQ2RtSW1wb3J0RmlsZU1vZGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxLFxyXG4gIFJlcGxhY2VBbGxSb3dzID0gMixcclxufVxyXG4iLCAiXHVGRUZGXHJcbmV4cG9ydCBlbnVtIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUge1xyXG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXHJcbiAgU3RyaW5nID0gJ3N0cmluZycsXHJcbiAgTnVtYmVyID0gJ251bWJlcicsXHJcbiAgRGF0ZSA9ICdkYXRlJyxcclxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG4gIE9iamVjdCA9ICdvYmplY3QnLFxyXG4gIERhdGV0aW1lID0gJ2RhdGV0aW1lJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQ29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGdyb3VwSW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IG51bWJlcjtcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUgZXh0ZW5kcyBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XHJcbiAgY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW107XHJcbn1cclxuIiwgImNvbnN0IGxvYWRlZFVybHM6IHN0cmluZ1tdID0gW11cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludGVnZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93ICgkY29udGFpbmVyOiBKUXVlcnksIGltYWdlVXJsczogc3RyaW5nW10sIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIgPSA1LCB0cmFuc2l0aW9uVGltZVNlYzogbnVtYmVyID0gMikge1xyXG4gIC8vIFNodWZmbGUgdXJsc1xyXG4gIGNvbnN0IHNodWZmbGVkVXJscyA9IGltYWdlVXJscy5zb3J0KChhLCBiKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcclxuXHJcbiAgJGNvbnRhaW5lci5hZGRDbGFzcygnaXN6b2xlYS1iYWNrZ3JvdW5kLWltYWdlLXZpZXdlcicpLmNzcyh7XHJcbiAgICAndHJhbnNpdGlvbic6IGBiYWNrZ3JvdW5kLWltYWdlICR7dHJhbnNpdGlvblRpbWVTZWN9cyBlYXNlLWluLW91dCAwc2AsXHJcbiAgfSk7XHJcblxyXG4gIHNodWZmbGVkVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcclxuICAgICAgbG9hZGVkVXJscy5wdXNoKHVybCk7XHJcblxyXG4gICAgICBpZihsb2FkZWRVcmxzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGluaXRJbWFnZXNDaGFuZ2luZygkY29udGFpbmVyLCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaW1nLnNyYyA9IHVybDtcclxuICAgIH0sIGluZGV4ICogMTAwKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV4dEluZGV4VG9TaG93IChjdXJyZW50SW5kZXg6IG51bWJlcikge1xyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwID8gMSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXh0SW5kZXggPSByYW5kb21JbnRlZ2VyKDAsIGxvYWRlZFVybHMubGVuZ3RoIC0gMSk7XHJcblxyXG4gIGlmKG5leHRJbmRleCA9PT0gY3VycmVudEluZGV4KSB7XHJcbiAgICByZXR1cm4gbmV4dEluZGV4ID09PSBsb2FkZWRVcmxzLmxlbmd0aCAtIDEgPyAwIDogbmV4dEluZGV4ICsgMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXh0SW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRJbWFnZXNDaGFuZ2luZyAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbWdDaGFuZ2VJbnRlcnZhbFNlYzogbnVtYmVyKSB7XHJcbiAgbGV0IGN1cnJlbnRTaG93bkluZGV4ID0gMDtcclxuXHJcbiAgc2hvd0ltYWdlKCRjb250YWluZXIsIGN1cnJlbnRTaG93bkluZGV4KTtcclxuXHJcbiAgd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U2hvd25JbmRleCA9IGdldE5leHRJbmRleFRvU2hvdyhjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG4gIH0sIGltZ0NoYW5nZUludGVydmFsU2VjICogMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dJbWFnZSAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgJGNvbnRhaW5lci5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCBgdXJsKFwiJHtsb2FkZWRVcmxzW2luZGV4XX1cIilgKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxpY2VuY2UgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcblxyXG5leHBvcnQgZW51bSBGb290ZXJJbmRpY2F0b3JTdGF0dXMge1xyXG4gIFN1Y2Nlc3MsXHJcbiAgV2FybmluZyxcclxuICBFcnJvclxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJJbmRpY2F0b3JWYWx1ZSB7XHJcbiAgc3RhdHVzOiBGb290ZXJJbmRpY2F0b3JTdGF0dXM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvck9wdGlvbnMge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZTtcclxuICBnZXRWYWx1ZT86ICgpID0+IFByb21pc2U8SUZvb3RlckluZGljYXRvclZhbHVlPjtcclxuICBnZXRWYWx1ZUludGVydmFsTXM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3Rlck9wdGlvbnMge1xyXG4gICRyb290OiBKUXVlcnk7XHJcbiAgbmFtZTogc3RyaW5nIHwgZmFsc2U7XHJcbiAgbGljZW5jZTogSUxpY2VuY2UgfCBmYWxzZTtcclxuICB5ZWFyPzogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlO1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgc2VydmVyTmFtZT86IHN0cmluZztcclxuICBkYXRhYmFzZT86IHN0cmluZztcclxuICBpbmRpY2F0b3JzPzogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8SUZvb3Rlck9wdGlvbnM+ID0ge1xyXG4gIHllYXI6ICdsb2NhbCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvb3RlciB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q3VycmVudFllYXIoY3VycmVudFllYXI6IG51bWJlciB8ICdsb2NhbCcgfCBmYWxzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gY3VycmVudFllYXIgPT09ICdsb2NhbCcgfHwgY3VycmVudFllYXIgPT09IGZhbHNlXHJcbiAgICAgID8gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXHJcbiAgICAgIDogY3VycmVudFllYXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWRUbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd05hbWU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaWNlbmNlOiBJTGljZW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dMaWNlbmNlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgeWVhcjogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1llYXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93Q29ubmVjdGVkVG86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzT3B0aW9uczogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeU5hbWU6IE1hcDxzdHJpbmcsIEpRdWVyeT47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JDbGFzc0J5U3RhdHVzID0gbmV3IE1hcDxGb290ZXJJbmRpY2F0b3JTdGF0dXMsIHN0cmluZz4oW1xyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5TdWNjZXNzLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV9zdWNjZXNzJ10sXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLldhcm5pbmcsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3dhcm5pbmcnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuRXJyb3IsICdmb290ZXJfX2luZGljYXRvcl90eXBlX2Vycm9yJ11cclxuICBdKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZvb3Rlck9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmRlZmF1bHRPcHRpb25zIH0gYXMgUmVxdWlyZWQ8SUZvb3Rlck9wdGlvbnM+O1xyXG5cclxuICAgIHRoaXMuJHJvb3QgPSBtZXJnZWRPcHRpb25zLiRyb290O1xyXG4gICAgdGhpcy5uYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubmFtZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubGljZW5jZSA9IG1lcmdlZE9wdGlvbnMubGljZW5jZSAhPT0gZmFsc2UgPyBtZXJnZWRPcHRpb25zLmxpY2VuY2UgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnllYXIgPSBGb290ZXIuZ2V0Q3VycmVudFllYXIobWVyZ2VkT3B0aW9ucy55ZWFyKTtcclxuICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5zaG93TmFtZSA9IG1lcmdlZE9wdGlvbnMubmFtZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1llYXIgPSBtZXJnZWRPcHRpb25zLnllYXIgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gPSAhIW1lcmdlZE9wdGlvbnMuc2VydmVyTmFtZSAmJiAhIW1lcmdlZE9wdGlvbnMuZGF0YWJhc2U7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zID0gb3B0aW9ucy5pbmRpY2F0b3JzIHx8IFtdO1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEpRdWVyeT4oKTtcclxuXHJcbiAgICB0aGlzLmNvbm5lY3RlZFRvID0gdGhpcy5zaG93Q29ubmVjdGVkVG8gPyBgJHttZXJnZWRPcHRpb25zLnNlcnZlck5hbWV9IC0gJHttZXJnZWRPcHRpb25zLmRhdGFiYXNlfWAgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuJHJvb3QuYWRkQ2xhc3MoJ2Zvb3RlcicpO1xyXG5cclxuICAgIHRoaXMucmVuZGVySW5kaWNhdG9ycygpO1xyXG4gICAgdGhpcy5yZW5kZXJDb3B5cmlnaHQoKTtcclxuICAgIHRoaXMuc2hvd1llYXIgJiYgdGhpcy5yZW5kZXJZZWFyKCk7XHJcbiAgICB0aGlzLnNob3dOYW1lICYmIHRoaXMucmVuZGVyTmFtZSgpO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gJiYgdGhpcy5yZW5kZXJDb25uZWN0ZWRUbygpO1xyXG4gICAgdGhpcy5zaG93TGljZW5jZSAmJiB0aGlzLnJlbmRlckxpY2VuY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRpY2F0b3JWYWx1ZShpbmRpY2F0b3JOYW1lOiBzdHJpbmcsIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9IHRoaXMuaW5kaWNhdG9yc0J5TmFtZS5nZXQoaW5kaWNhdG9yTmFtZSk7XHJcbiAgICBpZiAoJGluZGljYXRvckVsKSB7XHJcbiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJJbmRpY2F0b3JzKCkge1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzT3B0aW9ucz8uZm9yRWFjaCgobykgPT4ge1xyXG4gICAgICBpZiAoby50ZXh0KSB7XHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pbmRpY2F0b3ItdGV4dCcpXHJcbiAgICAgICAgICAuaHRtbChgJHtvLnRleHR9OmApXHJcbiAgICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9ICQoJzxzcGFuPicpXHJcbiAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvcicpXHJcbiAgICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG5cclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCBvLnZhbHVlKTtcclxuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lLnNldChvLm5hbWUsICRpbmRpY2F0b3JFbCk7XHJcblxyXG4gICAgICBpZiAoby5nZXRWYWx1ZSAmJiBvLmdldFZhbHVlSW50ZXJ2YWxNcykge1xyXG4gICAgICAgIHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgby5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICAgICAgfSwgby5nZXRWYWx1ZUludGVydmFsTXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbDogSlF1ZXJ5LCB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlKSB7XHJcbiAgICAkaW5kaWNhdG9yRWwuYXR0cigndGl0bGUnLCB2YWx1ZS50aXRsZSk7XHJcbiAgICAkaW5kaWNhdG9yRWwucmVtb3ZlQ2xhc3MoWy4uLnRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy52YWx1ZXMoKV0pO1xyXG4gICAgJGluZGljYXRvckVsLmFkZENsYXNzKHRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy5nZXQodmFsdWUuc3RhdHVzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvcHlyaWdodCgpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb3B5cmlnaHQnKVxyXG4gICAgICAuaHRtbCgnJmNvcHk7JylcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYW1lKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2FwcC1uYW1lJylcclxuICAgICAgLnRleHQodGhpcy5uYW1lICsgKCEhdGhpcy52ZXJzaW9uID8gYDogJHt0aGlzLnZlcnNpb259YCA6ICcnKSlcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb25uZWN0ZWRUbygpIHtcclxuICAgIHRoaXMubmFtZSAmJiAkKCc8c3Bhbj4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb25uZWN0ZWQtdG8nKVxyXG4gICAgICAudGV4dChgQ29ubmVjdGVkIHRvOiAke3RoaXMuY29ubmVjdGVkVG99LmApXHJcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWWVhcigpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2N1cnJlbnQteWVhcicpXHJcbiAgICAgIC50ZXh0KHRoaXMueWVhcilcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaWNlbmNlKCkge1xyXG4gICAgdGhpcy5saWNlbmNlICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtaW5mbycpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19saWNlbmNlLW93bmVyJylcclxuICAgICAgICAgIC50ZXh0KGAke3RoaXMuZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQodGhpcy5saWNlbmNlKX0uIGApXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtZGF0ZScpXHJcbiAgICAgICAgICAudGV4dCh0aGlzLmdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KHRoaXMubGljZW5jZSkpXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dChsaWNlbmNlOiBJTGljZW5jZSkge1xyXG4gICAgcmV0dXJuIGBMaWNlbmNlZCB0bzogJHtsaWNlbmNlLk93bmVyfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICBjb25zdCBkYXRlID0gdHlwZW9mIGxpY2VuY2UuRXhwaXJhdGlvbkRhdGUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUobGljZW5jZS5FeHBpcmF0aW9uRGF0ZSkgOiBsaWNlbmNlLkV4cGlyYXRpb25EYXRlO1xyXG5cclxuICAgIHJldHVybiBgTGljZW5jZSBFeHBpcnk6ICR7ZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX1gO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGbGV0IHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuY29uc3QgcmVzaXplSGFuZGxlcnMgPSBbXTtcclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgaWYgKHJlcGFpbnRUaW1lb3V0KSB7XHJcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHJlcGFpbnRUaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHJlcGFpbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgcmVzaXplSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcigpKTtcclxuICAgIHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuICB9LCAxMDApO1xyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uUmVzaXplOiAoKSA9PiB2b2lkKSB7XHJcbiAgcmVzaXplSGFuZGxlcnMucHVzaChvblJlc2l6ZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgbWFpbjogJy5tYWluJyxcclxuICBoZWFkZXI6ICcubWFpbiAuaGVhZGVyJyxcclxuICBjb250ZW50OiAnLmNvbnRlbnQtYXJlYScsXHJcbiAgcGFuZWw6ICcucGFuZWwnLFxyXG4gIGZvb3RlcjogJ2Zvb3RlcidcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICRjb250ZW50ID0gJChDU1MuY29udGVudCk7XHJcblxyXG4gICRjb250ZW50LmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4sIGlnbm9yZVNpYmxpbmdzOiBib29sZWFuID0gZmFsc2UsIGFkZE93blNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGNvbnN0ICRtYWluID0gJChDU1MubWFpbik7XHJcbiAgY29uc3QgJGhlYWRlciA9ICQoQ1NTLmhlYWRlcik7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuICBjb25zdCAkZm9vdGVyID0gJChDU1MuZm9vdGVyKTtcclxuXHJcbiAgY29uc3QgcGFkZGluZ3MgPSAkY29udGVudC5vdXRlckhlaWdodCgpIC0gJGNvbnRlbnQuaGVpZ2h0KCk7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ID0gJG1haW4uaGVpZ2h0KCkgLSAkaGVhZGVyLmhlaWdodCgpIC0gJGZvb3Rlci5vdXRlckhlaWdodCgpIC0gcGFkZGluZ3M7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgY29uc3QgJGNvbnRlbnRFbGVtZW50cyA9ICRjb250ZW50LmNoaWxkcmVuKCk7XHJcbiAgbGV0IGNvbnRlbnRFbGVtZW50c0hlaWdodCA9IDA7XHJcblxyXG4gIGlmICghaWdub3JlU2libGluZ3MpIHtcclxuICAgIGNvbnN0ICR3aWRnZXRFbGVtZW50ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICAgICRjb250ZW50RWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0ICRjaGlsZCA9ICQoZWwpO1xyXG5cclxuICAgICAgaWYgKCRjaGlsZC5pcygkd2lkZ2V0RWxlbWVudCkgfHwgJGNoaWxkLmhhcygkd2lkZ2V0RWxlbWVudFswXSkubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250ZW50RWxlbWVudHNIZWlnaHQgKz0gKCRjaGlsZC5pcygnOnZpc2libGUnKSAmJiAkY2hpbGQuY3NzKCdwb3NpdGlvbicpICE9PSAnYWJzb2x1dGUnKSA/ICRjaGlsZC5vdXRlckhlaWdodCh0cnVlKSA6IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxhc3RXaWRnZXRIZWlnaHQgPSBsYXN0Q29udGVudEhlaWdodCAtIGNvbnRlbnRFbGVtZW50c0hlaWdodDtcclxuXHJcbiAgaWYgKGFkZE93blNpemUpIHtcclxuICAgIGxhc3RXaWRnZXRIZWlnaHQgKz0gd2lkZ2V0LmVsZW1lbnQoKS5vdXRlckhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0IHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9IHdpbmRvd0hlaWdodDtcclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCwgaWdub3JlU2libGluZ3MsIGFkZE93blNpemUpO1xyXG5cclxuICBhdXRvUmVzaXplKCgpID0+IHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZjb25zdCBESVNBQkxFRF9DTEFTUyA9ICdpc296LWljb24tZGlzYWJsZWQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRIRU1FX0NMQVNTRVMgPSB7XHJcbiAgbGc6ICdpc3pvbGVhLWxnJyxcclxuICBtZDogJ2lzem9sZWEtbWQnLFxyXG4gIHNtOiAnaXN6b2xlYS1zbSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaGVtZUhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWlkZGxlU2l6ZShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XHJcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMubWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50U21hbGxTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5zbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldE1pZGRsZVNpemUoaW5zdGFuY2U6IGFueSkge1xyXG4gICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZSwgVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldFNtYWxsU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNsYXNzKGljb246IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuLCBzaXplOiAxNiB8IDI0ID0gMTYpIHtcclxuICAgIGNvbnN0IGljb25DbGFzcyA9IGBpc296IGlzb3otaWNvbi0ke2ljb259LSR7c2l6ZX1gO1xyXG5cclxuICAgIHJldHVybiAhZGlzYWJsZWRcclxuICAgICAgPyBpY29uQ2xhc3NcclxuICAgICAgOiBgJHtpY29uQ2xhc3N9ICR7RElTQUJMRURfQ0xBU1N9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHNldFdpZGdldFNpemUoaW5zdGFuY2U6IGFueSwgc2l6ZUNsYXNzOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICBpbnN0YW5jZS5vcHRpb24oJ2VsZW1lbnRBdHRyJywgeyBjbGFzczogc2l6ZUNsYXNzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbGJhckhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBnZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbCA9ICQoYDxzcGFuIGNsYXNzPVwiJHtDTEFTU0VTLnRpdGxlfVwiPiR7dGl0bGV9PC9zcGFuPmApO1xyXG5cclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICRlbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdSZXBvcnQgZGV0YWlscycpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkZWw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVG9vbGJhclNldHRpbmcge1xyXG4gIG9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENMQVNTRVMgPSB7XHJcbiAgdGl0bGU6ICdpc296LXRpdGxlJyxcclxuICBoZWFkZXI6ICdpc296LXRvb2xiYXItaGVhZGVyJyxcclxuICBkcm9wRG93bkJ1dHRvbjogJ2R4LWRyb3Bkb3dubWVudS1idXR0b24nXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcjogc3RyaW5nLCBzZXR0aW5nczogSVRvb2xiYXJTZXR0aW5nID0geyB0aXRsZTogJycsIGRlc2NyaXB0aW9uOiAnJywgb3B0aW9uczoge30gfSk6XHJcbiAgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIge1xyXG4gIGNvbnN0IHtcclxuICAgIHRpdGxlID0gJycsXHJcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxyXG4gICAgb3B0aW9ucyA9IHt9LFxyXG4gIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7XHJcbiAgICBpdGVtcyA9IFtdLFxyXG4gICAgZWxlbWVudEF0dHIgPSB7fVxyXG4gIH0gPSBvcHRpb25zO1xyXG5cclxuICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBtaWRsZGVTaXplRWxlbWVudEF0dHIgPSB7IGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kIH07XHJcblxyXG4gICAgaWYgKGl0ZW0ub3B0aW9ucykge1xyXG4gICAgICBsZXQgeyBlZGl0b3JPcHRpb25zIH0gPSBpdGVtLm9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoIWVkaXRvck9wdGlvbnMpIHtcclxuICAgICAgICBlZGl0b3JPcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVkaXRvck9wdGlvbnMuZWxlbWVudEF0dHIgPSBtaWRsZGVTaXplRWxlbWVudEF0dHI7XHJcbiAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVkaXRvck90aW9ucyA9IGVkaXRvck9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKGUpID0+IHtcclxuICAgIGUuZWxlbWVudFxyXG4gICAgICAuZmluZChgLiR7Q0xBU1NFUy5kcm9wRG93bkJ1dHRvbn1gKVxyXG4gICAgICAuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgIG9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuICQoYCR7c2VsZWN0b3J9YClcclxuICAgIC5keFRvb2xiYXIoe1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHRpdGxlLCBkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgLi4uaXRlbXNcclxuICAgICAgXSxcclxuICAgICAgb25Db250ZW50UmVhZHksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgLi4uZWxlbWVudEF0dHIsXHJcbiAgICAgICAgY2xhc3M6IENMQVNTRVMuaGVhZGVyXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuZHhUb29sYmFyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xyXG5cclxuY29uc3QgQ1NTID0ge1xyXG4gIHBhbmVsOiAnLnBhbmVsLWJvZHknXHJcbn07XHJcblxyXG5sZXQgbGFzdFdpbmRvd0hlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0Q29udGVudEhlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0V2lkZ2V0SGVpZ2h0ID0gbnVsbDtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUhlaWdodCh3aWRnZXQpIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSAkd2lkZ2V0LnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgJHBhbmVsLmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSB3aWRnZXQuZWxlbWVudCgpLnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgY29uc3QgcGFuZWxUb3AgPSAkcGFuZWwucG9zaXRpb24oKS50b3A7XHJcbiAgY29uc3QgcGFuZWxIZWlnaHQgPSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3QgcGFuZWxQYWRkaW5nID0gJHBhbmVsLm91dGVySGVpZ2h0KCkgLSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3Qgd2lkZ2V0VG9wID0gJHdpZGdldC5wb3NpdGlvbigpLnRvcDtcclxuXHJcbiAgY29uc3Qgd2lkZ2V0SGVpZ2h0ID0gcGFuZWxIZWlnaHQgLSAod2lkZ2V0VG9wIC0gcGFuZWxUb3ApICsgcGFuZWxQYWRkaW5nIC8gMjtcclxuXHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0Jywgd2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHBhbmVsSGVpZ2h0IGZyb20gJy4uL1BhbmVsSGVpZ2h0JztcclxuaW1wb3J0IHsgQ1NTX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIGluUGFuZWxHcmlkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChpZDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBpc0luUGFuZWxHcmlkID0gZmFsc2UpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEYXRhR3JpZChpZCwgb3B0aW9ucyk7XHJcblxyXG4gIGlmICghb3B0aW9ucy5oZWlnaHQpIHtcclxuICAgIGlmIChpc0luUGFuZWxHcmlkKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KGdyaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZnVsbFNjcmVlbihncmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0YUdyaWQoZWw6IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGVsLmR4RGF0YUdyaWQob3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KFxyXG4gIGVsOiBzdHJpbmcgfCBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdC5Qcm9wZXJ0aWVzLCBpc0luUGFuZWwgPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3Qge1xyXG4gIGNvbnN0IHRyZWVMaXN0ID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgPyAkKGVsKSA6IGVsKS5keFRyZWVMaXN0KG9wdGlvbnMpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XHJcblxyXG4gIHRyZWVMaXN0LmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbCkge1xyXG4gICAgICBwYW5lbEhlaWdodCh0cmVlTGlzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKHRyZWVMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cmVlTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgVG9vbGJhckhlbHBlciB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVG9vbGJhcic7XHJcbmltcG9ydCB7IFRoZW1lSGVscGVyLCBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uLy4uL0NvbmZpZy9JbmRleCc7XHJcbmltcG9ydCB7IGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbiB9IGZyb20gJy4uLy4uL1V0aWxzL0dyaWRFeHBvcnQnO1xyXG5cclxuaW50ZXJmYWNlIElHcmlkU2V0dGluZ3NCYXNlPFQ+IHtcclxuICBvcHRpb25zPzogVDtcclxuXHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG4gIGlzRnVsbFNjcmVlbj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgc2V0RGVmYXVsdENvbHVtbldpZHRoPzogYm9vbGVhbjtcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb24/OiBib29sZWFuO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJJdGVtcz86IGFueVtdO1xyXG4gIGJ1dHRvbnNTaXplPzogJ3NtJyB8ICdtZCc7XHJcbn1cclxuXHJcbmNvbnN0IGdldFdpZGdldE5hbWUgPSAod2lkZ2V0OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gd2lkZ2V0XHJcbiAgICAuc2xpY2UoJ2R4Jy5sZW5ndGgpXHJcbiAgICAudG9Mb3dlckNhc2UoKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFNlbGVjdG9ycyA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IGdyaWROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VhcmNoUGFuZWw6IGAuZHgtJHtncmlkTmFtZX0tc2VhcmNoLXBhbmVsYCxcclxuICAgIHRvb2xiYXJFZGl0QnV0dG9uOiBgLmR4LSR7Z3JpZE5hbWV9LXRvb2xiYXItYnV0dG9uLmR4LWVkaXQtYnV0dG9uYCxcclxuICAgIHRvb2xiYXJFeHBvcnRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tZXhwb3J0LWJ1dHRvbiAuZHgtYnV0dG9uYCxcclxuICAgIHNlbGVjdENoZWNrQm94OiAnLmR4LXNlbGVjdC1jaGVja2JveCdcclxuICB9O1xyXG59O1xyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhR3JpZFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTGlzdFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncykge1xyXG4gIGNvbnN0IHJlc3VsdDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyBnZXRMZWdhY3lEZWZhdWx0T3B0aW9ucyhzZXR0aW5ncykgOiBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4pIHtcclxuICAgIChyZXN1bHQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMpLnN1bW1hcnkgPSB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4sXHJcbiAgICAgICAgc2hvd0luQ29sdW1uOiBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uIHx8IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXN1bHQuZXhwb3J0ID0ge1xyXG4gICAgZW5hYmxlZDogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcclxuICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICByZXN1bHQuZ3JvdXBQYW5lbCA9IHsgdmlzaWJsZTogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG5cclxuICByZXN1bHQuc2VsZWN0aW9uID0geyBtb2RlOiAnbm9uZScgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnNcclxuICA8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5ncyk6IFQge1xyXG4gIHJldHVybiB7XHJcbiAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgY2FjaGVFbmFibGVkOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRydWUsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogODAgfSxcclxuICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgc2Nyb2xsaW5nOiB7XHJcbiAgICAgIG1vZGU6ICd2aXJ0dWFsJyxcclxuICAgICAgcm93UmVuZGVyaW5nTW9kZTogJ3ZpcnR1YWwnXHJcbiAgICB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHtcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDI0MCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nXHJcbiAgICB9LFxyXG4gICAgc2hvd1Jvd0xpbmVzOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBzZWxlY3Rpb246IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgd29yZFdyYXBFbmFibGVkOiB0cnVlXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMZWdhY3lEZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG5cclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwIH0sXHJcbiAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJyB9LFxyXG4gIH0gYXMgVDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlcGFyZURlZmF1bHRUb29sYmFyQnV0dG9ucyh0b29sYmFyT3B0aW9uczogYW55LCB0b29sYmFyQWNjZW50QnV0dG9uTmFtZT86IHN0cmluZykge1xyXG4gIGNvbnN0IGZpbmRUb29sYmFySXRlbSA9IChpdGVtczogYW55W10sIG5hbWU6IHN0cmluZykgPT4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcclxuXHJcbiAgaWYgKHRvb2xiYXJPcHRpb25zPy5pdGVtcykge1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgaWYgKHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IGFjY2VudEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuICAgICAgaWYgKGFjY2VudEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgICBhY2NlbnRCdXR0b25JdGVtLm9wdGlvbnMudHlwZSA9ICdkZWZhdWx0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNhdmVCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAnc2F2ZUJ1dHRvbicpO1xyXG4gICAgaWYgKHNhdmVCdXR0b25JdGVtKSB7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdTYXZlJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXZlcnRCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmV2ZXJ0QnV0dG9uJyk7XHJcbiAgICBpZiAocmV2ZXJ0QnV0dG9uSXRlbSkge1xyXG4gICAgICByZXZlcnRCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ0Rpc2NhcmQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmVmcmVzaCcpO1xyXG4gICAgaWYgKHJlZnJlc2hCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdSZWZyZXNoJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy5oaW50ID0gJ1JlbG9hZCBEYXRhJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFuZGxlcnM8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihcclxuICB3aWRnZXQ6ICdkeERhdGFHcmlkJyB8ICdkeFRyZWVMaXN0JyxcclxuICBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5nc1xyXG4pOiBUIHtcclxuICBjb25zdCBzZWxlY3RvcnMgPSBnZXRTZWxlY3RvcnMod2lkZ2V0KTtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnaGVhZGVyJykge1xyXG4gICAgICAgICAgZS5jZWxsRWxlbWVudC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25DZWxsUHJlcGFyZWQpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZChlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgaWYgKCFzZXR0aW5ncy5kaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbikge1xyXG4gICAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGRhdGFHcmlkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpc0dyaWRJbml0aWFsaXphZWQpIHtcclxuICAgICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZGF0YUdyaWQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyaWQuY29sdW1uQ291bnQoKTsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2RhdGFUeXBlJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggfHwgc2V0dGluZ3Muc2V0RGVmYXVsdENvbHVtbldpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGlmICghZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICc0NXB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTM1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE0MHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScgfHwgZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2FsaWdubWVudCcsICdyaWdodCcpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ2RkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ0hIOm1tLCBkZCBNTU0geXl5eScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNtYWxsU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoc2VsZWN0b3JzLnNlbGVjdENoZWNrQm94KSk7XHJcblxyXG4gICAgICAgIGlmICgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmR4QnV0dG9uKCdpbnN0YW5jZScpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldE1pZGRsZVNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zID0ge31cclxuICAgICAgfSA9IGU7XHJcblxyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIGl0ZW1zID0gW11cclxuICAgICAgfSA9IHRvb2xiYXJPcHRpb25zO1xyXG5cclxuICAgICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy50aXRsZSkge1xyXG4gICAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZSgpIHtcclxuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoc2V0dGluZ3MudGl0bGUpO1xyXG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbS53aWRnZXQgPT09ICdkeEJ1dHRvbicgJiYgaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHNldHRpbmdzLnRpdGxlLCBzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHNldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gMTYgOiAyNDtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYWRkUm93QnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdwbHVzJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdzYXZlQnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdzYXZlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdyZXZlcnRCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ2Nsb3NlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyLmNsYXNzID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZDtcclxuICAgICAgICAgICAgaXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zLCBzZXR0aW5ncy50b29sYmFyQWNjZW50QnV0dG9uTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy50b29sYmFySXRlbXMpIHtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goLi4uc2V0dGluZ3MudG9vbGJhckl0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zLmVsZW1lbnRBdHRyID0ge1xyXG4gICAgICAgICAgY2xhc3M6ICdpc296LXRvb2xiYXItaGVhZGVyJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNhdmVCdXR0b25JbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzYXZlQnV0dG9uJyk7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKTtcclxuICAgICAgbGV0IGluZGV4Rm9yVXBkYXRlID0gLTE7XHJcblxyXG4gICAgICBpZiAoc2F2ZUJ1dHRvbkluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNhdmVCdXR0b25JbmRleDtcclxuICAgICAgfSBlbHNlIGlmIChzZWFyY2hQYW5lbEluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNlYXJjaFBhbmVsSW5kZXg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5kZXhGb3JVcGRhdGUgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmxlbmd0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy5zcGxpY2UoaW5kZXhGb3JVcGRhdGUsIDAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBuYW1lOiAncmVmcmVzaCcsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGljb246ICdyZWZyZXNoJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAzMCA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6IGBkeC1kYXRhZ3JpZC10b29sYmFyLWJ1dHRvbiAke3NldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gVEhFTUVfQ0xBU1NFUy5zbSA6IFRIRU1FX0NMQVNTRVMubWR9YCB9LFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gJ3RleHQnIDogJ2NvbnRhaW5lZCcsXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGRhdGFHcmlkPy5yZWZyZXNoKCksXHJcbiAgICAgICAgICAgIG9uQ29udGVudFJlYWR5OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAoY29udGVudFJlYWR5RXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb250ZW50UmVhZHlFdmVudC5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiA2LFxyXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNlxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b24uUHJvcGVydGllc1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vblRvb2xiYXJQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucyA9IHtcclxuICAgICAgICAgIC4uLmUuZWRpdG9yT3B0aW9ucyxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgICAgIGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4U2VsZWN0Qm94Jykge1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyxcclxuICAgICAgICAgICAgb25TaG93aW5nOiAoYXJnczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgd2lkZ2V0TmFtZSA9IGdldFdpZGdldE5hbWUod2lkZ2V0KTtcclxuICAgICAgICAgICAgICBhcmdzLmNvbXBvbmVudC5fJHBvcHVwQ29udGVudC5hZGRDbGFzcyhgaXNvei0ke3dpZGdldE5hbWV9LXNlbGVjdGJveC1wb3B1cGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4Q2hlY2tCb3gnKSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRFbGVtZW50U21hbGxTaXplKGUuZWRpdG9yRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGUucGFyZW50VHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2ZpbHRlclJvdyc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseUZpbHRlcjogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5lbGVtZW50ICYmIGUuZWxlbWVudC5maW5kKCcuZHgtYXBwbHktYnV0dG9uJykudHJpZ2dlcignZHhjbGljaycpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5RmlsdGVyO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseUZpbHRlcjtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnc2VhcmNoUGFuZWwnOlxyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uRWRpdG9yUHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkVkaXRvclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGV4dE1lbnVQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSAnY29udGVudCcgJiYgISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkge1xyXG4gICAgICAgICAgaWYgKCFlLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGUuaXRlbXMgPSBbXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBlLml0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IGFsbCBkYXRhJyxcclxuICAgICAgICAgICAgb25JdGVtQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaWNvbjogJ3hsc3hmaWxlJ1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuXHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucy5zZWxlY3Rpb24/Lm1vZGUgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSBlLmNvbXBvbmVudC5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuXHJcbiAgICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0V4cG9ydCBzZWxlY3RlZCByb3dzJyxcclxuICAgICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4gZS5jb21wb25lbnQuZXhwb3J0VG9FeGNlbCh0cnVlKSxcclxuICAgICAgICAgICAgICBpY29uOiAnZXhwb3J0c2VsZWN0ZWQnLFxyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiAhc2VsZWN0ZWRSb3dzIHx8ICFzZWxlY3RlZFJvd3MubGVuZ3RoXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51SXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGV4dE1lbnVQcmVwYXJpbmcoZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkV4cG9ydGluZzogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSA/IGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkgOiB2b2lkIDAsXHJcbiAgfSBhcyBUO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCB7IGdldEdyaWREZWZhdWx0T3B0aW9ucywgZ2V0SGFuZGxlcnMsIElEYXRhR3JpZFNldHRpbmdzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWw6IEpRdWVyeSwgc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldEdyaWREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcbiAgbGV0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIHNldHRpbmdzLm9wdGlvbnMpO1xyXG4gIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnM8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4oJ2R4RGF0YUdyaWQnLCAkLmV4dGVuZCh0cnVlLCB7fSwgc2V0dGluZ3MsIHsgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyB9KSk7XHJcblxyXG4gIG1lcmdlZE9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgbWVyZ2VkT3B0aW9ucywgaGFuZGxlcnMpO1xyXG5cclxuICBpZiAoc2V0dGluZ3MuaXNGdWxsU2NyZWVuIHx8IHNldHRpbmdzLmlzRnVsbFNjcmVlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zLCBzZXR0aW5ncy5pblBhbmVsR3JpZCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBjcmVhdGVEYXRhR3JpZChlbCwgbWVyZ2VkT3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL0RlZmF1bHRHcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZ1xyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIHJldHVybiBkZWZhdWx0R3JpZCgkKGAjJHtpZH1gKSwge1xyXG4gICAgb3B0aW9uczogZGF0YUdyaWRPcHRpb25zLFxyXG4gICAgZXhwb3J0RmlsZU5hbWU6IGFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgaW5QYW5lbEdyaWQ6IGFkZGl0aW9uYWxPcHRpb25zLmluUGFuZWxHcmlkLFxyXG4gICAgc2hvd1N1bW1hcnlJbkNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICBoZWFkZXJEZXNjcmlwdGlvbixcclxuICAgIHRpdGxlOiBoZWFkZXJUZXh0XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElUcmVlTGlzdFNldHRpbmdzLCBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycyB9IGZyb20gJy4vRGVmYXVsdEdyaWRCYXNlJztcclxuaW1wb3J0IHsgY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0IH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihcclxuICBpZDogc3RyaW5nIHwgSlF1ZXJ5LFxyXG4gIHNldHRpbmdzOiBJVHJlZUxpc3RTZXR0aW5ncyA9IHt9XHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPignZHhUcmVlTGlzdCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoaWQsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxufVxyXG4iLCAiaW1wb3J0IENyb3BwciBmcm9tICdjcm9wcHInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi9Qb3B1cCc7XHJcblxyXG5pbXBvcnQgSW5pdGlhbGl6ZWRFdmVudEluZm8gPSBEZXZFeHByZXNzLmV2ZW50cy5Jbml0aWFsaXplZEV2ZW50SW5mbztcclxuXHJcbmNvbnN0IGF2YXRhclNpemUgPSB7XHJcbiAgaGVpZ2h0OiAzMDAsXHJcbiAgd2lkdGg6IDMwMCxcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0SW1hZ2VUb1ByZXZpZXcgKHByZXZpZXc6IEpRdWVyeSwgYmFzZTY0SW1nOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgcHJldmlldy5hdHRyKCdzcmMnLCBiYXNlNjRJbWcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb250ZW50TWFya3VwIChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCkge1xyXG4gIGNvbnN0ICRhdmF0YXJQb3B1cENvbnRlbnQgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fZHJvcHpvbmUnKTtcclxuICAvLy5vbignZHJvcCcgLCBldiA9PiBldi5kYXRhVHJhbnNmZXIuZmlsZXMpXHJcblxyXG4gIGNvbnN0ICRjcm9wcGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX2Nyb3AtY29udGFpbmVyJylcclxuICAgIC5hcHBlbmRUbygkYXZhdGFyUG9wdXBDb250ZW50KTtcclxuXHJcbiAgY29uc3QgJGNyb3BJbWFnZSA9ICQoJzxpbWcgLz4nKS5wcmVwZW5kVG8oJGNyb3BwZXJDb250YWluZXIpO1xyXG5cclxuICBzZXRJbWFnZVRvUHJldmlldygkY3JvcEltYWdlLCBpbWFnZUJhc2U2NCk7XHJcblxyXG4gIGNvbnN0IGNyb3BwZXIgPSBuZXcgQ3JvcHByKCRjcm9wSW1hZ2VbMF0sIHtcclxuICAgIGFzcGVjdFJhdGlvOiAxLFxyXG4gICAgc3RhcnRTaXplOiBbOTAsIDkwXSxcclxuICB9KTtcclxuXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJGF2YXRhclBvcHVwQ29udGVudCxcclxuICAgIGNyb3BwZXJcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAgKCRjb250ZW50OiBKUXVlcnksIGNyb3BwZXI6IENyb3Bwciwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdVcGRhdGUgcHJvZmlsZSBwaWN0dXJlJyxcclxuICAgICAgc2hvd1RpdGxlOiB0cnVlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgIGhpZGVPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgIG1heFdpZHRoOiAxMDI0LFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZTogSW5pdGlhbGl6ZWRFdmVudEluZm88RGV2RXhwcmVzcy51aS5keFBvcHVwPikgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50ICYmIGUuY29tcG9uZW50Lm9wdGlvbignZnVsbFNjcmVlbicsIHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwMjQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgJGNvbnRlbnQsXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6ICdVcGRhdGUnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2UpID0+IHtcclxuICAgICAgICBjb25zdCBjcm9wT3B0aW9ucyA9IGNyb3BwZXIuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCAkY2FudmFzOiBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+ID0gJCgnPGNhbnZhcz4nKS5hdHRyKCdoZWlnaHQnLCBhdmF0YXJTaXplLmhlaWdodCkuYXR0cignd2lkdGgnLCBhdmF0YXJTaXplLndpZHRoKSBhcyBKUXVlcnk8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG4gICAgICAgIGNvbnN0IGN0eCA9ICgkY2FudmFzWzBdIGFzIGFueSkuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjb25zdCAkaW1hZ2UgPSAkY29udGVudC5maW5kKCdpbWcuY3JvcHByLWltYWdlJylbMF07XHJcblxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoJGltYWdlLCBjcm9wT3B0aW9ucy54LCBjcm9wT3B0aW9ucy55LCBjcm9wT3B0aW9ucy53aWR0aCwgY3JvcE9wdGlvbnMuaGVpZ2h0LCAwLCAwLCBhdmF0YXJTaXplLndpZHRoLCBhdmF0YXJTaXplLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNyb3BwZWQgPSAkY2FudmFzWzBdLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuOSk7XHJcblxyXG4gICAgICAgIG9uQXZhdGFyVXBkYXRlZChjcm9wcGVkKTtcclxuICAgICAgICBjbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiBjbG9zZSgpXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNob3cgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY29uc3QgY29udGVudCA9IGNyZWF0ZUNvbnRlbnRNYXJrdXAoaW1hZ2VCYXNlNjQpO1xyXG5cclxuICBzaG93UG9wdXAoY29udGVudC4kY29udGVudCwgY29udGVudC5jcm9wcGVyLCBvbkF2YXRhclVwZGF0ZWQpO1xyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZ2V0QmFzZTY0ID0gKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBmaWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICByZXNvbHZlKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnID8gcmVzdWx0IDogbnVsbCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuICB9KTtcclxufTtcclxuIiwgImltcG9ydCB7SVJlbmRlcmVkfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQge0RldkV4cHJlc3NFdmVudEFyZ3N9IGZyb20gJy4uLy4uL1V0aWxzL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5pbXBvcnQgeyBzaG93IH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cnO1xyXG5pbXBvcnQge2dldEJhc2U2NH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cvSGVscGVycyc7XHJcbmltcG9ydCBkeFRleHRCb3hPcHRpb25zID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3hPcHRpb25zO1xyXG5pbXBvcnQgZHhUZXh0Qm94ID0gRGV2RXhwcmVzcy51aS5keFRleHRCb3g7XHJcbmltcG9ydCBJc3pvbGVhVUkgZnJvbSAnLi4vLi4vaW5kZXgnO1xyXG5cclxuY29uc3QgbWF4RmlsZU1iU2l6ZSA9IDEwO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQWNjb3VudFNldHRpbmdzRGF0YSB7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxuICBGaXJzdE5hbWU6IHN0cmluZztcclxuICBMYXN0TmFtZTogc3RyaW5nO1xyXG4gIFBob25lTnVtYmVyOiBzdHJpbmc7XHJcbiAgRW1haWw6IHN0cmluZztcclxuICBPbGRQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkOiBzdHJpbmc7XHJcbiAgTmV3UGFzc3dvcmRSZXBlYXQ6IHN0cmluZztcclxuICBBdmF0YXI6IHN0cmluZztcclxuICBIYXNDaGFuZ2VzOiBib29sZWFuO1xyXG4gIEVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBVc2VyQXZhdGFyOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBY2NvdW50U2V0dGluZ3NQYWdlIGltcGxlbWVudHMgSVJlbmRlcmVkIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBmb3JtQWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBhdmF0YXJVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGFjY291bnRTZXR0aW5nc0Zvcm06IERldkV4cHJlc3MudWkuZHhGb3JtIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyBlbGVtZW50c1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgXyRyb290RWxlbWVudDogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAkY29udGFpbmVyOiBKUXVlcnk8SFRNTERpdkVsZW1lbnQ+LFxyXG4gICAgZm9ybUFjdGlvbjogc3RyaW5nLFxyXG4gICAgYWNjb3VudFNldHRpbmdzRGF0YTogSUFjY291bnRTZXR0aW5nc0RhdGEgfCB1bmRlZmluZWQsXHJcbiAgICB1c2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSA9IGFjY291bnRTZXR0aW5nc0RhdGE7XHJcbiAgICB0aGlzLmN1cnJlbnRVc2VySW5mbyA9IHVzZXJJbmZvO1xyXG4gICAgdGhpcy5fJHJvb3RFbGVtZW50ID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZm9ybUFjdGlvbiA9IGZvcm1BY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5yZW5kZXJVcGxvYWRlcih0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICB0aGlzLnJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgJHJvb3RFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLl8kcm9vdEVsZW1lbnQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcm9vdCBlbGVtZW50IGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl8kcm9vdEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclVwbG9hZGVyKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgdGhpcy5hdmF0YXJVcGxvYWRlciA9ICQoJzxkaXY+JylcclxuICAgICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX3VwbG9hZGVyJylcclxuICAgICAgLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXHJcbiAgICAgICAgdXBsb2FkTW9kZTogJ3VzZUZvcm0nLFxyXG4gICAgICAgIGFjY2VwdDogJ2ltYWdlLyonLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIG1heEZpbGVTaXplOiBtYXhGaWxlTWJTaXplICogMTAwMDAwMCxcclxuXHJcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlOiBEZXZFeHByZXNzRXZlbnRBcmdzPERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXJPcHRpb25zLCAnb25WYWx1ZUNoYW5nZWQnPikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCB8fCAhZS52YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBmaWxlID0gZS52YWx1ZVswXTtcclxuICAgICAgICAgIGNvbnN0IG1heFNpemUgPSBlLmNvbXBvbmVudC5vcHRpb24oJ21heEZpbGVTaXplJykgfHwgbWF4RmlsZU1iU2l6ZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWZpbGUgfHwgZmlsZS5zaXplID4gbWF4U2l6ZSkge1xyXG4gICAgICAgICAgICBEZXZFeHByZXNzLnVpLm5vdGlmeShgRmlsZSBzaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gJHttYXhGaWxlTWJTaXplfSBNQi4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGZpbGVgLCAnZXJyb3InLCA1MDAwKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBnZXRCYXNlNjQoZmlsZSlcclxuICAgICAgICAgICAgLnRoZW4oKGltYWdlQmFzZTY0KSA9PiB7XHJcbiAgICAgICAgICAgICAgc2hvdyhpbWFnZUJhc2U2NCwgKG5ld0ltZ1NvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy51cGRhdGVEYXRhKCdBdmF0YXInLCBuZXdJbWdTb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IERldkV4cHJlc3MudWkubm90aWZ5KGVycm9yLCAnZXJyb3InLCAzMDAwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQWNjb3VudFNldHRpbmdzRm9ybSgkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybSA9ICQoJzxmb3JtIC8+JylcclxuICAgICAgLmF0dHIoJ2FjdGlvbicsIHRoaXMuZm9ybUFjdGlvbilcclxuICAgICAgLmF0dHIoJ21ldGhvZCcsICdwb3N0JylcclxuICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19mb3JtJylcclxuICAgICAgLmFkZENsYXNzKCdmb3JtLWNvbnRlbnQnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICAgICAgLmR4Rm9ybSh0aGlzLmdldEZvcm1PcHRpb25zKCkpXHJcbiAgICAgIC5keEZvcm0oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IElzem9sZWFVSS53aWRnZXRzLm5vdGlmeSgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnLCB0cnVlKSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybU9wdGlvbnMoKSA6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmb3JtRGF0YTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLFxyXG4gICAgICBtaW5Db2xXaWR0aDogMjAwLFxyXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcclxuICAgICAgYWxpZ25JdGVtTGFiZWxzOiB0cnVlLFxyXG4gICAgICBzaG93VmFsaWRhdGlvblN1bW1hcnk6IHRydWUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICBjb2xDb3VudDogMTYsXHJcbiAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogNixcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnUHJvZmlsZSBQaWN0dXJlJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0F2YXRhcicsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhclZpZXdDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWNvbnRhaW5lcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkYXZhdGFyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZCgkYXZhdGFyVmlld0NvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1idXR0b24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3Bob3RvJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdVcGxvYWQgbmV3IGltYWdlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmF2YXRhclVwbG9hZGVyICYmIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkaWFsb2dUcmlnZ2VyJywgZS5lbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICApLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmF0YXJCYXNlNjQgPSBkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUgfHwgdGhpcy5jdXJyZW50VXNlckluZm8/LlVzZXJBdmF0YXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdmF0YXJCYXNlNjQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpbWc+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzcmMnLCBhdmF0YXJCYXNlNjQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQ+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1pbnB1dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAndGV4dCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ25hbWUnLCAnQXZhdGFyJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhckNvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsKGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJzxpPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhbJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3LWRlZmF1bHQnLCAnZmFzJywgJ2ZhLXVzZXInXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJWaWV3Q29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmKHRoaXMuYXZhdGFyVXBsb2FkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdkcm9wWm9uZScsICRhdmF0YXJDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVFbnRlcicsICgpID0+ICRhdmF0YXJDb250YWluZXIuYWRkQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignb25Ecm9wWm9uZUxlYXZlJywgKCkgPT4gJGF2YXRhckNvbnRhaW5lci5yZW1vdmVDbGFzcygnZHJvcCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXZhdGFyQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdlbXB0eScsXHJcbiAgICAgICAgICAgICAgY29sU3BhbjogMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29sU3BhbjogOSxcclxuICAgICAgICAgICAgICBjYXB0aW9uOiAnQWNjb3VudCBEZXRhaWxzJyxcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0Vycm9yTWVzc2FnZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZGF0YSAmJiBkYXRhLmVkaXRvck9wdGlvbnMgJiYgZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlICYmICQoJzxkaXYgLz4nKS50ZXh0KGVycm9yTWVzc2FnZSkuYWRkQ2xhc3MoJ2Vycm9yLW1lc3NhZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgIC8vICAgZGF0YUZpZWxkOiAnSGFzQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICAgIC8vICAgfSxcclxuICAgICAgICAgICAgICAgIC8vICAgdmlzaWJsZTogdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhPy5IYXNDaGFuZ2VzICYmICF0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEuRXJyb3JNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgLy8gICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiAkKCc8ZGl2IC8+JykudGV4dCgnQ2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQnKS5hZGRDbGFzcygnc3VjY2Vzcy1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXJOYW1lJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXNlcm5hbWUnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgICAgICAgICAgY29sQ291bnQ6IDIsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlyc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdGaXJzdCBOYW1lJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdGaXJzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTGFzdE5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0xhc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnTGFzdCBOYW1lIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdQaG9uZU51bWJlcicsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1Bob25lIE51bWJlcidcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFbWFpbCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0VtYWlsJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdFbWFpbCBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlbWFpbCcsIG1lc3NhZ2U6ICdQbGVhc2UgdXNlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fcGFzc3dvcmQtYXJlYScsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiAkKCc8ZGl2IC8+JykuY3NzKCdmb250LXdlaWdodCcsICdib2xkJykudGV4dCgnQ2hhbmdlIFBhc3N3b3JkJylcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnT2xkUGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDdXJyZW50IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoISF0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnT2xkIHBhc3N3b3JkIGlzIHJlcXVpcmVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmV3UGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdOZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0QXR0cjogeyBhdXRvY29tcGxldGU6ICduZXctcGFzc3dvcmQnIH1cclxuICAgICAgICAgICAgICAgICAgfSBhcyBkeFRleHRCb3hPcHRpb25zPGR4VGV4dEJveD4sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkUmVwZWF0JyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ29uZmlybSBuZXcgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVldmFsdWF0ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8uZ2V0RWRpdG9yKCdOZXdQYXNzd29yZCcpPy5vcHRpb24oJ3ZhbHVlJykgfHwgJycpID09PSBwYXJhbXMudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkIG1pc21hdGNoJyxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdyaWdodCcsXHJcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fc3VibWl0LWJ0bicsXHJcbiAgICAgICAgICAgICAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZSBDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlU3VibWl0QmVoYXZpb3I6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maXJtKHRleHQ6IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0ICRkZWZmZXJlZDogSlF1ZXJ5RGVmZXJyZWQ8Ym9vbGVhbj4gPSAkLkRlZmVycmVkKCk7XHJcbiAgICBjb25zdCAkZWxlbWVudCA9ICQoJzxkaXYvPicpLmFwcGVuZFRvKHdpbmRvdy5kb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgICBjb25zdCBwb3B1cCA9ICRlbGVtZW50LmR4UG9wdXAoe1xyXG4gICAgICAgIHNob3dUaXRsZTogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiAxNDAsXHJcbiAgICAgICAgd2lkdGg6IDM3MCxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgkY29udGVudCkgPT4ge1xyXG4gICAgICAgICAgICAkY29udGVudC5hZGRDbGFzcygnaXN6b2xlYS1keC1jb25maXJtJyk7XHJcblxyXG4gICAgICAgICAgICAkKCc8Yi8+JykuYWRkQ2xhc3MoJ21lc3NhZ2UnKS50ZXh0KHRleHQpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRidXR0b25zU2VjdGlvbiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdidXR0b25zJykuYXBwZW5kVG8oJGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGFuZ2VyJyxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3B1cC5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zU2VjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgb25IaWRkZW46ICgpID0+IHtcclxuICAgICAgICBwb3B1cC5kaXNwb3NlKCk7XHJcbiAgICAgICAgcG9wdXAuZWxlbWVudCgpLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHBvcHVwLnNob3coKTtcclxuXHJcbiAgICByZXR1cm4gJGRlZmZlcmVkO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vQ29uZmlnL0luZGV4JztcclxuaW1wb3J0IHsgSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzIH0gZnJvbSAnLi4vRGF0YS9JQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBzaG93IGFzIHNob3dJbWFnZVZpZXdlciB9IGZyb20gJy4uL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5kaW5nKCRjb250YWluZXI6IEpRdWVyeSwgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nLCBzaG93U2lnbkluQnV0dG9uOiBib29sZWFuLCBwaG90b0dhbGxlcnlTZXR0aW5nczogSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzID0geyBlbmFibGVkOiBmYWxzZSB9KSB7XHJcbiAgZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5ncykudGhlbigoc2V0dGluZ3MpID0+IHtcclxuICAgIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lciwgc2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b24sIHBob3RvR2FsbGVyeVNldHRpbmdzKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+IHtcclxuICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+ID0gJC5EZWZlcnJlZCgpO1xyXG5cclxuICBpZiAodHlwZW9mIGxvZ29TZXR0aW5ncyA9PT0gJ3N0cmluZycpIHtcclxuICAgIGNvbnN0IGNhY2hlZFNldHRpbmdzUmF3ID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgICRkZWZmZXJlZC5yZXNvbHZlKEpTT04ucGFyc2UoY2FjaGVkU2V0dGluZ3NSYXcpIGFzIElMb2dvU2V0dGluZ3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VuZFJlcXVlc3QobG9nb1NldHRpbmdzLCAncG9zdCcpLmRvbmUoKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgICBhcHBsaWNhdGlvbk5hbWU6IGRhdGEuQXBwbGljYXRpb25OYW1lLFxyXG4gICAgICAgICAgYnVzaW5lc3NOYW1lOiBkYXRhLkJ1c2luZXNzTmFtZSxcclxuICAgICAgICAgIGxhbmRpbmdQYWdlTG9nbzogZGF0YS5MYW5kaW5nUGFnZUxvZ28sXHJcbiAgICAgICAgICBsb2dvSW1hZ2U6IGRhdGEuTG9nb0ltYWdlLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuRGVzY3JpcHRpb25cclxuICAgICAgICB9IGFzIElMb2dvU2V0dGluZ3M7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xyXG4gICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAkZGVmZmVyZWQucmVzb2x2ZShsb2dvU2V0dGluZ3MpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTGFuZGluZ01hcmt1cCgkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncykge1xyXG4gIGNvbnN0ICRsYW5kaW5nUGFnZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXN6b2xlYS1sYW5kaW5nLXBhZ2UnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICBsZXQgJGxhbmRpbmdDb250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xhbmRpbmctY29udGFpbmVyJykuYXBwZW5kVG8oJGxhbmRpbmdQYWdlKTtcclxuXHJcbiAgaWYocGhvdG9HYWxsZXJ5U2V0dGluZ3MuZW5hYmxlZCkge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdwaG90by1nYWxsZXJ5LW1vZGUnKTtcclxuICB9IGVsc2Uge1xyXG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdkZWZhdWx0LW1vZGUnKTtcclxuICAgICRsYW5kaW5nQ29udGFpbmVyID0gJGxhbmRpbmdQYWdlO1xyXG4gIH1cclxuXHJcbiAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2dvLWNvbnRhaW5lcicpXHJcbiAgICAuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8aW1nIC8+JykuYXR0cignc3JjJywgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbykuYWRkQ2xhc3MoJ2xvZ28tbGFyZ2UnKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lciksXHJcbiAgICAgICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICk7XHJcblxyXG4gICQoJzxoMiAvPicpLnRleHQoYFdlbGNvbWUgdG8gJHtsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb259YCkuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpO1xyXG5cclxuICBpZiAoc2hvd1NpZ25JbkJ1dHRvbikge1xyXG4gICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCdzaWduLWluLWJ1dHRvbicpLmFwcGVuZCgkKCc8ZGl2IC8+JykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiAnU2lnbiBJbicsXHJcbiAgICAgIHdpZHRoOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyB1bmRlZmluZWQgOiAnMjAwcHgnLFxyXG4gICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvSG9tZS9Mb2dpbj9yZXR1cm5Vcmw9JHtlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYudG9TdHJpbmcoKSl9YDtcclxuICAgICAgfVxyXG4gICAgfSkpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgIHNob3dJbWFnZVZpZXdlcihcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuJGNvbnRhaW5lciB8fCAkbGFuZGluZ1BhZ2UsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltYWdlVXJscyB8fCBbXSxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuaW1nQ2hhbmdlSW50ZXJ2YWxTZWMgfHwgOCxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MudHJhbnNpdGlvblRpbWVTZWMgfHwgMlxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBY2Nlc3NEZW5pZWRUb1JlcG9ydCgkY29udGFpbmVyOiBKUXVlcnksIGFsbG93ZWRSZXBvcnRSb2xlczogc3RyaW5nW10sIGFsbG93ZWRDb25uZWN0aW9uUm9sZXM6IHN0cmluZ1tdKSB7XHJcbiAgY29uc3QgJGlzem9sZWFDb250YWluZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdhY2Nlc3MtZGVuaWVkLXRvLXJlcG9ydC1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgJCgnPGgyPicpLmFkZENsYXNzKCdlcnJvci10ZXh0JykudGV4dCgnQWNjZXNzIGRlbmllZCB0byB0aGUgcmVwb3J0JykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG5cclxuICBpZiAoYWxsb3dlZFJlcG9ydFJvbGVzICYmIGFsbG93ZWRSZXBvcnRSb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IHJlcG9ydFJvbGVzID0gYWxsb3dlZFJlcG9ydFJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciByZXBvcnQ6ICcpLmFwcGVuZChyZXBvcnRSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGFsbG93ZWRDb25uZWN0aW9uUm9sZXMgJiYgYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGNvbm5lY3Rpb25zUm9sZXMgPSBhbGxvd2VkQ29ubmVjdGlvblJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcclxuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciBkYiBjb25uZWN0aW9uOiAnKS5hcHBlbmQoY29ubmVjdGlvbnNSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSUNkbVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29uZmlndXJhdG9yLCBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xDb25maWd1cmF0b3InO1xyXG5pbXBvcnQgeyBDb250cm9sRGlzcGxheSwgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB9IGZyb20gJy4vQ29udHJvbERpc3BsYXknO1xyXG5pbXBvcnQgeyBEaXNwbGF5TWFuYWdlciwgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vRGlzcGxheU1hbmFnZXInO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IHsgQ29udHJvbENvbmZpZ3VyYXRvciB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmV4cG9ydCB7IENvbnRyb2xEaXNwbGF5IH0gZnJvbSAnLi9Db250cm9sRGlzcGxheSc7XHJcbmV4cG9ydCB7IERpc3BsYXlNYW5hZ2VyIH0gZnJvbSAnLi9EaXNwbGF5TWFuYWdlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDRE1SZXBvcnRQYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSUNkbVJlcG9ydFBhcmFtcztcclxuICB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBjZG1SZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENETVJlcG9ydFBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBTZXR0aW5ncyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIERpc3BsYXknO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1RPUkFHRV9NT0RFX0tFWSA9ICdDRE1fU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3RFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlNYW5hZ2VyT3B0aW9uczogSURpc3BsYXlNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xEaXNwbGF5T3B0aW9uczogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIG11bHRpVmlldzogRGV2RXhwcmVzcy51aS5keE11bHRpVmlldztcclxuICBwcml2YXRlIHRhYlBhbmVsOiBEZXZFeHByZXNzLnVpLmR4VGFiUGFuZWw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlcjtcclxuXHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQ0RNUmVwb3J0UGFnZU9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSBgLyR7b3B0aW9ucy5jZG1SZXBvcnRDb250cm9sbGVyVXJsfS8ke29wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWA7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudCA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcblxyXG4gICAgdGhpcy5jb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyA9IHRoaXMuZ2V0Q29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMoYmFzZVVybCwgb3B0aW9ucy5jZG1SZXBvcnRDb250cm9sbGVyVXJsKTtcclxuICAgIHRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zID0gdGhpcy5nZXREaXNwbGF5TWFuYWdlck9wdGlvbnMoYmFzZVVybCk7XHJcbiAgICB0aGlzLmNvbnRyb2xEaXNwbGF5T3B0aW9ucyA9IHRoaXMuZ2V0Q29udHJvbERpc3BsYXlPcHRpb25zKGJhc2VVcmwsIG9wdGlvbnMudXNlck5hbWUsIG9wdGlvbnMucmVwb3J0UGFyYW1zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5tdWx0aVZpZXc/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMudGFiUGFuZWw/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICh0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJUYWJQYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsOiBzdHJpbmcsIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZyk6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgYXZhaWxhYmxlUm9sZXNVcmw6IGAvJHtjZG1SZXBvcnRDb250cm9sbGVyVXJsfS9BdmFpbGFibGVSb2xlc2AsXHJcbiAgICAgIGdyb3VwRmllbGRzVXJsOiBgJHtiYXNlVXJsfS9BbGxDb250cm9sRmllbGRzYCxcclxuICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9Db25maWd1cmF0b3JEYXRhYFxyXG4gICAgfSBhcyBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsOiBzdHJpbmcpOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29udHJvbERpc3BsYXlVc2VyQXNzaWdubWVudHNgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2BcclxuICAgIH0gYXMgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29udHJvbERpc3BsYXlPcHRpb25zKFxyXG4gICAgYmFzZVVybDogc3RyaW5nLFxyXG4gICAgdXNlck5hbWU6IHN0cmluZyxcclxuICAgIHJlcG9ydFBhcmFtczogSUNkbVJlcG9ydFBhcmFtc1xyXG4gICk6IElDb250cm9sRGlzcGxheU9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiByZXBvcnRQYXJhbXMuTmFtZSxcclxuICAgICAgdXNlckNvbmZpZ1VybDogYCR7YmFzZVVybH0vRmllbGRzUGVybWlzc2lvbnNgLFxyXG4gICAgICBjb250cm9sTG9nc1VybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbExvZ3NgLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29udHJvbERpc3BsYXlEYXRhYCxcclxuICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlEYXRhYCxcclxuICAgICAgdXNlck5hbWUsXHJcbiAgICAgIGltcG9ydEZpbGVPcHRpb25zOiByZXBvcnRQYXJhbXMuQWxsb3dJbXBvcnRpbmcgPyB7XHJcbiAgICAgICAgbW9kZTogcmVwb3J0UGFyYW1zLkltcG9ydEZpbGVNb2RlLFxyXG4gICAgICAgIGNyZWF0ZVRhYmxlVXJsOiBgJHtiYXNlVXJsfS9jcmVhdGUtdGFibGVgLFxyXG4gICAgICAgIGFkZFJvd3NVcmw6IGAke2Jhc2VVcmx9L2FkZC1yb3dzYCxcclxuICAgICAgICBmaWxlVXBsb2FkVXJsOiBgJHtiYXNlVXJsfS9nZXQtY29sdW1uc2AsXHJcbiAgICAgICAgcHJlZGVmaW5lZFRhYmxlOiByZXBvcnRQYXJhbXMuRmlsZUltcG9ydGVyVGFibGVJbmZvXHJcbiAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbEZpbHRlcnNgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xGaWx0ZXJgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xGaWx0ZXJgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xGaWx0ZXJgXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xWaWV3c2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbFZpZXdgLFxyXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xWaWV3YCxcclxuICAgICAgICBkZWxldGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9SZW1vdmVDb250cm9sVmlld2BcclxuICAgICAgfSxcclxuICAgICAgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbERpc3BsYXlzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sRGlzcGxheWAsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xEaXNwbGF5YFxyXG4gICAgICB9LFxyXG4gICAgICByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NgLFxyXG4gICAgICB9XHJcbiAgICB9IGFzIElDb250cm9sRGlzcGxheU9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIHRoaXMubW9kZSk7XHJcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyRGlzcGxheSgpIHtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50Lmh0bWwoJycpO1xyXG4gICAgY29uc3QgJHZpZXcgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMubXVsdGlWaWV3ID0gJHZpZXcuZHhNdWx0aVZpZXcoe1xyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb250cm9sRGlzcGxheSh7IC4uLnRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH0pLmFkZENsYXNzKCdjZG0tcmVwb3J0X19kaXNwbHktZ3JpZCcpLmR4TXVsdGlWaWV3KCdpbnN0YW5jZScpO1xyXG4gICAgZnVsbFNjcmVlbih0aGlzLm11bHRpVmlldywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUYWJQYW5lbCgpIHtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50Lmh0bWwoJycpO1xyXG5cclxuICAgIGNvbnN0ICRtYWluVGFiUGFuZWwgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kcm9vdEVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMudGFiUGFuZWwgPSB0aGlzLmNyZWF0ZVRhYlBhbmVsKCRtYWluVGFiUGFuZWwpO1xyXG4gICAgZnVsbFNjcmVlbih0aGlzLnRhYlBhbmVsLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVRhYlBhbmVsKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pOiBEZXZFeHByZXNzLnVpLmR4VGFiUGFuZWwge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQuZHhUYWJQYW5lbCh7XHJcbiAgICAgIHN3aXBlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dOYXZCdXR0b25zOiB0cnVlLFxyXG4gICAgICBmb2N1c1N0YXRlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFjdGl2ZVN0YXRlRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQucmVwYWludCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnQ29uZmlndXJhdG9yJyxcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb250cm9sQ29uZmlndXJhdG9yKHsgLi4udGhpcy5jb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xyXG4gICAgICAgICAgICBjb21wb25lbnQucmVuZGVyKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogJ0Rpc3BsYXkgTWFuYWdlcicsXHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgRGlzcGxheU1hbmFnZXIoeyAuLi50aGlzLmRpc3BsYXlNYW5hZ2VyT3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xyXG4gICAgICAgICAgICBjb21wb25lbnQucmVuZGVyKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2NkbS1yZXBvcnRfX2NvbmZpZ3VyYXRpb24tdGFiLXBhbmVsJylcclxuICAgICAgLmR4VGFiUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLlNUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBpbml0UG9wb3ZlcihsaW5rOiBzdHJpbmcsIGRldGFpbHM6IHN0cmluZyk6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHtcclxuICBjb25zdCBodG1sID0gJCgnPHAvPicpLmh0bWwoZGV0YWlscykudGV4dCgpO1xyXG5cclxuICBjb25zdCBwb3BvdmVyID0gJCgnPGRpdj4nLCB7IGNsYXNzOiAncmVwb3J0LWRldGFpbHMtcG9wb3ZlcicgfSlcclxuICAgIC5odG1sKGh0bWwpXHJcbiAgICAuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7XHJcblxyXG4gIHJldHVybiAkKHBvcG92ZXIpLmR4UG9wb3Zlcih7XHJcbiAgICB0YXJnZXQ6IGxpbmssXHJcbiAgICBzaG93RXZlbnQ6ICdkeGNsaWNrJyxcclxuICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcclxuICAgIHdpZHRoOiA1MDBcclxuICB9KS5keFBvcG92ZXIoJ2luc3RhbmNlJyk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCB7Q1NTX0NMQVNTRVN9IGZyb20gJy4uLy4uLy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIHtcclxuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcclxuICBzdW1tYXJ5Q29sdW1uPzogc3RyaW5nO1xyXG4gIHNob3dTdW1tYXJ5SW5Db2x1bW4/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0YUdyaWQoXHJcbiAgJHRhcmdldCwgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0Q29sdW1uV2lkdGggPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGxldCBpc0dyaWRJbml0aWFsaXphZWQgPSBmYWxzZTtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgIGV4cG9ydDoge1xyXG4gICAgICBlbmFibGVkOiAhIWFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgICBhbGxvd0V4cG9ydFNlbGVjdGVkRGF0YTogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcblxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcblxyXG4gICAgc2VsZWN0aW9uOiB7bW9kZTogJ211bHRpcGxlJ30sXHJcbiAgICBrZXlib2FyZE5hdmlnYXRpb246IHtlbmFibGVkOiBmYWxzZX0sXHJcbiAgICBwYWdpbmc6IHtwYWdlU2l6ZTogNTB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIGZpbHRlclJvdzoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgaGVhZGVyRmlsdGVyOiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBzY3JvbGxpbmc6IHttb2RlOiAndmlydHVhbCd9LFxyXG4gICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGUuY29tcG9uZW50KTtcclxuXHJcbiAgICAgIGlmIChpc0dyaWRJbml0aWFsaXphZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlzR3JpZEluaXRpYWxpemFlZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoIWRlZmF1bHRDb2x1bW5XaWR0aCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZS5jb21wb25lbnQuY29sdW1uQ291bnQoKTsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhVHlwZSA9IGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnZGF0YVR5cGUnKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnKSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTAwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE1MHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vdG8gZml4IGF1dG9zY3JvbGxcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZSA9IGUuY29tcG9uZW50LmdldFNjcm9sbGFibGUoKTtcclxuXHJcbiAgICAgICAgaWYgKHNjcm9sbGFibGUpIHtcclxuICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oe3RvcDogMH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoaGVhZGVyVGV4dCkge1xyXG4gICAgICAgIGUudG9vbGJhck9wdGlvbnMuaXRlbXMudW5zaGlmdCh7XHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICB0ZW1wbGF0ZSgpIHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyRWwgPSAkKCc8aDIgLz4nKS5hZGRDbGFzcygnZ3JpZC1oZWFkZXInKS50ZXh0KGhlYWRlclRleHQpO1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyRGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICBoZWFkZXJFbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdDbGljayB0byBzZWUgZnVydGhlciBkZXRhaWxzJykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyRWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBvbkNvbnRlbnRSZWFkeSA9IGRhdGFHcmlkT3B0aW9ucy5vbkNvbnRlbnRSZWFkeVxyXG4gICAgPyAoZSkgPT4ge1xyXG4gICAgICBkZWZhdWx0T3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgICAgZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgfVxyXG4gICAgOiBkZWZhdWx0T3B0aW9ucy5vbkNvbnRlbnRSZWFkeTtcclxuXHJcbiAgdHJ5U2V0VG90YWxTdW1tYXJ5KGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMpO1xyXG5cclxuICBjb25zdCBtZXJnZWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBkYXRhR3JpZE9wdGlvbnMsIHtvbkNvbnRlbnRSZWFkeX0pO1xyXG5cclxuICBjb25zdCBncmlkID0gJHRhcmdldC5keERhdGFHcmlkKG1lcmdlZE9wdGlvbnMpLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcblxyXG4gIGdyaWQuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xyXG5cclxuICByZXR1cm4gZ3JpZDtcclxufVxyXG5cclxuZnVuY3Rpb24gdHJ5U2V0VG90YWxTdW1tYXJ5KGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMpIHtcclxuICBpZiAoZGF0YUdyaWRPcHRpb25zPy5zdW1tYXJ5Py50b3RhbEl0ZW1zPy5zb21lKChpKSA9PiBpLnN1bW1hcnlUeXBlID09PSAnY291bnQnKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgbGV0IHN1bW1hcnlDb2x1bW4gPSBhZGRpdGlvbmFsT3B0aW9ucz8uc3VtbWFyeUNvbHVtbjtcclxuICBpZiAoIXN1bW1hcnlDb2x1bW4gJiYgZGF0YUdyaWRPcHRpb25zPy5jb2x1bW5zPy5sZW5ndGgpIHtcclxuICAgIHN1bW1hcnlDb2x1bW4gPSB0eXBlb2YgZGF0YUdyaWRPcHRpb25zLmNvbHVtbnNbMF0gPT09ICdzdHJpbmcnXHJcbiAgICAgID8gZGF0YUdyaWRPcHRpb25zLmNvbHVtbnNbMF1cclxuICAgICAgOiBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXS5kYXRhRmllbGQ7XHJcbiAgfVxyXG5cclxuICBpZiAoc3VtbWFyeUNvbHVtbikge1xyXG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeSkge1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkudG90YWxJdGVtcykge1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkudG90YWxJdGVtcy5wdXNoKHtcclxuICAgICAgY29sdW1uOiBzdW1tYXJ5Q29sdW1uLFxyXG4gICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVTdW1tYXJ5Q29sdW1uSWZSZXF1aXJlZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICBjb25zdCB0b3RhbEl0ZW1zID0gZ3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtcycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddO1xyXG4gIGNvbnN0IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID0gdG90YWxJdGVtcz8uZmlsdGVyKChpKSA9PiBpLnN1bW1hcnlUeXBlID09PSAnY291bnQnKVswXT8uY29sdW1uO1xyXG5cclxuICBsZXQgc3VtbWFyeUNvbHVtbkluZGV4ID0gY3VycmVudFN1bW1hcnlDb2x1bW4gJiYgZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+IGVsLmRhdGFGaWVsZCA9PT0gY3VycmVudFN1bW1hcnlDb2x1bW4pO1xyXG4gIGlmICghc3VtbWFyeUNvbHVtbkluZGV4KSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBncmlkLm9wdGlvbignc2VsZWN0aW9uJyk7XHJcbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLm1vZGUgIT09ICdub25lJztcclxuICAgIHN1bW1hcnlDb2x1bW5JbmRleCA9IGhhc1NlbGVjdGlvbiA/IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiAhIWVsLmRhdGFGaWVsZCkgOiAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbmV3U3VtbWFyeUNvbHVtbiA9IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKVtzdW1tYXJ5Q29sdW1uSW5kZXhdPy5kYXRhRmllbGQ7XHJcblxyXG4gIGlmIChuZXdTdW1tYXJ5Q29sdW1uICYmIGN1cnJlbnRTdW1tYXJ5Q29sdW1uICE9PSBuZXdTdW1tYXJ5Q29sdW1uKSB7XHJcbiAgICBncmlkLm9wdGlvbignc3VtbWFyeScsIHtcclxuICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICBjb2x1bW46IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKVtzdW1tYXJ5Q29sdW1uSW5kZXhdPy5kYXRhRmllbGQsXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChcclxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXHJcbiAgaGVhZGVyVGV4dD86IHN0cmluZywgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsIGRlZmF1bHRDb2x1bW5XaWR0aCA9IGZhbHNlLCBza2lwRnVsbFNjcmVlbiA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGNyZWF0ZURlZmF1bHREYXRhR3JpZCgkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCBoZWFkZXJUZXh0LCBoZWFkZXJEZXNjcmlwdGlvbiwgZGVmYXVsdENvbHVtbldpZHRoKTtcclxuXHJcbiAgaWYgKCFza2lwRnVsbFNjcmVlbikge1xyXG4gICAgZnVsbFNjcmVlbihncmlkKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRleHQsIHRpdGxlKSB7XHJcbiAgcmV0dXJuICQoJzxzcGFuPicpXHJcbiAgICAuYXR0cigndGl0bGUnLCB0aXRsZSlcclxuICAgIC50ZXh0KHRleHQpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkLCBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcclxuaW1wb3J0IGNyZWF0ZURlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCB7SUxvb2t1cER0b30gZnJvbSAnLi4vLi4vLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG4vLyBOT1RFOiBjb25zdCBkZWZhdWx0U2hvd2VkUm9sZXMgPSBbJ1Byb2R1Y3Rpb24nLCAnU2FsZXMnLCAnRmxvb3InXTtcclxuY29uc3Qgcm9sZXNPcmRlciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XHJcblxyXG5leHBvcnQgY29uc3QgZW51bSBEaXNwbGF5VHlwZSB7XHJcbiAgSWNvbnMgPSAxLFxyXG4gIFByZWRlZmluZWRWYWx1ZXMgPSAyLFxyXG4gIFJhYmJpdEFjdGlvbiA9IDNcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtIHtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgaW1hZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUHJlZGVmaW5lZFZhbHVlc0VkaXRvckl0ZW0ge1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEge1xyXG4gIGFjdGlvblR5cGU6IHN0cmluZztcclxuICBmaWVsZHM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRGlzcGxheVR5cGVTZXR0aW5ncyA9IElEaXNwbGF5SWNvbnNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlQcmVkZWZpbmVkVmFsdWVzVHlwZVNldHRpbmdzIHwgSURpc3BsYXlJUmFiYml0QWN0aW9uVHlwZVNldHRpbmdzO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUljb25zVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5JY29ucztcclxuICBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJUHJlZGVmaW5lZFZhbHVlc1R5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlcztcclxuICBkYXRhOiBJUHJlZGVmaW5lZFZhbHVlc0VkaXRvckl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbjtcclxuICBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGF2YWlsYWJsZVJvbGVzVXJsOiBzdHJpbmc7XHJcbiAgZ3JvdXBGaWVsZHNVcmw6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YSB7XHJcbiAgZmllbGRzOiBJTG9va3VwRHRvPHN0cmluZz5bXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRyb2xDb25maWd1cmF0b3Ige1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdmFpbGFibGVSb2xlc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBGaWVsZHNVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVR5cGVzOiBhbnlbXSA9IFtcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5JY29ucywgdmFsdWU6ICdJY29ucycgfSxcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzLCB2YWx1ZTogJ1ByZWRlZmluZWRWYWx1ZXMnIH0sXHJcbiAgICB7IGtleTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uLCB2YWx1ZTogJ1JhYmJpdEFjdGlvbicgfVxyXG4gIF07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlZGl0b3JzID0ge1xyXG4gICAgW0Rpc3BsYXlUeXBlLkljb25zXTogSWNvbnNDb2x1bW5FZGl0b3IsXHJcbiAgICBbRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlc106IFByZWRlZmluZWRWYWx1ZXNDb2x1bW5FZGl0b3IsXHJcbiAgICBbRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uXTogUmFiYml0QWN0aW9uQ29sdW1uRWRpdG9yLFxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlZGl0b3JzSW5pdERhdGEgOiB7W2lkOiBudW1iZXJdIDogb2JqZWN0O30gPSB7fTtcclxuICBwcml2YXRlIHJvbGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgZmllbGRzOiBJTG9va3VwRHRvPHN0cmluZz5bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMuYXZhaWxhYmxlUm9sZXNVcmwgPSBvcHRpb25zLmF2YWlsYWJsZVJvbGVzVXJsO1xyXG4gICAgdGhpcy5ncm91cEZpZWxkc1VybCA9IG9wdGlvbnMuZ3JvdXBGaWVsZHNVcmw7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMucGFnZVRpdGxlID0gb3B0aW9ucy5wYWdlVGl0bGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKCdhcHMtZ3JpZCcpO1xyXG5cclxuICAgIFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5nZXRBdmFpbGFibGVSb2xlcygpLFxyXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZUZpZWxkcygpXHJcbiAgICBdKS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgdGhpcy5yb2xlcyA9IHJlc3VsdFswXTtcclxuICAgICAgdGhpcy5maWVsZHMgPSByZXN1bHRbMV07XHJcbiAgICAgIHRoaXMuZWRpdG9yc0luaXREYXRhW0Rpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbl0gPSB7IGZpZWxkczogdGhpcy5maWVsZHMgfTtcclxuICAgICAgdGhpcy5jcmVhdGVNYWluR3JpZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEF2YWlsYWJsZVJvbGVzKCkge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0PEFycmF5PHsgTmFtZTogc3RyaW5nIH0+Pih0aGlzLmF2YWlsYWJsZVJvbGVzVXJsKVxyXG4gICAgICAudGhlbigocmVzKSA9PiByZXMubWFwKChyKSA9PiByLk5hbWUpLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICBjb25zdCBhT3JkZXIgPSByb2xlc09yZGVyLmdldChhKSB8fCA5OTk5O1xyXG4gICAgICAgIGNvbnN0IGJPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGIpIHx8IDk5OTk7XHJcblxyXG4gICAgICAgIHJldHVybiBhT3JkZXIgLSBiT3JkZXI7XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlRmllbGRzKCk6IFByb21pc2U8SUxvb2t1cER0bzxzdHJpbmc+W10+IHtcclxuICAgIHJldHVybiBzZW5kUmVxdWVzdCh0aGlzLmdyb3VwRmllbGRzVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGlzcGxheVR5cGVFZGl0b3IoJGNvbnRhaW5lciwgdHlwZSwgZGF0YSkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JzW3R5cGVdO1xyXG4gICAgY29uc3QgaW5pdERhdGEgPSB0aGlzLmVkaXRvcnNJbml0RGF0YVt0eXBlXTtcclxuXHJcbiAgICByZXR1cm4gZWRpdG9yXHJcbiAgICAgID8gbmV3IGVkaXRvcigkY29udGFpbmVyLCBkYXRhLCBpbml0RGF0YSlcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZCgpIHtcclxuICAgIGxldCBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKCksXHJcbiAgICAgIGNvbHVtbkNob29zZXI6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFsbG93U2VhcmNoOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdzZWxlY3QnXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgcmVmcmVzaE1vZGU6ICdyZXBhaW50J1xyXG4gICAgICB9LFxyXG4gICAgICByZXBhaW50Q2hhbmdlc09ubHk6IHRydWUsXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHtcclxuICAgICAgICBzdW1tYXJ5OiB0cnVlLFxyXG4gICAgICAgIHBhZ2luZzogdHJ1ZSxcclxuICAgICAgICBncm91cGluZzogZmFsc2UsXHJcbiAgICAgICAgc29ydGluZzogZmFsc2UsXHJcbiAgICAgICAgZmlsdGVyaW5nOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGFsbG93Q29sbGFwc2luZzogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdtdWx0aXBsZSdcclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiBmYWxzZSxcclxuICAgICAgY29sdW1uSGlkaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBjb2x1bW5BdXRvV2lkdGg6IGZhbHNlLFxyXG4gICAgICByb3dBbHRlcm5hdGlvbkVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbk1pbldpZHRoOiA4MCxcclxuICAgICAgb25Sb3dVcGRhdGluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUubmV3RGF0YSB8fCAhZS5vbGREYXRhKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRSb2xlcyA9IGUubmV3RGF0YS5Sb2xlcztcclxuICAgICAgICBjb25zdCBjdXJyZW50Um9sZXMgPSBlLm9sZERhdGEuUm9sZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZE9sZERhdGFUb05ld0RhdGEgPSAoZmllbGROYW1lOiBzdHJpbmcsIG5ld0RhdGFTZWN0aW9uID0gZS5uZXdEYXRhLCBvbGREYXRhU2VjdGlvbiA9IGUub2xkRGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFuZXdEYXRhU2VjdGlvbi5oYXNPd25Qcm9wZXJ0eShmaWVsZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIG5ld0RhdGFTZWN0aW9uW2ZpZWxkTmFtZV0gPSBvbGREYXRhU2VjdGlvbltmaWVsZE5hbWVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh1cGRhdGVkUm9sZXMgJiYgY3VycmVudFJvbGVzKSB7XHJcbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh1cGRhdGVkUm9sZXMpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChyb2xlTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSb2xlID0gdXBkYXRlZFJvbGVzW3JvbGVOYW1lXTtcclxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Um9sZSA9IGN1cnJlbnRSb2xlc1tyb2xlTmFtZV07XHJcblxyXG4gICAgICAgICAgICAgIHVwZGF0ZWRSb2xlLklkID0gY3VycmVudFJvbGUuSWQ7XHJcblxyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlQ3JlYXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVSZWFkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVVwZGF0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlRGVsZXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnTGFiZWwnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdPcmRlcicpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ1Rvb2xUaXAnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdJc0RlZmF1bHRWaWV3RmllbGQnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdJc0tleUNvbHVtbicpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0dyb3VwRmllbGQnKTtcclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdEaXNwbGF5VHlwZScpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0RhdGFPd25lcicpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ1hMU1NjaGVkdWxlTGFiZWwnKTtcclxuICAgICAgfSxcclxuICAgICAgb25Sb3dVcGRhdGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IHRoaXMucHJlcGFyZU1haW5HcmlkQ29sdW1ucyhbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgICBjYXB0aW9uOiAnRmllbGQnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIGZpeGVkOiB0cnVlLFxyXG4gICAgICAgICAgZml4ZWRQb3NpdGlvbjogJ2xlZnQnLFxyXG4gICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcclxuICAgICAgICAgIHdpZHRoOiAxODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdHcm91cEZpZWxkJyxcclxuICAgICAgICAgIGNhcHRpb246ICdHcm91cCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSxcclxuICAgICAgICAgICAgICBkYXRhU291cmNlOiBbLi4ubmV3IFNldChncmlkLmdldERhdGFTb3VyY2UoKS5pdGVtcygpLmZpbHRlcigoaSkgPT4gaS5Hcm91cEZpZWxkKS5tYXAoKGkpID0+IGkuR3JvdXBGaWVsZCkuc29ydCgpKV0sXHJcbiAgICAgICAgICAgICAgYWNjZXB0Q3VzdG9tVmFsdWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0xhYmVsJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdUeXBlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2UsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdEYXRhT3duZXInLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ0RPJywgJ0RhdGEgT3duZXInKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnWExTU2NoZWR1bGVMYWJlbCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnWExTJywgJ1hMUyBTY2hlZHVsZSBMYWJlbCcpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdEaXNwbGF5VHlwZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTYwLFxyXG4gICAgICAgICAgY3VzdG9taXplVGV4dDogKGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghY2VsbEluZm8udmFsdWUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGNlbGxJbmZvLnZhbHVlIGFzIHN0cmluZyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmRpc3BsYXlUeXBlc1xyXG4gICAgICAgICAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtLmtleSA9PT0gc2V0dGluZ3MudHlwZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gc2V0dGluZ3MgPyBzZXR0aW5ncy50eXBlIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHNldHRpbmdzID8gc2V0dGluZ3MuZGF0YSA6IFtdO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keERyb3BEb3duQm94KHtcclxuICAgICAgICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHsgd2lkdGg6IDQwMCB9LFxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGlzcGxheVR5cGVzLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRjb250YWl0ZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkc2VsZWN0b3IgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkYm9keSA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW46IDhweCAwO1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkYnV0dG9ucyA9ICQoJzxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDtcIiAvPicpLmFwcGVuZFRvKCRjb250YWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHNhdmVCdXR0b24gPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7XCIgLz4nKS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkY2FuY2VsQnV0dG9uID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4O1wiIC8+JykuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBlZGl0b3IgPSB0eXBlXHJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5nZXREaXNwbGF5VHlwZUVkaXRvcigkYm9keSwgdHlwZSwgZGF0YSlcclxuICAgICAgICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgJGJvZHkuaHRtbCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvci5yZW5kZXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkc2VsZWN0b3IuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgICAgICAgICBpdGVtczogdGhpcy5kaXNwbGF5VHlwZXMsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdrZXknLFxyXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yID0gdGhpcy5nZXREaXNwbGF5VHlwZUVkaXRvcigkYm9keSwgZS52YWx1ZSwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJGJvZHkuaHRtbCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICRzYXZlQnV0dG9uLmR4QnV0dG9uKCdpbnN0YW5jZScpLm9wdGlvbignZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICRzYXZlQnV0dG9uLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhZWRpdG9yLFxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdG9yRGF0YSA9IGVkaXRvci5nZXREYXRhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJHNlbGVjdG9yLmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpLm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGVkaXRvckRhdGFcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jbG9zZUVkaXRDZWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkY2FuY2VsQnV0dG9uLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2xvc2VFZGl0Q2VsbCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgJGNvbnRhaXRlci5keFNjcm9sbFZpZXcoe1xyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRjb250YWl0ZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0lzRGVmYXVsdFZpZXdGaWVsZCcsXHJcbiAgICAgICAgICBjYXB0aW9uOiAnRGlzcGxheSBpbiBkZWZhdWx0IHZpZXcnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0lzS2V5Q29sdW1uJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdPcmRlcicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IGZvcm1hdDogJyMnIH0sXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdyYW5nZScsXHJcbiAgICAgICAgICAgICAgbWluOiAwLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdPcmRlciBjYW5cXCd0IGJlIG5lZ2F0aXZlJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnV2lkdGgnLFxyXG4gICAgICAgICAgZGF0YVR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ1dpZHRoJywgJ1dpZHRoIChpbiBwaXhlbHMpJyksXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IGZvcm1hdDogJyMnIH0sXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdyYW5nZScsXHJcbiAgICAgICAgICAgICAgbWluOiAxLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdXaWR0aCBjYW5cXCd0IGJlIGxlc3MgdGhlbiAxcHgnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdIaWRpbmdPcmRlcicsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnSGlkZScsICdIaWRpbmcgT3JkZXInKSxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDEsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0hpZGluZyBvcmRlciBjYW5cXCd0IGJlIGxlc3MgdGhlbiAxJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2lkdGg6IDcwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnVG9vbFRpcCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBtaW5XaWR0aDogMTgwXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnUm9sZXMnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dIaWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogdHJ1ZSxcclxuICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY3JlYXRlUm9sZXNDb2x1bW5zKHRoaXMucm9sZXMpXHJcbiAgICAgICAgfVxyXG4gICAgICBdKSxcclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucztcclxuXHJcbiAgICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcclxuICAgICAgc3VtbWFyeUNvbHVtbjogJ05hbWUnXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ3JpZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZU1haW5HcmlkQ29sdW1ucyhjb2x1bW5zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi5hbGxvd0hpZGluZyA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5hbGxvd0hpZGluZyA9PT0gbnVsbCkge1xyXG4gICAgICAgIGNvbHVtbi5hbGxvd0hpZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gbnVsbCkge1xyXG4gICAgICAgIGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSb2xlc0NvbHVtbnMocm9sZXM6IHN0cmluZ1tdKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHJvbGVzXHJcbiAgICAgIC5tYXAoKHJvbGUpID0+ICh7XHJcbiAgICAgICAgbmFtZTogcm9sZSxcclxuICAgICAgICBjYXB0aW9uOiByb2xlLFxyXG4gICAgICAgIGFsbG93SGlkaW5nOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihyb2xlLCAnQ2FuQmVSZWFkJywge1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnUmVhZCcsICdSZWFkJylcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVSb2xlc1Blcm1pc3Npb25Db2x1bW4ocm9sZSwgJ0NhbkJlVXBkYXRlZCcsIHtcclxuICAgICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ0VkaXQnLCAnRWRpdCcpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIF1cclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSb2xlc1Blcm1pc3Npb25Db2x1bW4oXHJcbiAgICByb2xlOiBzdHJpbmcsIHBlcm1pc3Npb25OYW1lOiBzdHJpbmcsIGJhc2VDb2x1bW5PcHRpb25zPzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uXHJcbiAgKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmJhc2VDb2x1bW5PcHRpb25zLFxyXG4gICAgICBuYW1lOiBgJHtyb2xlfV8ke3Blcm1pc3Npb25OYW1lfWAsXHJcbiAgICAgIGRhdGFGaWVsZDogYFJvbGVzLiR7cm9sZX0uJHtwZXJtaXNzaW9uTmFtZX1gLFxyXG4gICAgICBhbGxvd0hpZGluZzogZmFsc2UsXHJcbiAgICAgIHNob3dJbkNvbHVtbkNob29zZXI6IGZhbHNlLFxyXG4gICAgICBhbGxvd0hlYWRlckZpbHRlcmluZzogZmFsc2UsXHJcbiAgICAgIGFsbG93RmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6IDYwXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snZGF0YVNvdXJjZSddIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgIGxvYWRVcmw6IHRoaXMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmwsXHJcbiAgICAgICAga2V5OiAnTmFtZScsXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgSWNvbnNDb2x1bW5FZGl0b3Ige1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGF0YSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICB1c2VJY29uczogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgY29udGV4dE1lbnVFbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd0aXRsZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdpbWFnZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6IChjb250YWluZXIsIGNlbGxEYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY2VsbERhdGEuZGF0YS5pbWFnZSB9KSlcclxuICAgICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1nID0gY2VsbEluZm8udmFsdWUgfHwgJyc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIgLz4nKTtcclxuICAgICAgICAgICAgY29uc3QgJGltZyA9ICQoYDxpbWcgc3JjPVwiJHtpbWd9XCIgLz5gKTtcclxuICAgICAgICAgICAgY29uc3QgJGxpbmsgPSAkKCc8YSBjbGFzcz1cImR4LWxpbmsgZHgtaWNvbi11cGxvYWRcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDhweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDE4cHg7XCIgLz4nKTtcclxuICAgICAgICAgICAgY29uc3QgJGZpbGVJbnB1dCA9ICQoJzxpbnB1dCB0eXBlPVwiZmlsZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIC8+Jyk7XHJcblxyXG4gICAgICAgICAgICAkbGluay5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgJGZpbGVJbnB1dC5jbGljaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICRmaWxlSW5wdXQub24oJ2NoYW5nZScsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKChlLnRhcmdldCBhcyBhbnkpLmZpbGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICRpbWcuYXR0cignc3JjJywgKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKChyZWFkZXIucmVzdWx0IGFzIHN0cmluZykpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gKGUudGFyZ2V0IGFzIGFueSkuZmlsZXNbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAkaW1nLmF0dHIoJ3NyYycsICcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJGltZy5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICAgICAgJGxpbmsuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICRmaWxlSW5wdXQuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAnZWRpdCcsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBoaW50OiAnRGVsZXRlJyxcclxuICAgICAgICAgICAgICBpY29uOiAndHJhc2gnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIChyb3dzIGFzIGFueVtdKS5zcGxpY2UoZS5yb3cucm93SW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHJvd3MpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkZ3JpZCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKFxyXG4gICAgICAkZ3JpZCxcclxuICAgICAge1xyXG4gICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJykgYXMgSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUHJlZGVmaW5lZFZhbHVlc0VkaXRvckl0ZW1bXTtcclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10pIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGNvbnN0IG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmRhdGEsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAncm93JyxcclxuICAgICAgICBhbGxvd0FkZGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgdXNlSWNvbnM6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7IGNvbnRleHRNZW51RW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAndmFsdWUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICdlZGl0JyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgIGljb246ICd0cmFzaCcsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5ncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQoJGdyaWQsIHtcclxuICAgICAgb3B0aW9ucyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3Ige1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGE7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0RGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhO1xyXG4gIHByaXZhdGUgZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEsIGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGEpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgdGhpcy5pbml0RGF0YSA9IGluaXREYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMuZm9ybSA9ICQoJzxkaXYgLz4nKS5keEZvcm0oe1xyXG4gICAgICBmb3JtRGF0YTogdGhpcy5kYXRhLFxyXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdhY3Rpb25UeXBlJyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2ZpZWxkcycsXHJcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCdcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKGUpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gKGUudmFsdWUgYXMgYW55KS5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVxdWlyZWQnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFRhZ0JveCcsXHJcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGRhdGFTb3VyY2U6IHRoaXMuaW5pdERhdGEuZmllbGRzLFxyXG4gICAgICAgICAgICBkaXNwbGF5RXhwcjogJ1RleHQnLFxyXG4gICAgICAgICAgICB2YWx1ZUV4cHI6ICdWYWx1ZScsXHJcbiAgICAgICAgICAgIHNlYXJjaEVuYWJsZWQ6IHRydWVcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRhZ0JveE9wdGlvbnNcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH0pLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcikuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG5cclxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhY3Rpb25UeXBlID0gdGhpcy5mb3JtLmdldEVkaXRvcignYWN0aW9uVHlwZScpLm9wdGlvbigndmFsdWUnKSBhcyBzdHJpbmc7XHJcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdmaWVsZHMnKS5vcHRpb24oJ3ZhbHVlJykgYXMgc3RyaW5nW107XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aW9uVHlwZSxcclxuICAgICAgZmllbGRzXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuKERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCBhcyBhbnkpLnJlZ2lzdGVyTW9kdWxlKCdjb2x1bW5DaG9vc2VyU29ydGluZycsIHtcclxuICBleHRlbmRlcnM6IHtcclxuICAgIGNvbnRyb2xsZXJzOiB7XHJcbiAgICAgIGNvbHVtbnM6IHtcclxuICAgICAgICBnZXRDaG9vc2VyQ29sdW1ucyhsb2FkQWxsQ29sdW1ucykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHRoaXMgYXMgYW55KS5jYWxsQmFzZShsb2FkQWxsQ29sdW1ucyk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KChjb2x1bW4xLCBjb2x1bW4yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24xID0gY29sdW1uMT8uY2FwdGlvbiB8fCAnJztcclxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjIgPSBjb2x1bW4yPy5jYXB0aW9uIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNhcHRpb24xLmxvY2FsZUNvbXBhcmUoY2FwdGlvbjIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuIiwgIlx1RkVGRmNvbnN0IGFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsID0gKHByZXY6IGFueVtdIHwgbnVsbCwgbmV4dDogYW55W10gfCBudWxsKSA9PiB7XHJcbiAgaWYgKHByZXYgPT09IG51bGwgfHwgbmV4dCA9PT0gbnVsbCB8fCBwcmV2Lmxlbmd0aCAhPT0gbmV4dC5sZW5ndGgpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykge1xyXG4gICAgaWYgKHByZXZbaV0gIT09IG5leHRbaV0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbWVtb2l6ZSA9IDxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KGZ1bmM6IFQpOiBUID0+IHtcclxuICBsZXQgbGFzdEFyZ3M6IGFueVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgbGV0IGxhc3RSZXN1bHQ6IHVua25vd24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBvbmx5LWFycm93LWZ1bmN0aW9uc1xyXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICBpZiAoIWFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsKGxhc3RBcmdzLCBhcmdzKSkge1xyXG4gICAgICBsYXN0UmVzdWx0ID0gZnVuYyguLi5hcmdzIGFzIGFueSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xyXG5cclxuICAgIHJldHVybiBsYXN0UmVzdWx0O1xyXG4gIH0gYXMgVDtcclxufTtcclxuIiwgIlx1RkVGRi8vIHRzbGludDpkaXNhYmxlOiBtZW1iZXItb3JkZXJpbmdcclxuaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSAnLi4vLi4vLi4vVXRpbHMvTWVtb2l6ZSc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VmlldyB7XHJcbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlIHwgbnVsbDtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVZpZXdEdG8ge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG4gIEdyaWRTdGF0ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICBJc0dsb2JhbDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMge1xyXG4gIC8vIHJlYWRvbmx5IGRlZmF1bHRPcGVuZWRWaWV3SWQ6IG51bWJlcjtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMgPSBQYXJ0aWFsPFBpY2s8SUNvbnRyb2xEaXNwbGF5VmlldywgJ25hbWUnIHwgJ2dyaWRTdGF0ZScgfCAnaXNHbG9iYWwnPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZFZpZXdzTWFuYWdlciB7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3OiBJQ29udHJvbERpc3BsYXlWaWV3ID0ge1xyXG4gICAgaWQ6IDAsXHJcbiAgICBuYW1lOiAnRGVmYXVsdCcsXHJcbiAgICBncmlkU3RhdGU6IG51bGwsXHJcbiAgICBpc0dsb2JhbDogZmFsc2VcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBkZWZhdWx0Vmlld3MgPSBbR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3XTtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudFZpZXdJZDogbnVtYmVyID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkO1xyXG4gIHByaXZhdGUgdmlld3M6IElDb250cm9sRGlzcGxheVZpZXdbXSA9IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdFZpZXdzO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRWaWV3QnlJZEludGVybmFsID0gKHZpZXdJZDogbnVtYmVyKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3cyAmJiB0aGlzLnZpZXdzLmZpbmQoKHYpID0+IHYuaWQgPT09IHZpZXdJZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0Vmlld0J5SWQgPSBtZW1vaXplKHRoaXMuZ2V0Vmlld0J5SWRJbnRlcm5hbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Vmlld0J5SWQodGhpcy5fY3VycmVudFZpZXdJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWaWV3SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZpZXdJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudFZpZXdJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50Vmlld0lkID0gaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlWaWV3W10+IHtcclxuICAgIGlmICh0aGlzLnZpZXdzID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRWaWV3cykge1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnZpZXdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUN1cnJlbnRWaWV3KHZpZXdVcGRhdGVzOiBDb250cm9sRGlzcGxheVZpZXdVcGRhdGVzKSB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVWaWV3KHRoaXMuY3VycmVudFZpZXcuaWQsIHZpZXdVcGRhdGVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdWaWV3KHZpZXdOYW1lOiBzdHJpbmcsIGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSwgaXNHbG9iYWwpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXc+IHtcclxuICAgIGxldCBuZXdWaWV3RHRvOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvID0gdGhpcy5tYXBWaWV3TW9kZWxUb0R0byh7XHJcbiAgICAgIGlkOiAtMSxcclxuICAgICAgbmFtZTogdmlld05hbWUsXHJcbiAgICAgIGdyaWRTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgIH0pO1xyXG5cclxuICAgIG5ld1ZpZXdEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlWaWV3RHRvPih0aGlzLmluc2VydERhdGFVcmwsICdQT1NUJywgbmV3Vmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcFZpZXdEdG9Ub01vZGVsKG5ld1ZpZXdEdG8pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZVZpZXcodmlld0lkOiBudW1iZXIsIHVwZGF0ZXM6IENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh2aWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0Vmlld0J5SWQodmlld0lkKTtcclxuICAgIGlmICghdmlldykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFZpZXc6IElDb250cm9sRGlzcGxheVZpZXcgPSB7XHJcbiAgICAgIC4uLnZpZXcsXHJcbiAgICAgIC4uLnVwZGF0ZXNcclxuICAgIH07XHJcbiAgICBsZXQgdXBkYXRlZFZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHVwZGF0ZWRWaWV3KTtcclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgdXBkYXRlZFZpZXdEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlWaWV3RHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLCB1cGRhdGVkVmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh2aWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0Vmlld0J5SWQodmlld0lkKTtcclxuICAgIGlmICghdmlldykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyB2aWV3SWQgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3cygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlld3MoKSB7XHJcbiAgICBjb25zdCB2aWV3cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVZpZXdEdG9bXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgdGhpcy52aWV3cyA9IHZpZXdzLm1hcCgoZHRvKSA9PiB0aGlzLm1hcFZpZXdEdG9Ub01vZGVsKGR0bykpO1xyXG4gICAgdGhpcy52aWV3cy51bnNoaWZ0KEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldyk7XHJcbiAgICAvLyBOT1RFOiByZXNldCBtZW1vaXplXHJcbiAgICB0aGlzLnJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRWaWV3QnlJZEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFZpZXdNb2RlbFRvRHRvKG1vZGVsOiBJQ29udHJvbERpc3BsYXlWaWV3KTogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBJZDogbW9kZWwuaWQsXHJcbiAgICAgIE5hbWU6IG1vZGVsLm5hbWUsXHJcbiAgICAgIEdyaWRTdGF0ZTogSlNPTi5zdHJpbmdpZnkobW9kZWwuZ3JpZFN0YXRlKSxcclxuICAgICAgSXNHbG9iYWw6IG1vZGVsLmlzR2xvYmFsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBWaWV3RHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8pOiBJQ29udHJvbERpc3BsYXlWaWV3IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiBkdG8uSWQsXHJcbiAgICAgIG5hbWU6IGR0by5OYW1lLFxyXG4gICAgICBncmlkU3RhdGU6IEpTT04ucGFyc2UoZHRvLkdyaWRTdGF0ZSksXHJcbiAgICAgIGlzR2xvYmFsOiBkdG8uSXNHbG9iYWxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRWaWV3QnlJZEZ1bmN0aW9uKCkge1xyXG4gICAgdGhpcy5nZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuL0dyaWRTdGF0ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElPbmVUaW1lR3JpZFN0YXRlTWFuYWdlck9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlOiBJR3JpZFN0YXRlIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyIHtcclxuICBwdWJsaWMgY3VycmVudFNhdmVkR3JpZFN0YXRlOiBJR3JpZFN0YXRlO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IElPbmVUaW1lR3JpZFN0YXRlTWFuYWdlck9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElPbmVUaW1lR3JpZFN0YXRlTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSA9IG9wdGlvbnMuaW5pdGlhbFN0YXRlO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ3N0YXRlU3RvcmluZycsIHtcclxuICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgIGN1c3RvbUxvYWQ6ICgpID0+IFByb21pc2UucmVzb2x2ZSh0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSlcclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3RhdGVTdG9yaW5nJ10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgLy8gVE9ETzogdXNlIGRlZXAgZXF1YWxcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSAhPT0gbnVsbCAmJiBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlKSAhPT0gSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUoKTogSUdyaWRTdGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlVW5zYXZlZEdyaWRTdGF0ZSh0aGlzLm9wdGlvbnMub3duZXIuc3RhdGUoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYXBwbHkoZ3JpZFN0YXRlOiBJR3JpZFN0YXRlIHwgbnVsbCwgcmVzZXRGaWx0ZXIgPSB0cnVlKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50RmlsdGVyID0gcmVzZXRGaWx0ZXIgPyB1bmRlZmluZWQgOiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKCk7XHJcblxyXG4gICAgICAvKiBOT1RFOiBTb21ldGltZXMgYSBncmlkIGNhbiByZXR1cm4gYSBuZXcgc3RhdGUgd2l0aCBvbGQgZmlsdGVyVmFsdWUsXHJcbiAgICAgICAgc28gd2Ugc2hvdWxkIHJlc2V0IHRoZSBmaWx0ZXJWYWx1ZSBiZWZvcmUgc3RhdGUgYXBwbHlpbmdcclxuICAgICAgICBpZiB0aGlzIGJ1ZyB3aWxsIGJlIGZpeGVkIG9uIHRoZSBEZXZFeHRyZW1lIHNpZGUgd2UgY2FuIHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmVcclxuICAgICAgKi9cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5jbGVhckZpbHRlcignZmlsdGVyVmFsdWUnKTtcclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZShncmlkU3RhdGUpO1xyXG5cclxuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maWx0ZXIoKGMpID0+ICFjLnR5cGUpO1xyXG5cclxuICAgICAgaWYgKHZpc2libGVDb2x1bW5zWzBdICYmIHZpc2libGVDb2x1bW5zWzBdLmRhdGFGaWVsZCkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ3N1bW1hcnknLCB7XHJcbiAgICAgICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgICAgICBjb2x1bW46IHZpc2libGVDb2x1bW5zWzBdLmRhdGFGaWVsZCxcclxuICAgICAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgICAgIH1dXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1cnJlbnRGaWx0ZXIgJiYgdGhpcy5vcHRpb25zLm93bmVyLmZpbHRlcihjdXJyZW50RmlsdGVyKTtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmVuZFVwZGF0ZSgpO1xyXG5cclxuICAgICAgY29uc3Qgb25Db250ZW50UmVhZHkgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zYXZlKCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5vd25lci5vZmYoJ2NvbnRlbnRSZWFkeScsIG9uQ29udGVudFJlYWR5KTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5vbignY29udGVudFJlYWR5Jywgb25Db250ZW50UmVhZHkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gdGhpcy5jdXJyZW50VW5zYXZlZEdyaWRTdGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpIHtcclxuICAgIHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZSh0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVVbnNhdmVkR3JpZFN0YXRlKHVuc2F2ZWRHcmlkU3RhdGU6IElHcmlkU3RhdGUpOiBJR3JpZFN0YXRlIHtcclxuICAgIGlmICh1bnNhdmVkR3JpZFN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB1bnNhdmVkR3JpZFN0YXRlLmNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpO1xyXG4gICAgICBjb25zdCBsYXN0Q29sdW1uID0gdmlzaWJsZUNvbHVtbnNbdmlzaWJsZUNvbHVtbnMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGxhc3RDb2x1bW4ud2lkdGggPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuc2F2ZWRHcmlkU3RhdGU7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyLCBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlciB9IGZyb20gJy4vR3JpZFN0YXRlTWFuYWdlcic7XHJcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxuICByZWFkb25seSBvblZpZXdBcHBsaWVkPzogKHZpZXdJZDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gIHJlYWRvbmx5IG9uVmlld0RlbGV0ZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgY2FuQ3JlYXRlR2xvYmFsVmlld3M6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgdmlzaWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICByZWFkb25seSBncmlkU3RhdGVNYW5hZ2VyOiBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcjtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zID1cclxuICBNdXRhYmxlPE9taXQ8SUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zLCBrZXlvZiBJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucztcclxuICAvLyB0b29sYmFyIGl0ZW1zXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX3ZpZXdzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgLy8gdG9vbGJhciB3aWRnZXRzXHJcbiAgcHJpdmF0ZSB2aWV3c0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgdmlld3NEYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY3VycmVudFZpZXdUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlVmlld0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVWaWV3QXNCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjb2x1bW5DaG9vc2VyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBncmlkU3RhdGVNYW5hZ2VyOiBvcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIgPyBvcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIgOiBuZXcgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIoe1xyXG4gICAgICAgIG93bmVyOiBvcHRpb25zLm93bmVyLFxyXG4gICAgICAgIGluaXRpYWxTdGF0ZTogbnVsbFxyXG4gICAgICB9KSxcclxuICAgICAgZ3JpZFZpZXdzTWFuYWdlcjogb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyID8gb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyIDogbmV3IEdyaWRWaWV3c01hbmFnZXIob3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyksXHJcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXHJcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHRyeUFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaXNDYW5CZVZpZXdBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuXHJcbiAgICBpZiAoaXNDYW5CZVZpZXdBcHBsaWVkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlWaWV3KHZpZXdJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ2FuQmVWaWV3QXBwbGllZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseVZpZXcodmlld0lkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCk7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCA9IHZpZXdJZDtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmFwcGx5KHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3LmdyaWRTdGF0ZSwgZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuZW5kVmlld0FwcGx5aW5nTG9hZGluZygpO1xyXG4gICAgdGhpcy5zeW5jVUlXaXRoQ3VycmVudFZpZXcoKTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub25WaWV3QXBwbGllZCAmJiB0aGlzLm9wdGlvbnMub25WaWV3QXBwbGllZCh2aWV3SWQpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXMpO1xyXG5cclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UoMSwgMCxcclxuICAgICAgdGhpcy52aWV3c1Rvb2xiYXJJdGVtLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVmYXVsdENvbHVtbkNob29zZXJCdXR0b24odG9vbGJhckl0ZW1zOiBBcnJheTx7IG5hbWU/OiBzdHJpbmcgfT4pIHtcclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UodG9vbGJhckl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnY29sdW1uQ2hvb3NlckJ1dHRvbicpLCAxKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IHZpZXdzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX3ZpZXdzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fdmlld3NUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlVmlld3NUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl92aWV3c1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaXNEZWZhdWx0VmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50VmlldztcclxuICAgIGlmICghdGhpcy5jdXJyZW50Vmlld1RpdGxlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnKSAhPT0gY3VycmVudFZpZXcubmFtZSB8fCB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5oYXNDaGFuZ2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVWaWV3c1Rvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICBsZXQgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6ICdkeERyb3BEb3duQm94JyBhcyBhbnksXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnVmlld3MnLFxyXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtdmlld3NfX3Rvb2xiYXItaXRlbScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxyXG4gICAgICAgIGl0ZW1zOiBbR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3XSxcclxuICAgICAgICB2YWx1ZTogR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgICB3aWR0aDogNTUwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94ID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgICB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLnZhbHVlID09PSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkIHx8ICFpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc1ZpZXdBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseVZpZXcoZS52YWx1ZSk7XHJcbiAgICAgICAgICBpZiAoaXNWaWV3QXBwbGllZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnN5bmNVSVdpdGhDdXJyZW50Vmlldyh0cnVlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZCA9IHRoaXMuY3JlYXRlVmlld3NEYXRhR3JpZChlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnRWaWV3VGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlVmlld0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTtcclxuICAgICAgICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5DaG9vc2VyQnV0dG9uID0gdGhpcy5jcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19oZWFkZXInKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudFZpZXdUaXRsZS5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlVmlld0J1dHRvbi5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlVmlld0FzQnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmNvbHVtbkNob29zZXJCdXR0b24uZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmhlaWdodCgnMTAwJScpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMudmlld3NEYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3hPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVWaWV3c0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgdmlldz8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgbG9hZFBhbmVsOiB7XHJcbiAgICAgICAgICBzaGFkaW5nOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0dsb2JhbCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBHbG9iYWwnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICB3aWR0aDogNzBcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdkZWxldGUnLFxyXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKGUpID0+IGUucm93ICYmIGUucm93LmtleSAhPT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdzaW5nbGUnIH0sXHJcbiAgICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gNTFweCknLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIHZpZXdzJyxcclxuICAgICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndmFsdWUnLCBlLnNlbGVjdGVkUm93S2V5cyAmJiBlLnNlbGVjdGVkUm93S2V5cy5sZW5ndGggPyBlLnNlbGVjdGVkUm93S2V5c1swXSA6IDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5kYXRhRmllbGQgPT09ICdpc0dsb2JhbCcpIHtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRpc2FibGVkID0gIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLnZpc2libGUgPSBlLnJvdy5kYXRhLmlkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvblZhbHVlQ2hhbmdlZCA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gYXN5bmMgKG9wdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci51cGRhdGVWaWV3KGUucm93LmRhdGEuaWQsIHsgaXNHbG9iYWw6IG9wdC52YWx1ZSB9KTtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkKG9wdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlICE9PSAnYnV0dG9ucycgfHwgIWUuZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZW5hYmxlZCA9ICFlLmRhdGEuaXNHbG9iYWxcclxuICAgICAgICAgICAgfHwgKGUuZGF0YS5pc0dsb2JhbCAmJiB0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3MpO1xyXG5cclxuICAgICAgICAgIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICBBcnJheS5mcm9tKGUuY2VsbEVsZW1lbnQuY2hpbGRyZW4oKSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICQoYykuY3NzKHtcclxuICAgICAgICAgICAgICAgIGNvbG9yOiAnI2RkZCAhaW1wb3J0YW50JyxcclxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnXHJcbiAgICAgICAgICAgICAgfSkub2ZmKCdjbGljaycpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZVZpZXcoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRWaWV3VGl0bGUoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keFRleHRCb3gge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY3VycmVudC12aWV3IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICB2YWx1ZTogZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3RleHQnKSB8fCBkcm9wZG93bkJveE93bmVyLm9wdGlvbigncGxhY2Vob2xkZXInKSxcclxuICAgICAgICByZWFkT25seTogdGhpcy5pc0RlZmF1bHRWaWV3XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fc2F2ZS12aWV3IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0RlZmF1bHRWaWV3LFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuc2F2ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogODdcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fc2F2ZS12aWV3LWFzIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlIEFzJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZVNhdmVBc0RpYWxvZy5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogMTE4XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ29sdW1uQ2hvb3NlckJ1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2NvbHVtbi1jaG9vc2VyIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMub3BlbkNvbHVtbkNob29zZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnY29sdW1uLWNob29zZXInXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUFzRGlhbG9nKCkge1xyXG4gICAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dDb250ZW50RWxlbWVudCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnVmlldyBOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgfSkuZHhWYWxpZGF0b3Ioe1xyXG4gICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcgfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB2aWV3TmFtZVRleHRCb3ggPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgICBjb25zdCB2aWV3TmFtZVRleHRCb3hWYWxpZGF0b3IgPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFZhbGlkYXRvcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICB2aWV3TmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIGNvbnN0IHZpZXdJc0dsb2JhbENoZWNrYm94ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIiAvPicpXHJcbiAgICAgIC5keENoZWNrQm94KHtcclxuICAgICAgICB0ZXh0OiAnR2xvYmFsIHZpZXcnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHZpZXdJc0dsb2JhbENoZWNrYm94LmVsZW1lbnQoKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICByZXR1cm4gY3JlYXRlRGlhbG9nKFxyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IFZpZXcnLFxyXG4gICAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgbWF4V2lkdGg6ICczMDBweCcsXHJcbiAgICAgIH0sXHJcbiAgICAgICRwb3B1cENvbnRlbnQsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnT2snLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jIChjbG9zZVBvcHVwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXZpZXdOYW1lVGV4dEJveFZhbGlkYXRvci52YWxpZGF0ZSgpLmlzVmFsaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZUFzKHZpZXdOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyksIHZpZXdJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICBjbG9zZVBvcHVwKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IChjbG9zZVBvcHVwKSA9PiBjbG9zZVBvcHVwKClcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5Db2x1bW5DaG9vc2VyKCkge1xyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnNob3dDb2x1bW5DaG9vc2VyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCkge1xyXG4gICAgaWYgKCF0aGlzLnZpZXdzRHJvcGRvd25Cb3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuZ2V0Vmlld3MoKTtcclxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICBrZXk6ICdpZCcsXHJcbiAgICAgIGRhdGE6IHZpZXdzXHJcbiAgICB9KTtcclxuICAgIHRoaXMudmlld3NEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgIHRoaXMudmlld3NEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlKCkge1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoKTtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZUN1cnJlbnRWaWV3KHtcclxuICAgICAgbmFtZTogdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgZ3JpZFN0YXRlOiB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGVcclxuICAgIH0pO1xyXG5cclxuICAgIG5vdGlmeSgnU2F2ZWQnLCB0cnVlKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVBcyh2aWV3TmFtZTogc3RyaW5nLCBpc0dsb2JhbDogYm9vbGVhbikge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xyXG4gICAgY29uc3QgdXBkYXRlZFZpZXcgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jcmVhdGVOZXdWaWV3KFxyXG4gICAgICB2aWV3TmFtZSxcclxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuY3VycmVudFNhdmVkR3JpZFN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlWaWV3KHVwZGF0ZWRWaWV3LmlkKTtcclxuXHJcbiAgICBub3RpZnkoJ1ZpZXcgaXMgY3JlYXRlZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVWaWV3KHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5kZWxldGVWaWV3KHZpZXdJZCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uVmlld0RlbGV0ZWQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLm9uVmlld0RlbGV0ZWQodmlld0lkKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCAhPT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlWaWV3KEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZ2luVmlld0FwcGx5aW5nTG9hZGluZygpIHtcclxuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIHRydWUpO1xyXG4gICAgdGhpcy5zYXZlVmlld0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0FwcGx5aW5nLi4uJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVuZFZpZXdBcHBseWluZ0xvYWRpbmcoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jVUlXaXRoQ3VycmVudFZpZXcoaWdub3JlQ3VycmVudFZpZXdUaXRsZSA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIWlnbm9yZUN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcubmFtZSk7XHJcbiAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgdGhpcy5pc0RlZmF1bHRWaWV3KTtcclxuICAgIH1cclxuICAgIHRoaXMudmlld3NEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnZpZXdzRGF0YUdyaWQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRGF0YUdyaWQuc2VsZWN0Um93c0J5SW5kZXhlcyhbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRGF0YUdyaWQuc2VsZWN0Um93cyhbdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZF0sIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG5cclxuICAgIGNvbnN0IGlzR2xvYmFsVmlldyA9IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3LmlzR2xvYmFsXHJcbiAgICAgICYmICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3M7XHJcblxyXG4gICAgdGhpcy5zYXZlVmlld0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCB0aGlzLmlzRGVmYXVsdFZpZXcgfHwgaXNHbG9iYWxWaWV3KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRi8vIHRzbGludDpkaXNhYmxlOiBtZW1iZXItb3JkZXJpbmdcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5RmlsdGVyIHtcclxuICByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBpc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgaXNHbG9iYWw6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgZmlsdGVyU3RhdGU6IGFueSB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8ge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG4gIElzRGVmYXVsdDogYm9vbGVhbjtcclxuICBJc0dsb2JhbDogYm9vbGVhbjtcclxuICBGaWx0ZXJTdGF0ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZEZpbHRlcklkOiBudW1iZXI7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxudHlwZSBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMgPSBQYXJ0aWFsPFBpY2s8SUNvbnRyb2xEaXNwbGF5RmlsdGVyLCAnbmFtZScgfCAnZmlsdGVyU3RhdGUnIHwgJ2lzR2xvYmFsJz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRGaWx0ZXJzTWFuYWdlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlcnM6IElDb250cm9sRGlzcGxheUZpbHRlcltdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdldEZpbHRlckJ5SWRJbnRlcm5hbCA9IChmaWx0ZXJJZDogbnVtYmVyKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzICYmIHRoaXMuZmlsdGVycy5maW5kKCh2KSA9PiB2LmlkID09PSBmaWx0ZXJJZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0RmlsdGVyQnlJZCA9IG1lbW9pemUodGhpcy5nZXRGaWx0ZXJCeUlkSW50ZXJuYWwpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRGaWx0ZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJCeUlkKHRoaXMuX2N1cnJlbnRGaWx0ZXJJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRGaWx0ZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50RmlsdGVySWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRGaWx0ZXJJZChpZDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RmlsdGVySWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRGaWx0ZXJzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyW10+IHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUN1cnJlbnRGaWx0ZXIoZmlsdGVyVXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLmN1cnJlbnRGaWx0ZXIgJiYgdGhpcy51cGRhdGVGaWx0ZXIodGhpcy5jdXJyZW50RmlsdGVyLmlkLCBmaWx0ZXJVcGRhdGVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoZmlsdGVyTmFtZTogc3RyaW5nLCBmaWx0ZXJTdGF0ZTogYW55LCBpc0RlZmF1bHQ6IGJvb2xlYW4sIGlzR2xvYmFsOiBib29sZWFuKVxyXG4gICAgOiBQcm9taXNlPElDb250cm9sRGlzcGxheUZpbHRlcj4ge1xyXG4gICAgbGV0IG5ld0ZpbHRlckR0bzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvID0gdGhpcy5tYXBGaWx0ZXJNb2RlbFRvRHRvKHtcclxuICAgICAgaWQ6IC0xLFxyXG4gICAgICBuYW1lOiBmaWx0ZXJOYW1lLFxyXG4gICAgICBpc0RlZmF1bHQsXHJcbiAgICAgIGlzR2xvYmFsLFxyXG4gICAgICBmaWx0ZXJTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbmV3RmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLmluc2VydERhdGFVcmwsXHJcbiAgICAgICdQT1NUJywgbmV3RmlsdGVyRHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBGaWx0ZXJEdG9Ub01vZGVsKG5ld0ZpbHRlckR0byk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIsIHVwZGF0ZXM6IENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkRmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIgPSB7XHJcbiAgICAgIC4uLmZpbHRlcixcclxuICAgICAgLi4udXBkYXRlc1xyXG4gICAgfTtcclxuICAgIGxldCB1cGRhdGVkRmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8odXBkYXRlZEZpbHRlcik7XHJcblxyXG4gICAgdXBkYXRlZEZpbHRlckR0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheUZpbHRlckR0bz4odGhpcy51cGRhdGVEYXRhVXJsLFxyXG4gICAgICAnUFVUJywgdXBkYXRlZEZpbHRlckR0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyQnlJZChmaWx0ZXJJZCk7XHJcbiAgICBpZiAoIWZpbHRlcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBmaWx0ZXJJZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZpbHRlcnMoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvW10+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnMubWFwKChkdG8pID0+IHRoaXMubWFwRmlsdGVyRHRvVG9Nb2RlbChkdG8pKTtcclxuICAgIC8vIE5PVEU6IHJlc2V0IG1lbW9pemVcclxuICAgIHRoaXMucmVzZXRDYWNoZWRSZXN1bHRPZkdldEZpbHRlckJ5SWRGdW5jdGlvbigpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlck1vZGVsVG9EdG8obW9kZWw6IElDb250cm9sRGlzcGxheUZpbHRlcik6IElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBJZDogbW9kZWwuaWQsXHJcbiAgICAgIE5hbWU6IG1vZGVsLm5hbWUsXHJcbiAgICAgIElzRGVmYXVsdDogbW9kZWwuaXNEZWZhdWx0LFxyXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWwsXHJcbiAgICAgIEZpbHRlclN0YXRlOiBKU09OLnN0cmluZ2lmeShtb2RlbC5maWx0ZXJTdGF0ZSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlckR0b1RvTW9kZWwoZHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8pOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGR0by5JZCxcclxuICAgICAgbmFtZTogZHRvLk5hbWUsXHJcbiAgICAgIGlzRGVmYXVsdDogZHRvLklzRGVmYXVsdCB8fCBmYWxzZSxcclxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbCB8fCBmYWxzZSxcclxuICAgICAgZmlsdGVyU3RhdGU6IEpTT04ucGFyc2UoZHRvLkZpbHRlclN0YXRlKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldEZpbHRlckJ5SWRGdW5jdGlvbigpIHtcclxuICAgIHRoaXMuZ2V0RmlsdGVyQnlJZCA9IG1lbW9pemUodGhpcy5nZXRGaWx0ZXJCeUlkSW50ZXJuYWwpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyLCBJQ29udHJvbERpc3BsYXlGaWx0ZXIsIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcic7XHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBhcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI6IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgb25GaWx0ZXJBcHBsaWVkPzogKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgb25GaWx0ZXJEZWxldGVkPzogKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgY2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcclxuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zIHtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbnR5cGUgTXV0YWJsZTxUPiA9IHtcclxuICAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF07XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zID1cclxuICBNdXRhYmxlPE9taXQ8SUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnM7XHJcbiAgLy8gdG9vbGJhciBpdGVtc1xyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9maWx0ZXJzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgLy8gdG9vbGJhciB3aWRnZXRzXHJcbiAgcHJpdmF0ZSBmaWx0ZXJzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlcnNEYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY3VycmVudEZpbHRlclRpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG5ld0ZpbHRlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICAvLyB3aWRnZXRzXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2ZpbHRlclBvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJOYW1lVGV4dEJveDogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJCdWlsZGVyOiBEZXZFeHByZXNzLnVpLmR4RmlsdGVyQnVpbGRlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yOiBEZXZFeHByZXNzLnVpLmR4RmlsdGVyQnVpbGRlcjtcclxuICBwcml2YXRlIGZpbHRlcklzR2xvYmFsQ2hlY2tib3g6IERldkV4cHJlc3MudWkuZHhDaGVja0JveCB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIGlzSW5GaWx0ZXJBcHBseWluZyA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcjogb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcclxuICAgICAgICA/IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyXHJcbiAgICAgICAgOiBuZXcgR3JpZEZpbHRlcnNNYW5hZ2VyKG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyksXHJcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXHJcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKHtcclxuICAgICAgICBmaWVsZHM6IHRoaXMuZ2V0RmxhdENvbHVtbnNMaXN0KHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ2NvbHVtbnMnKSlcclxuICAgICAgfSlcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB0cnlBcHBseUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc0NhbkJlRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcblxyXG4gICAgaWYgKGlzQ2FuQmVGaWx0ZXJBcHBsaWVkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc0NhbkJlRmlsdGVyQXBwbGllZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZlcnJlZExvYWRpbmcgPSBmYWxzZSkge1xyXG4gICAgLy8gTk9URTogSWYgd2UgY2hhbmdlIHRoZSBmaWx0ZXIsIHRoZSBncmlkIHdpbGwgYmUgcmVsb2FkZWQgaW4gdGhlIGZpbHRlcnNEcm9wZG93bkJveC5vblZhbHVlQ2hhbmdlZFxyXG4gICAgLy8gY29uc3QgZmlsdGVyQ2hhbmdlZCA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkICE9PSBmaWx0ZXJJZDtcclxuICAgIHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkID0gZmlsdGVySWQ7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudCh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XHJcblxyXG4gICAgbGV0IGdyaWREYXRhU291cmNlID0gdGhpcy5vcHRpb25zLm93bmVyLmdldERhdGFTb3VyY2UoKTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgIC8vIE5PVEU6IG5lZWQgdG8gcHJvY2VzcyBmaWx0ZXIgdmFsdWUgYnkgdGhlIGdldEZpbHRlckV4cHJlc3Npb24gbWV0aG9kXHJcbiAgICAgIC8vIHRvIGJlIHN1cmUgaXQgd2lsbCB3b3JrIGluIGRhdGFzb3VyY2UgKGZvciBleGFtcGxlLCB0aGUgJ2JldHdlZW4nIGNvbmRpdGlvbilcclxuICAgICAgLy8gd2lsbCBiZSBtb2RpZmllZCB0byBcIj49IGFuZCA8PVwiIGJlY2F1c2UgZGF0YSBzb3VyY2UgZG9lc24ndCBzdXBwb3J0ICdiZXR3ZWVuJy5cclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3Iub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3IuZ2V0RmlsdGVyRXhwcmVzc2lvbigpO1xyXG5cclxuICAgICAgaWYgKGdyaWREYXRhU291cmNlLmlzTG9hZGluZygpKSB7XHJcbiAgICAgICAgY29uc3QgYXBwbHlWYWx1ZSA9ICgpID0+IHtcclxuICAgICAgICAgIGdyaWREYXRhU291cmNlLm9mZignbG9hZGluZ0NoYW5nZWQnLCBhcHBseVZhbHVlKTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBncmlkRGF0YVNvdXJjZSA9IHRoaXMub3B0aW9ucy5vd25lci5nZXREYXRhU291cmNlKCk7XHJcbiAgICAgICAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcih2YWwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZ3JpZERhdGFTb3VyY2Uub24oJ2xvYWRpbmdDaGFuZ2VkJywgYXBwbHlWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgKCFmaWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICBpZiAoIWRlZmVycmVkTG9hZGluZykge1xyXG4gICAgICBhd2FpdCBncmlkRGF0YVNvdXJjZS5sb2FkKCk7XHJcbiAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm9uRmlsdGVyQXBwbGllZCAmJiB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkKGZpbHRlcklkKTtcclxuICAgIHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludGVncmF0ZVRvR3JpZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nID0gZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycpO1xyXG5cclxuICAgIGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nICYmIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB0aGlzLm9uR3JpZFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkVG9vbGJhclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25Ub29sYmFyUHJlcGFyaW5nJ10gPSAoZSkgPT4ge1xyXG4gICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucyAmJiBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgaWYgKCF0b29sYmFySXRlbXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UoMSwgMCxcclxuICAgICAgdGhpcy5maWx0ZXJzVG9vbGJhckl0ZW1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBmaWx0ZXJzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJzVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZUZpbHRlcnNUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBmaWx0ZXJQb3B1cCgpIHtcclxuICAgIGlmICghdGhpcy5fZmlsdGVyUG9wdXApIHtcclxuICAgICAgdGhpcy5fZmlsdGVyUG9wdXAgPSB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclBvcHVwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaGFzQ2hhbmdlcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXI7XHJcblxyXG4gICAgY29uc3QgbmV3TmFtZSA9IHRoaXMuZmlsdGVyTmFtZVRleHRCb3ggJiYgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBvbGROYW1lID0gY3VycmVudEZpbHRlciAmJiBjdXJyZW50RmlsdGVyLm5hbWU7XHJcblxyXG4gICAgY29uc3QgbmV3RmlsdGVyID0gdGhpcy5maWx0ZXJCdWlsZGVyICYmIHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBvbGRGaWx0ZXIgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuZmlsdGVyU3RhdGU7XHJcblxyXG4gICAgY29uc3QgbmV3SXNHbG9iYWwgPSB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3ggJiYgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZElzR2xvYmFsID0gY3VycmVudEZpbHRlciAmJiBjdXJyZW50RmlsdGVyLmlzR2xvYmFsO1xyXG5cclxuICAgIHJldHVybiBuZXdOYW1lICE9PSBvbGROYW1lIHx8IG5ld0ZpbHRlciAhPT0gb2xkRmlsdGVyIHx8IG5ld0lzR2xvYmFsICE9PSBvbGRJc0dsb2JhbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICBsZXQgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6ICdkeERyb3BEb3duQm94JyBhcyBhbnksXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnRGF0YSBTZXRzJyxcclxuICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25zLnZpc2libGUsXHJcbiAgICAgIGNzc0NsYXNzOiAnYXBzLWZpbHRlcnNfX3Rvb2xiYXItaXRlbScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJyxcclxuICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcclxuICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgIGRyb3BEb3duT3B0aW9uczoge1xyXG4gICAgICAgICAgd2lkdGg6IDUwMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Jbml0aWFsaXplZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgICBjb25zdCBbLCB1c2VyU2V0dGluZ3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci5nZXRVc2VyU2V0dGluZ3MoKVxyXG4gICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgdXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCAmJiBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmlzSW5GaWx0ZXJBcHBseWluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCFpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBlLnZhbHVlO1xyXG4gICAgICAgICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcih2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKCFpc0ZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZS5wcmV2aW91c1ZhbHVlO1xyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3ModmFsdWUsIGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlICYmIHRoaXMuY3VycmVudEZpbHRlclRpdGxlLm9wdGlvbigndmFsdWUnLFxyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3RleHQnKSB8fCBlLmNvbXBvbmVudC5vcHRpb24oJ3BsYWNlaG9sZGVyJykpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25PcGVuZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5zZWxlY3RSb3dzKGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSwgZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgPSB0aGlzLmNyZWF0ZUZpbHRlcnNEYXRhR3JpZChlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudEZpbHRlclRpdGxlKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMubmV3RmlsdGVyQnV0dG9uID0gdGhpcy5jcmVhdGVOZXdGaWx0ZXJCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtZmlsdGVyc19faGVhZGVyJylcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZS5lbGVtZW50KCkpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5uZXdGaWx0ZXJCdXR0b24uZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuY3NzKCdoZWlnaHQnLCAnMTAwJScpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuZmlsdGVyc0RhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcnNEYXRhR3JpZChkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZHJvcGRvd25Cb3hPd25lci5nZXREYXRhU291cmNlKCksXHJcbiAgICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcclxuICAgICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1EZWxldGVNZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGRhdGEgc2V0PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ25hbWUnLFxyXG4gICAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0RlZmF1bHQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgRGVmYXVsdCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzR2xvYmFsJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA3MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2VkaXQnLFxyXG4gICAgICAgICAgICAgICAgaGludDogJ0VkaXQnLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFlLnJvdyB8fCAhZS5yb3cua2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKGUucm93LmtleSk7XHJcbiAgICAgICAgICAgICAgICAgIGlzRmlsdGVyQXBwbGllZCAmJiAhdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3Zpc2libGUnKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMub3BlbkVkaXRGaWx0ZXJQb3B1cCh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgJ2RlbGV0ZSdcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XHJcbiAgICAgICAgICBlZGl0T25LZXlQcmVzczogZmFsc2UsXHJcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCb3JkZXJzOiBmYWxzZSxcclxuICAgICAgICBzaG93Q29sdW1uTGluZXM6IGZhbHNlLFxyXG4gICAgICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnc2luZ2xlJyB9LFxyXG4gICAgICAgIGhlaWdodDogJ2NhbGMoMTAwJSAtIDUxcHgpJyxcclxuICAgICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICAgIG5vRGF0YVRleHQ6ICdObyBkYXRhIHNldHMnLFxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzID8gZS5zZWxlY3RlZFJvd0tleXNbMF0gOiBudWxsKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuZGF0YUZpZWxkID09PSAnaXNHbG9iYWwnKSB7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSBhc3luYyAob3B0KSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGUucm93LmRhdGEuaWQsIHsgaXNHbG9iYWw6IG9wdC52YWx1ZSB9KTtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkKG9wdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlICE9PSAnYnV0dG9ucycgfHwgIWUuZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZS5jb2x1bW4udHlwZSA9PT0gJ2J1dHRvbnMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSAhZS5kYXRhLmlzR2xvYmFsXHJcbiAgICAgICAgICAgICAgfHwgKGUuZGF0YS5pc0dsb2JhbCAmJiB0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICBBcnJheS5mcm9tKGUuY2VsbEVsZW1lbnQuY2hpbGRyZW4oKSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgJChjKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJyNkZGQgIWltcG9ydGFudCcsXHJcbiAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnXHJcbiAgICAgICAgICAgICAgICB9KS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93VXBkYXRpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUua2V5IHx8IGUubmV3RGF0YS5pc0RlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGUuY29tcG9uZW50LmdldERhdGFTb3VyY2UoKS5pdGVtcygpLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmlzRGVmYXVsdCk7XHJcbiAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVyLmlzRGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXBkYXRlVXNlclNldHRpbmdzKHtcclxuICAgICAgICAgICAgZGVmYXVsdEZpbHRlcklkOiBlLm5ld0RhdGEuaXNEZWZhdWx0ID8gZS5rZXkgOiB1bmRlZmluZWRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGVsZXRlRmlsdGVyKGUua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50RmlsdGVyVGl0bGUoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keFRleHRCb3gge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19jdXJyZW50LWZpbHRlcicpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIHJlYWRPbmx5OiB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZmlsdGVyc19fYWRkLW5ldy1maWx0ZXIgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ05ldyBEYXRhIFNldCcsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTmV3RmlsdGVyUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICdwbHVzJ1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlclBvcHVwKCkge1xyXG4gICAgY29uc3QgJHBvcHVwUm9vdCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygnYm9keScpO1xyXG4gICAgbGV0IGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gJHBvcHVwUm9vdC5keFBvcHVwKHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLm9wdGlvbnMub3duZXIuZWxlbWVudCgpLFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDY1MCxcclxuICAgICAgaGVpZ2h0OiA1MDAsXHJcbiAgICAgIG9uU2hvd2luZzogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveCAmJiB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkhpZGluZzogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcyB8fCBpc1BvcHVwSGlkaW5nQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICBpc1BvcHVwSGlkaW5nQ29uZmlybWVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZS5jYW5jZWwgPSB0cnVlO1xyXG4gICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG4gICAgICAgIGlmIChpc1BvcHVwSGlkaW5nQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveCAmJiB0aGlzLmZpbHRlcnNEcm9wZG93bkJveC5vcGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJOYW1lVGV4dEJveCgpIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdFbnRlciBEYXRhIFNldCBOYW1lLi4uJyxcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVySXNHbG9iYWxDaGVja2JveCgpIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgIHRleHQ6ICdHbG9iYWwgZGF0YSBzZXQnLFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhDaGVja0JveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmxhdENvbHVtbnNMaXN0KHNvdXJjZUNvbHVtbnMsIC4uLnJlc3QpIHtcclxuICAgIGxldCByZXN1bHQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUNvbHVtbiBvZiBzb3VyY2VDb2x1bW5zKSB7XHJcbiAgICAgIGlmIChzb3VyY2VDb2x1bW4uY29sdW1ucyAmJiBzb3VyY2VDb2x1bW4uY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbmVzdGVkQ29sdW1ucyA9IHRoaXMuZ2V0RmxhdENvbHVtbnNMaXN0KHNvdXJjZUNvbHVtbi5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChuZXN0ZWRDb2x1bW5zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSAkLmV4dGVuZCh7fSwgc291cmNlQ29sdW1uKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGUnIHx8IGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgY29uc3QgaXNEYXRlVGltZSA9IGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJztcclxuICAgICAgICAgIGNvbnN0IGRhdGVGb3JtYXQgPSAnZGQgTU1NIHl5JztcclxuICAgICAgICAgIGNvbnN0IGRhdGVUaW1lRm9ybWF0ID0gJ2hoOm1tLCBkZCBNTU0geXknO1xyXG4gICAgICAgICAgY29uc3QgZGlzcGxheUZvcm1hdCA9IGlzRGF0ZVRpbWUgPyBkYXRlVGltZUZvcm1hdCA6IGRhdGVGb3JtYXQ7XHJcblxyXG4gICAgICAgICAgY29uc3QgcGFyc2VEYXRlVGltZSA9IChkYXRlU3RyOiBzdHJpbmcpOiBEYXRlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVQYXJ0cyA9IGRhdGVTdHIuc3BsaXQoJywgJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZGF0ZVRpbWVQYXJ0c1sxXSwgZGF0ZUZvcm1hdCkgfHwgbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGltZVBhcnRzID0gZGF0ZVRpbWVQYXJ0c1swXS5zcGxpdCgnOicpO1xyXG5cclxuICAgICAgICAgICAgICBkYXRlLnNldEhvdXJzKHBhcnNlSW50KHRpbWVQYXJ0c1swXSkpO1xyXG4gICAgICAgICAgICAgIGRhdGUuc2V0TWludXRlcyhwYXJzZUludCh0aW1lUGFydHNbMV0pKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgY29sdW1uLmZvcm1hdCA9IGRpc3BsYXlGb3JtYXQ7XHJcbiAgICAgICAgICBjb2x1bW4uZWRpdG9yVGVtcGxhdGUgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RGF0ZUJveCh7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdCxcclxuICAgICAgICAgICAgICB0eXBlOiBpc0RhdGVUaW1lID8gJ2RhdGV0aW1lJyA6ICdkYXRlJyxcclxuICAgICAgICAgICAgICB3aWR0aDogMTUwLFxyXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlLnNldFZhbHVlKERldkV4cHJlc3MubG9jYWxpemF0aW9uLmZvcm1hdERhdGUodmFsdWUsIGRpc3BsYXlGb3JtYXQpKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAoaXNEYXRlVGltZSA/IHBhcnNlRGF0ZVRpbWUoZS52YWx1ZSkgOiBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZS52YWx1ZSwgZGlzcGxheUZvcm1hdCkpXHJcbiAgICAgICAgICAgICAgICB8fCBudWxsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGNvbHVtbi5maWx0ZXJPcGVyYXRpb25zID0gWyc9JywgJzw+JywgJzwnLCAnPicsICc8PScsICc+PScsICdpc2JsYW5rJywgJ2lzbm90YmxhbmsnXTtcclxuICAgICAgICAgIGNvbHVtbi5jYWxjdWxhdGVGaWx0ZXJFeHByZXNzaW9uID0gZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJncyA9IFtzb3VyY2VDb2x1bW5zLCAuLi5yZXN0XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmdzWzBdKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGlzRGF0ZVRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBwYXJzZURhdGVUaW1lKGFyZ3NbMF0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzWzBdID0gRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGZpbHRlclZhbHVlLCBkaXNwbGF5Rm9ybWF0KSB8fCBudWxsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdENhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24oLi4uYXJncyk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzdWx0LnB1c2goY29sdW1uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQuc29ydCgoY29sMSwgY29sMikgPT4ge1xyXG4gICAgICBjb25zdCBjYXB0aW9uMSA9IChjb2wxLmNhcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24yID0gKGNvbDIuY2FwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIGlmIChjYXB0aW9uMSA8IGNhcHRpb24yKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2FwdGlvbjEgPiBjYXB0aW9uMikge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJCdWlsZGVyKCkge1xyXG4gICAgY29uc3QgZmlsdGVyQnVpbGRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKHtcclxuICAgICAgICBmaWVsZHM6IHRoaXMuZ2V0RmxhdENvbHVtbnNMaXN0KHRoaXMub3B0aW9ucy5vd25lci5vcHRpb24oJ2NvbHVtbnMnKSlcclxuICAgICAgfSlcclxuICAgICAgLmR4RmlsdGVyQnVpbGRlcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyQnVpbGRlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcj86IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJzEwMCUnKTtcclxuXHJcbiAgICBjb25zdCAkbmFtZUNvbnRhaW5lciA9ICQoJzxkaXYgY2xhc3M9XCJhcHMtZmlsdGVyc19fbmFtZS1jb250YWluZXJcIiAvPicpLmhlaWdodCgnMzZweCcpO1xyXG5cclxuICAgIC8vIE5PVEU6IFJlY3JlYXRlIHdpZGdldHNcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3ggPSB0aGlzLmNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCk7XHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIgPSB0aGlzLmNyZWF0ZUZpbHRlckJ1aWxkZXIoKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCA9IHRoaXMuY3JlYXRlRmlsdGVySXNHbG9iYWxDaGVja2JveCgpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIubmFtZSk7XHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94LmVsZW1lbnQoKS5hcHBlbmRUbygkbmFtZUNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmlzR2xvYmFsKTtcclxuICAgIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5lbGVtZW50KCkuYXBwZW5kVG8oJG5hbWVDb250YWluZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMpO1xyXG5cclxuICAgICRuYW1lQ29udGFpbmVyLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcblxyXG4gICAgY29uc3QgJGZpbHRlckJ1aWxkZXJDb250YWluZXIgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCdjYWxjKDEwMCUgLSAzNnB4KScpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlci5lbGVtZW50KCkuYXBwZW5kVG8oJGZpbHRlckJ1aWxkZXJDb250YWluZXIpO1xyXG5cclxuICAgICRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyLmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgIHNjcm9sbEJ5Q29udGVudDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuICRwb3B1cENvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcj86IElDb250cm9sRGlzcGxheUZpbHRlcik6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbVtdIHtcclxuICAgIHJldHVybiBmaWx0ZXIgPyBbXHJcbiAgICAgIHRoaXMuY3JlYXRlVXBkYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZVNhdmVGaWx0ZXJBc05ld1BvcHVwVG9vbGJhckl0ZW0oKSxcclxuICAgICAgdGhpcy5jcmVhdGVSZXNldEZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKSxcclxuICAgICAgdGhpcy5jcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKClcclxuICAgIF0gOiBbdGhpcy5jcmVhdGVTYXZlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdBcHBseSBhbmQgU2F2ZScsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5jcmVhdGVOZXdGaWx0ZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVXBkYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0FwcGx5IGFuZCBVcGRhdGUnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVGaWx0ZXJBc05ld1BvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdTYXZlIEFzIE5ldycsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5jcmVhdGVOZXdGaWx0ZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUmVzZXRGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnUmVzZXQnLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAgICAgICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlc2V0IHVuc2F2ZWQgY2hhbmdlcz8nLFxyXG4gICAgICAgICAgICAnUmVzZXQgdGhlIGRhdGEgc2V0J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVzZXRDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAndW5kbydcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGVsZXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0RlbGV0ZSBEYXRhIFNldCcsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgICAgICAgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIFwiJHt0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIubmFtZX1cIiBkYXRhIHNldD9gLFxyXG4gICAgICAgICAgICAnRGVsZXRlIHRoZSBkYXRhIHNldCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoIWlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUZpbHRlcih0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclBvcHVwLmhpZGUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICd0cmFzaCdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb3Blbk5ld0ZpbHRlclBvcHVwKCkge1xyXG4gICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcih1bmRlZmluZWQpO1xyXG4gICAgaWYgKCFpc0ZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KCk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLnNob3coKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkVkaXRGaWx0ZXJQb3B1cChmaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlcikge1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uID0gdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdhbmltYXRpb24nLCB1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3RpdGxlJywgZmlsdGVyID8gYEVkaXQgdGhlIFwiJHtmaWx0ZXIubmFtZX1cIiBkYXRhIHNldGAgOiAnQ3JlYXRlIGEgbmV3IGRhdGEgc2V0Jyk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignY29udGVudFRlbXBsYXRlJywgKCkgPT4gdGhpcy5jcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyKSk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndG9vbGJhckl0ZW1zJywgdGhpcy5jcmVhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtcyhmaWx0ZXIpKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAucmVwYWludCgpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdhbmltYXRpb24nLCBjdXJyZW50QW5pbWF0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3RmlsdGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlck5hbWVUZXh0Qm94IHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmlsdGVyTmFtZSA9IHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgZmlsdGVyQnVpbGRlclN0YXRlID0gdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGlzRGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgY29uc3QgaXNHbG9iYWwgPSB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgIGlmICghZmlsdGVyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29udHJvbERpc3BsYXlGaWx0ZXIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmNyZWF0ZU5ld0ZpbHRlcihcclxuICAgICAgZmlsdGVyTmFtZSwgZmlsdGVyQnVpbGRlclN0YXRlLCBpc0RlZmF1bHQsIGlzR2xvYmFsXHJcbiAgICApO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKGNvbnRyb2xEaXNwbGF5RmlsdGVyLmlkKTtcclxuXHJcbiAgICBub3RpZnkoJ0NyZWF0ZWQnLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlRmlsdGVyKGZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyTmFtZVRleHRCb3ggfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBmaWx0ZXJTdGF0ZSA9IHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc1VwZGF0ZWQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLnVwZGF0ZUZpbHRlcihmaWx0ZXIuaWQsIHtcclxuICAgICAgbmFtZTogZmlsdGVyTmFtZSxcclxuICAgICAgZmlsdGVyU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICB9KTtcclxuICAgIGlmICghaXNVcGRhdGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiB1cGRhdGUgdGl0bGVcclxuICAgIG5vdGlmeSgnVXBkYXRlZCcsIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcih0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuaWQpO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmRlbGV0ZUZpbHRlcihmaWx0ZXJJZCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uRmlsdGVyRGVsZXRlZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25GaWx0ZXJEZWxldGVkKGZpbHRlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKHVuZGVmaW5lZCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLm5hbWUpO1xyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuZmlsdGVyU3RhdGUpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuaXNHbG9iYWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNEcm9wZG93bkJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgW3VzZXJTZXR0aW5ncywgZmlsdGVyc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIuZ2V0VXNlclNldHRpbmdzKCksXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuZ2V0RmlsdGVycygpXHJcbiAgICBdKTtcclxuXHJcbiAgICBpZiAodXNlclNldHRpbmdzLmRlZmF1bHRGaWx0ZXJJZCkge1xyXG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZmlsdGVycy5maW5kKChmKSA9PiBmLmlkID09PSB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKTtcclxuICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcclxuICAgICAgICAoZGVmYXVsdEZpbHRlciBhcyBhbnkpLmlzRGVmYXVsdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5BcnJheVN0b3JlKHtcclxuICAgICAga2V5OiAnaWQnLFxyXG4gICAgICBkYXRhOiBmaWx0ZXJzXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1DaGFuZ2VzTG9zcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIE5PVEU6IERlbGF5IGZvciBwb3B1cCB2aXNpYmlsaXR5IGNoZWNraW5nXHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDApKTtcclxuICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8ICF0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndmlzaWJsZScpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBjbG9zZSB0aGlzIHBvcHVwLiBEbyB5b3Ugd2FudCB0byBjbG9zZSB0aGUgcG9wdXAgYW5kIG5vdCBzYXZlIGNoYW5nZXM/JyxcclxuICAgICAgJ1Vuc2F2ZWQgY2hhbmdlcydcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJQXBpUmVzcG9uc2UsIFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4uLy4uL0RhdGEnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZVVwbG9hZGVyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIG1heEZpbGVTaXplOiBudW1iZXI7XHJcbiAgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xyXG4gIG9uVmFsdWVDaGFuZ2VkPzogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVmFsdWVDaGFuZ2VkRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25VcGxvYWRTdGFydGVkPzogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVXBsb2FkU3RhcnRlZEV2ZW50KSA9PiB2b2lkO1xyXG4gIG9uVXBsb2FkZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRlZEV2ZW50KSA9PiB2b2lkO1xyXG4gIHNlbGVjdEJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFjY2VwdGVkRmlsZVR5cGVzOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25WYWx1ZUNoYW5nZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlZhbHVlQ2hhbmdlZEV2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25VcGxvYWRTdGFydGVkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZGVkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRlZEV2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3NzQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdEJ1dHRvblRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBmaWxlVXBsb2FkZXI6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlVXBsb2FkZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmNzc0NsYXNzID0gb3B0aW9ucy5jc3NDbGFzcztcclxuICAgIHRoaXMubWF4RmlsZVNpemUgPSBvcHRpb25zLm1heEZpbGVTaXplO1xyXG4gICAgdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyA9IG9wdGlvbnMuYWNjZXB0ZWRGaWxlVHlwZXM7XHJcbiAgICB0aGlzLnNlbGVjdEJ1dHRvblRleHQgPSBvcHRpb25zLnNlbGVjdEJ1dHRvblRleHQ7XHJcbiAgICB0aGlzLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucyA9IG9wdGlvbnMuYWxsb3dlZEZpbGVFeHRlbnNpb25zO1xyXG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCA9IG9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICB0aGlzLm9uVXBsb2FkU3RhcnRlZCA9IG9wdGlvbnMub25VcGxvYWRTdGFydGVkO1xyXG4gICAgdGhpcy5vblVwbG9hZGVkID0gb3B0aW9ucy5vblVwbG9hZGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGNvbnN0ICRmaWxlVXBsb2FkZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICBpZiAodGhpcy5jc3NDbGFzcykge1xyXG4gICAgICAkZmlsZVVwbG9hZGVyLmFkZENsYXNzKHRoaXMuY3NzQ2xhc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsZVVwbG9hZGVyID0gJGZpbGVVcGxvYWRlci5keEZpbGVVcGxvYWRlcih7XHJcbiAgICAgIHNlbGVjdEJ1dHRvblRleHQ6IHRoaXMuc2VsZWN0QnV0dG9uVGV4dCxcclxuICAgICAgbGFiZWxUZXh0OiAnJyxcclxuICAgICAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiB0aGlzLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucyxcclxuICAgICAgYWNjZXB0OiB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLFxyXG4gICAgICB1cGxvYWRNb2RlOiAndXNlRm9ybScsXHJcbiAgICAgIG1heEZpbGVTaXplOiB0aGlzLm1heEZpbGVTaXplLFxyXG4gICAgICBzaG93RmlsZUxpc3Q6IGZhbHNlLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ2xhYmVsVGV4dCcsIGUudmFsdWVbMF0gPyBlLnZhbHVlWzBdLm5hbWUgOiAnJyk7XHJcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZD8uKGUpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblVwbG9hZFN0YXJ0ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5lbGVtZW50LmZpbmQoJy5keC1maWxldXBsb2FkZXItdXBsb2FkLWJ1dHRvbicpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLm9uVXBsb2FkU3RhcnRlZD8uKGUpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblVwbG9hZGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRlZD8uKGUpO1xyXG4gICAgICB9LFxyXG4gICAgfSkuZHhGaWxlVXBsb2FkZXIoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZCh0aGlzLmZpbGVVcGxvYWRlci5lbGVtZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwbG9hZDxUPih1cGxvYWRVcmw6IHN0cmluZywgcGFyYW1zPzogYW55KTogUHJvbWlzZTxUPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICBjb25zdCBmaWxlID0gKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKS5maW5kKCdpbnB1dCcpWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzWzBdO1xyXG5cclxuICAgICAgZmQuYXBwZW5kKCdmaWxlJywgZmlsZSk7XHJcblxyXG4gICAgICAvKiBlc2xpbnQgZ3VhcmQtZm9yLWluOiBvZmYgKi9cclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBmb3JpblxyXG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFyYW1zKSB7XHJcbiAgICAgICAgZmQuYXBwZW5kKHByb3AsIHBhcmFtc1twcm9wXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgdXJsOiB1cGxvYWRVcmwsXHJcbiAgICAgICAgdHlwZTogJ3Bvc3QnLFxyXG4gICAgICAgIGRhdGE6IGZkLFxyXG4gICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcclxuICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXHJcbiAgICAgICAgc3VjY2VzczogKHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8VD4pID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5EYXRhIGFzIGFueSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZWplY3QocmVzcG9uc2UuTWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGUpID0+IHJlamVjdCgnVW5rbm93biBlcnJvcicpXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIgfSBmcm9tICcuLi9GaWxlVXBsb2FkZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBJRmlsZUltcG9ydGVyQ29sdW1uSW5mbywgSUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGEgfSBmcm9tICcuL0lGaWxlSW1wb3J0ZXJUYWJsZU1ldGFkYXRhJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL1V0aWxzL0V2ZW50RW1pdHRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJUYWJsZUluZm8ge1xyXG4gIHNjaGVtYTogc3RyaW5nO1xyXG4gIHRhYmxlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlck9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIGZpbGVVcGxvYWRVcmw6IHN0cmluZztcclxuICBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBnZXRUYWJsZXNMaXN0VXJsPzogc3RyaW5nO1xyXG4gIHByZWRlZmluZWRUYWJsZT86IElGaWxlSW1wb3J0ZXJUYWJsZUluZm87XHJcbiAgcHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlPzogSW1wb3J0RmlsZU1vZGU7XHJcbiAgY3JlYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIHVwZGF0ZVRhYmxlQnV0dG9uVGV4dD86IHN0cmluZztcclxuICBjcmVhdGVUYWJsZU1vZGVUZXh0Pzogc3RyaW5nO1xyXG4gIHVwZGF0ZVRhYmxlTW9kZVRleHQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEltcG9ydEZpbGVNb2RlIHtcclxuICBDcmVhdGVOZXdUYWJsZSA9IDAsXHJcbiAgQWRkTmV3Um93cyA9IDFcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVJbXBvcnRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUQUJMRV9VUERBVEVEX0VWRU5UID0gJ2ZpbGUtaW1wb3J0ZXItdGFibGUtdXBkYXRlZC1ldmVudCc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSb3dzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVkZWZpbmVkVGFibGU6IElGaWxlSW1wb3J0ZXJUYWJsZUluZm8gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRUYWJsZXNMaXN0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjYW5DaGFuZ2VNb2RlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVCdXR0b25UZXh0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZVRhYmxlTW9kZVRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVRhYmxlTW9kZVRleHQ6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBwb3B1cDogRGV2RXhwcmVzcy51aS5keFBvcHVwO1xyXG4gIHByaXZhdGUgZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm07XHJcbiAgcHJpdmF0ZSBmaWxlVXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBwcml2YXRlIGRhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcHJpdmF0ZSBhY3Rpb25CdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSByb3dzQ291bnRlckNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcm93c0NvdW50ZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIG1vZGU6IEltcG9ydEZpbGVNb2RlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRmlsZUltcG9ydGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuZmlsZVVwbG9hZFVybCA9IG9wdGlvbnMuZmlsZVVwbG9hZFVybDtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMudGl0bGUgPSBvcHRpb25zLnRpdGxlO1xyXG4gICAgdGhpcy5nZXRUYWJsZXNMaXN0VXJsID0gb3B0aW9ucy5nZXRUYWJsZXNMaXN0VXJsO1xyXG4gICAgdGhpcy5jcmVhdGVUYWJsZVVybCA9IG9wdGlvbnMuY3JlYXRlVGFibGVVcmw7XHJcbiAgICB0aGlzLmFkZFJvd3NVcmwgPSBvcHRpb25zLmFkZFJvd3NVcmw7XHJcbiAgICB0aGlzLnByZWRlZmluZWRUYWJsZSA9IG9wdGlvbnMucHJlZGVmaW5lZFRhYmxlO1xyXG4gICAgdGhpcy5jYW5DaGFuZ2VNb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgPT09IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubW9kZSA9IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSA6IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG4gICAgdGhpcy5jcmVhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcclxuICAgIHRoaXMudXBkYXRlVGFibGVCdXR0b25UZXh0ID0gb3B0aW9ucy51cGRhdGVUYWJsZUJ1dHRvblRleHQgfHwgJ0FkZCBOZXcgUm93cyc7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlTW9kZVRleHQgPSBvcHRpb25zLmNyZWF0ZVRhYmxlTW9kZVRleHQgfHwgJ0NyZWF0ZSBUYWJsZSc7XHJcbiAgICB0aGlzLnVwZGF0ZVRhYmxlTW9kZVRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlTW9kZVRleHQgfHwgJ0FkZCBOZXcgUm93cyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvdygpIHtcclxuICAgIHRoaXMucG9wdXAgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKVxyXG4gICAgICAuZHhQb3B1cCh7XHJcbiAgICAgICAgc2hvd1RpdGxlOiB0cnVlLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICByZXNpemVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgICAgaGlkZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICBmdWxsU2NyZWVuOiB0cnVlLFxyXG4gICAgICAgIG1heFdpZHRoOiAxMzAwLFxyXG4gICAgICAgIG1heEhlaWdodDogODAwLFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGNvbnN0ICRzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuYXBwZW5kKHRoaXMuZm9ybS5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgICRzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dCgpLFxyXG4gICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24gPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm93c1RvVGFibGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5wb3B1cC5oaWRlKClcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9XVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwLnNob3coKTtcclxuICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIGlmICh0aGlzLnBvcHVwKSB7XHJcbiAgICAgIHRoaXMucG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCk6IERldkV4cHJlc3MudWkuZHhGb3JtIHtcclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2PicpLmR4Rm9ybSh7XHJcbiAgICAgIHNob3dDb2xvbkFmdGVyTGFiZWw6IHRydWUsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBjb2xDb3VudEJ5U2NyZWVuOiB7IG1kOiA0LCBzbTogMSB9LFxyXG4gICAgICBzY3JlZW5CeVdpZHRoOiAod2lkdGgpID0+IHdpZHRoIDwgMTI1NiA/ICdzbScgOiAnbWQnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdNb2RlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2NoZW1hJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZScsXHJcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXHJcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICB9XVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGVTZWxlY3RvcicsXHJcbiAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgIHRleHQ6ICdUYWJsZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgY29sU3BhbjogMixcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBsb2FkVXJsOiB0aGlzLmdldFRhYmxlc0xpc3RVcmwsXHJcbiAgICAgICAgICAgICAgbG9hZFBhcmFtczogeyBjb250ZXh0TmFtZTogJycsIHRhYmxlc09ubHk6IHRydWUsIGlzV2FyZWhvdXNlQ29udGV4dDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgIGxvYWRNZXRob2Q6ICdwb3N0JyxcclxuICAgICAgICAgICAgICBub3RpZnlFcnJvcjogZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgc29ydDogJ3RoaXMnLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTb3VyY2UgRmlsZScsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdDb2x1bW5zIFNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbFNwYW46IDQsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICAkKCc8ZGl2IC8+JykuZHhCdXR0b25Hcm91cCh7XHJcbiAgICAgIGl0ZW1zOiBbe1xyXG4gICAgICAgIHRleHQ6IHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCxcclxuICAgICAgICBpY29uOiAnaW5zZXJ0dGFibGUnLFxyXG4gICAgICAgIHZhbHVlOiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgdGV4dDogdGhpcy51cGRhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnRyb3diZWxvdycsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3NcclxuICAgICAgfV0gYXMgYW55LFxyXG4gICAgICBrZXlFeHByOiAndmFsdWUnLFxyXG4gICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgc3R5bGluZ01vZGU6ICdvdXRsaW5lZCcsXHJcbiAgICAgIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1LZXlzOiBbdGhpcy5tb2RlXSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gZS5pdGVtRGF0YS52YWx1ZTtcclxuICAgICAgICB0aGlzLm9uTW9kZVN3aXRjaGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgfSkuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbGVzVXBsb2FkZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xyXG4gICAgICAkY29udGFpbmVyLFxyXG4gICAgICBjc3NDbGFzczogJ3RhYmxlLWNyZWF0b3JfX3VwbG9hZCcsXHJcbiAgICAgIG1heEZpbGVTaXplOiAxMCAqIDEwMDAwMDAsXHJcbiAgICAgIGFjY2VwdGVkRmlsZVR5cGVzOiAnLnhscywgLnhsc3gnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IFsnLnhscycsICcueGxzeCddLFxyXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiAnU2VsZWN0IEV4Y2VsIGZpbGUnLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdQYXJzaW5nIHNlbGVjdGVkIGZpbGUuLi4nKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8SUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGE+KHRoaXMuZmlsZVVwbG9hZFVybCkudGhlbigodGFibGVNZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGFibGVNZXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Um93c0NvdW50KHRhYmxlTWV0YS5Sb3dzQ291bnQpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBzdG9yZToge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcclxuICAgICAgICAgICAgICAgIGtleTogJ0lkJyxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRhYmxlTWV0YS5Db2x1bW5zXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwYWdpbmF0ZTogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFBhcnNpbmcgRXJyb3IgOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIG5vRGF0YVRleHQ6ICdTZWxlY3QgRXhjZWwgRmlsZScsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUm93OiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc29ydGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBwYWdpbmc6IHtcclxuICAgICAgICBwYWdlU2l6ZTogMTAwMDAsXHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFt7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSWQnLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2VsZWN0ZWQnLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgY2FwdGlvbjogJ0NvbHVtbiBOYW1lJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNOdWxsYWJsZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlICYmIHRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgICBzZXRDZWxsVmFsdWU6IChuZXdEYXRhLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbmV3RGF0YS5Jc051bGxhYmxlID0gdmFsdWU7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgbmV3RGF0YS5Jc0tleUNvbHVtbiA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgICAgICB0b29sYmFySXRlbXMucHVzaCh7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndGFibGUtY3JlYXRvcl9fdGFibGUtaGVhZGVyJylcclxuICAgICAgICAgICAgICAgIC50ZXh0KCdQYXJzZWQgRmlsZSBNZXRhZGF0YScpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlciA9ICQoJzxzcGFuPicpLnRleHQoJzEwMDAnKTtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpLnRleHQoJ1Jvd3MgQ291bnQ6ICcpLCB0aGlzLnJvd3NDb3VudGVyKS5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lcjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZGF0YVJvdycgJiYgZS5kYXRhRmllbGQgPT09ICdJc0tleUNvbHVtbicpIHtcclxuICAgICAgICAgIGNvbnN0IGVkaXRvck9wdGlvbnMgPSBlLmVkaXRvck9wdGlvbnMgYXMgRGV2RXhwcmVzcy51aS5keENoZWNrQm94T3B0aW9ucztcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSBlLnJvdy5kYXRhLklzTnVsbGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGF0YUdyaWQgPSBkZWZhdWx0R3JpZCgkKCc8ZGl2IC8+JyksIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgc2V0RGVmYXVsdENvbHVtbldpZHRoOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgJGNvbnRhaW5lci5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJsZSgpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgY29uc3QgZHMgPSB0aGlzLmRhdGFHcmlkLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgaWYgKCFkcykge1xyXG4gICAgICAgIG5vdGlmeSgnU2VsZWN0IGZpbGUgd2l0aCBkYXRhJywgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xyXG4gICAgICBpZiAoIXRoaXMuYXJlQ29sdW1uc1ZhbGlkKGNvbHVtbnMpKSB7XHJcbiAgICAgICAgbm90aWZ5KCdBdCBsZWFzdCAxIGtleSBjb2x1bW4gbXVzdCBiZSBzZXQnLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgc2NoZW1hOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlNjaGVtYSxcclxuICAgICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlLFxyXG4gICAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdDcmVhdGluZyBhbmQgZmlsbGluZyBEQiB0YWJsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmNyZWF0ZVRhYmxlVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlIFske3BhcmFtcy5zY2hlbWF9XS5bJHtwYXJhbXMudGFibGV9XSBoYXMgYmVlbiBjcmVhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gY3JlYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgbm90aWZ5KGBUYWJsZSBjcmVhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFJvd3NUb1RhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICB0YWJsZTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5UYWJsZVNlbGVjdG9yLFxyXG4gICAgICAgIGNvbHVtbnM6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBZGRpbmcgcm93cyB0byBEQiB0YWJsZS4uLicpO1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8Ym9vbGVhbj4odGhpcy5hZGRSb3dzVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlICR7cGFyYW1zLnRhYmxlfSBoYXMgYmVlbiB1cGRhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gdXBkYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgbm90aWZ5KGBUYWJsZSB1cGRhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vZGVTd2l0Y2hpbmcoKSB7XHJcbiAgICBjb25zdCBpc0NyZWF0ZVRhYmxlTW9kZSA9IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCkpO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzS2V5Q29sdW1uJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNOdWxsYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG5cclxuICAgIGlmICghdGhpcy5jYW5DaGFuZ2VNb2RlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIHRydWUpO1xyXG4gICAgICB0aGlzLmZvcm0udXBkYXRlRGF0YSgnU2NoZW1hJywgdGhpcy5wcmVkZWZpbmVkVGFibGUuc2NoZW1hKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdUYWJsZScsIHRoaXMucHJlZGVmaW5lZFRhYmxlLnRhYmxlKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGVTZWxlY3RvcicsICd2aXNpYmxlJywgIWlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWN0aW9uQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgPyB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA6IHRoaXMudXBkYXRlVGFibGVCdXR0b25UZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcmVDb2x1bW5zVmFsaWQoY29sdW1uczogSUZpbGVJbXBvcnRlckNvbHVtbkluZm9bXSkge1xyXG4gICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLlNlbGVjdGVkKS5zb21lKChzKSA9PiBzLklzS2V5Q29sdW1uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Um93c0NvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucm93c0NvdW50ZXJDb250YWluZXIuc2hvdygpO1xyXG4gICAgdGhpcy5yb3dzQ291bnRlci50ZXh0KGNvdW50KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWREaXNwbGF5c01hbmFnZXIgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEZpbGVJbXBvcnRlciwgSUZpbGVJbXBvcnRlclRhYmxlSW5mbywgSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcclxuICBtb2RlOiBDZG1JbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlOiBJRmlsZUltcG9ydGVyVGFibGVJbmZvO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGVkaXRNb2RlOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheXNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnREaXNwbGF5VGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWxlSW1wb3J0ZXI6IEZpbGVJbXBvcnRlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2Rpc3BsYXlzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pbXBvcnRGaWxlVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIgPSBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxhaXNMb2FkZWQgPSAoZGlzcGxheXMpID0+IHtcclxuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgIGRhdGE6IGRpc3BsYXlzXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ICYmIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YUdyaWQgJiYgdGhpcy5kYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSAoZGlzcGxheSkgPT4ge1xyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5JZCA6IG51bGwpO1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgJiYgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5OYW1lIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQnV0dG9uICYmIHRoaXMuc2F2ZUJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YUdyaWQpIHtcclxuICAgICAgICBkaXNwbGF5XHJcbiAgICAgICAgICA/IHRoaXMuZGF0YUdyaWQuc2VsZWN0Um93cyhbZGlzcGxheS5JZF0sIGZhbHNlKVxyXG4gICAgICAgICAgOiB0aGlzLmRhdGFHcmlkLmRlc2VsZWN0QWxsKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBbdGhpcy5kaXNwbGF5c1Rvb2xiYXJJdGVtXTtcclxuXHJcbiAgICBpZiAodGhpcy5pbXBvcnRGaWxlT3B0aW9ucyAmJiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLm1vZGUgIT09IENkbUltcG9ydEZpbGVNb2RlLk5vbmUpIHtcclxuICAgICAgbmV3SXRlbXMucHVzaCh0aGlzLmltcG9ydEZpbGVUb29sYmFySXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLCAuLi5uZXdJdGVtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSxcclxuICAgICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXNwbGF5PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRQYW5lbDoge1xyXG4gICAgICAgICAgc2hhZGluZzogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlsdGVySWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnRGF0YSBTZXQnLFxyXG4gICAgICAgICAgICBsb29rdXA6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdWaWV3SWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnVmlldycsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAnY2FsYygxMDAlIC0gNTFweCknIDogJzEwMCUnLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRpc3BsYXlzJyxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKTtcclxuICAgICAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmdldFZpZXdzKCk7XHJcblxyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdGaWx0ZXJJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIGZpbHRlcnMpO1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdWaWV3SWQnLCAnbG9va3VwLmRhdGFTb3VyY2UnLCB2aWV3cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxDbGljazogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLnJvd1R5cGUgIT09ICdkYXRhJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5kYXRhLklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmRlbGV0ZURpc3BsYXkoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpc3BsYXlzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGNvbnN0IGJhc2ljT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIHwgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94LlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIHZhbHVlRXhwcjogJ0lkJyxcclxuICAgICAgZGlzcGxheUV4cHI6ICdOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICB3aWR0aDogMjAwLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5nZXREaXNwbGF5cygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5O1xyXG5cclxuICAgICAgICBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gZGlzcGxheSAmJiBkaXNwbGF5LkZpbHRlcklkICE9PSB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQ7XHJcbiAgICAgICAgY29uc3Qgdmlld0NoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuVmlld0lkICE9PSB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZDtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKGZpbHRlckNoYW5nZWQgfHwgdmlld0NoYW5nZWRcclxuICAgICAgICAgID8gdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKVxyXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJ1ZSkpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlybWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXlJZCA9IGUudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRyb3BEb3duQm94T3B0aW9uczogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgd2lkdGg6IDgwMFxyXG4gICAgICB9LFxyXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICF0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyB2b2lkIDAgOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQgPSB0aGlzLmNyZWF0ZURhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnREaXNwbGF5VGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTtcclxuICAgICAgICB0aGlzLnNhdmVBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19oZWFkZXInKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVBc0J1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdE1vZGUpIHtcclxuICAgICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICB9LFxyXG4gICAgICBvbk9wZW5lZDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uICYmIHRoaXMuc2F2ZUFzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICgnZHhEcm9wRG93bkJveCcgYXMgYW55KSA6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnRGlzcGxheXMnLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy1kaXNwbGF5c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gJC5leHRlbmQoYmFzaWNPcHRpb25zLCBkcm9wRG93bkJveE9wdGlvbnMpIDogYmFzaWNPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBpY29uOiAndXBsb2FkJyxcclxuICAgICAgICBoaW50OiAnSW1wb3J0IGZpbGUnLFxyXG4gICAgICAgIGhlaWdodDogMzAsXHJcbiAgICAgICAgc3R5bGluZ01vZGU6ICd0ZXh0JyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5maWxlSW1wb3J0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyID0gbmV3IEZpbGVJbXBvcnRlcih7XHJcbiAgICAgICAgICAgICRjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCkucGFyZW50KCksXHJcbiAgICAgICAgICAgIHRpdGxlOiAnSW1wb3J0IEZpbGUgdG8gQ0RNJyxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuY3JlYXRlVGFibGVVcmwsXHJcbiAgICAgICAgICAgIGFkZFJvd3NVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuYWRkUm93c1VybCxcclxuICAgICAgICAgICAgZmlsZVVwbG9hZFVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5maWxlVXBsb2FkVXJsLFxyXG4gICAgICAgICAgICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU6IHRoaXMuZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSksXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRUYWJsZTogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5wcmVkZWZpbmVkVGFibGUsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dDogJ1JlcGxhY2UgQWxsIFJvd3MnLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZU1vZGVUZXh0OiAnUmVwbGFjZSBSb3dzJyxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLm9uKEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5ULCAoKSA9PiB0aGlzLm9wdGlvbnMub3duZXIucmVmcmVzaCgpKTtcclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgZS5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IDUsXHJcbiAgICAgICAgICAgIHBhZGRpbmdCb3R0b206IDVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKG1vZGU6IENkbUltcG9ydEZpbGVNb2RlKTogSW1wb3J0RmlsZU1vZGUge1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93cztcclxuXHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuUmVwbGFjZUFsbFJvd3M6XHJcbiAgICAgICAgcmV0dXJuIEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG1vZGUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19jdXJyZW50LWRpc3BsYXkgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5LFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX3NhdmUtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIudXBkYXRlQ3VycmVudERpc3BsYXkoXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDEyNVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlfX3NhdmUtZGlzcGxheS1hcyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcycsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4gKFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2coKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxNjBcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdEaXNwbGF5IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG5hbWVUZXh0Qm94ID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gICAgY29uc3QgdmFsaWRhdG9yID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhWYWxpZGF0b3IoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgbmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgRGlzcGxheScsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3JlYXRlTmV3RGlzcGxheShcclxuICAgICAgICAgICAgbmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGRpc3BsYXlzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaW1wb3J0RmlsZVRvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXkge1xyXG4gIHJlYWRvbmx5IElkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgTmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEZpbHRlcklkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgVmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNNYW5hZ2VyIHtcclxuICBwcml2YXRlIGRpc3BsYXlzOiBJQ29udHJvbERpc3BsYXlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IHtcclxuICAgIGNoYW5nZWQ6IEFycmF5PChkaXNwbGF5OiBJQ29udHJvbERpc3BsYXkpID0+IHZvaWQ+LFxyXG4gICAgbG9hZGVkOiBBcnJheTwoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkPlxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudERpc3BsYXlJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG5cclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IHtcclxuICAgICAgY2hhbmdlZDogW10sXHJcbiAgICAgIGxvYWRlZDogW11cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZERpc3BsYXlzKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVtdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuICAgIHRoaXMub25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREaXNwbGF5cygpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzIHx8IGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGlzcGxheUJ5SWQgPSAoaWQ6IG51bWJlcikgPT4ge1xyXG4gICAgaWYgKCFpZCB8fCAhdGhpcy5kaXNwbGF5cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cy5maW5kKCh2KSA9PiB2LklkID09PSBpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXdWaWV3RHRvID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgTmFtZTogbmFtZSxcclxuICAgICAgRmlsdGVySWQ6IGZpbHRlcklkLFxyXG4gICAgICBWaWV3SWQ6IHZpZXdJZFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmluc2VydERhdGFVcmwsICdQT1NUJywgbmV3Vmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZURpc3BsYXkoaWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBpZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudERpc3BsYXkobmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzcGxheSh0aGlzLmN1cnJlbnREaXNwbGF5LklkLCBuYW1lLCBmaWx0ZXJJZCwgdmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEaXNwbGF5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHtcclxuICAgICAgaWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWRcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmN1cnJlbnREaXNwbGF5KVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGlzcGxhaXNMb2FkZWRQcml2YXRlKCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmxvYWRlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmRpc3BsYXlzKVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERpc3BsYXlJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudERpc3BsYXlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RGlzcGxheUlkID0gaWQ7XHJcbiAgICB0aGlzLm9uRGlzcGxheUNoYW5nZWRQcml2YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheUJ5SWQodGhpcy5fY3VycmVudERpc3BsYXlJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9uRGlzcGxheUNoYW5nZWQoaGFuZGxlcjogKGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNoYW5nZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGFpc0xvYWRlZChoYW5kbGVyOiAoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLnB1c2goaGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zLCBrZXlvZiBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicsIHtcclxuICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzZWxlY3Rpb24nXSk7XHJcbiAgICBncmlkLm9uKCdlZGl0b3JQcmVwYXJpbmcnLCB0aGlzLm9uR3JpZEVkaXRvclByZXBhcmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZEVkaXRvclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25FZGl0b3JQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBpZiAoIWUuY29tcG9uZW50IHx8ICFlLmVkaXRvck9wdGlvbnMgfHwgZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycgfHwgIWUuZGF0YUZpZWxkIHx8ICFlLnJvdyB8fCAhZS5yb3cua2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhRmllbGQgPSBlLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0IGVkaXRvcktleSA9IGUucm93LmtleTtcclxuICAgIGNvbnN0IGRlZmF1bHRMaXN0ZW5lciA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IChldmVudDogeyB2YWx1ZTogYW55IH0pID0+IHtcclxuICAgICAgZGVmYXVsdExpc3RlbmVyKGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlTXVsdGlwbGVSb3dzKGRhdGFGaWVsZCwgZWRpdG9yS2V5LCBldmVudC52YWx1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVNdWx0aXBsZVJvd3M8VD4oZGF0YUZpZWxkOiBzdHJpbmcsIGVkaXRvcktleTogc3RyaW5nLCB2YWx1ZTogVCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dLZXlzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMub3B0aW9ucy5vd25lci5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuICAgIGlmICghc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkUm93S2V5cy5maW5kSW5kZXgoKGspID0+IGsgPT09IGVkaXRvcktleSk7XHJcbiAgICBpZiAoZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA8IDAgfHwgc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLnNwbGljZShlZGl0b3JLZXlTZWxlY3RlZEluZGV4LCAxKTtcclxuICAgIHNlbGVjdGVkUm93S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNlbGxWYWx1ZSh0aGlzLm9wdGlvbnMub3duZXIuZ2V0Um93SW5kZXhCeUtleShrZXkpLCBkYXRhRmllbGQsIHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICByZWFkb25seSBkZWZhdWx0RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICByZWFkb25seSBkZWZhdWx0Vmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8ge1xyXG4gIERlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIERlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbG9hZGVkVXNlclNldHRpbmdzPzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWVtcHR5LWludGVyZmFjZVxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zIHtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBNdXRhYmxlPE9taXQ8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMsIGtleW9mIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJEZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnM7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSB7XHJcbiAgICBkZWZhdWx0RmlsdGVySWQ6IHVuZGVmaW5lZCxcclxuICAgIGRlZmF1bHRWaWV3SWQ6IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZFxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJvdGVjdGVkIF9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBhdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFQU0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3MpIHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB0aGlzLm9wdGlvbnMubG9hZGVkVXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3ModmFsdWU6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncykge1xyXG4gICAgdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gdmFsdWU7XHJcbiAgICB0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgaWYgKCF0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWRVc2VyU2V0dGluZ3MoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3ModXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy51cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+O1xyXG5cclxuICBwcm90ZWN0ZWQgc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gdHJ1ZTtcclxuICAgIH0sIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0b3BBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgdXNlclNldHRpbmdzU3RvcmFnZUtleSA9ICdhcHM6Y29udHJvbC1kaXNwbGF5OnVzZXItc2V0dGluZ3MnO1xyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgcmF3VXNlclNldHRpbmdzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSk7XHJcbiAgICBpZiAoIXJhd1VzZXJTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzID0gSlNPTi5wYXJzZShyYXdVc2VyU2V0dGluZ3MpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodXBkYXRlZFVzZXJTZXR0aW5ncykpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMge1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMgJiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIGV4dGVuZHMgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3NEdG8gPyB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1c2VyU2V0dGluZ3NEdG8pIDogdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5ncyA9IHsgLi4uY3VycmVudFVzZXJTZXR0aW5ncywgLi4udXBkYXRlcyB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KFxyXG4gICAgICB0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLFxyXG4gICAgICB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byh1cGRhdGVkVXNlclNldHRpbmdzKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwodXBkYXRlZFVzZXJTZXR0aW5nc0R0byk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKG1vZGVsOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgRGVmYXVsdEZpbHRlcklkOiBtb2RlbC5kZWZhdWx0RmlsdGVySWQsXHJcbiAgICAgIERlZmF1bHRWaWV3SWQ6IG1vZGVsLmRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvKTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRlZmF1bHRGaWx0ZXJJZDogZHRvLkRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgZGVmYXVsdFZpZXdJZDogZHRvLkRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zOiBBcnJheTx7IHZpc2libGVJbmRleDogbnVtYmVyLCB2aXNpYmxlOiBib29sZWFuLCBkYXRhRmllbGQ6IHN0cmluZyB9PiB8XHJcbiAgUmVhZG9ubHlBcnJheTxQaWNrPERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgJ3Zpc2libGVJbmRleCcgfCAndmlzaWJsZScgfCAnZGF0YUZpZWxkJz4+KSB7XHJcbiAgbGV0IGNvbHVtbkZvclN1bW1hcnkgPSAnJztcclxuXHJcbiAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcclxuICBjb25zdCBjb2x1bW5zV2l0aEluZGV4ID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAhPT0gbnVsbCAmJiBjLnZpc2libGVJbmRleCAhPT0gdm9pZCAwKTtcclxuXHJcbiAgaWYgKCEhY29sdW1uc1dpdGhJbmRleC5sZW5ndGgpIHtcclxuICAgIGNvbHVtbkZvclN1bW1hcnkgPSBjb2x1bW5zV2l0aEluZGV4LnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpWzBdLmRhdGFGaWVsZDtcclxuICB9IGVsc2Uge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9ICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNvbHVtbkZvclN1bW1hcnk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQsIElGaWxlSW1wb3J0ZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciwgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciwgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gfSBmcm9tICcuL011bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luJztcclxuaW1wb3J0IHsgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLCBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcic7XHJcbmltcG9ydCB7IERpc3BsYXlUeXBlLCBJRGlzcGxheVR5cGVTZXR0aW5ncywgSUljb25zQ29sdW1uRWRpdG9ySXRlbSB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmltcG9ydCB7IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSwgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGdldFN1bW1hcnlDb2x1bW4gfSBmcm9tICcuL0dyaWRTdW1tYXJ5SGVscGVyJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24ge1xyXG4gIFBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBUeXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ29iamVjdCcgfCAnZGF0ZScgfCAnZGF0ZXRpbWUnO1xyXG4gIExhYmVsOiBzdHJpbmc7XHJcbiAgT3JkZXI6IG51bWJlcjtcclxuICBUb29sVGlwOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0Vmlld0ZpZWxkOiBib29sZWFuO1xyXG4gIElzS2V5Q29sdW1uOiBib29sZWFuO1xyXG4gIEdyb3VwRmllbGQ6IHN0cmluZztcclxuICBEaXNwbGF5VHlwZTogc3RyaW5nO1xyXG4gIFdpZHRoPzogbnVtYmVyO1xyXG4gIEhpZGluZ09yZGVyPzogbnVtYmVyO1xyXG4gIENvbHVtbnM/OiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2Uge1xyXG4gIEZpZWxkc0NvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZVZpZXdzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZURpc3BsYXlzOiBib29sZWFuO1xyXG4gIENhbkFwcGxheURpc3BsYXlzOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogb2ZmICovXHJcbi8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXHJcbmNvbnN0IGVudW0gQ29udHJvbFJvbGVQZXJtaXNzaW9ucyB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgUmVhZCA9IDEgPDwgMCxcclxuICBDcmVhdGUgPSAxIDw8IDEsXHJcbiAgVXBkYXRlID0gMSA8PCAyLFxyXG4gIERlbGV0ZSA9IDEgPDwgMyxcclxufVxyXG4vKiB0c2xpbnQ6ZW5hYmxlOiBuby1iaXR3aXNlICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGV4cG9ydEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgY29udHJvbExvZ3NVcmw6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbERpc3BsYXkge1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG1haW5HcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudDogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQ6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50OiBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luOiBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICAgIHRoaXMuZXhwb3J0RmlsZU5hbWUgPSBvcHRpb25zLmV4cG9ydEZpbGVOYW1lO1xyXG4gICAgdGhpcy51c2VyTmFtZSA9IG9wdGlvbnMudXNlck5hbWU7XHJcbiAgICB0aGlzLnVzZXJDb25maWdVcmwgPSBvcHRpb25zLnVzZXJDb25maWdVcmw7XHJcbiAgICB0aGlzLmNvbnRyb2xMb2dzVXJsID0gb3B0aW9ucy5jb250cm9sTG9nc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMgPSBvcHRpb25zLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKFsnYXBzLWdyaWQnLCAnY29udHJvbC1kaXNwbGF5LWdyaWQnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgc2VuZFJlcXVlc3Q8SVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2U+KHRoaXMudXNlckNvbmZpZ1VybClcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyaWRGaWx0ZXJzTWFuYWdlciA9IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIodGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkVmlld3NNYW5hZ2VyID0gbmV3IEdyaWRWaWV3c01hbmFnZXIodGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZ3JpZERpc3BsYXlzTWFuYWdlciA9IG5ldyBHcmlkRGlzcGxheXNNYW5hZ2VyKHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLm1haW5HcmlkID0gdGhpcy5jcmVhdGVNYWluR3JpZChyZXMuRmllbGRzQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbkNyZWF0ZURpc3BsYXlzID0gcmVzLkNhbkNyZWF0ZURpc3BsYXlzICYmIHJlcy5DYW5DcmVhdGVWaWV3cyAmJiByZXMuQ2FuQ3JlYXRlRmlsdGVycztcclxuXHJcbiAgICAgICAgaWYgKGNhbkNyZWF0ZURpc3BsYXlzIHx8IHJlcy5DYW5BcHBsYXlEaXNwbGF5cykge1xyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgICAgZWRpdE1vZGU6IGNhbkNyZWF0ZURpc3BsYXlzLFxyXG4gICAgICAgICAgICBncmlkRmlsdGVyc01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGltcG9ydEZpbGVPcHRpb25zOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgb25WaWV3QXBwbGllZDogdGhpcy5vblZpZXdBcHBsaWVkLFxyXG4gICAgICAgICAgb25WaWV3RGVsZXRlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICBjYW5DcmVhdGVHbG9iYWxWaWV3czogcmVzLkNhbkNyZWF0ZUdsb2JhbFZpZXdzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZVZpZXdzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICBhcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI6IG5ldyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlck5hbWUsXHJcbiAgICAgICAgICAgIGxvYWREYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLmxvYWREYXRhVXJsLFxyXG4gICAgICAgICAgICB1cGRhdGVEYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLnVwZGF0ZURhdGFVcmxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvbkZpbHRlckRlbGV0ZWQ6IGFzeW5jIChmaWx0ZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IHJlcy5DYW5DcmVhdGVHbG9iYWxGaWx0ZXJzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZUZpbHRlcnNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiA9IG5ldyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbih7XHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSBhc3luYyAoZGlzcGxheSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRpc3BsYXkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIoZGlzcGxheS5GaWx0ZXJJZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5hcHBseVZpZXcoZGlzcGxheS5WaWV3SWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIodm9pZCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuICBwcml2YXRlIGhhc1Blcm1pc3NvbihydWxlcywgcGVybWlzc29uKSB7XHJcbiAgICByZXR1cm4gcnVsZXMgJiBwZXJtaXNzb247XHJcbiAgfVxyXG4gIC8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFRyZWUoY29sdW1ucykge1xyXG4gICAgY29uc3QgZ3JvdXBQcmVmaXggPSAnX19HUk9VUF9fJztcclxuXHJcbiAgICBsZXQgY29sdW1uc01hcCA9IGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xyXG4gICAgICBjb2x1bW4uQ29sdW1ucyA9IFtdO1xyXG4gICAgICBjb2x1bW4uR3JvdXBGaWVsZCA9IGNvbHVtbi5Hcm91cEZpZWxkXHJcbiAgICAgICAgPyBgJHtncm91cFByZWZpeH0ke2NvbHVtbi5Hcm91cEZpZWxkfWBcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIGFjY1tjb2x1bW4uTmFtZV0gPSBjb2x1bW47XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30pO1xyXG5cclxuICAgIGNvbHVtbnNNYXAgPSBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIC5yZWR1Y2UoKGFjYywgZ3JvdXBGaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBncm91cEZpZWxkLnJlcGxhY2UoZ3JvdXBQcmVmaXgsICcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSB7XHJcbiAgICAgICAgICBOYW1lOiBncm91cEZpZWxkLFxyXG4gICAgICAgICAgTGFiZWw6IGNvbHVtbk5hbWUsXHJcbiAgICAgICAgICBDb2x1bW5zOiBbXSxcclxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlOiBtYXgtbGluZS1sZW5ndGggKi9cclxuICAgICAgICAgIEdyb3VwRmllbGQ6IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0gJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICYmIGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZCAhPT0gZ3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA/IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBhY2NbZ3JvdXBGaWVsZF0gPSBncm91cENvbHVtbjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgfSwgY29sdW1uc01hcCk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIGluIGNvbHVtbnNNYXApIHtcclxuICAgICAgaWYgKGNvbHVtbnNNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uTmFtZSkpIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLkdyb3VwRmllbGQpIHtcclxuICAgICAgICAgIGNvbHVtbnNNYXBbY29sdW1uLkdyb3VwRmllbGRdLkNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRpc3BsYXlUeXBlKHNldHRpbmdzOiBJRGlzcGxheVR5cGVTZXR0aW5ncywgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sIHBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zKSB7XHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuSWNvbnMpIHtcclxuICAgICAgY29sdW1uLmNlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyhvcHRpb25zLnZhbHVlKTtcclxuICAgICAgICBjb25zdCBjZWxsU2V0dGluZ3MgPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IFN0cmluZyhpdGVtLnZhbHVlKSA9PT0gc3RyaW5nVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbFNldHRpbmdzKSB7XHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGNlbGxTZXR0aW5ncy50aXRsZSlcclxuICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsU2V0dGluZ3MuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLnRleHQob3B0aW9ucy52YWx1ZSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiAndGl0bGUnLFxyXG4gICAgICAgICAgaXRlbVRlbXBsYXRlOiAoZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBkYXRhLnRpdGxlKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogZGF0YS5pbWFnZSB9KSlcclxuICAgICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgZmllbGRUZW1wbGF0ZTogKGRhdGEsIGVsKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCAkaXRlbU5hbWUgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2l0ZW0tbmFtZScpO1xyXG4gICAgICAgICAgICBjb25zdCAkcmVzdWx0ID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtaWNvbi1lZGl0b3JfX2N1c3RvbS1pdGVtJylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0uaW1hZ2UgOiAnJyB9KS5hdHRyKCd0aXRsZScsIGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0udGl0bGUgOiAnJykpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkaXRlbU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgJGl0ZW1OYW1lXHJcbiAgICAgICAgICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXHJcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZWwuYXBwZW5kKCRyZXN1bHQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUocGFyc2VJbnQodmFsdWUudmFsdWUpKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogKGNlbGxJbmZvLnZhbHVlICE9PSBudWxsICYmIGNlbGxJbmZvICE9PSB2b2lkIDApICYmIGNlbGxJbmZvLnZhbHVlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gcGFyc2VJbnQoaXRlbS52YWx1ZSkgPT09IGNlbGxJbmZvLnZhbHVlKVxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uYWxsb3dTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93RmlsdGVyaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0hlYWRlckZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0dyb3VwaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMpIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLm1hcCgoaSkgPT4gaS52YWx1ZSkuc29ydCgpLFxyXG4gICAgICAgICAgYWNjZXB0Q3VzdG9tVmFsdWU6IHRydWUsXHJcbiAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUsIGNvbXBvbmVudCB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKHZhbHVlIHx8ICcnKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uKSB7XHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhDaGVja0JveCh7XHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUgfHwgZmFsc2UsXHJcbiAgICAgICAgICByZWFkT25seTogIXRoaXMuaGFzUGVybWlzc29uKHBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNlbGxWYWx1ZShjZWxsSW5mby5yb3dJbmRleCwgY2VsbEluZm8uY29sdW1uLmRhdGFGaWVsZCwgZS52YWx1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbHVtbihjb2x1bW5Db25maWc6IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIHtcclxuICAgIGNvbnN0IHRpdGxlID0gY29sdW1uQ29uZmlnLkxhYmVsIHx8IGNvbHVtbkNvbmZpZy5OYW1lO1xyXG4gICAgY29uc3QgdG9vbHRpcCA9IGNvbHVtbkNvbmZpZy5Ub29sVGlwIHx8IHRpdGxlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uID0gIWNvbHVtbkNvbmZpZy5Db2x1bW5zLmxlbmd0aFxyXG4gICAgICA/IHtcclxuICAgICAgICBkYXRhRmllbGQ6IGNvbHVtbkNvbmZpZy5OYW1lLFxyXG4gICAgICAgIGRhdGFUeXBlOiBjb2x1bW5Db25maWcuVHlwZSxcclxuICAgICAgICBjYXB0aW9uOiB0aXRsZSxcclxuICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0aXRsZSwgdG9vbHRpcCksXHJcbiAgICAgICAgdmlzaWJsZTogY29sdW1uQ29uZmlnLklzRGVmYXVsdFZpZXdGaWVsZCxcclxuICAgICAgICB2aXNpYmxlSW5kZXg6IGNvbHVtbkNvbmZpZy5PcmRlcixcclxuICAgICAgICBhbGxvd0ZpeGluZzogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiAhIXRoaXMuaGFzUGVybWlzc29uKGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpLFxyXG4gICAgICAgIHdpZHRoOiBjb2x1bW5Db25maWcuV2lkdGgsXHJcbiAgICAgICAgaGlkaW5nUHJpb3JpdHk6IGNvbHVtbkNvbmZpZy5IaWRpbmdPcmRlclxyXG4gICAgICB9IDoge1xyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbkNvbmZpZy5Db2x1bW5zLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpXHJcbiAgICAgIH07XHJcblxyXG4gICAgaWYgKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSkge1xyXG4gICAgICBjb25zdCBkaXNwbGF5U2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzID0gSlNPTi5wYXJzZShjb2x1bW5Db25maWcuRGlzcGxheVR5cGUpO1xyXG5cclxuICAgICAgaWYgKGRpc3BsYXlTZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZGlzcGxheVNldHRpbmdzLmRhdGEubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgdGV4dDogaXRlbS50aXRsZSxcclxuICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpdGVtcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICAgICAgdGV4dDogJ0JsYW5rJyxcclxuICAgICAgICAgIHZhbHVlOiBudWxsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIChjb2x1bW4gYXMgYW55KS5oZWFkZXJGaWx0ZXIgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBpdGVtc1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheVR5cGUoZGlzcGxheVNldHRpbmdzLCBjb2x1bW4sIGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5maWx0ZXIoXHJcbiAgICAgIChjKSA9PiB0aGlzLmhhc1Blcm1pc3NvbihjLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlJlYWQpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbmZpZ3VyYXRpb24gPSB0aGlzLmJ1aWxkVHJlZShjb25maWd1cmF0aW9uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb25maWd1cmF0aW9uLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZChjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25zdCBoYXNLZXlzID0gY29uZmlndXJhdGlvbi5zb21lKChjKSA9PiBjLklzS2V5Q29sdW1uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbmZpZ3VyZUNvbHVtbnMoY29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgY29uc3QgY29sdW1uRm9yU3VtbWFyeSA9IGdldFN1bW1hcnlDb2x1bW4oY29sdW1ucyk7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbiksXHJcbiAgICAgIGNvbHVtblJlc2l6aW5nTW9kZTogJ3dpZGdldCcsXHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiBoYXNLZXlzLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAnYmF0Y2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAndmlydHVhbCcsIHByZWxvYWRFbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGhlaWdodDogdGhpcy5pc1N0YW5kYWxvbmVQYWdlID8gdW5kZWZpbmVkIDogJzEwMCUnLFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnZHJhZ0FuZERyb3AnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbkZpeGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICBjcmVhdGVGaWx0ZXI6ICdOb25lJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHN1bW1hcnk6IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbeyBzdW1tYXJ5VHlwZTogJ2NvdW50JywgY29sdW1uOiBjb2x1bW5Gb3JTdW1tYXJ5IH1dXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIGNvbHVtbkhpZGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1ucyxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBtYXN0ZXJEZXRhaWw6ICFoYXNLZXlzID8gdW5kZWZpbmVkIDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdGVtcGxhdGU6IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSB7fTtcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5mb3JFYWNoKChjKSA9PiBrZXlzW2MuTmFtZV0gPSBvcHRpb25zLmRhdGFbYy5OYW1lXSk7XHJcblxyXG4gICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgICAgICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgICAgICAgIGxvYWRVcmw6IGAke3RoaXMuY29udHJvbExvZ3NVcmx9P2tleT0ke0pTT04uc3RyaW5naWZ5KGtleXMpfWAsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgY29sdW1uczogW3tcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXInLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NyZWF0ZWRBdCcsXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uOiAnRGF0ZScsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnc2hvcnREYXRlU2hvcnRUaW1lJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDBcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGMsIG8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG8uZGF0YS5DaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGA8ZGl2IGNsYXNzPSdhcHMtY29udHJvbC1sb2cnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fZmllbGQnPiR7aXRlbS5GaWVsZH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19vbGQtdmFsdWUnPiR7aXRlbS5PbGRWYWx1ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX25ldy12YWx1ZSc+JHtpdGVtLk5ld1ZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZ3MnPiR7Y29udGVudH08L2Rpdj5gKS5hcHBlbmRUbyhjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJlcGFyZUZpbHRlclBhbmVsKGUuY29tcG9uZW50KTtcclxuICAgICAgfSxcclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSAhPT0gJ2RhdGFSb3cnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZmluZCgoYykgPT4gYy5OYW1lID09PSBlLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgIGlmICghZmllbGRDb25maWcpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc2FibGVFZGl0aW5nID0gIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSk7XHJcblxyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucy5yZWFkT25seSA9IGRpc2FibGVFZGl0aW5nO1xyXG5cclxuICAgICAgICBpZiAoIWRpc2FibGVFZGl0aW5nICYmIGZpZWxkQ29uZmlnLlR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlU2V0VmFsdWUgPSBlLnNldFZhbHVlO1xyXG5cclxuICAgICAgICAgIChlIGFzIGFueSkuc2V0VmFsdWUgPSAobmV3VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBiYXNlU2V0VmFsdWUobmV3VmFsdWUudHJpbSgpKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuY29sdW1uLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkQ29uZmlnICYmICF0aGlzLmhhc1Blcm1pc3NvbihmaWVsZENvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpKSB7XHJcbiAgICAgICAgICAgICQoZS5jZWxsRWxlbWVudCkuYWRkQ2xhc3MoJ2Fwcy1ncmlkX19kaXNhYmxlZC1jZWxsJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblJvd0V4cGFuZGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbFJvd0luZGV4ID0gZS5jb21wb25lbnQuZ2V0Um93SW5kZXhCeUtleShlLmtleSkgKyAxO1xyXG4gICAgICAgIGNvbnN0ICRkZXRhaWxDZWxsID0gZS5jb21wb25lbnQuZ2V0Q2VsbEVsZW1lbnQoZGV0YWlsUm93SW5kZXgsIDApLnBhcmVudCgpLmZpbmQoJy5keC1tYXN0ZXItZGV0YWlsLWNlbGwnKTtcclxuICAgICAgICBjb25zdCBkYXRhR3JpZCA9ICRkZXRhaWxDZWxsLmZpbmQoJy5keC1kYXRhZ3JpZCcpLmZpcnN0KCkucGFyZW50KCkuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZGF0YUdyaWQucmVmcmVzaCgpO1xyXG4gICAgICB9LFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc1N0YW5kYWxvbmVQYWdlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IHRydWUsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgIGRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uOiB0cnVlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAga2V5OiBjb25maWd1cmF0aW9uLmZpbHRlcigoYykgPT4gYy5Jc0tleUNvbHVtbikubWFwKChjKSA9PiBjLk5hbWUpLFxyXG4gICAgICAgIGxvYWRVcmw6IHRoaXMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHRoaXMuY2xlYXJGaWx0ZXJSb3dBZnRlclZpZXdTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUZpbHRlclBhbmVsKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgJGZpbHRlclBhbmVsRWxlbWVudCA9IGdyaWQuZWxlbWVudCgpXHJcbiAgICAgIC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsJyk7XHJcbiAgICBjb25zdCAkZmlsdGVySWNvbkZpbHRlciA9ICRmaWx0ZXJQYW5lbEVsZW1lbnQuZmluZCgnLmR4LWljb24tZmlsdGVyJyk7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxUZXh0ID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsLXRleHQnKTtcclxuXHJcbiAgICAkZmlsdGVySWNvbkZpbHRlci5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkZmlsdGVyUGFuZWxUZXh0Lm9mZignY2xpY2snKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFJvd3NDb3VudFN1bW1hcnkoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBmaXJzdFZpc2libGVEYXRhQ29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmQoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgaWYgKCFmaXJzdFZpc2libGVEYXRhQ29sdW1uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5TmFtZSA9ICdSb3dzQ291bnQnO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IHRvdGFsSXRlbXM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXSA9IChncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddICkgfHwgW107XHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5SXRlbSA9IHRvdGFsSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtLm5hbWUgPT09IHJvd3NDb3VudFN1bW1hcnlOYW1lKTtcclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSAmJiByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPT09IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm93c0NvdW50U3VtbWFyeUl0ZW0pIHtcclxuICAgICAgcm93c0NvdW50U3VtbWFyeUl0ZW0uY29sdW1uID0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHJvd3NDb3VudFN1bW1hcnlOYW1lLFxyXG4gICAgICAgIGNvbHVtbjogZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQsXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCcsXHJcbiAgICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFpbkdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnLCB0b3RhbEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8vIE5PVEU6IFdvcmthcm91bmQuIFRoZSBncmlkIGNhbid0IGNsZWFyIHRoZSBmaWx0ZXIgcm93LCBzbyB3ZSBjbGVhciB0aGF0IG1hbnVhbGx5XHJcbiAgcHJpdmF0ZSBjbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGNsZWFySGVhZGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzOiB7IFt2aXNpYmxlSW5kZXg6IG51bWJlcl06IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB9ID0ge307XHJcblxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIHx8IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgIGNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAmJiAoYy5maWx0ZXJWYWx1ZSB8fCBjLmZpbHRlclZhbHVlcykpXHJcbiAgICAgICAgLmZvckVhY2goKGMpID0+IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbYy52aXNpYmxlSW5kZXhdID0gYyk7XHJcblxyXG4gICAgICAkKCd0ZCBbYXJpYS1sYWJlbCo9XCJGaWx0ZXIgY2VsbFwiXScpXHJcbiAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+ICFjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzW2luZGV4XSlcclxuICAgICAgICAudmFsKCcnKTtcclxuICAgICAgdGhpcy5tYWluR3JpZC5vZmYoJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICAgIH07XHJcbiAgICB0aGlzLm1haW5HcmlkLm9uKCdjb250ZW50UmVhZHknLCBjbGVhckhlYWRlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHREYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5cclxuaW50ZXJmYWNlIElBcHBVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJRGlzcGxheSB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnQge1xyXG4gIERpc3BsYXlJZDogbnVtYmVyO1xyXG4gIFVzZXJJZDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRDb2x1bW4ge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgQ2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhIHtcclxuICBVc2VyczogSUFwcFVzZXJbXTtcclxuICBEaXNwbGF5czogSURpc3BsYXlbXTtcclxuICBBc3NpZ25tZW50czogSUNvbnRyb2xEaXNwbGF5c1VzZXJBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEaXNwbGF5TWFuYWdlciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBsZXQgY29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGxvYWREYXRhUHJvbWlzZSA9IHNlbmRSZXF1ZXN0PElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YT4odGhpcy5sb2FkRGF0YVVybCwgJ2dldCcpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBjb2x1bW5zID0gcmVzLkRpc3BsYXlzLm1hcCgoZCkgPT4gKHsgSWQ6IGQuSWQudG9TdHJpbmcoKSwgQ2FwdGlvbjogZC5OYW1lIH0pKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgcmVzLlVzZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0geyBVc2VyTmFtZTogdXNlci5Vc2VyTmFtZSwgVXNlcklkOiB1c2VyLklkIH07XHJcbiAgICAgICAgICBjb25zdCB1c2VyQXNzaWdubWVudHMgPSByZXMuQXNzaWdubWVudHMuZmlsdGVyKChhKSA9PiBhLlVzZXJJZCA9PT0gdXNlci5JZCk7XHJcblxyXG4gICAgICAgICAgdXNlckFzc2lnbm1lbnRzLmZvckVhY2goKGFzc2lnbm1lbnQpID0+IHtcclxuICAgICAgICAgICAgaXRlbVthc3NpZ25tZW50LkRpc3BsYXlJZF0gPSB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgZGF0YS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJOYW1lJywgd2lkdGg6IDMwMCwgZml4ZWQ6IHRydWUsIGZpeGVkUG9zaXRpb246ICdsZWZ0JywgYWxsb3dFZGl0aW5nOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdVc2VySWQnLCB2aXNpYmxlOiBmYWxzZSB9XHJcbiAgICAgICAgXSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuQ29sdW1uW107XHJcblxyXG4gICAgICAgIGdyaWQub3B0aW9uKCdjb2x1bW5zJywgZ3JpZENvbHVtbnMuY29uY2F0KGNvbHVtbnMubWFwKChjb2wpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogY29sLklkLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2wuQ2FwdGlvbixcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgY2FsY3VsYXRlQ2VsbFZhbHVlOiAocm93RGF0YSkgPT4gISFyb3dEYXRhW2NvbC5JZF1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdhcHMtZGlzcGxheS1tYW5hZ2VyJ30sXHJcbiAgICAgIGRhdGFTb3VyY2U6IHtcclxuICAgICAgICBzdG9yZTogbmV3IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICBrZXk6ICdVc2VySWQnLFxyXG4gICAgICAgICAgbG9hZE1vZGU6ICdyYXcnLFxyXG4gICAgICAgICAgbG9hZDogKCkgPT4gbG9hZERhdGFQcm9taXNlLFxyXG4gICAgICAgICAgdXBkYXRlOiAoa2V5LCB2YWx1ZXM6IHsgW2Rpc3BsYXlJZDogbnVtYmVyXTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0b0FkZDogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdGhlcmVJc0N1cnJlbnRVcGRhdGluZyA9IHVwZGF0aW5nSXNJblByb2dyZXNzO1xyXG5cclxuICAgICAgICAgICAgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUlkcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XHJcblxyXG4gICAgICAgICAgICBkaXNwbGF5SWRzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2gocGFyc2VJbnQoaWQpKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBOT1RFOiBub3RpZnkgYWJvdXQgc3VjY2Vzc2Z1bCByZXF1ZXN0IG9ubHkgZm9yIHRoZSBmaXJzdCByZXF1ZXN0IGluIHRoZSBxdWV1ZVxyXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7IH0sIDApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ3B1dCcsIHtcclxuICAgICAgICAgICAgICB1c2VySWQ6IGtleSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvUmVtb3ZlOiB0b1JlbW92ZSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvQWRkOiB0b0FkZFxyXG4gICAgICAgICAgICB9LCAhdGhlcmVJc0N1cnJlbnRVcGRhdGluZykucHJvbWlzZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBjb250ZXh0TWVudUVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH1cclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXM7XHJcblxyXG4gICAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiAnRGlzcGxheU1hbmFnZW1lbnQnLFxyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnVXNlck5hbWUnXHJcbiAgICB9IGFzIElHcmlkQWRkaXRpb25hbE9wdGlvbnM7XHJcblxyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBpbmdSZXN1bHQge1xyXG4gIGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucyB7XHJcbiAgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xyXG4gIGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBsb2dvdXRVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RpZmllciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5RHVyYXRpb25NczogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ291dFVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHdhdGluZ1RpbWVvdXRJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgY291bnRlckludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHBpbmdJbnRlcnZhbElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBleHBpcmF0aW9uVGltZTogRGF0ZTtcclxuICBwcml2YXRlICR0ZXh0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSBjb250aW51ZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSBva0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIGxvZ291dEJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuXHJcbiAgcHJpdmF0ZSBfcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBwcml2YXRlIGdldCBwb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgaWYgKCF0aGlzLl9wb3B1cCkge1xyXG4gICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuY3JlYXRlUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fcG9wdXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zID0gb3B0aW9ucy5zZXNzaW9uRXhwaXJlVGltZU1zO1xyXG4gICAgdGhpcy5kaXNwbGF5RHVyYXRpb25NcyA9IG9wdGlvbnMuZGlzcGxheUR1cmF0aW9uTXM7XHJcbiAgICB0aGlzLnNlc3Npb25QaW5nVXJsID0gb3B0aW9ucy5zZXNzaW9uUGluZ1VybDtcclxuICAgIHRoaXMubG9nb3V0VXJsID0gb3B0aW9ucy5sb2dvdXRVcmw7XHJcblxyXG4gICAgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUgPSB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy5wb3B1cD8uaGlkZSgpO1xyXG5cclxuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSB0aGlzLmdldEV4cGlyYXRpb25UaW1lKCk7XHJcblxyXG4gICAgdGhpcy53YXRpbmdUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgfSwgTWF0aC5tYXgodGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zIC0gdGhpcy5kaXNwbGF5RHVyYXRpb25NcywgMCkpO1xyXG5cclxuICAgIHRoaXMucGluZ0ludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpO1xyXG4gICAgfSwgNjAgKiAxMDAwKTtcclxuXHJcbiAgICAkKGRvY3VtZW50KS5vbigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dOb3RpZmljYXRpb24oKSB7XHJcbiAgICB0aGlzLnBvcHVwPy5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuY291bnRlckludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKSB7XHJcbiAgICBpZiAodGhpcy53YXRpbmdUaW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2F0aW5nVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudGVySW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG4gICAgfVxyXG5cclxuICAgICQoZG9jdW1lbnQpLm9mZigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RXhwaXJhdGlvblRpbWUoKTogRGF0ZSB7XHJcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBleHBpcmF0aW9uVGltZS5zZXRNaWxsaXNlY29uZHMoZXhwaXJhdGlvblRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgKyB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMpO1xyXG5cclxuICAgIHJldHVybiBleHBpcmF0aW9uVGltZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhQb3B1cCh7XHJcbiAgICAgIHRpdGxlOiAnU2Vzc2lvbiBFeHBpcmluZycsXHJcbiAgICAgIGhpZGVPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IGZhbHNlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIG1heEhlaWdodDogMTkwLFxyXG4gICAgICBtYXhXaWR0aDogMzcwLFxyXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgY29udGVudFRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy4kdGV4dENvbnRhaW5lciA9ICQoJzxzcGFuIC8+Jyk7XHJcbiAgICAgICAgdGhpcy4kdGV4dENvbnRhaW5lci5hcHBlbmQodGhpcy5nZXRDb3VudGVyVGV4dCgpKTtcclxuICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFwcGVuZCh0aGlzLiR0ZXh0Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgIH0sXHJcbiAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHRleHQ6ICdDb250aW51ZSBzZXNzaW9uJyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmNvbnRpbnVlckJ1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZXNzaW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgfSwge1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgdGV4dDogJ1JlbG9hZCBwYWdlJyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLm9rQnV0dG9uID0gZS5jb21wb25lbnQsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHRleHQ6ICdMb2cgT3V0JyxcclxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmxvZ291dEJ1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ091dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICB9KS5hcHBlbmRUbygkKGRvY3VtZW50LmJvZHkpKS5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb3VudGVyVGV4dCgpOiBKUXVlcnkge1xyXG4gICAgY29uc3QgcmVtYWluZWRTZWNvbmRzID0gTWF0aC5tYXgodGhpcy5nZXRTZWNvbmRzVG9FeHBpcmF0aW9uKCksIDApO1xyXG4gICAgaWYgKHJlbWFpbmVkU2Vjb25kcyA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS50ZXh0KCdZb3VyIHNlc3Npb24gaGFzIGJlZW4gZXhwaXJlZCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgJHN0YXJ0VGV4dCA9ICQoJzxzcGFuIC8+JykudGV4dCgnWW91ciBzZXNzaW9uIHdpbGwgZXhwaXJlIGluICcpO1xyXG4gICAgICBjb25zdCAkY291bnRlciA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3Nlc3Npb24tbm90aWZpZXJfX2NvdW50ZXInKS50ZXh0KHJlbWFpbmVkU2Vjb25kcy50b0ZpeGVkKDApKTtcclxuICAgICAgY29uc3QgJGZpbmlzaFRleHQgPSAkKCc8c3BhbiAvPicpLnRleHQoJyBzZWNvbmRzJyk7XHJcblxyXG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS5hcHBlbmQoJHN0YXJ0VGV4dCwgJGNvdW50ZXIsICRmaW5pc2hUZXh0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh0aGlzLmV4cGlyYXRpb25UaW1lLmdldFRpbWUoKSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpKSAvIDEwMDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hTZXNzaW9uKCkge1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG5cclxuICAgIHNlbmRSZXF1ZXN0PElQaW5nUmVzdWx0Pih0aGlzLnNlc3Npb25QaW5nVXJsLCAnR0VUJywgbnVsbCwgZmFsc2UsIHsgbm90aWZ5RXJyb3I6IGZhbHNlIH0pLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpIHtcclxuICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRSZXF1ZXN0PElQaW5nUmVzdWx0Pih0aGlzLnNlc3Npb25QaW5nVXJsLCAnR0VUJywgbnVsbCwgZmFsc2UsIHsgbm90aWZ5RXJyb3I6IGZhbHNlIH0pLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgICB0aGlzLnNldEV4cGlyZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEV4cGlyZWQoKSB7XHJcbiAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMucGluZ0ludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBpbmdJbnRlcnZhbElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9nT3V0KCkge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmxvZ291dFVybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUG9wdXBDb250ZW50KCkge1xyXG4gICAgY29uc3QgaXNBbHJlYWR5RXhwaXJlZCA9IHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpIDw9IDA7XHJcblxyXG4gICAgdGhpcy4kdGV4dENvbnRhaW5lcj8uaHRtbCgnJykuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XHJcbiAgICB0aGlzLm9rQnV0dG9uLm9wdGlvbigndmlzaWJsZScsIGlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gICAgdGhpcy5jb250aW51ZXJCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgIWlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gICAgdGhpcy5sb2dvdXRCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgIWlzQWxyZWFkeUV4cGlyZWQpO1xyXG4gIH1cclxufVxyXG4iLCAiY29uc3QgR1JJRF9JTkRJQ0FUT1JfU1RBVEUgPSB7XHJcbiAgZWRpdDogJ2VkaXQnLFxyXG4gIHNhdmluZzogJ3NhdmluZycsXHJcbiAgc2F2ZWQ6ICdzYXZlZCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdSSURfSU5ESUNBVE9SX1NUQVRFO1xyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWREYXRhTGF5ZXIgfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHsgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUsIElHcmlkU3RhdGUsIElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZSwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL0luZGV4JztcclxuXHJcbmludGVyZmFjZSBJTG9hZGVkQ29sdW1ucyB7IFtkYXRhRmllbGQ6IHN0cmluZ106IGJvb2xlYW47IH1cclxuaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzIHsgW2RhdGFGaWVsZDogc3RyaW5nXTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGU7IH1cclxuaW50ZXJmYWNlIElDb2x1bW5XaWR0aHMgeyBbdmlzaWJsZUluZGV4OiBudW1iZXJdOiBudW1iZXIgfCBzdHJpbmc7IH1cclxuXHJcbmludGVyZmFjZSBJQ29sdW1uQ2FwdGlvbiB7XHJcbiAgZGF0YUZpZWxkOiBzdHJpbmc7XHJcbiAgY2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmlkU3RhdGVNYW5hZ2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgT1VUREFURV9DT0xVTU5TX0ZPVU5EX0VWRU5UID0gJ291dGRhdGVkLWNvbHVtbnMtZm91bmQtZXZlbnQnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG5cclxuICBwcml2YXRlIHN0YXRlTG9hZGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsb2FkZWRDb2x1bW5zOiBJTG9hZGVkQ29sdW1ucyA9IHt9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0Q29sdW1uU2V0dGluZ3NTdHI6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoZ3JpZElkOiBudW1iZXIsIGdyaWREYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuaWQgPSBncmlkSWQ7XHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIgPSBncmlkRGF0YUxheWVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWQoY2hlY2tPdXRkYXRlZENvbHVtbnM6IGJvb2xlYW4sIG91dGRhdGVkQ29sdW1uc0NhbGxiYWNrOiAoY29sdW1ucykgPT4gdm9pZCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5nZXRHcmlkVmlld1NldHRpbmdzKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhOiBJR3JpZFN0YXRlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjaGVja091dGRhdGVkQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5jaGVja0NvbHVtbnNSZWxldmFuY2UoZGF0YS5jb2x1bW5zLCBvdXRkYXRlZENvbHVtbnNDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZShzdGF0ZTogSUdyaWRTdGF0ZSwgc2F2aW5nQ2FsbGJhY2s/OiAoKSA9PiB2b2lkLCBzYXZlZENhbGxiYWNrPzogKCkgPT4gdm9pZCk6IElDb2x1bW5XaWR0aHMge1xyXG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBJQ29sdW1uV2lkdGhzID0ge307XHJcblxyXG4gICAgaWYgKCFzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0ZS5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBjb25zdCBhZGRTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcclxuXHJcbiAgICAgIGlmIChhZGRTZXR0aW5ncykge1xyXG4gICAgICAgIGNvbHVtbi5jYXB0aW9uID0gYWRkU2V0dGluZ3MuY2FwdGlvbjtcclxuICAgICAgICBjb2x1bW4udG9vbHRpcCA9IGFkZFNldHRpbmdzLnRvb2x0aXA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vTk9URTogaWYgREIgdGFibGUgaGFzIG5vIGRhdGEgaW4gYSBjb2x1bW4sIGRhdGEgZ3JpZCBjYW4ndCBpbmZlciBkYXRhIHR5cGUgYW5kIGRvZXNuJ3Qgc2V0IHRoZSBkYXRhVHlwZSBmaWVsZFxyXG4gICAgICBpZiAoIWNvbHVtbi5kYXRhVHlwZSkge1xyXG4gICAgICAgIGNvbHVtbi5kYXRhVHlwZSA9IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUuRGVmYXVsdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCEhY29sdW1uLndpZHRoICYmIGNvbHVtbi52aXNpYmxlKSB7XHJcbiAgICAgICAgY29sdW1uV2lkdGhzW2NvbHVtbi52aXNpYmxlSW5kZXhdID0gY29sdW1uLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5TZXR0aW5nc1N0ciA9IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbHVtbnMpO1xyXG5cclxuICAgIGlmICghdGhpcy5zdGF0ZUxvYWRlZCB8fCBjb2x1bW5TZXR0aW5nc1N0ciA9PT0gdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBjb2x1bW5TZXR0aW5nc1N0cjtcclxuXHJcbiAgICBpZiAoc2F2aW5nQ2FsbGJhY2spIHtcclxuICAgICAgc2F2aW5nQ2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIudXBkYXRlR3JpZFZpZXdTZXR0aW5ncyh0aGlzLmlkLCBzdGF0ZSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGlmIChzYXZlZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICBzYXZlZENhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1uV2lkdGhzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrTmV3Q29sdW1ucyhzdGF0ZTogSUdyaWRTdGF0ZSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IG5ld0NvbHVtbkZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAoc3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCBuZXdDb2x1bW5zID0gc3RhdGUuY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSAmJiBjb2x1bW4udmlzaWJsZSk7XHJcblxyXG4gICAgICBpZiAobmV3Q29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgbmV3Q29sdW1uRmllbGRzLnB1c2goY29sdW1uLmRhdGFGaWVsZCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ld0NvbHVtbkZpZWxkcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb2x1bW5DYXB0aW9ucygpOiBJQ29sdW1uQ2FwdGlvbltdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3MpLm1hcCgoZGF0YUZpZWxkKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0YUZpZWxkLFxyXG4gICAgICAgIGNhcHRpb246IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdLmNhcHRpb25cclxuICAgICAgfSBhcyBJQ29sdW1uQ2FwdGlvbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENvbHVtbkNhcHRpb24oZGF0YUZpZWxkOiBzdHJpbmcsIGNhcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXSkge1xyXG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXSA9IHsgY2FwdGlvbjogJycsIHRvb2x0aXA6ICcnIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0uY2FwdGlvbiA9IGNhcHRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sdW1uQWRkaXRpb25hbFNldHRpbmdzKGRhdGFGaWVsZDogc3RyaW5nKTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrQ29sdW1uc1JlbGV2YW5jZShjb2x1bW5zOiBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGVbXSwgY2FsbGJhY2s6IChvdXRkYXRlZENvbHVtbnM6IHN0cmluZ1tdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmdyaWREYXRhTGF5ZXIuZ2V0Q29sdW1uc0J5UmVwb3J0SWQodGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhY3R1YWxDb2x1bW5zID0ge307XHJcblxyXG4gICAgICAgIGRhdGEuZm9yRWFjaCgoYykgPT4gYWN0dWFsQ29sdW1uc1tjLk5hbWVdID0gdHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG91dGRhdGVkQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYWN0dWFsQ29sdW1uc1tjLmRhdGFGaWVsZF0pLm1hcCgoYykgPT4gYy5kYXRhRmllbGQpO1xyXG5cclxuICAgICAgICBpZiAob3V0ZGF0ZWRDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShgR3JpZCBzZXR0aW5ncyBjb250YWluIHNvbWUgY29sdW5tcyB3aGljaCBkb24ndCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgdGFibGUgYW55bW9yZTpcclxuXHJcbiAgICAgICAgICAnJHtvdXRkYXRlZENvbHVtbnMuam9pbignLCAnKX0nLlxyXG5cclxuICAgICAgICAgIERvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGVzZSBjb2x1bW5zIGZyb20gZ3JpZCBzZXR0aW5ncz9cclxuICAgICAgICAgIGAsICdSZW1vdmUgcmVkdW5kYW50IGNvbHVtbnM/JylcclxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghcmVzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjYWxsYmFjayhvdXRkYXRlZENvbHVtbnMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0U2V0dGluZ3MoKTogSlF1ZXJ5UHJvbWlzZTxJR3JpZFN0YXRlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkRGF0YUxheWVyLnJlc2V0U2V0dGluZ3ModGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLm9uRGF0YUxvYWRlZChkYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRhdGFMb2FkZWQoZGF0YTogSUdyaWRTdGF0ZSkge1xyXG4gICAgY29uc3QgbG9hZGVkR3JpZFN0YXRlQ29sdW1ucyA9IGRhdGEgJiYgZGF0YS5jb2x1bW5zO1xyXG4gICAgbGV0IHZpc2libGVJbmRleENvdW50ZXIgPSAwO1xyXG5cclxuICAgIHRoaXMuc3RhdGVMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChsb2FkZWRHcmlkU3RhdGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkQ29sdW1ucyA9IHt9O1xyXG5cclxuICAgICAgbG9hZGVkR3JpZFN0YXRlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBOT1RFOiBzZXQgdmlzaWJsZSBpbmRleGVzIGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBzZXQuIEl0J3MgcmVxdWlyZWQgZm9yIHByb3BlciBkeERhdGFHcmlkIGFwcGVhcmFuY2UuXHJcbiAgICAgICAgaWYgKGNvbHVtbi52aXNpYmxlICYmIGNvbHVtbi52aXNpYmxlSW5kZXggPT09IG51bGwpIHtcclxuICAgICAgICAgIGNvbHVtbi52aXNpYmxlSW5kZXggPSB2aXNpYmxlSW5kZXhDb3VudGVyKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOT1RFOiByZW1vdmUgZW1wdHkgdmFsdWVzIGJlY2F1c2UgdGhleSBsZWFkIHRvIHdyb25nIGR4RGF0YUdyaWQgYmVoYXZpb3JcclxuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbHVtbltrZXldID09PSBudWxsIHx8IGNvbHVtbltrZXldID09PSB2b2lkIDAgfHwgY29sdW1uW2tleV0gPT09ICcnKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW5ba2V5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFNldHRpbmdzID0gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdO1xyXG5cclxuICAgICAgICBpZiAoIWFkZGl0aW9uYWxTZXR0aW5ncykge1xyXG4gICAgICAgICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdID0ge1xyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2x1bW4uY2FwdGlvbixcclxuICAgICAgICAgICAgdG9vbHRpcDogY29sdW1uLnRvb2x0aXBcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy5jYXB0aW9uID0gY29sdW1uLmNhcHRpb247XHJcbiAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IGNvbHVtbi50b29sdGlwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9URTogcmVtb3ZlIGNvbHVtbnMgd2hpY2ggZHhEYXRhR3JpZCBkb2Vzbid0IGV4cGVjdC5cclxuICAgICAgICBkZWxldGUgY29sdW1uLmNhcHRpb247XHJcbiAgICAgICAgZGVsZXRlIGNvbHVtbi50b29sdGlwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RDb2x1bW5TZXR0aW5nc1N0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEuY29sdW1ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZlbnVtIEdyaWRNb2RlIHtcclxuICBWaWV3ID0gMSxcclxuICBFZGl0ID0gMlxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHcmlkTW9kZTtcclxuIiwgIlx1RkVGRmltcG9ydCBHcmlkTW9kZSBmcm9tICcuLi9QYWdlcy9HcmlkL01vZGUnO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zIH0gZnJvbSAnLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBJQ29sdW1uTWV0YURhdGEgfSBmcm9tICcuLi9Db2x1bW5NZXRhRGF0YSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi4vLi4vRGF0YS9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREYXRhTGF5ZXIge1xyXG4gIGdldENvbHVtbnNCeVJlcG9ydElkKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJQ29sdW1uTWV0YURhdGFbXT47XHJcbiAgZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0OiBib29sZWFuKTogRGV2RXhwcmVzcy5kYXRhLkN1c3RvbVN0b3JlPGFueSwgYW55PjtcclxuICByZXNldFNldHRpbmdzKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJR3JpZFN0YXRlPjtcclxuICB1cGRhdGVHcmlkVmlld1NldHRpbmdzKHJlcG9ydElkOiBudW1iZXIsIHN0YXRlOiBJR3JpZFN0YXRlKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PjtcclxuICBnZXRHcmlkVmlld1NldHRpbmdzKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJR3JpZFN0YXRlPjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdyaWREYXRhTGF5ZXI6IChncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKSA9PiBJR3JpZERhdGFMYXllciA9IChncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgdXJscyA9IHtcclxuICAgIGdyaWRSZXN1bHQ6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HcmlkVmlld1Jlc3VsdGAsXHJcbiAgICBnZXRDb2x1bW5zQnlSZXBvcnRJZDogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldERiVGFibGVGaWVsZHNgLFxyXG4gICAgcmVzZXRHcmlkU2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9SZXNldEdyaWRWaWV3U2V0dGluZ3NgLFxyXG4gICAgdXBkYXRlR3JpZFZpZXdTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L1VwZGF0ZUdyaWRWaWV3U2V0dGluZ3NgLFxyXG4gICAgZ2V0R3JpZFZpZXdTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdyaWRWaWV3U2V0dGluZ3NgXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdCkge1xyXG4gICAgICByZXR1cm4gY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBsb2FkUGFyYW1zOiB7XHJcbiAgICAgICAgICBpZDogcmVwb3J0UGFyYW1zLlJlcG9ydElkLFxyXG4gICAgICAgICAgYXBwTmFtZTogcmVwb3J0UGFyYW1zLkFwcE5hbWUsXHJcbiAgICAgICAgICBncmlkTW9kZSxcclxuICAgICAgICAgIHJvd3NMaW1pdDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXNob3dBbGxEYXRhSW5FZGl0ID8gMTUgOiBudWxsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkVXJsOiB1cmxzLmdyaWRSZXN1bHQsXHJcbiAgICAgICAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDb2x1bW5zQnlSZXBvcnRJZDogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMuZ2V0Q29sdW1uc0J5UmVwb3J0SWQsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXNldFNldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5yZXNldEdyaWRTZXR0aW5ncywgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwgeyBkYXRhVHlwZTogJ2pzb24nIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVHcmlkVmlld1NldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlciwgc3RhdGU6IElHcmlkU3RhdGUpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMudXBkYXRlR3JpZFZpZXdTZXR0aW5ncywgJ3Bvc3QnLCB7XHJcbiAgICAgICAgaWQ6IHJlcG9ydElkLCBjb2x1bW5zU2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KHN0YXRlLmNvbHVtbnMpXHJcbiAgICAgIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0R3JpZFZpZXdTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMuZ2V0R3JpZFZpZXdTZXR0aW5ncywgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxufTtcclxuXHJcbmNvbnN0IGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSA9IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKTogc3RyaW5nID0+IHtcclxuICBzd2l0Y2ggKGV4Y2VwdGlvblR5cGUpIHtcclxuICAgIGNhc2UgRXhjZXB0aW9uVHlwZS5TcWxFeGNlcHRpb246XHJcbiAgICAgIHJldHVybiAnV2UgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgdGhlIGRhdGEgcXVlcnkgaG93ZXZlciBpdCBhcHBlYXJzIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBkYXRhIHNvdXJjZS4gUGxlYXNlIGNvbnRhY3QgdGhlIHJlcG9ydCBhdXRob3IgdG8gY29uZmlybSB0aGUgZGF0YSByZXF1aXJlbWVudHMuJztcclxuXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG59O1xyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaE9wdGlvbnMge1xyXG4gIGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gIGVsYXBzZWRDYWxsYmFjazogKHRpbWU6IG51bWJlcikgPT4gdm9pZDtcclxufVxyXG5cclxuY29uc3QgdXBkYXRlVGltZW91dCA9IDEwMDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZnJlc2hUaW1lciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVsYXBzZWRDYWxsYmFjazogKHRpbWU6IG51bWJlcikgPT4gdm9pZDtcclxuICBwcml2YXRlIGFjdGl2ZVRpbWVySWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBjdXJyZW50SW50ZXJ2YWw6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBsYXN0U3RhdGVDaGVja2VkOiBEYXRlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVmcmVzaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrID0gb3B0aW9ucy5lbGFwc2VkQ2FsbGJhY2s7XHJcbiAgICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydChpbnRlcnZhbDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaW50ZXJ2YWwgPD0gMCkge1xyXG4gICAgICB0aGlzLmNhbGxiYWNrKCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuY3VycmVudEludGVydmFsID0gaW50ZXJ2YWw7XHJcblxyXG4gICAgY29uc3QgdGltZXJJZCA9IHRoaXMuYWN0aXZlVGltZXJJZCA9IE1hdGgucmFuZG9tKCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50SW50ZXJ2YWwgPCAwKSB7XHJcbiAgICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRoaXMuY3VycmVudEludGVydmFsKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyaWdnZXJDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICAvL0NoYW5nZSB0aW1lcklkIGZvciBicmVha2luZyByZWZyZXNoIHByb2Nlc3MgaW4gbmV4dCBzZXRUaW1lb3V0IGNhbGwuIGRrbGltYW5vdlxyXG4gICAgdGhpcy5hY3RpdmVUaW1lcklkLS07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQ6IG51bWJlcikge1xyXG4gICAgaWYgKHRpbWVySWQgIT09IHRoaXMuYWN0aXZlVGltZXJJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgbGV0IHRpbWVUb1VwZGF0ZTogbnVtYmVyID0gdGhpcy5jdXJyZW50SW50ZXJ2YWwgLSAobmV3IERhdGUoKSAtIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCk7XHJcbiAgICBpZiAodGltZVRvVXBkYXRlIDw9IDApIHtcclxuICAgICAgdGltZVRvVXBkYXRlID0gdGhpcy5jdXJyZW50SW50ZXJ2YWwgKyA5OTk7XHJcbiAgICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICAgICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aW1lVG9VcGRhdGUpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50aWNrVGltZXJGdW5jdGlvbih0aW1lcklkKSwgdXBkYXRlVGltZW91dCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgUmVmcmVzaENvbXBvbmVudCBmcm9tICcuL0luZGV4JztcclxuXHJcbmNvbnN0IGRlZmF1bHRSZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdID0gW3tcclxuICB0aW1lb3V0OiAwLFxyXG4gIHRleHQ6ICdyZWZyZXNoIG5vdycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDE1ICogMTAwMCxcclxuICB0ZXh0OiAnMTUgc2VjJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogMzAgKiAxMDAwLFxyXG4gIHRleHQ6ICczMCBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiA2MCAqIDEwMDAsXHJcbiAgdGV4dDogJzEgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTgwICogMTAwMCxcclxuICB0ZXh0OiAnMyBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMDAgKiAxMDAwLFxyXG4gIHRleHQ6ICc1IG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzEwIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IC0xLFxyXG4gIHRleHQ6ICdvZmYnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlOiBvZmYnLFxyXG4gIGlzRGVmYXVsdDogdHJ1ZVxyXG59XTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hFbnRyeSB7XHJcbiAgdGltZW91dDogbnVtYmVyLFxyXG4gIHRleHQ6IHN0cmluZyxcclxuICByZWZyZXNoVGVtcGxhdGU6IHN0cmluZyxcclxuICBpc0RlZmF1bHQ/OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZnJlc2hCdXR0b24ge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcERvd25CdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0TWVudTogRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaENvbXBvbmVudDogUmVmcmVzaENvbXBvbmVudDtcclxuICBwcml2YXRlIG1lbnVJc09wZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRFbnRyeTogSVJlZnJlc2hFbnRyeTtcclxuXHJcbiAgY29uc3RydWN0b3IoJHRhcmdldDogSlF1ZXJ5LCBjYWxsYmFjazogKCkgPT4gdm9pZCwgcmVmcmVzaEVudHJpZXM6IElSZWZyZXNoRW50cnlbXSB8IG51bGwgPSBkZWZhdWx0UmVmcmVzaEVudHJpZXMpIHtcclxuICAgIHRoaXMucmVmcmVzaENvbXBvbmVudCA9IG5ldyBSZWZyZXNoQ29tcG9uZW50KHsgY2FsbGJhY2ssIGVsYXBzZWRDYWxsYmFjazogKGUpID0+IHRoaXMuZWxhcHNlZENhbGxiYWNrKGUpIH0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZEVudHJ5ID0gcmVmcmVzaEVudHJpZXMuZmluZCgoZSkgPT4gZS5pc0RlZmF1bHQpIHx8IHJlZnJlc2hFbnRyaWVzLmZpbHRlcigoZSkgPT4gISFlLnRpbWVvdXQpWzBdO1xyXG5cclxuICAgIHRoaXMuY29udGV4dE1lbnUgPSAkKCc8ZGl2IC8+JykuZHhDb250ZXh0TWVudSh7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHJlZnJlc2hFbnRyaWVzLFxyXG4gICAgICB0YXJnZXQ6ICR0YXJnZXQsXHJcbiAgICAgIHBvc2l0aW9uOiB7IG15OiAncmlnaHQgdG9wJywgYXQ6ICdyaWdodCBib3R0b20nIH0sXHJcbiAgICAgIG9uSXRlbUNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmKCEoZS5pdGVtRGF0YSBhcyBhbnkpLnRpbWVvdXQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSBlLml0ZW1EYXRhIGFzIElSZWZyZXNoRW50cnk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRFbnRyeSBhcyBhbnkpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnN0YXJ0KChlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkhpZGRlbjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVudUlzT3BlbmVkID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uU2hvd246IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgIChlLmNvbXBvbmVudCBhcyBhbnkpLml0ZW1zQ29udGFpbmVyKClbMF0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc3pvbGVhLXRoZW1lJyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1UZW1wbGF0ZTogKGVudHJ5KSA9PiBlbnRyeS50ZXh0LFxyXG5cclxuICAgICAgY3NzQ2xhc3M6ICdpc3pvbGVhLXRoZW1lJ1xyXG4gICAgfSkuYXBwZW5kVG8oJ2JvZHknKS5keENvbnRleHRNZW51KCdpbnN0YW5jZScpO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRFbnRyeSBhcyBhbnkpO1xyXG5cclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24gPSAkdGFyZ2V0LmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5zZWxlY3RlZEVudHJ5LnRleHQsXHJcbiAgICAgIHRlbXBsYXRlOiAoYnV0dG9uRGF0YSwgY29udGVudCkgPT4ge1xyXG4gICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2R4LWljb24gZHgtaWNvbi1yZWZyZXNoJykuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC10ZXh0JykudGV4dChidXR0b25EYXRhLnRleHQpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG4gICAgICAgICQoJzxzcGFuPicpLmFkZENsYXNzKCdidXR0b24td2l0aC1leHBhbmQtaWNvbiBpc296LWljb24tMTYgaXNvei1pY29uLWFycm93LWRvd24tMTYnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgY2xhc3M6ICdpc3pvbGVhLW1kIGJ1dHRvbi13aXRoLWV4cGFuZCdcclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5lbGVtZW50KCkud2lkdGgoJHRhcmdldC5vdXRlcldpZHRoKCkpO1xyXG4gICAgICAgIGlmICh0aGlzLm1lbnVJc09wZW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSkuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgKHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0ID4gMCkgJiYgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnN0YXJ0KHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnRyaWdnZXJDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3BEb3duQnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMuc2VsZWN0ZWRFbnRyeS5yZWZyZXNoVGVtcGxhdGUucmVwbGFjZSgnJScsIE1hdGguZmxvb3IodGltZVRvVXBkYXRlIC8gMTAwMCkudG9TdHJpbmcoKSkpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGdyaWRDb2x1bW5UeXBlcyBmcm9tICcuLi8uLi9CdXNpbmVzcy9HcmlkQ29sdW1uVHlwZXMnO1xyXG5pbXBvcnQge2luaXRQb3BvdmVyfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHtJR3JpZFJlcG9ydFBhcmFtcywgSVJlcG9ydFBhcmFtc30gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCBHUklEX0lORElDQVRPUl9TVEFURSBmcm9tICcuL0dyaWRJbmRpY2F0b3JTdGF0ZSc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgR3JpZFN0YXRlTWFuYWdlciBmcm9tICcuL0dyaWRTdGF0ZU1hbmFnZXInO1xyXG5pbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi9Nb2RlJztcclxuaW1wb3J0IHtjcmVhdGVHcmlkRGF0YUxheWVyLCBJR3JpZERhdGFMYXllcn0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XHJcbmltcG9ydCB7R3JpZERhdGFDb2x1bW5EYXRhVHlwZSwgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUsIElHcmlkU3RhdGV9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5jb25zdCBSRVNFVF9TQVZFRF9JTkRJQ0FUT1JfVElNRU9VVCA9IDMwMDA7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkT3B0aW9ucyB7XHJcbiAgZ3JpZFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHNob3dIZWFkZXI/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmlkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlcG9ydFBhcmFtczogSUdyaWRSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgY3VycmVudEdyaWRNb2RlOiBHcmlkTW9kZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2hvd0FsbERhdGFJbkVkaXQgPSBmYWxzZTtcclxuICBwcml2YXRlIGxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFN0YXRlTWFuYWdlcjogR3JpZFN0YXRlTWFuYWdlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJGdyaWRTdGF0ZUluZGljYXRvcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZEVycm9yUGxhY2Vob2xkZXI6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJGdyaWRUYXJnZXRFbGVtZW50OiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50OiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZGF0YUxheWVyOiBJR3JpZERhdGFMYXllcjtcclxuICBwcml2YXRlIGVkaXRXaWR0aEVkaXRCb3hlczogRGV2RXhwcmVzcy51aS5keFRleHRCb3hbXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWRSZXBhaW50UXVldWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBjb2x1bW5OYW1lc1VwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRPcHRpb25zKSB7XHJcbiAgICB0aGlzLmdyaWRQb3NpdGlvbk1hcmtlciA9IG9wdGlvbnMuZ3JpZFBvc2l0aW9uTWFya2VyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsID0gb3B0aW9ucy5ncmlkUmVwb3J0Q29udHJvbGxlclVybDtcclxuICAgIHRoaXMuc2hvd0hlYWRlciA9IG9wdGlvbnMuc2hvd0hlYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRHcmlkTW9kZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IEdyaWRNb2RlLlZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0SW50ZXJuYWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkPy5yZWZyZXNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5ncmlkID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG51bGw7XHJcbiAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuXHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRJbnRlcm5hbCgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgdGhpcy5kYXRhTGF5ZXIgPSBjcmVhdGVHcmlkRGF0YUxheWVyKHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG5cclxuICAgIGlmICh0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCkge1xyXG4gICAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCA9ICQoJzxkaXYgLz4nKS5pbnNlcnRBZnRlcih0aGlzLmdyaWRQb3NpdGlvbk1hcmtlcik7XHJcblxyXG4gICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyID0gbmV3IEdyaWRTdGF0ZU1hbmFnZXIodGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQsIHRoaXMuZGF0YUxheWVyKTtcclxuXHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlciA9ICQoJzxkaXYgLz4nKS50ZXh0KCdEYXRhIGxvYWRpbmcgZmFpbGVkLicpLmFkZENsYXNzKCdkeC1kYXRhZ3JpZC1ub2RhdGEnKS5jc3MoeyB6SW5kZXg6IDEgfSk7XHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5hcHBlbmRUbyh0aGlzLmdyaWRQb3NpdGlvbk1hcmtlcik7XHJcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5oaWRlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgLy8gVE9ETzogZWxlbWVudCBzZWxlY3RvciBhcyBhIHBhcmFtXHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzID0gW107XHJcbiAgICBjb25zdCBncmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCA/ICdlZGl0LW1vZGUnIDogJ3ZpZXctbW9kZScgfSxcclxuICAgICAgcmVwYWludENoYW5nZXNPbmx5OiB0cnVlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgJiYgdGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzZWFyY2hQYW5lbCcpWzBdO1xyXG4gICAgICAgICAgY29uc3Qgc2VhcmNoUGFuZWxJbmRleCA9IGl0ZW1zLmluZGV4T2Yoc2VhcmNoUGFuZWwpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN3aXRjaFRvRWRpdEJ0biA9IHtcclxuICAgICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdTd2l0Y2ggdG8gRWRpdCBNb2RlJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnN3aXRjaFRvTW9kZShHcmlkTW9kZS5FZGl0KSxcclxuICAgICAgICAgICAgICBpY29uOiAnc3dpdGNoLXRvLWVkaXQtbW9kZScsXHJcbiAgICAgICAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2Uoc2VhcmNoUGFuZWxJbmRleCwgMSk7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHN3aXRjaFRvRWRpdEJ0bik7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHNlYXJjaFBhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgY29uc3QgY29sdW1uQ2hvb3NlckJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnY29sdW1uQ2hvb3NlckJ1dHRvbicpWzBdO1xyXG4gICAgICAgICAgY29uc3QgY29sdW1udENob29zZXJCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YoY29sdW1uQ2hvb3NlckJ0bik7XHJcblxyXG4gICAgICAgICAgY29uc3Qgc2hvd0RhdGFJdGVtID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4ICNlMGUwZTAgc29saWQnLFxyXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnM3B4IDZweCcsXHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd3aGl0ZScsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7IG1hcmdpbjogJzAgNXB4IDAgMCcsIHdpZHRoOiAnNTRweCcgfSlcclxuICAgICAgICAgICAgICAgIC5keFN3aXRjaCh7XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNob3dBbGxEYXRhSW5FZGl0LFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxzcGFuIC8+JykudGV4dCgnU2hvdyBhbGwgZGF0YSAnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgJGhpbnRUYXJnZXQgPSAkKCc8YSAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHsgdGV4dERlY29yYXRpb246ICd1bmRlcmxpbmUnLCBjb2xvcjogJ2JsdWUnIH0pXHJcbiAgICAgICAgICAgICAgICAudGV4dCgnKD8pJylcclxuICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAudGV4dChgSWYgdGhlIHRhYmxlIGNvbnRhaW5zIGEgbG90IG9mIGNvbHVtbnMgc2hvd2luZyBhbGwgZGF0YSBjYW4gbGVhZCB0byBzbG93IHBhZ2UgcGVyZm9ybWFuY2Ugd2hlbiB5b3UncmUgZWRpdGluZyB0aGUgZ3JpZC5cclxuQnkgZGVmYXVsdCBncmlkIHNob3dzIG9ubHkgZmlyc3QgMTAgcm93cyBpbiB0aGUgRWRpdCBtb2RlLmApXHJcbiAgICAgICAgICAgICAgICAuZHhQb3BvdmVyKHtcclxuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAkaGludFRhcmdldCxcclxuICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50OiAnbW91c2VlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgIGhpZGVFdmVudDogJ21vdXNlbGVhdmUnLFxyXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MDBcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb1ZpZXdCdG4gPSB7XHJcbiAgICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnU3dpdGNoIHRvIFZpZXcgTW9kZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuVmlldyksXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by12aWV3LW1vZGUnLFxyXG4gICAgICAgICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ31cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGNvbHVtbnRDaG9vc2VyQnRuSW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGV4cG9ydEJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnZXhwb3J0QnV0dG9uJylbMF07XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YoZXhwb3J0QnRuKTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoZXhwb3J0QnRuSW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnB1c2goc2hvd0RhdGFJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goc3dpdGNoVG9WaWV3QnRuKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goY29sdW1uQ2hvb3NlckJ0bik7XHJcblxyXG4gICAgICAgICAgY29uc3QgZWRpdFN0YXR1cyA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdlZGl0LWdyaWQtc3RhdGUnKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdCk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnVuc2hpZnQoZWRpdFN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hZGRSZWZyZXNoQnV0dG9uKSB7XHJcbiAgICAgICAgICBjb25zdCByZWZyZXNoQnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdyZWZyZXNoJylbMF07XHJcbiAgICAgICAgICBjb25zdCByZWZyZXNoQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKHJlZnJlc2hCdG4pO1xyXG5cclxuICAgICAgICAgIGl0ZW1zW3JlZnJlc2hCdG5JbmRleF0gPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJGNvbnRhaW5lciwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKHsgcm93VHlwZSwgY29sdW1uLCBjZWxsRWxlbWVudCB9KSA9PiB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBpZiAocm93VHlwZSA9PT0gJ2hlYWRlcicgJiYgIWNvbHVtbi5jb21tYW5kKSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhRmllbGQgPSBjb2x1bW4uZGF0YUZpZWxkO1xyXG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbFNldHRpbmdzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmdldENvbHVtbkFkZGl0aW9uYWxTZXR0aW5ncyhkYXRhRmllbGQpO1xyXG5cclxuICAgICAgICAgIHRoaXMuaW5pdEdyaWRIZWFkZXJDZWxsKGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChjb2x1bW4sIGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRHcmlkID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlOiBJR3JpZFN0YXRlID0gY3VycmVudEdyaWQuc3RhdGUoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5OYW1pbmcoY3VycmVudFN0YXRlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTk9URTogY29sdW1uIG5hbWUgdXBkYXRpbmcgdHJpZ2dlcnMgb25Db250ZW50UmVhZHkgZXZlbnQgcmFpc2luZyBhZ2Fpbi5cclxuICAgICAgICAgIC8vIFdlIG5lZWQgbm90IHRvIGV4ZXVjdXRlIHRoZSBzYW1lIG9uZSBtb3JlIHRpbWUuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjdXJyZW50R3JpZC5lbmRDdXN0b21Mb2FkaW5nKCkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuY2hlY2tOZXdDb2x1bW5zKGN1cnJlbnRTdGF0ZSk7XHJcblxyXG4gICAgICAgIG5ld0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uTmFtZSkgPT4gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGNvbHVtbk5hbWUsICd2aXNpYmxlJywgZmFsc2UpKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uQ2FwdGlvbnMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuZ2V0Q29sdW1uQ2FwdGlvbnMoKTtcclxuXHJcbiAgICAgICAgY29sdW1uQ2FwdGlvbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgaWYgKGMuY2FwdGlvbiAmJiBjdXJyZW50R3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYXB0aW9uJykgIT09IGMuY2FwdGlvbikge1xyXG4gICAgICAgICAgICBjdXJyZW50R3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYXB0aW9uJywgYy5jYXB0aW9uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgc3RhdGVTdG9yaW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICBjdXN0b21Mb2FkOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmxvYWQodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQsIChvdXRkYXRlZENvbHVtbnMpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdyaWQuc3RhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHN0YXRlLmNvbHVtbnMgPSAoc3RhdGUuY29sdW1ucyBhcyBhbnlbXSkuZmlsdGVyKChjb2x1bW4pID0+IG91dGRhdGVkQ29sdW1ucy5pbmRleE9mKGNvbHVtbi5kYXRhRmllbGQpIDwgMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdyaWQuc3RhdGUoc3RhdGUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjdXN0b21TYXZlOiAoc3RhdGUpID0+IHRoaXMuc2F2ZUdyaWRTdGF0ZShzdGF0ZSlcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldywgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgfSxcclxuICAgICAgZXJyb3JSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgc29ydGluZzogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgICBncm91cGluZzogeyBhdXRvRXhwYW5kQWxsOiBmYWxzZSB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0LFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7IGVuYWJsZWQ6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0IH0sXHJcbiAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtlbmFibGVkOiBmYWxzZX0sXHJcblxyXG4gICAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgICAgcGFnaW5nOiB7IHBhZ2VTaXplOiA1MCwgZW5hYmxlZDogdHJ1ZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG5cclxuICAgICAgc3VtbWFyeTogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uID8ge1xyXG4gICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICBjb2x1bW46IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbixcclxuICAgICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICAgICAgfV1cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nKGUpIHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZmlsdGVyUm93Jykge1xyXG4gICAgICAgICAgY29uc3QgYXBwbHkgPSAoKSA9PiBlLmVsZW1lbnQuZmluZCgnLmR4LWFwcGx5LWJ1dHRvbicpLnRyaWdnZXIoJ2R4Y2xpY2snKTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5O1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ3NlYXJjaFBhbmVsJykge1xyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkID0gZGVmYXVsdEdyaWQodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLnJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSA6IG51bGwsXHJcbiAgICAgIGhlYWRlckRlc2NyaXB0aW9uOiB0aGlzLnNob3dIZWFkZXIgPyB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzIDogbnVsbFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQgPSAkKCc8c3BhbiAvPicpXHJcbiAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICBmbG9hdDogJ3JpZ2h0JyxcclxuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxyXG4gICAgICAgICAgYm90dG9tOiAnOHB4J1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFkZENsYXNzKCdpc3pvbGVhLW1kJylcclxuICAgICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgICAgdGV4dDogJ1Jlc2V0IHNldHRpbmdzJyxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMucmVzZXRTZXR0aW5ncygpLFxyXG4gICAgICAgICAgaWNvbjogJ3Jlc2V0LWdyaWQtc2V0dGluZ3MnXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXBwZW5kVG8oJ2Zvb3RlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdyaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihzdGF0ZTogc3RyaW5nKSB7XHJcbiAgICBPYmplY3Qua2V5cyhHUklEX0lORElDQVRPUl9TVEFURSkuZm9yRWFjaCgocykgPT4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLnJlbW92ZUNsYXNzKEdSSURfSU5ESUNBVE9SX1NUQVRFW3NdKSk7XHJcblxyXG4gICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLmFkZENsYXNzKHN0YXRlKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0KSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5lZGl0KTtcclxuICAgICAgfSwgUkVTRVRfU0FWRURfSU5ESUNBVE9SX1RJTUVPVVQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0aXRsZSA9ICcnO1xyXG5cclxuICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5lZGl0OlxyXG4gICAgICAgIHRpdGxlID0gJ0VkaXQgbW9kZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkOlxyXG4gICAgICAgIHRpdGxlID0gJ1NhdmVkJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2aW5nOlxyXG4gICAgICAgIHRpdGxlID0gJ1NhdmluZyc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yLmF0dHIoJ3RpdGxlJywgdGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1pbmcoc3RhdGU6IElHcmlkU3RhdGUpIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxyXG4gICAgLy8gSEFDSzogRGV2RXh0cmVtZSBncmlkIGRvZXNuJ3Qgc2hvdyBjb2x1bW5zIGRhdGEgaWYgYSBkYXRhRmllbGQgaGFzIHNwZWNpYWwgc3ltYm9scy5cclxuICAgIC8vIFNlZSBodHRwczovL3d3dy5kZXZleHByZXNzLmNvbS9TdXBwb3J0L0NlbnRlci9RdWVzdGlvbi9EZXRhaWxzL1Q2MjE4MzgvZHhkYXRhZ3JpZC1hLWNvbHVtbi1pcy1lbXB0eS1pZi1kYXRhZmllbGQtY29udGFpbnMtc3BlY2lhbC1jaGFyYWN0ZXJzXHJcbiAgICAvLyB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aFxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KGMuZGF0YUZpZWxkKSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihjLmRhdGFGaWVsZCwgJ2NhbGN1bGF0ZUNlbGxWYWx1ZScsIChyb3dEYXRhKSA9PiByb3dEYXRhW2MuZGF0YUZpZWxkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlKHJlcG9ydFBhcmFtc0RhdGFTb3VyY2U6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXREYXRhU291cmNlOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuZGF0YUxheWVyLmdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtc0RhdGFTb3VyY2UsIGdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdERhdGFTb3VyY2UpO1xyXG4gICAgY29uc3QgZHMgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICBzdG9yZSxcclxuICAgICAgb25DaGFuZ2VkOiBncmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyA/IHZvaWQgMCA6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkxvYWRFcnJvcjogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWRzLmlzTG9hZGVkKCkpIHtcclxuICAgICAgICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLnNob3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uTG9hZGluZ0NoYW5nZWQ6IChpc0xvYWRpbmcpID0+IHtcclxuICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5oaWRlKCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnUGxlYXNlIHdhaXQsIGRhdGEgbG9hZGluZyBpbiBwcm9ncmVzcy4nKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgMTAwMDApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkaW5nVGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ncmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRTZXR0aW5ncygpIHtcclxuICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oJ1Jlc2V0IGdyaWQgc2V0dGluZ3MgdG8gZGVmYXVsdCB2YWx1ZXM/JywgJ1Jlc2V0IHRvIGRlZmF1bHQ/JylcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlclxyXG4gICAgICAgICAgICAucmVzZXRTZXR0aW5ncygpXHJcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLnN0YXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3dpdGNoVG9Nb2RlKG1vZGU6IEdyaWRNb2RlKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IG1vZGUgfHwgbW9kZSA9PT0gR3JpZE1vZGUuRWRpdCAmJiAhdGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gbW9kZTtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50U3VtbWFyeUNvbHVtbiA9IHRoaXMuZ3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtc1swXS5jb2x1bW4nKSBhcyBzdHJpbmc7XHJcblxyXG4gICAgY29uc3QgbmV3UmVwb3J0UGFyYW1zID0ge1xyXG4gICAgICAuLi50aGlzLnJlcG9ydFBhcmFtcyxcclxuICAgICAgVG90YWxTdW1tYXJ5Q29sdW1uOiBjdXJyZW50U3VtbWFyeUNvbHVtbiA/IGN1cnJlbnRTdW1tYXJ5Q29sdW1uIDogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gbmV3UmVwb3J0UGFyYW1zO1xyXG5cclxuICAgIHRoaXMuZ3JpZC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudC5yZW1vdmUoKTtcclxuICAgIHRoaXMuZ3JpZCA9IHRoaXMuaW5pdEludGVybmFsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVHcmlkU3RhdGUoc3RhdGUpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSAhPT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZShzdGF0ZSxcclxuICAgICAgKCkgPT4gdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2aW5nKSxcclxuICAgICAgKCkgPT4gdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQpKTtcclxuXHJcbiAgICBpZiAod2lkdGhzKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZWRpdFdpZHRoQm94ID0gdGhpcy5lZGl0V2lkdGhFZGl0Qm94ZXNba2V5XTtcclxuXHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB3aWR0aHNba2V5XSA9PT0gJ2luaGVyaXQnID8gJycgOiB3aWR0aHNba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKGVkaXRXaWR0aEJveCAmJiBlZGl0V2lkdGhCb3gub3B0aW9uKCd2YWx1ZScpICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEdyaWRIZWFkZXJDZWxsRWRpdFBhbmVsKFxyXG4gICAgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sXHJcbiAgICAkY2VsbDogSlF1ZXJ5LFxyXG4gICAgYWRkaXRpb25hbFNldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZVxyXG4gICkge1xyXG4gICAgY29uc3QgZGF0YUZpZWxkID0gY29sdW1uLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0ICRjb2x1bW5DYXB0aW9uRWwgPSAkY2VsbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XHJcbiAgICBjb25zdCAkZWRpdG9yQXJlYSA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2NvbHVtbi1lZGl0b3ItYXJlYScpLmluc2VydEFmdGVyKCRjb2x1bW5DYXB0aW9uRWwpO1xyXG5cclxuICAgICRjb2x1bW5DYXB0aW9uRWwuY3NzKCdtYXhXaWR0aCcsICc1NSUnKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFR5cGVQYW5lbCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtdHlwZS1wYW5lbCcpXHJcbiAgICAgIC53aWR0aCgnMTAwJScpXHJcbiAgICAgIC5hcHBlbmRUbygkY2VsbCk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRXaWR0aFBhbmVsID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZWRpdC13aWR0aC1wYW5lbCcpXHJcbiAgICAgIC53aWR0aCgnMTAwJScpXHJcbiAgICAgIC5hcHBlbmRUbygkY2VsbCk7XHJcblxyXG4gICAgJGVkaXRUeXBlUGFuZWxbMF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3RCb3ggPSAkZWRpdFR5cGVCb3guZHhTZWxlY3RCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0Qm94Lm9wdGlvbignb3BlbmVkJykpIHtcclxuICAgICAgICBzZWxlY3RCb3guY2xvc2UoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RCb3gub3BlbigpO1xyXG4gICAgICB9XHJcbiAgICB9LCB0cnVlKTtcclxuXHJcbiAgICBsZXQgbGFzdENhcHRpb25WYWx1ZSA9IGNvbHVtbi5jYXB0aW9uO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0Q2FwdGlvbkJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xyXG4gICAgICBoaW50OiAnRWRpdCBjb2x1bW4gY2FwdGlvbicsXHJcbiAgICAgIHRlbXBsYXRlOiAoZGF0YSwgJGNvbnRlbnQpID0+ICRjb250ZW50LmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdlZGl0LWNhcHRpb24tYnRuJykpLFxyXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRDYXB0aW9uQnRuLmhpZGUoKTtcclxuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkZWRpdCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgICAgIHZhbHVlOiBsYXN0Q2FwdGlvblZhbHVlLFxyXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdjYXB0aW9uLWVkaXRvcicgfSxcclxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGVkaXRCdG4ub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgICAgICAgJGVkaXQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICRjb2x1bW5DYXB0aW9uRWwudGV4dChuZXdWYWx1ZSkuc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdENhcHRpb25CdG4uc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdFRvb2x0aXBCdG4uc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgbGFzdENhcHRpb25WYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuc2V0Q29sdW1uQ2FwdGlvbihkYXRhRmllbGQsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlR3JpZFN0YXRlKHRoaXMuZ3JpZC5zdGF0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgICAgICAuYXBwZW5kVG8oJGVkaXRvckFyZWEpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRCdG4gPSAkZWRpdC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGNvbHVtbkNhcHRpb25FbCk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUb29sdGlwQnRuID0gJCgnPHNwYW4gLz4nKS5keEJ1dHRvbih7XHJcbiAgICAgIGhpbnQ6ICdFZGl0IGNvbHVtbiB0b29sdGlwJyxcclxuICAgICAgdGVtcGxhdGU6IChkYXRhLCAkY29udGVudCkgPT4gJGNvbnRlbnQuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2VkaXQtdG9vbHRpcC1idG4nKSksXHJcbiAgICAgIG9uQ2xpY2s6ICh7IGV2ZW50IH0pID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLmhpZGUoKTtcclxuICAgICAgICAkZWRpdENhcHRpb25CdG4uaGlkZSgpO1xyXG4gICAgICAgICRlZGl0VG9vbHRpcEJ0bi5oaWRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRlZGl0ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICAgICAgdmFsdWU6IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCxcclxuICAgICAgICAgIHRleHQ6IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCxcclxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgY29sdW1uIHRvb2x0aXAuLi4nLFxyXG4gICAgICAgICAgb25FbnRlcktleTogKGUpID0+IHtcclxuICAgICAgICAgICAgZWRpdEJ0bi5ibHVyKCk7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uRm9jdXNPdXQ6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgICAgICAgICRlZGl0LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRDYXB0aW9uQnRuLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRUb29sdGlwQnRuLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICRjZWxsLmF0dHIoJ3RpdGxlJywgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVHcmlkU3RhdGUodGhpcy5ncmlkLnN0YXRlKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgICAgIC5hcHBlbmRUbygkZWRpdG9yQXJlYSlcclxuICAgICAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdEJ0biA9ICRlZGl0LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZWRpdEJ0bi5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9KS5pbnNlcnRBZnRlcigkZWRpdENhcHRpb25CdG4pO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VHlwZUJveCA9ICQoJzxzcGFuIC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICBkYXRhU291cmNlOiBncmlkQ29sdW1uVHlwZXMsXHJcbiAgICAgIHZhbHVlOiBjb2x1bW4uZGF0YVR5cGUgfHwgR3JpZERhdGFDb2x1bW5EYXRhVHlwZS5EZWZhdWx0LFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb2x1bW4gdHlwZS4uLicsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihkYXRhRmllbGQsICdkYXRhVHlwZScsIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKS5hcHBlbmRUbygkZWRpdFR5cGVQYW5lbCk7XHJcblxyXG4gICAgbGV0IHByZXZWYWx1ZSA9ICEhY29sdW1uLndpZHRoID8gY29sdW1uLndpZHRoLnRvU3RyaW5nKCkgOiAnJztcclxuXHJcbiAgICBjb25zdCBvbldpZHRoVmFsdWVDaGFuZ2VkID0gKGUpID0+IHtcclxuICAgICAgbGV0IG5ld1ZhbHVlID0gZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgaWYgKCFuZXdWYWx1ZSB8fCBuZXdWYWx1ZSA9PT0gJ2luaGVyaXQnKSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSAnJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFwcmV2VmFsdWUgfHwgcHJldlZhbHVlID09PSAnaW5oZXJpdCcpIHtcclxuICAgICAgICBwcmV2VmFsdWUgPSAnJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5ld1ZhbHVlICE9PSBwcmV2VmFsdWUpIHtcclxuICAgICAgICBwcmV2VmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGRhdGFGaWVsZCwgJ3dpZHRoJywgbmV3VmFsdWUgfHwgJ2luaGVyaXQnKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdyaWRSZXBhaW50UXVldWVkKSB7XHJcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRSZXBhaW50UXVldWVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAkZWRpdFdpZHRoQm94ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICB0ZXh0OiBwcmV2VmFsdWUgPT09ICdpbmhlcml0JyA/ICcnIDogcHJldlZhbHVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NldCB3aWR0aC4uLicsXHJcbiAgICAgIG9uRW50ZXJLZXk6ICgpID0+ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpLmJsdXIoKSxcclxuICAgICAgb25Gb2N1c091dDogb25XaWR0aFZhbHVlQ2hhbmdlZCxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWRcclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgLmFwcGVuZFRvKCRlZGl0V2lkdGhQYW5lbClcclxuICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2NvbHVtbi52aXNpYmxlSW5kZXhdID0gJGVkaXRXaWR0aEJveC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcmlkSGVhZGVyQ2VsbCgkY2VsbEVsOiBKUXVlcnksIGFkZGl0aW9uYWxTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUpIHtcclxuICAgIGNvbnN0ICRjb2x1bW5DYXB0aW9uRWwgPSAkY2VsbEVsLmZpbmQoJy5keC1kYXRhZ3JpZC10ZXh0LWNvbnRlbnQnKTtcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXA7XHJcbiAgICBjb25zdCBjYXB0aW9uID0gYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy5jYXB0aW9uO1xyXG5cclxuICAgICRjZWxsRWwuYXR0cigndGl0bGUnLCB0b29sdGlwIHx8IHZvaWQgMCk7XHJcblxyXG4gICAgaWYgKGNhcHRpb24pIHtcclxuICAgICAgJGNvbHVtbkNhcHRpb25FbC50ZXh0KGNhcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW50ZXJmYWNlIElHYXVnZVN1YnZhbHVlc09wdGlvbnMge1xyXG4gIHN1YnZhbHVlczogSVN1YnZhbHVlT3B0aW9uc1tdO1xyXG4gIHR5cGU6IHN0cmluZztcclxuICB3aWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVN1YnZhbHVlT3B0aW9ucyB7XHJcbiAga2V5OiBudW1iZXI7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGlzQm91bmQ6IGJvb2xlYW47XHJcbiAgbWVhc3VyZUlkOiBzdHJpbmc7XHJcbiAgdmFsdWU6IG51bWJlcjtcclxuICBjb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcclxuICBzdWJ2YWx1ZXM6IFtdLFxyXG4gIHR5cGU6ICd0cmlhbmdsZU1hcmtlcicsXHJcbiAgY29sb3I6ICcjODc5OGE1JyxcclxuICBzZWNvbmRDb2xvcjogJyNlMThlOTInLFxyXG4gIHdpZHRoOiAxMCxcclxuICBpc0N1c3RvbVBhbGV0dGU6IGZhbHNlLFxyXG4gIHBhbGV0dGU6IG51bGwsXHJcbiAgY3VzdG9tUGFsZXR0ZTogWycjNjFhNTk1JywgJ0dyZXknLCAncmdiKDE1MywgMTAyLCAyNTUpJywgJ05hdnknXVxyXG59IGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcblxyXG5jb25zdCBDU1NfQ0xBU1MgPSAnaXNvei1zdWJ2YWx1ZUVkaXRvckZvcm1Hcm91cCc7XHJcbmNvbnN0IE5BTUVfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19uYW1lYDtcclxuY29uc3QgSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19pcy1ib3VuZGA7XHJcbmNvbnN0IFZBTFVFX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fdmFsdWVgO1xyXG5jb25zdCBNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbWVhc3VyZS1pZGA7XHJcbmNvbnN0IENPTE9SX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fY29sb3JgO1xyXG5cclxuY29uc3QgQ0lSQ0xVQVJfSU5ESUNBVE9SX1RZUEVTID0gWydyZWN0YW5nbGVOZWVkbGUnLCAndHJpYW5nbGVOZWVkbGUnLCAncmFuZ2VCYXInLCAndHJpYW5nbGVNYXJrZXInLCAndGV4dENsb3VkJ107XHJcbmNvbnN0IExJTkVBUl9JTkRJQ0FUT1JfVFlQRVMgPSBbJ3JlY3RhbmdsZScsICdjaXJjbGUnLCAncmhvbWJ1cycsICdyYW5nZUJhcicsICd0cmlhbmdsZU1hcmtlcicsICd0ZXh0Q2xvdWQnXTtcclxuXHJcbmNvbnN0IENJUkNVTEFSX1ZJRVdfVFlQRVM6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlVmlld1R5cGVbXSA9IFsnQ2lyY3VsYXJGdWxsJywgJ0NpcmN1bGFySGFsZicsICdDaXJjdWxhclF1YXJ0ZXJMZWZ0JywgJ0NpcmN1bGFyUXVhcnRlclJpZ2h0JywgJ0NpcmN1bGFyVGhyZWVGb3VydGgnXTtcclxuY29uc3QgTElORUFSX1ZJRVdfVFlQRVM6IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlVmlld1R5cGVbXSA9IFsnTGluZWFySG9yaXpvbnRhbCcsICdMaW5lYXJWZXJ0aWNhbCddO1xyXG5cclxuY29uc3QgREVGQVVMVF9QQUxFVFRFID0gWycjMWRiMmY1JywgJyNmNTU2NGEnLCAnIzk3Yzk1YycsICcjZmZjNzIwJywgJyNlYjM1NzMnLCAnI2E2M2RiOCcsICcjNjU5M2JjJywgJyNmYWEzMzUnLCAnI2ZmODg3YyddO1xyXG5cclxuY29uc3QgUFJFREVGSU5FRF9QQUxFVFRFUyA9IFsnQnJpZ2h0JywgJ0hhcm1vbnkgTGlnaHQnLCAnT2NlYW4nLCAnUGFzdGVsJywgJ1NvZnQnLCAnU29mdCBQYXN0ZWwnLCAnVmludGFnZScsXHJcbiAgJ1Zpb2xldCcsICdDYXJtaW5lJywgJ0RhcmsgTW9vbicsICdEYXJrIFZpb2xldCcsICdHcmVlbiBNaXN0JywgJ1NvZnQgQmx1ZScsICdNYXRlcmlhbCcsICdPZmZpY2UnXTtcclxuXHJcbi8vIDEuIE1vZGVsXHJcbmNvbnN0IHByb3BlcnR5ID0ge1xyXG4gIG93bmVyVHlwZTogRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtLFxyXG4gIHByb3BlcnR5TmFtZTogJ0dhdWdlU3VidmFsdWVzU2V0dGluZ3MnLFxyXG4gIGRlZmF1bHRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoZGVmYXVsdE9wdGlvbnMpLFxyXG4gIHZhbHVlVHlwZTogJ3N0cmluZydcclxufSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5DdXN0b21Qcm9wZXJ0eU1ldGFkYXRhO1xyXG5cclxuRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8ucmVnaXN0ZXJDdXN0b21Qcm9wZXJ0eShwcm9wZXJ0eSk7XHJcblxyXG4vLyAyLiBWaWV3ZXJcclxuZnVuY3Rpb24gb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkl0ZW1XaWRnZXRPcHRpb25FdmVudEFyZ3MpIHtcclxuICBpZiAoYXJncy5kYXNoYm9hcmRJdGVtIGluc3RhbmNlb2YgRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtKSB7XHJcbiAgICBjb25zdCBzdG9yZWRPcHRpb25zID0gZ2V0T3B0aW9ucyhhcmdzLmRhc2hib2FyZEl0ZW0pO1xyXG5cclxuICAgIGNvbnN0IGdhdWdlT3B0aW9ucyA9IGFyZ3Mub3B0aW9ucyBhcyBEZXZFeHByZXNzLnZpei5keExpbmVhckdhdWdlT3B0aW9ucyB8IERldkV4cHJlc3Mudml6LmR4Q2lyY3VsYXJHYXVnZU9wdGlvbnM7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzID0gZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyB8fCBbXTtcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvciA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvciB8fCB7fTtcclxuXHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IudHlwZSA9IHN0b3JlZE9wdGlvbnMudHlwZSBhcyBhbnk7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3Iud2lkdGggPSBzdG9yZWRPcHRpb25zLndpZHRoO1xyXG5cclxuICAgIGNvbnN0IGhhc1RhcmdldFZhbHVlID0gISFhcmdzLmRhc2hib2FyZEl0ZW0uZ2F1Z2VzKClbMF0/LnRhcmdldFZhbHVlKCk7XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IucGFsZXR0ZSA9IHN0b3JlZE9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigocykgPT4gaGFzVGFyZ2V0VmFsdWUgfHwgcy5rZXkgPiAtMSkubWFwKChzKSA9PiBzLmNvbG9yKTtcclxuXHJcbiAgICBzdG9yZWRPcHRpb25zLnN1YnZhbHVlcy5mb3JFYWNoKChzdWJ2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAoc3VidmFsdWUua2V5ID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdmFsdWUgPSBzdWJ2YWx1ZS5pc0JvdW5kID8gYXJncy5pdGVtRGF0YS5nZXRNZWFzdXJlVmFsdWUoc3VidmFsdWUubWVhc3VyZUlkKS5nZXRWYWx1ZSgpIDogc3VidmFsdWUudmFsdWU7XHJcbiAgICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIDMuIERlc2lnbmVyXHJcbmZ1bmN0aW9uIG9uQ3VzdG9taXplU2VjdGlvbnMoYXJnczogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuQ3VzdG9taXplU2VjdGlvbnNFdmVudEFyZ3MpIHtcclxuICBjb25zdCBnYXVnZUl0ZW0gPSBhcmdzLmRhc2hib2FyZEl0ZW07XHJcbiAgaWYgKGdhdWdlSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xyXG4gICAgYXJncy5hZGRTZWN0aW9uKHtcclxuICAgICAgdGl0bGU6ICdTdWJ2YWx1ZXMnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogcHJvcGVydHkucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgdGVtcGxhdGUoYSwgZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgbmV3IERldkV4cHJlc3MudWkuZHhCdXR0b24oYnV0dG9uQ29udGFpbmVyLCB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0VkaXQgaW4gV2l6YXJkJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgICAgICAgICAgc2hvd1BvcHVwKGdhdWdlSXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBidXR0b25Db250YWluZXI7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dQb3B1cChnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSkge1xyXG4gIGNvbnN0IHBvcHVwQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3B1cENvbnRhaW5lcik7XHJcbiAgY29uc3QgcG9wdXBPcHRpb25zID0ge1xyXG4gICAgd2lkdGg6ICc4MDBweCcsXHJcbiAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgIG1heEhlaWdodDogJzEwMCUnLFxyXG4gICAgaGlkZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgIGNvbnRlbnRUZW1wbGF0ZSh0aGlzOiBhbnksIGNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgY29uc3Qgc3VidmFsdWVzRm9ybUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb25zdCBzdWJ2YWx1ZXNmb3JtT3B0aW9ucyA9IGdldFN1YnZhbHVlRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgdGhpcy5fc3VidmFsdWVzRm9ybSA9IG5ldyBEZXZFeHByZXNzLnVpLmR4Rm9ybShzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyLCBzdWJ2YWx1ZXNmb3JtT3B0aW9ucyk7XHJcblxyXG4gICAgICBjb25zdCBpbmRpY2F0b3JGb3JtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IGluZGljYXRvcmZvcm1PcHRpb25zID0gZ2V0SW5kaWNhdG9yRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgdGhpcy5faW5kaWNhdG9yRm9ybSA9IG5ldyBEZXZFeHByZXNzLnVpLmR4Rm9ybShpbmRpY2F0b3JGb3JtQ29udGFpbmVyLCBpbmRpY2F0b3Jmb3JtT3B0aW9ucyk7XHJcblxyXG4gICAgICBjb25zdCBjb250ZW50ID0gJCgnPGRpdiAvPicpLmFwcGVuZChzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyLCBpbmRpY2F0b3JGb3JtQ29udGFpbmVyKTtcclxuXHJcbiAgICAgIGNvbnN0IHNjcm9sbFZpZXcgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgICAgIHNjcm9sbFZpZXcuYXBwZW5kKGNvbnRlbnQpO1xyXG4gICAgICBzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBzY3JvbGxWaWV3O1xyXG4gICAgfSxcclxuICAgIG9uSGlkZGVuKCkge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHBvcHVwQ29udGFpbmVyKTtcclxuICAgIH0sXHJcbiAgICB0aXRsZTogJ1N1YnZhbHVlcyBXaXphcmQnLFxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXM7XHJcbiAgY29uc3QgcG9wdXAgPSBuZXcgRGV2RXhwcmVzcy51aS5keFBvcHVwKHBvcHVwQ29udGFpbmVyLCBwb3B1cE9wdGlvbnMpO1xyXG4gIHBvcHVwLnNob3coKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhnYWd1ZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IElHYXVnZVN1YnZhbHVlc09wdGlvbnMge1xyXG4gIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGdhZ3VlSXRlbS5jdXN0b21Qcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5TmFtZSkgYXMgc3RyaW5nKSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG4gIGNvbnN0IGhhc1RhcmdldFZhbHVlID0gISFnYWd1ZUl0ZW0uZ2F1Z2VzKClbMF0/LnRhcmdldFZhbHVlKCk7XHJcblxyXG4gIGlmIChoYXNUYXJnZXRWYWx1ZSAmJiAoIWRhdGEuc3VidmFsdWVzIHx8ICFkYXRhLnN1YnZhbHVlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gLTEpKSkge1xyXG4gICAgZGF0YS5zdWJ2YWx1ZXMuc3BsaWNlKDAsIDAsIHtcclxuICAgICAga2V5OiAtMSxcclxuICAgICAgbmFtZTogJ1RhcmdldCBWYWx1ZScsXHJcbiAgICAgIGlzQm91bmQ6IGZhbHNlLFxyXG4gICAgICBtZWFzdXJlSWQ6ICcnLFxyXG4gICAgICB2YWx1ZTogMCxcclxuICAgICAgY29sb3I6IERFRkFVTFRfUEFMRVRURVsoZGF0YS5zdWJ2YWx1ZXM/Lmxlbmd0aCB8fCAwKSAlIChERUZBVUxUX1BBTEVUVEUubGVuZ3RoIC0gMSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF0YTtcclxufVxyXG5mdW5jdGlvbiBzZXRPcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtLCB2YWx1ZTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucykge1xyXG4gIHJldHVybiBnYXVnZUl0ZW0uY3VzdG9tUHJvcGVydGllcy5zZXRWYWx1ZShwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbn1cclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbmZ1bmN0aW9uIGNyZWF0ZUxpc3RBbmRUb29sYmFyKGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtLCBnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IFtKUXVlcnksIERldkV4cHJlc3MudWkuZHhMaXN0LCBEZXZFeHByZXNzLnVpLmR4VG9vbGJhcl0ge1xyXG4gIGNvbnN0ICRlbGVtZW50ID0gJCgnPGRpdiAvPicpO1xyXG4gIGNvbnN0ICR0b29sYmFyQ29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICRlbGVtZW50LmFwcGVuZCgkdG9vbGJhckNvbnRhaW5lcik7XHJcbiAgY29uc3QgZWRpdEJ1dHRvbiA9IG51bGw7XHJcbiAgbGV0IGxpc3Q6IERldkV4cHJlc3MudWkuZHhMaXN0ID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdG9vbGJhck9wdGlvbnMgPSB7XHJcbiAgICBpdGVtczogW3tcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBpY29uOiAnYWRkJyxcclxuICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxyXG4gICAgICAgIG9uQ2xpY2soZSkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IG9wdGlvbnMuc3VidmFsdWVzLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiBhY2MgPCBpdGVtLmtleSA/IGl0ZW0ua2V5IDogYWNjLCAwKSArIDE7XHJcbiAgICAgICAgICBjb25zdCBuZXdTdWJ2YWx1ZTogSVN1YnZhbHVlT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICBuYW1lOiBgU3VidmFsdWUgJHtrZXl9YCxcclxuICAgICAgICAgICAgaXNCb3VuZDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1lYXN1cmVJZDogJycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjb2xvcjogREVGQVVMVF9QQUxFVFRFW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAlIChERUZBVUxUX1BBTEVUVEUubGVuZ3RoIC0gMSldLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIG5ld1N1YnZhbHVlKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBpdGVtSW5EYXRhU291cmNlID0gb3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmtleSA9PT0gbmV3U3VidmFsdWUua2V5KVswXTtcclxuICAgICAgICAgIGlmICghaXRlbUluRGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnN1YnZhbHVlcy5wdXNoKG5ld1N1YnZhbHVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihpdGVtSW5EYXRhU291cmNlKTtcclxuICAgICAgICAgICAgb3B0aW9uc1tpbmRleF0gPSBuZXdTdWJ2YWx1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICBsaXN0LnJlbG9hZCgpO1xyXG4gICAgICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICB9XVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJPcHRpb25zO1xyXG5cclxuICBjb25zdCB1cGRhdGVUb29sYmFyU3RhdGUgPSAoaGFzU2VsZWN0ZWRJdGVtOiBib29sZWFuKSA9PiB7XHJcbiAgICBlZGl0QnV0dG9uICYmIGVkaXRCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFoYXNTZWxlY3RlZEl0ZW0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHRvb2xiYXIgPSBuZXcgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIoJHRvb2xiYXJDb250YWluZXIsIHRvb2xiYXJPcHRpb25zKTtcclxuICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgY29uc3QgbGlzdE9wdGlvbnMgPSB7XHJcbiAgICBkYXRhU291cmNlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICBsb2FkOiAoKSA9PiBnZXRPcHRpb25zKGdhdWdlSXRlbSkuc3VidmFsdWVzLFxyXG4gICAgICByZW1vdmU6ICgpID0+IHsgfVxyXG4gICAgfSBhcyBhbnkpLFxyXG4gICAgZGlzcGxheUV4cHI6ICduYW1lJyxcclxuICAgIGhlaWdodDogJzIwMHB4JyxcclxuICAgIGtleUV4cHI6ICdrZXknLFxyXG4gICAgbm9EYXRhVGV4dDogJ0FkZCBhIFN1YnZhbHVlJyxcclxuICAgIGFsbG93SXRlbURlbGV0aW5nOiB0cnVlLFxyXG4gICAgaXRlbURlbGV0ZU1vZGU6ICdzdGF0aWMnLFxyXG4gICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXHJcbiAgICBvbkNvbnRlbnRSZWFkeShlKSB7IHVwZGF0ZVRvb2xiYXJTdGF0ZSghIWUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJykpOyB9LFxyXG4gICAgb25JdGVtUmVuZGVyZWQoZSkge1xyXG4gICAgICBjb25zdCBpdGVtRGF0YSA9IGUuaXRlbURhdGEgYXMgSVN1YnZhbHVlT3B0aW9ucztcclxuICAgICAgaWYgKGl0ZW1EYXRhLmtleSA9PT0gLTEpIHtcclxuICAgICAgICBjb25zdCBkZWxldGVFbGVtZW50ID0gZS5pdGVtRWxlbWVudFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkeC1saXN0LXN0YXRpYy1kZWxldGUtYnV0dG9uLWNvbnRhaW5lcicpWzBdIGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgICAgIGRlbGV0ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlZChlKSB7XHJcbiAgICAgIHVwZGF0ZVRvb2xiYXJTdGF0ZSghIWUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJykpO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpO1xyXG4gICAgICBmb3JtLm9wdGlvbignZm9ybURhdGEnLCBzZWxlY3RlZEl0ZW0pO1xyXG4gICAgICBjb25zdCB3YXNmb3JtVmlzaWJsZSA9IGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJztcclxuICAgICAgY29uc3Qgc2hvdWxkRm9ybUJlVmlzaWJsZSA9ICEhc2VsZWN0ZWRJdGVtO1xyXG4gICAgICBpZiAoIXdhc2Zvcm1WaXNpYmxlICYmIHNob3VsZEZvcm1CZVZpc2libGUgfHwgd2FzZm9ybVZpc2libGUgJiYgIXNob3VsZEZvcm1CZVZpc2libGUpIHtcclxuICAgICAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5Jywgc2hvdWxkRm9ybUJlVmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25JdGVtRGVsZXRlZDogKGUpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcclxuICAgICAgY29uc3Qga2V5ID0gZS5pdGVtRGF0YS5rZXk7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHN1YnZhbHVlKSA9PiBzdWJ2YWx1ZS5rZXkgPT09IGtleSlbMF0pO1xyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICAgIGxpc3QucmVsb2FkKCk7XHJcbiAgICAgIGxpc3Qub3B0aW9uKCdzZWxlY3RlZEl0ZW0nLCBvcHRpb25zLnN1YnZhbHVlc1tvcHRpb25zLnN1YnZhbHVlcy5sZW5ndGggLSAxXSk7XHJcbiAgICB9XHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4TGlzdE9wdGlvbnM7XHJcblxyXG4gIGNvbnN0ICRsaXN0Q29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICRlbGVtZW50LmFwcGVuZCgkbGlzdENvbnRhaW5lcik7XHJcblxyXG4gIGxpc3QgPSBuZXcgRGV2RXhwcmVzcy51aS5keExpc3QoJGxpc3RDb250YWluZXIsIGxpc3RPcHRpb25zKTtcclxuXHJcbiAgcmV0dXJuIFskZWxlbWVudCwgbGlzdCwgdG9vbGJhcl07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFN1YnZhbHVlRm9ybU9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gIGxldCBpdGVtc0xpc3Q6IERldkV4cHJlc3MudWkuZHhMaXN0IHwgbnVsbCA9IG51bGw7XHJcbiAgY29uc3QgdXBkYXRlRm9ybVN0YXRlID0gKGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtKSA9PiB7XHJcbiAgICBjb25zdCB2YWx1ZUVkaXRvciA9IGZvcm0uZ2V0RWRpdG9yKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgbWVhc3VyZUlkRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ21lYXN1cmVJZCcpO1xyXG4gICAgY29uc3QgbmFtZUVkaXRvciA9IGZvcm0uZ2V0RWRpdG9yKCduYW1lJyk7XHJcbiAgICBjb25zdCBpc0JvdW5kID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuaXNCb3VuZDtcclxuICAgIGNvbnN0IGlzVGFyZ2V0VmFsdWUgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKS5rZXkgPT09IC0xO1xyXG5cclxuICAgIHZhbHVlRWRpdG9yICYmIHZhbHVlRWRpdG9yLm9wdGlvbignZGlzYWJsZWQnLCBpc0JvdW5kKTtcclxuICAgIG1lYXN1cmVJZEVkaXRvciAmJiBtZWFzdXJlSWRFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsICFpc0JvdW5kKTtcclxuXHJcbiAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtJU19CT1VORF9JVEVNX0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAhaXNUYXJnZXRWYWx1ZSA/ICdmbGV4JyA6ICdub25lJyk7XHJcbiAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtWQUxVRV9JVEVNX0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAhaXNUYXJnZXRWYWx1ZSA/ICdmbGV4JyA6ICdub25lJyk7XHJcbiAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuXHJcbiAgICBuYW1lRWRpdG9yICYmIG5hbWVFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsIGlzVGFyZ2V0VmFsdWUpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBmb3JtRGF0YTogbnVsbCxcclxuICAgIGNvbENvdW50OiAyLFxyXG4gICAgaXRlbXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgIGNhcHRpb246ICdTdWJ2YWx1ZXMgaXRlbXMnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgY29uc3QgWyRjb250YWluZXIsIGxpc3RdID0gY3JlYXRlTGlzdEFuZFRvb2xiYXIoYXJncy5jb21wb25lbnQsIGdhdWdlSXRlbSk7XHJcbiAgICAgICAgICBpdGVtc0xpc3QgPSBsaXN0O1xyXG5cclxuICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnc3VidmFsdWVFZGl0b3InLFxyXG4gICAgICAgIGNzc0NsYXNzOiBDU1NfQ0xBU1MsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ0l0ZW0gb3B0aW9ucycsXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBOQU1FX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhUZXh0Qm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHZhbHVlQ2hhbmdlRXZlbnQ6ICdrZXl1cCdcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdpc0JvdW5kJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IElTX0JPVU5EX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhSYWRpb0dyb3VwJyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGxheW91dDogJ2hvcml6b250YWwnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogJ1VuYm91bmQnLCB2YWx1ZTogZmFsc2VcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnQm91bmQnLCB2YWx1ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFJhZGlvR3JvdXAuUHJvcGVydGllcyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBWQUxVRV9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVmFsdWUnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgc2hvd1NwaW5CdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhOdW1iZXJCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbWVhc3VyZUlkJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IE1FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0hpZGRlbiBtZWFzdXJlcycsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpdGVtczogZ2F1Z2VJdGVtLmhpZGRlbk1lYXN1cmVzKCkubWFwKChtZWFzdXJlKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlKSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBtZWFzdXJlLnVuaXF1ZU5hbWUoKVxyXG4gICAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIGNzc0NsYXNzOiBDT0xPUl9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnY29sb3InLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhDb2xvckJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0NvbG9yJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBvbkNvbnRlbnRSZWFkeShlKSB7IHVwZGF0ZUZvcm1TdGF0ZShlLmNvbXBvbmVudCk7IH0sXHJcbiAgICBvbkZpZWxkRGF0YUNoYW5nZWQoZSkge1xyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IGUuY29tcG9uZW50Lm9wdGlvbignZm9ybURhdGEnKSBhcyBJU3VidmFsdWVPcHRpb25zO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICBjb25zdCBlZGl0ZWRTdWJ2YWx1ZSA9IG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoc3VidmFsdWUpID0+IHN1YnZhbHVlLmtleSA9PT0gZm9ybURhdGEua2V5KVswXTtcclxuXHJcbiAgICAgIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmluZGV4T2YoZWRpdGVkU3VidmFsdWUpXSA9IGZvcm1EYXRhO1xyXG4gICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICBpZiAoZWRpdGVkU3VidmFsdWUgJiYgZWRpdGVkU3VidmFsdWUubmFtZSAhPT0gZm9ybURhdGEubmFtZSAmJiBpdGVtc0xpc3QpIHtcclxuICAgICAgICBpdGVtc0xpc3QucmVwYWludCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHVwZGF0ZUZvcm1TdGF0ZShlLmNvbXBvbmVudCk7XHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE1lYXN1cmVEaXNhcGxheVRleHQobWVhc3VyZTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuTWVhc3VyZSk6IHN0cmluZyB7XHJcbiAgaWYgKG1lYXN1cmUubmFtZSgpKSB7XHJcbiAgICByZXR1cm4gbWVhc3VyZS5uYW1lKCk7XHJcbiAgfVxyXG5cclxuICBsZXQgcmVzdWx0ID0gbWVhc3VyZS5kYXRhTWVtYmVyKCk7XHJcbiAgaWYgKG1lYXN1cmUuc3VtbWFyeVR5cGUgJiYgbWVhc3VyZS5zdW1tYXJ5VHlwZSgpKSB7XHJcbiAgICByZXN1bHQgKz0gYCAoJHttZWFzdXJlLnN1bW1hcnlUeXBlKCl9KWA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgY29uc3QgY3VycmVudFZpZXdUeXBlID0gZ2F1Z2VJdGVtLnZpZXdUeXBlKCk7XHJcbiAgY29uc3QgaW5kaWNhdG9yVHlwZXMgPSBMSU5FQVJfVklFV19UWVBFUy5zb21lKCh0KSA9PiB0ID09PSBjdXJyZW50Vmlld1R5cGUpXHJcbiAgICA/IExJTkVBUl9JTkRJQ0FUT1JfVFlQRVNcclxuICAgIDogQ0lSQ0xVQVJfSU5ESUNBVE9SX1RZUEVTO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZm9ybURhdGE6IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKSB8fCBudWxsLFxyXG4gICAgaXRlbXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIGNhcHRpb246ICdJbmRpY2F0b3Igb3B0aW9ucycsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAndHlwZScsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1R5cGUnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IGluZGljYXRvclR5cGVzLm1hcCgodCkgPT4gKHsgdGV4dDogdCwgdmFsdWU6IHQgfSkpLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnd2lkdGgnLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgc2hvd1NwaW5CdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhOdW1iZXJCb3hPcHRpb25zLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdXaWR0aCcsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBvbkZpZWxkRGF0YUNoYW5nZWQoZSkge1xyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IGUuY29tcG9uZW50Lm9wdGlvbignZm9ybURhdGEnKSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG5cclxuICAgICAgb3B0aW9ucy53aWR0aCA9IGZvcm1EYXRhLndpZHRoO1xyXG4gICAgICBvcHRpb25zLnR5cGUgPSBmb3JtRGF0YS50eXBlO1xyXG5cclxuICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuXHJcbi8vIDQuIEV2ZW50IFN1YnNjcmlwdGlvblxyXG5leHBvcnQgZnVuY3Rpb24gZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24odGhpczogYW55LCBkYXNoYm9hcmRDb250cm9sOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKSB7XHJcbiAgdGhpcy5uYW1lID0gJ0dhdWdlU3VidmFsdWVzJztcclxuICB0aGlzLnN0YXJ0ID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xyXG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xyXG4gICAgICB2aWV3ZXJBcGlFeHRlbnNpb24ub24oJ2l0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQnLCBvbkl0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCdpdGVtLW9wdGlvbnMtcGFuZWwnKSBhcyBhbnk7XHJcbiAgICBpZiAob3B0aW9uc1BhbmVsRXh0ZW5zaW9uKSB7XHJcbiAgICAgIG9wdGlvbnNQYW5lbEV4dGVuc2lvbi5vbignY3VzdG9taXplU2VjdGlvbnMnLCBvbkN1c3RvbWl6ZVNlY3Rpb25zKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHRoaXMuc3RvcCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHZpZXdlckFwaUV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbigndmlld2VyLWFwaScpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLlZpZXdlckFwaUV4dGVuc2lvbjtcclxuICAgIGlmICh2aWV3ZXJBcGlFeHRlbnNpb24pIHtcclxuICAgICAgdmlld2VyQXBpRXh0ZW5zaW9uLm9mZignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zUGFuZWxFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ2l0ZW0tb3B0aW9ucy1wYW5lbCcpIGFzIGFueTtcclxuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcclxuICAgICAgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uLm9mZignY3VzdG9taXplU2VjdGlvbnMnLCBvbkN1c3RvbWl6ZVNlY3Rpb25zKTtcclxuICAgIH1cclxuICB9O1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJRGFzaGJvYXJkUGVybWlzc2lvbnMsIElEYXNoYm9hcmRVcmxzLCBJUmVwb3J0UGFyYW1zIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IGdhdWdlU3VidmFsdWVzRXh0ZW5zaW9uIH0gZnJvbSAnLi9FeHRlbnNpb25zL0dhdWdlU3VidmFsdWVzRXh0ZW5zaW9uJztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmNvbnN0IERBU0hCT0FSRF9NT0RFX0tFWSA9ICdEQVNIQk9BUkRfTU9ERV9LRVknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGFzaGJvYXJkT3B0aW9ucyB7XHJcbiAgJGRhc2hib2FyZENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBwZXJtaXNzaW9uczogSURhc2hib2FyZFBlcm1pc3Npb25zO1xyXG4gIHVybHM6IElEYXNoYm9hcmRVcmxzO1xyXG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGRhc2hib2FyZENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbnM6IElEYXNoYm9hcmRQZXJtaXNzaW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVybHM6IElEYXNoYm9hcmRVcmxzO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGRhc2hib2FyZDogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGFzaGJvYXJkT3B0aW9ucykge1xyXG4gICAgdGhpcy4kZGFzaGJvYXJkQ29udGFpbmVyID0gb3B0aW9ucy4kZGFzaGJvYXJkQ29udGFpbmVyO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMucmVwb3J0SWQgPSBvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICAgIHRoaXMucGVybWlzc2lvbnMgPSBvcHRpb25zLnBlcm1pc3Npb25zO1xyXG4gICAgdGhpcy51cmxzID0gb3B0aW9ucy51cmxzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVwb3J0SWRTdHIgPSB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCAmJiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZC50b1N0cmluZygpO1xyXG5cclxuICAgIERldkV4cHJlc3MuRGFzaGJvYXJkLlJlc291cmNlTWFuYWdlci5lbWJlZEJ1bmRsZWRSZXNvdXJjZXMoKTtcclxuXHJcbiAgICBsZXQgbW9kZTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuV29ya2luZ01vZGUgPSB0aGlzLnBlcm1pc3Npb25zLkFsbG93RWRpdGluZ1xyXG4gICAgICA/IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSB8fCAnVmlld2VyJ1xyXG4gICAgICA6ICdWaWV3ZXInO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcucmVwb3J0LWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5PVEU6IERhc2hib2FyZCAxOC4xIGRvZXNuJ3Qgc3VwcG9ydCBleHBvcnQuIFdlIGhpZGUgdGhlIGV4cG9ydCBidXR0b24gdmlhIHN0eWxlc1xyXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCh0aGlzLiRkYXNoYm9hcmRDb250YWluZXJbMF0sIHtcclxuICAgICAgd29ya2luZ01vZGU6IG1vZGUsXHJcbiAgICAgIGluaXRpYWxEYXNoYm9hcmRJZDogcmVwb3J0SWRTdHIsXHJcbiAgICAgIGVuZHBvaW50OiB0aGlzLnVybHMuRW5kUG9pbnQsXHJcbiAgICAgIGFqYXhSZW1vdGVTZXJ2aWNlOiB7XHJcbiAgICAgICAgaGVhZGVyczogIXRoaXMucmVwb3J0UGFyYW1zLlRva2VuID8gdW5kZWZpbmVkIDoge1xyXG4gICAgICAgICAgdG9rZW46IHRoaXMucmVwb3J0UGFyYW1zLlRva2VuXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkRhc2hib2FyZEluaXRpYWxpemluZzogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcG9ydElkU3RyICE9PSBlLmRhc2hib2FyZElkKSB7XHJcbiAgICAgICAgICByZXBvcnRJZFN0ciA9IGUuZGFzaGJvYXJkSWQ7XHJcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGVuY29kZVVSSSh0aGlzLnVybHMuUHJldmlld1VybCArIGUuZGFzaGJvYXJkSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25CZWZvcmVSZW5kZXI6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQucmVnaXN0ZXJFeHRlbnNpb24obmV3IERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRleHRCb3hJdGVtRWRpdG9yRXh0ZW5zaW9uKGUuY29tcG9uZW50KSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGV4dGVuc2lvbnM6IHtcclxuICAgICAgICAnZGF0YS1zb3VyY2Utd2l6YXJkJzoge1xyXG4gICAgICAgICAgZW5hYmxlQ3VzdG9tU3FsOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnZGFzaGJvYXJkLWV4cG9ydCc6IHtcclxuICAgICAgICAgIGFsbG93RXhwb3J0RGFzaGJvYXJkSXRlbXM6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXRhLWluc3BlY3Rvcic6IHtcclxuICAgICAgICAgIGFsbG93SW5zcGVjdEFnZ3JlZ2F0ZWREYXRhOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dJbnNwZWN0UmF3RGF0YTogdHJ1ZSxcclxuICAgICAgICAgIG9uR3JpZEluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncmlkID0gZS5jb21wb25lbnQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gICAgICAgICAgICBncmlkLm9wdGlvbignZXhwb3J0LmVuYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZGFzaGJvYXJkLnJlbmRlcigpO1xyXG5cclxuICAgIGlmICh0aGlzLnBlcm1pc3Npb25zLkFsbG93RWRpdGluZykge1xyXG4gICAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6IG1vZGUgPT09ICdWaWV3ZXInID8gJ1N3aXRjaCB0byBEZXNpZ25lcicgOiAnU3dpdGNoIHRvIFZpZXdlcicsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgbW9kZSA9IG1vZGUgPT09ICdWaWV3ZXInID8gJ0Rlc2lnbmVyJyA6ICdWaWV3ZXInO1xyXG5cclxuICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCBtb2RlKTtcclxuXHJcbiAgICAgICAgICBpZiAobW9kZSA9PT0gJ1ZpZXdlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9WaWV3ZXIoKTtcclxuICAgICAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsICdTd2l0Y2ggdG8gRGVzaWduZXInKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkLnN3aXRjaFRvRGVzaWduZXIoKTtcclxuICAgICAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsICdTd2l0Y2ggdG8gVmlld2VyJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKHRoaXMuZGFzaGJvYXJkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gJiYgKHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCQoJy5yZXBvcnQtcmVmcmVzaC1idXR0b24nKSwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXNoYm9hcmQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZGFzaGJvYXJkID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBEQVNIQk9BUkRfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydElkO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFzaGJvYXJkPy5yZWZyZXNoKCk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVSZWR1bmRhbnRUb29sYm94SXRlbXMoY29udHJvbDogRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGFzaGJvYXJkQ29udHJvbCkge1xyXG4gIGNvbnN0IGl0ZW1zVG9SZW1vdmUgPSBbJ2NyZWF0ZS1kYXNoYm9hcmQnLCAnb3Blbi1kYXNoYm9hcmQnXTtcclxuICBjb25zdCB0b29sYm94ID0gY29udHJvbC5maW5kRXh0ZW5zaW9uKCd0b29sYm94JykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVG9vbGJveEV4dGVuc2lvbjtcclxuICBpdGVtc1RvUmVtb3ZlLmZvckVhY2goKGl0ZW1JZCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbSA9IHRvb2xib3gubWVudUl0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLmlkID09PSBpdGVtSWQpWzBdO1xyXG5cclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRvb2xib3gucmVtb3ZlTWVudUl0ZW0oaXRlbUlkKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHYW50dENoYXJ0T3B0aW9ucyB7XHJcbiAgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBzaG93SGVhZGVyOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0VGFzayB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBQYXJlbnRJZDogbnVtYmVyO1xyXG4gIFRpdGxlOiBzdHJpbmc7XHJcbiAgU3RhcnQ6IERhdGU7XHJcbiAgRW5kOiBEYXRlO1xyXG4gIFByb2dyZXNzOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHREZXBlbmRlbmN5XHJcbntcclxuICBJZDogbnVtYmVyO1xyXG4gIFByZWRlY2Vzc29ySWQ6IG51bWJlcjtcclxuICBTdWNjZXNzb3JJZDogbnVtYmVyO1xyXG4gIFR5cGU6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlQXNzaWdubWVudCB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBUYXNrSWQ6IG51bWJlcjtcclxuICBSZXNvdXJjZUlkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDaGFydERhdGFNb2RlbCB7XHJcbiAgVGFza3M6IElHYW50dFRhc2tbXTtcclxuICBEZXBlbmRlbmNpZXM6IElHYW50dERlcGVuZGVuY3lbXTtcclxuICBSZXNvdXJjZXM6IElHYW50dFJlc291cmNlW107XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50czogSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDb2x1bW5TdGF0ZSB7XHJcbiAgZGF0YUZpZWxkPzogc3RyaW5nO1xyXG4gIGRhdGFUeXBlPzogR3JpZERhdGFDb2x1bW5EYXRhVHlwZTtcclxuICB3aWR0aD86IHN0cmluZztcclxuICBzb3J0SW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydE9yZGVyPzogc3RyaW5nO1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdmlzaWJsZT86IGJvb2xlYW47XHJcbiAgdmlzaWJsZUluZGV4PzogbnVtYmVyO1xyXG4gIHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFNldHRpbmdzIHtcclxuICBUYXNrQ29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSxcclxuICBEYkNvbm5lY3Rpb25OYW1lOiBzdHJpbmcsXHJcbiAgVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzS2V5RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZXNUZXh0RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWU6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZDogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzVGFibGVOYW1lOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzS2V5RmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkOiBzdHJpbmc7XHJcbiAgRGVwZW5kZW5jaWVzVHlwZUZpZWxkOiBzdHJpbmc7XHJcblxyXG4gIFRhc2tUaXRsZVBvc2l0aW9uOiBEZXZFeHByZXNzLnVpLmR4R2FudHQuR2FudHRUYXNrVGl0bGVQb3NpdGlvbjtcclxuICBTY2FsZVR5cGU6IERldkV4cHJlc3MudWkuZHhHYW50dC5HYW50dFNjYWxlVHlwZTtcclxuICBTdGFydERhdGVSYW5nZTogc3RyaW5nO1xyXG4gIEVuZERhdGVSYW5nZTogc3RyaW5nO1xyXG59XHJcblxyXG5lbnVtIEdhbnR0VGFza3NDb2x1bW5UeXBlXHJcbntcclxuICBLZXkgPSAxLFxyXG4gIFRpdGxlID0gMixcclxuICBTdGFydCA9IDMsXHJcbiAgRW5kID0gNCxcclxuICBQYXJlbnRJZCA9IDUsXHJcbiAgUHJvZ3Jlc3MgPSA2XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbm50Q2hhcnQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBDSEFSVF9TVE9SQUdFX01PREVfS0VZID0gJ0NIQVJUX1NUT1JBR0VfTU9ERV9LRVknO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0UG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dIZWFkZXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcbiAgcHJpdmF0ZSBoYXNGb3JtID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgY2hhcnQ6IERldkV4cHJlc3MudWkuZHhHYW50dCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR2FudHRDaGFydE9wdGlvbnMpIHtcclxuICAgIHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlciA9IG9wdGlvbnMuY2hhcnRQb3NpdGlvbk1hcmtlcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybDtcclxuICAgIHRoaXMuc2hvd0hlYWRlciA9IG9wdGlvbnMuc2hvd0hlYWRlcjtcclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MgPSB7XHJcbiAgICAgIERiQ29ubmVjdGlvbk5hbWU6ICcnLCBUYWJsZU5hbWU6ICcnLCBUYXNrQ29sdW1uczogW10sXHJcbiAgICAgIFJlc291cmNlc1RhYmxlTmFtZTogJycsIFJlc291cmNlc1RleHRGaWVsZDogJycsIFJlc291cmNlc0tleUZpZWxkOiAnJyxcclxuICAgICAgUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQ6ICcnLCBSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQ6ICcnLCBSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZTogJycsXHJcbiAgICAgIERlcGVuZGVuY2llc0tleUZpZWxkOiAnJywgRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkOiAnJywgRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZDogJycsIERlcGVuZGVuY2llc1RhYmxlTmFtZTogJycsIERlcGVuZGVuY2llc1R5cGVGaWVsZDogJycsXHJcbiAgICAgIEVuZERhdGVSYW5nZTogdm9pZCAwLCBTdGFydERhdGVSYW5nZTogdm9pZCAwLCBUYXNrVGl0bGVQb3NpdGlvbjogJ291dHNpZGUnLCBTY2FsZVR5cGU6ICdhdXRvJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdID0gW107XHJcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IElHYW50dFNldHRpbmdzKSA9PiB7XHJcbiAgICAgICAgZ2FudHRTZXR0aW5ncyA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmKCFnYW50dFNldHRpbmdzLkRiQ29ubmVjdGlvbk5hbWUgfHwgIWdhbnR0U2V0dGluZ3MuVGFibGVOYW1lIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IFtdO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gPSAwOyBpdGVtIDwgNjsgaXRlbSsrKSB7XHJcbiAgICAgICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMucHVzaCh7IHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZVtHYW50dFRhc2tzQ29sdW1uVHlwZVtpdGVtKzFdXSB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhLlRhc2tDb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGNvbHVtbnNbYy50YXNrQ29sdW1uVHlwZS0xXSA9IGM7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgPSBjb2x1bW5zO1xyXG5cclxuICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hEYXRhKCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKChkYXRhOiB7IERhdGE6IElHYW50dENoYXJ0RGF0YU1vZGVsIH0pID0+IHtcclxuICAgICAgICBpZighaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5tb2RlID09PSBNb2RlLkRlc2lnbmVyKSB7XHJcbiAgICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCAhaXNJbml0aWFsaXplZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHVwQ2hhcnQoY29sdW1ucywgZ2FudHRTZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKGRhdGEuRGF0YSk7XHJcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCB0cnVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5kaWFncmFtLWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaERhdGEoKSB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdhbnR0Q2hhcnREYXRhYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZvcm0oZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MsIGluaXRpYWxTZXR1cDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5oYXNGb3JtID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtSXRlbXM6IERldkV4cHJlc3MudWkuZHhGb3JtLkl0ZW1bXSA9IFtcclxuICAgICAgeyBkYXRhRmllbGQ6ICdEYkNvbm5lY3Rpb25OYW1lJywgY2FwdGlvbjogJ0Nvbm5lY3Rpb24gTmFtZScgfSxcclxuICAgICAgeyBkYXRhRmllbGQ6ICdUYWJsZU5hbWUnLCBjYXB0aW9uOiAnVGFibGUnIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIGZvciAobGV0IGl0ZW0gPSAxOyBpdGVtIDwgNzsgaXRlbSsrKSB7XHJcbiAgICAgIGZvcm1JdGVtcy5wdXNoKHsgaXRlbVR5cGU6ICdncm91cCcsIGNvbENvdW50OiA4LCBpdGVtczogW1xyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnRhc2tDb2x1bW5UeXBlYCwgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhRmllbGRgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6IGAke0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW1dfSBEYXRhIEZpZWxkYCB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uY2FwdGlvbmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0NhcHRpb24nIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhVHlwZWAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0RhdGFUeXBlJyB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0ud2lkdGhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdXaWR0aCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRJbmRleGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRJbmRleCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRPcmRlcmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRPcmRlcicgfSwgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JywgZWRpdG9yT3B0aW9uczogeyBpdGVtczogWydhc2MnLCAnZGVzYyddLCBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXMgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS52aXNpYmxlYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZScgfSwgZWRpdG9yVHlwZTogJ2R4Q2hlY2tCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udmlzaWJsZUluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZUluZGV4JyB9IH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnUmVzb3VyY2VzJyxcclxuICAgICAgY29sQ291bnQ6IDQsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgLHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzS2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RleHRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RleHQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlIEFzc2lnbm1lbnRzJyxcclxuICAgICAgY29sQ291bnQ6IDUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFzayBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnUmVzb3VyY2UgSWQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ0RlcGVuZGVuY2llcycsXHJcbiAgICAgIGNvbENvdW50OiA2LFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzVGFibGVOYW1lJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFibGUnIH0sIGNvbFNwYW46IDIgfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc0tleUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnS2V5IEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdQcmVkZWNlc3NvciBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1N1Y2Nlc3NvciBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzVHlwZUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnRGVwZW5kZW5jeSBUeXBlIEZpZWxkJyB9IH1cclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zYXZlRm9ybURhdGEoZm9ybSkudGhlbigoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKFxyXG4gICAgICB7XHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ0FwcGVhcmFuY2UnLFxyXG4gICAgICAgIGNvbENvdW50OiA1LFxyXG4gICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1Rhc2tUaXRsZVBvc2l0aW9uJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBpdGVtczogWydpbnNpZGUnLCAnb3V0c2lkZScsICdub25lJ11cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1NjYWxlVHlwZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgaXRlbXM6IFsnYXV0bycsICdtaW51dGVzJywgJ2hvdXJzJywgJ2RheXMnLCAnd2Vla3MnLCAnbW9udGhzJywgJ3F1YXJ0ZXJzJywgJ3llYXJzJ11cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1N0YXJ0RGF0ZVJhbmdlJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeERhdGVCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IHNob3dDbGVhckJ1dHRvbjogdHJ1ZSB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRlQm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ0VuZERhdGVSYW5nZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyB9LFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhEYXRlQm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0ZUJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgICAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVXBkYXRlJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZighdGhpcy5jaGFydCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5iZWdpblVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5vcHRpb24oe1xyXG4gICAgICAgICAgICAgICAgICBzY2FsZVR5cGU6IGRhdGEuU2NhbGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICB0YXNrVGl0bGVQb3NpdGlvbjogZGF0YS5UYXNrVGl0bGVQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgc3RhcnREYXRlUmFuZ2U6IGRhdGEuU3RhcnREYXRlUmFuZ2UgPyBuZXcgRGF0ZShkYXRhLlN0YXJ0RGF0ZVJhbmdlKSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgIGVuZERhdGVSYW5nZTogZGF0YS5FbmREYXRlUmFuZ2UgPyBuZXcgRGF0ZShkYXRhLkVuZERhdGVSYW5nZSkgOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0LmVuZFVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydC5yZXBhaW50KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybURhdGEoZm9ybSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2IC8+JykuY3NzKCdwYWRkaW5nJywgMjApLmluc2VydEFmdGVyKHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlcikuZHhGb3JtKHtcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiBpbml0aWFsU2V0dXAgPyAnY2FsYygxMDAlIC0gNTBweCknIDogJ2NhbGMoNTAlIC0gNTBweCknLFxyXG4gICAgICBmb3JtRGF0YTogZ2FudHRTZXR0aW5ncyxcclxuICAgICAgc2Nyb2xsaW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgaXRlbXM6IGZvcm1JdGVtc1xyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlRm9ybURhdGEoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0pIHtcclxuICAgIGNvbnN0IGRhdGEgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKSBhcyBJR2FudHRTZXR0aW5ncztcclxuXHJcbiAgICBpZiAoZGF0YS5UYXNrQ29sdW1ucykge1xyXG4gICAgICBkYXRhLlRhc2tDb2x1bW5zID0gZGF0YS5UYXNrQ29sdW1ucy5maWx0ZXIoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vVXBkYXRlR2FudHRDaGFydFNldHRpbmdzYCwgJ3Bvc3QnLCB7XHJcbiAgICAgIGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCxcclxuICAgICAgc2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpKVxyXG4gICAgfSwgdHJ1ZSwgeyBkYXRhVHlwZTogJ2pzb24nIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cENoYXJ0IChjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdLCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncykge1xyXG4gICAgbGV0IHRvdGFsV2lkdGggPSAwO1xyXG4gICAgbGV0IHVzZUF1dG9XaWR0aCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbnNNYXBwaW5nID0ge307XHJcblxyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgIGlmIChjLnRhc2tDb2x1bW5UeXBlKSB7XHJcbiAgICAgICAgY29sdW1uc01hcHBpbmdbYy50YXNrQ29sdW1uVHlwZV0gPSBjLmRhdGFGaWVsZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICBjb25zdCB3ID0gcGFyc2VJbnQoYy53aWR0aCk7XHJcblxyXG4gICAgICBpZighaXNOYU4odykpIHtcclxuICAgICAgICB0b3RhbFdpZHRoICs9IHc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXNlQXV0b1dpZHRoID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jaGFydCA9IHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlci5keEdhbnR0KHtcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmhhc0Zvcm0gPyAnNTAlJyA6ICdjYWxjKDEwMCUgLSA2MHB4KScsXHJcbiAgICAgIGZpcnN0RGF5T2ZXZWVrOiA2LFxyXG4gICAgICB0YXNrTGlzdFdpZHRoOiAoIXVzZUF1dG9XaWR0aCAmJiB0b3RhbFdpZHRoID4gMCkgPyB0b3RhbFdpZHRoIDogdm9pZCAwLFxyXG4gICAgICB0b29sYmFyOiB7XHJcbiAgICAgICAgaXRlbXM6IFsnem9vbUluJywgJ3pvb21PdXQnLCAnc2VwYXJhdG9yJywgJ3Rhc2tEZXRhaWxzJ11cclxuICAgICAgfSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgc3RhcnREYXRlUmFuZ2U6IGdhbnR0U2V0dGluZ3MuU3RhcnREYXRlUmFuZ2UgPyBuZXcgRGF0ZShnYW50dFNldHRpbmdzLlN0YXJ0RGF0ZVJhbmdlKSA6IHZvaWQgMCxcclxuICAgICAgZW5kRGF0ZVJhbmdlOiBnYW50dFNldHRpbmdzLkVuZERhdGVSYW5nZSA/IG5ldyBEYXRlKGdhbnR0U2V0dGluZ3MuRW5kRGF0ZVJhbmdlKSA6IHZvaWQgMCxcclxuICAgICAgc2NhbGVUeXBlOiBnYW50dFNldHRpbmdzLlNjYWxlVHlwZSxcclxuICAgICAgdGFza1RpdGxlUG9zaXRpb246IGdhbnR0U2V0dGluZ3MuVGFza1RpdGxlUG9zaXRpb24sXHJcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IGMuZGF0YUZpZWxkLFxyXG4gICAgICAgICAgZGF0YVR5cGU6IGMuZGF0YVR5cGUsXHJcbiAgICAgICAgICB3aWR0aDogYy53aWR0aCxcclxuICAgICAgICAgIHZpc2libGVJbmRleDogYy52aXNpYmxlSW5kZXgsXHJcbiAgICAgICAgICBzb3J0SW5kZXg6IGMuc29ydEluZGV4LFxyXG4gICAgICAgICAgc29ydE9yZGVyOiBjLnNvcnRPcmRlciAmJiAoYy5zb3J0T3JkZXIgPT09ICdhc2MnID8gJ2FzYycgOiAnZGVzYycpLFxyXG4gICAgICAgICAgY2FwdGlvbjogYy5jYXB0aW9uIHx8IHZvaWQgMFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0Q29sdW1uXHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXNrczoge1xyXG4gICAgICAgIGtleUV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLktleV0sXHJcbiAgICAgICAgc3RhcnRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5TdGFydF0sXHJcbiAgICAgICAgZW5kRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuRW5kXSxcclxuICAgICAgICBwYXJlbnRJZEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlBhcmVudElkXSxcclxuICAgICAgICBwcm9ncmVzc0V4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlByb2dyZXNzXSxcclxuICAgICAgICB0aXRsZUV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlRpdGxlXVxyXG4gICAgICB9LFxyXG4gICAgICBkZXBlbmRlbmNpZXM6IHtcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc0tleUZpZWxkLFxyXG4gICAgICAgIHByZWRlY2Vzc29ySWRFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZCxcclxuICAgICAgICBzdWNjZXNzb3JJZEV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzU3VjY2Vzc29ySWRGaWVsZCxcclxuICAgICAgICB0eXBlRXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNUeXBlRmllbGRcclxuICAgICAgfSxcclxuICAgICAgcmVzb3VyY2VzOiB7XHJcbiAgICAgICAga2V5RXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZXNLZXlGaWVsZCxcclxuICAgICAgICB0ZXh0RXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZXNUZXh0RmllbGRcclxuICAgICAgfSxcclxuICAgICAgcmVzb3VyY2VBc3NpZ25tZW50czoge1xyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQsXHJcbiAgICAgICAgcmVzb3VyY2VJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkLFxyXG4gICAgICAgIHRhc2tJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGRcclxuICAgICAgfSxcclxuICAgIH0pLmR4R2FudHQoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uICYmIG5ldyBSZWZyZXNoQnV0dG9uKCQoJy5yZXBvcnQtcmVmcmVzaC1idXR0b24nKSwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVEYXRhKGRhdGE6IElHYW50dENoYXJ0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICBpZighdGhpcy5jaGFydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ3Rhc2tzLmRhdGFTb3VyY2UnLCBkYXRhLlRhc2tzKTtcclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCdkZXBlbmRlbmNpZXMuZGF0YVNvdXJjZScsIGRhdGEuRGVwZW5kZW5jaWVzKTtcclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCdyZXNvdXJjZXMuZGF0YVNvdXJjZScsIGRhdGEuUmVzb3VyY2VzKTtcclxuICAgIHRoaXMuY2hhcnQub3B0aW9uKCdyZXNvdXJjZUFzc2lnbm1lbnRzLmRhdGFTb3VyY2UnLCBkYXRhLlJlc291cmNlQXNzaWdubWVudHMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmZldGNoRGF0YSgpLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVEYXRhKGRhdGEuRGF0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFydD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5jaGFydCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkNIQVJUX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmNvbnN0IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbmNvbnN0IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuY29uc3QgU0VTU0lPTl9TVE9SQUdFX01PREVfS0VZID0gJ3JlcG9ydE1vZGUnO1xyXG5jb25zdCBDVVJSRU5UX1VSTF9LRVkgPSAnY3VzdG9tQ3VycmVudFVybCc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IGR4UmVwb3J0RGVzaWduZXI6IGFueTtcclxuY29uc3Qga28gPSAod2luZG93IGFzIGFueSkua287XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXBvcnRPcHRpb25zIHtcclxuICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZXBvcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRyZXBvcnRDb250YWluZXIgPSBvcHRpb25zLiRyZXBvcnRDb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZGVzaWduZXJNb2RlbFVybCA9IG9wdGlvbnMuZGVzaWduZXJNb2RlbFVybDtcclxuICAgIHRoaXMucmVwb3J0SWQgPSBvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcblxyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gICAgbGV0IGJ1dHRvbiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgbW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnN3aXRjaE1vZGUobW9kZSwgYnV0dG9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jcmVhdGVSZXBvcnREZXNpZ25lcih0aGlzLiRyZXBvcnRDb250YWluZXIsIHRoaXMuZGVzaWduZXJNb2RlbFVybCwgJ2R4UmVwb3J0RGVzaWduZXInLCB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZC50b1N0cmluZygpLCAocykgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZSwgYnV0dG9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCBtb2RlID09PSBNb2RlLlZpZXdlcik7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzTm90U2F2ZWRSZXBvcnQgPSBkeFJlcG9ydERlc2lnbmVyICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpLmlzRGlydHk7XHJcblxyXG4gICAgICBpZiAoaXNOb3RTYXZlZFJlcG9ydCkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSByZXBvcnQgZG9jdW1lbnQgaXMgbm90IHNhdmVkLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhlIHBhZ2U/JztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIpIHtcclxuICAgIGNvbnN0IHJlcG9ydFByZXZpZXcgPSBkZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3O1xyXG4gICAgY29uc3QgUmVwb3J0UHJldmlld1NlcnZpY2UgPSAoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5JbnRlcm5hbC5SZXBvcnRQcmV2aWV3U2VydmljZTtcclxuXHJcbiAgICByZXBvcnRQcmV2aWV3LmluaXRpYWxpemUoUmVwb3J0UHJldmlld1NlcnZpY2UuaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIuZGVzaWduZXJNb2RlbC5tb2RlbCgpKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaE1vZGUobW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XHJcbiAgICBpZiAobW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhkeFJlcG9ydERlc2lnbmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcuZGVhY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlLCBidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGU6IE1vZGUsIGJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbikge1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJlcG9ydERlc2lnbmVyKFxyXG4gICAgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5LFxyXG4gICAgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nLFxyXG4gICAgZ2xvYmFsTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0SWRTdHI6IHN0cmluZyxcclxuICAgIG9uSW5pdEhhbmRsZXI6IChzZW5kZXI6IGFueSkgPT4gdm9pZCxcclxuICAgIGlzUHJldmlld01vZGU6IGJvb2xlYW5cclxuICApOiBKUXVlcnk8SFRNTEVsZW1lbnQ+IHtcclxuICAgIGNvbnN0IGRlc2lnbmVyID0gJHJlcG9ydENvbnRhaW5lclxyXG4gICAgICAuYXR0cignZGF0YS1iaW5kJywgJ2R4UmVwb3J0RGVzaWduZXI6IGRlc2lnbmVyT3B0aW9ucycpXHJcbiAgICAgIC5hZGRDbGFzcygncmVwb3J0LWRlc2lnbmVyJyk7XHJcblxyXG4gICAgY29uc3QgZGVzaWduZXJPcHRpb25zID0ge1xyXG4gICAgICByZXBvcnRVcmw6IHJlcG9ydElkU3RyLFxyXG4gICAgICByZXF1ZXN0T3B0aW9uczoge1xyXG4gICAgICAgIGdldERlc2lnbmVyTW9kZWxBY3Rpb246IGRlc2lnbmVyTW9kZWxVcmxcclxuICAgICAgfSxcclxuICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgQmVmb3JlUmVuZGVyOiAocykgPT4ge1xyXG4gICAgICAgICAgKHdpbmRvdyBhcyBhbnkpW2dsb2JhbE5hbWVdID0gcztcclxuXHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICBzLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlIDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBvbkluaXRIYW5kbGVyKHMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuQ3VzdG9taXplTWVudUFjdGlvbnMsXHJcbiAgICAgICAgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zOiB0aGlzLlByZXZpZXdDdXN0b21pemVNZW51QWN0aW9ucyxcclxuICAgICAgICBSZXBvcnRPcGVuZWQ6IChzLCBlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQcmV2aWV3KHMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuUmVwb3J0T3BlbmVkKHMsIGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgUmVwb3J0VGFiQ2xvc2VkOiB0aGlzLlJlcG9ydFRhYkNsb3NlZFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGtvLmFwcGx5QmluZGluZ3MoeyBkZXNpZ25lck9wdGlvbnMgfSwgZGVzaWduZXJbMF0pO1xyXG5cclxuICAgIHJldHVybiBkZXNpZ25lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IHNob3dEZXNpZ25lckl0ZW0gPSBlLkdldEJ5SWQoKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuVmlld2VyLkFjdGlvbklkLkRlc2lnbik7XHJcblxyXG4gICAgaWYgKHNob3dEZXNpZ25lckl0ZW0pIHtcclxuICAgICAgc2hvd0Rlc2lnbmVySXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEN1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IEFjdGlvbklkID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZDtcclxuICAgIGNvbnN0IGFjdGlvbklkc1RvTW92ZUluVG9vbGJhcjogc3RyaW5nW10gPSBbQWN0aW9uSWQuU2F2ZV07XHJcbiAgICBjb25zdCBhY3Rpb25JZHNUb0hpZGU6IHN0cmluZ1tdID0gW0FjdGlvbklkLk5ld1JlcG9ydCwgQWN0aW9uSWQuTmV3UmVwb3J0VmlhV2l6YXJkLCBBY3Rpb25JZC5PcGVuUmVwb3J0LFxyXG4gICAgICBBY3Rpb25JZC5QcmV2aWV3LCBBY3Rpb25JZC5TYXZlQXMsIEFjdGlvbklkLkV4aXRdO1xyXG5cclxuICAgIGFjdGlvbklkc1RvTW92ZUluVG9vbGJhci5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcclxuXHJcbiAgICAgIGlmIChpdGVtICYmIChpdGVtLmNvbnRhaW5lciA9PT0gJ21lbnUnKSkge1xyXG4gICAgICAgIGl0ZW0uY29udGFpbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhY3Rpb25JZHNUb0hpZGUuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IGUuR2V0QnlJZChpZCk7XHJcblxyXG4gICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzYXZlQWN0aW9uID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkFjdGlvbnMuQWN0aW9uSWQuU2F2ZSk7XHJcbiAgICBjb25zdCBvcmlnQ2xpY2tBY3Rpb24gPSBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uO1xyXG4gICAgc2F2ZUFjdGlvbi5jbGlja0FjdGlvbiA9ICgpID0+IHtcclxuICAgICAgY29uc3QgdGFiID0gcy5HZXRDdXJyZW50VGFiKCk7XHJcbiAgICAgIHRhYi51cmwoa28udW53cmFwKHNbQ1VSUkVOVF9VUkxfS0VZXSkpO1xyXG4gICAgICBvcmlnQ2xpY2tBY3Rpb24oKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFJlcG9ydE9wZW5lZChzLCBlKSB7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0gPSBzW0NVUlJFTlRfVVJMX0tFWV0gfHwga28ub2JzZXJ2YWJsZSgpO1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldKGUuVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUmVwb3J0VGFiQ2xvc2VkKHMsIGUpIHtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0obnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTRVNTSU9OX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaWFncmFtUGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlhZ3JhbVBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgRElBR1JBTV9TVE9SQUdFX01PREVfS0VZID0gJ0RJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhZ3JhbUNvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGRpYWdyYW06IERldkV4cHJlc3MudWkuZHhEaWFncmFtO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGlhZ3JhbVBhZ2VPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmRpYWdyYW1Db250cm9sbGVyVXJsO1xyXG5cclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZURpYWdyYW1Db250cm9sKCk7XHJcbiAgICB0aGlzLmluaXREaWFncmFtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLmRpYWdyYW0tZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZGlhZ3JhbSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaWFncmFtICYmIHNlbmRSZXF1ZXN0KGAke3RoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmx9P2lkPSR7dGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YCwgJ2dldCcpLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5kaWFncmFtLmltcG9ydChKU09OLnN0cmluZ2lmeShkYXRhKSwgZmFsc2UpO1xyXG4gICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpYWdyYW1Db250cm9sKCkge1xyXG4gICAgdGhpcy5kaWFncmFtID0gdGhpcy4kY29udGFpbmVyLmR4RGlhZ3JhbSh7XHJcbiAgICAgIGhpc3RvcnlUb29sYmFyOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBjb21tYW5kczogWydzZXBhcmF0b3InLCAndW5kbycsICdyZWRvJywgJ3NlcGFyYXRvcicsIHsgbmFtZTogJ3NhdmUnLCB0ZXh0OiAnU2F2ZScsIGljb246ICdzYXZlJyB9XSBhcyBhbnlcclxuICAgICAgfSxcclxuICAgICAgb25DdXN0b21Db21tYW5kOiAoZSkgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAoZS5uYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICdzYXZlJzpcclxuICAgICAgICAgICAgdGhpcy5zYXZlUmVwb3J0KGUuY29tcG9uZW50LmV4cG9ydCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBmdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgcmVhZE9ubHk6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXJcclxuICAgIH0pLmR4RGlhZ3JhbSgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERpYWdyYW0oKSB7XHJcbiAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsfT9pZD0ke3RoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWAsICdnZXQnKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xyXG4gICAgICB0aGlzLnJlZnJlc2hCdXR0b24gPSBuZXcgUmVmcmVzaEJ1dHRvbigkKCcucmVwb3J0LXJlZnJlc2gtYnV0dG9uJyksICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnKSkge1xyXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSAnVGhlIGRvY3VtZW50IGlzIG5vdCBzYXZlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBwYWdlPyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ3JlYWRPbmx5JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlcik7XHJcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlUmVwb3J0KHNvdXJjZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kaWFncmFtQ29udHJvbGxlclVybCwgJ3Bvc3QnLCB7IGlkLCBzb3VyY2UgfSwgdHJ1ZSk7XHJcbiAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5ESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCB7TWVudUl0ZW1UeXBlfSBmcm9tICcuLi8uLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7SUNkbVJlcG9ydFBhcmFtcywgSUdyaWRSZXBvcnRQYXJhbXMsIElSZXBvcnRQYXJhbXN9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgUmVmcmVzaFRpbWVyIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0luZGV4JztcclxuaW1wb3J0IERhc2hib2FyZFJlcG9ydFBhZ2UgZnJvbSAnLi4vRGFzaGJvYXJkL0luZGV4JztcclxuaW1wb3J0IEdhbnR0Q2hhcnQgZnJvbSAnLi4vR2FubnRDaGFydC9JbmRleCc7XHJcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuLi9HcmlkL0luZGV4JztcclxuaW1wb3J0IENETVJlcG9ydFBhZ2UgZnJvbSAnLi4vQ0RNL0luZGV4JztcclxuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuLi9SZXBvcnQvSW5kZXgnO1xyXG5pbXBvcnQgRGlhZ3JhbVJlcG9ydFBhZ2UgZnJvbSAnLi4vRGlhZ3JhbS9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRSZXBvcnQgZXh0ZW5kcyBJUmVwb3J0UGFyYW1zIHtcclxuICBUeXBlOiBNZW51SXRlbVR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNsaWRlc2hvd1JlcG9ydFBhcmFtcyBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xyXG4gIFJlcG9ydHM6IElOZXN0ZWRSZXBvcnRbXTtcclxuICBEZWxheVNlYzogbnVtYmVyO1xyXG4gIFJlZnJlc2hTZWM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElTbGlkZXNob3dSZXBvcnRQYXJhbXM7XHJcbiAgZGVmYXVsdFJlcG9ydFNldHRpbmdzOiB7IFtrZXkgaW4gTWVudUl0ZW1UeXBlXTogYW55OyB9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXNob3dSZXBvcnRQYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3RFbGVtZW50OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XHJcbiAgcHJpdmF0ZSByZXBvcnRzOiBJUmVwb3J0Q29tcG9uZW50W10gPSBbXTtcclxuICBwcml2YXRlIGR4R2FsbGVyeTogRGV2RXhwcmVzcy51aS5keEdhbGxlcnk7XHJcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJlZnJlc2hUaW1lcjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNsaWRlc2hvd1JlcG9ydFBhZ2VPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50ID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3MgPSBvcHRpb25zLmRlZmF1bHRSZXBvcnRTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIGlmICghIXRoaXMucmVwb3J0cykge1xyXG4gICAgICB0aGlzLnJlcG9ydHMuZm9yRWFjaCgocmVwb3J0KSA9PiB7XHJcbiAgICAgICAgcmVwb3J0LmRpc3Bvc2UoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHdoaWxlICh0aGlzLnJlcG9ydHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRzLnBvcCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVwb3J0cyA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAoISF0aGlzLnJlZnJlc2hUaW1lcikge1xyXG4gICAgICB0aGlzLnJlZnJlc2hUaW1lci5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXBvcnRzICYmIHRoaXMucmVwb3J0cy5mb3JFYWNoKChyZXBvcnQpID0+IHtcclxuICAgICAgcmVwb3J0LnJlZnJlc2goKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XHJcbiAgICBsZXQgY3VycmVudFRpbWVvdXQgPSBudWxsO1xyXG4gICAgY29uc3QgbWF4SW5kZXggPSB0aGlzLm9wdGlvbnMuUmVwb3J0cy5sZW5ndGg7XHJcblxyXG4gICAgY29uc3Qgc2V0dXBOZXh0SXRlbVNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgY3VycmVudFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XHJcblxyXG4gICAgICAgIGlmKG5leHRJbmRleCA+PSBtYXhJbmRleCkge1xyXG4gICAgICAgICAgbmV4dEluZGV4ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZHhHYWxsZXJ5LmdvVG9JdGVtKG5leHRJbmRleCwgdHJ1ZSk7XHJcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5EZWxheVNlYyAqIDEwMDApO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0JyB9KS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICBjb25zdCAkZ2FsbGVyeSA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ2FsbGVyeScgfSkuZHhHYWxsZXJ5KHtcclxuICAgICAgbG9vcDogZmFsc2UsXHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMub3B0aW9ucy5SZXBvcnRzLFxyXG4gICAgICBzbGlkZXNob3dEZWxheTogMCxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzdHJldGNoSW1hZ2VzOiB0cnVlLFxyXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcclxuICAgICAgb25Jbml0aWFsaXplZDogKCkgPT4gc2V0dXBOZXh0SXRlbVNlbGVjdCgpLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgY3VycmVudEluZGV4ID0gZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEluZGV4Jyk7XHJcblxyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoY3VycmVudFRpbWVvdXQpO1xyXG4gICAgICAgIHNldHVwTmV4dEl0ZW1TZWxlY3QoKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAocmVwb3J0UGFyYW1zOiBJTmVzdGVkUmVwb3J0LCBpbmRleCwgaXRlbUVsZW1lbnQpID0+IHtcclxuICAgICAgICBpdGVtRWxlbWVudC5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19nYWxsZXJ5LWl0ZW0nIH0pLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgICAgICBjb25zdCAkc2xpZGVFbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19zbGlkZS1jb250ZW50JyB9KS5oZWlnaHQoJzEwMCUnKTtcclxuICAgICAgICBsZXQgcmVwb3J0U2xpZGU6IElSZXBvcnRDb21wb25lbnQ7XHJcblxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHN3aXRjaCAocmVwb3J0UGFyYW1zLlR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGFzaGJvYXJkOlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRGFzaGJvYXJkUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRhc2hib2FyZF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGRhc2hib2FyZENvbnRhaW5lcjogJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXNcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCdkYXNoYm9hcmQtdGl0bGUnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCcuZHgtZGFzaGJvYXJkLWxheW91dC1jb250YWluZXInKS5jc3MoeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5HcmlkVmlldzpcclxuICAgICAgICAgICAgICBjb25zdCAkZ3JpZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ3JpZC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5hZGRDbGFzcygnaXN6b2xlYS10aGVtZScpLmFkZENsYXNzKCdwYW5lbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgICAgICAgICRncmlkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IEdyaWRSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuR3JpZFZpZXddIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgIGdyaWRQb3NpdGlvbk1hcmtlcjogJGdyaWRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUdyaWRSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkNETTpcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBDRE1SZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuQ0RNXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyOiAkc2xpZGVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElDZG1SZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlJlcG9ydDpcclxuICAgICAgICAgICAgICBjb25zdCAkcmVwb3J0UG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRFhSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuUmVwb3J0XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkcmVwb3J0Q29udGFpbmVyOiAkcmVwb3J0UG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGlhZ3JhbTpcclxuICAgICAgICAgICAgICBjb25zdCAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEaWFncmFtUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRpYWdyYW1dIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICRkaWFncmFtUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuR2FudHRDaGFydDpcclxuICAgICAgICAgICAgICBjb25zdCAkZ2FudHRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dyaWQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuYWRkQ2xhc3MoJ2lzem9sZWEtdGhlbWUnKS5hZGRDbGFzcygncGFuZWwtYm9keScpO1xyXG5cclxuICAgICAgICAgICAgICAkZ2FudHRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgR2FudHRDaGFydCh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkdhbnR0Q2hhcnRdIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgIGNoYXJ0UG9zaXRpb25NYXJrZXI6ICRnYW50dFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIGFueSBhcyBJR3JpZFJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuTWVudU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlNsaWRlc2hvdzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVwb3J0U2xpZGUpIHtcclxuICAgICAgICAgICAgcmVwb3J0U2xpZGUuaW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydHMucHVzaChyZXBvcnRTbGlkZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTAwKTtcclxuXHJcbiAgICAgICAgJHNsaWRlRWxlbWVudC5hcHBlbmRUbyhpdGVtRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZHhHYWxsZXJ5ID0gJGdhbGxlcnkuZHhHYWxsZXJ5KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICRnYWxsZXJ5LmFwcGVuZFRvKCR2aWV3KTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG5ldyBSZWZyZXNoVGltZXIoe2NhbGxiYWNrOiAoKSA9PiB0aGlzLnJlZnJlc2goKSwgZWxhcHNlZENhbGxiYWNrOiAoZSkgPT4ge319KTtcclxuICAgIHRoaXMucmVmcmVzaFRpbWVyLnN0YXJ0KHRoaXMub3B0aW9ucy5SZWZyZXNoU2VjICogMTAwMCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkYvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVmVuZG9yL0RldkV4dHJlbWUvZHguYWxsLmQudHNcIiAvPlxyXG5cclxuZXhwb3J0IHsgSUxpY2VuY2UsIE1lbnVJdGVtVHlwZSwgTGljZW5jZVN0YXR1cyB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5leHBvcnQgeyBJQXBpUmVzcG9uc2UsIElEeERhdGFTb3VyY2VPcHRpb25zLCBJRXJyb3JJbmZvLCBJTG9nb1NldHRpbmdzLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuL0RhdGEnO1xyXG5leHBvcnQge1xyXG4gIEhlYWRlciwgTmF2aWdhdGlvbk1lbnUsIFVzZXJNZW51LCBNZW51U3dpdGNoZXIsXHJcbiAgSGVhZGVyVGhlbWVzLCBJSGVhZGVyT3B0aW9ucywgSUFwcE1lbnVNb2RlbCwgSU1lbnVTZXR0aW5ncywgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsLFxyXG4gIElVc2VyTWVudUl0ZW0sIElVc2VyTWVudUl0ZW1Nb2RlbCxcclxufSBmcm9tICcuL0hlYWRlcic7XHJcbmV4cG9ydCB7IElIaWVyYXJjaGljYWwsIElSZXBvcnRCYXNlLCBJQXBwTWVudUl0ZW1CYXNlTW9kZWwsIGdyaWRDb2x1bW5UeXBlcyB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcbmV4cG9ydCB7XHJcbiAgSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlLCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZFN0YXRlLFxyXG4gIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlXHJcbn0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5leHBvcnQgeyBJR3JpZERhdGEsIElWMkdyaWRDb2x1bW5TdGF0ZSB9IGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HcmlkL0lHcmlkRGF0YSc7XHJcbmV4cG9ydCB7IElDb2x1bW5NZXRhRGF0YSB9IGZyb20gJy4vUmVwb3J0cy9Db2x1bW5NZXRhRGF0YSc7XHJcbmV4cG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuXHJcbmltcG9ydCB7IHNob3cgYXMgYmFja2dyb3VuZEltYWdlVmlld2VyIH0gZnJvbSAnLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcbmltcG9ydCB7IExpY2VuY2VTdGF0dXMsIE1lbnVJdGVtVHlwZSB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5pbXBvcnQgeyBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgZGF0YSBmcm9tICcuL0RhdGEnO1xyXG5pbXBvcnQgRm9vdGVyLCB7IEZvb3RlckluZGljYXRvclN0YXR1cyB9IGZyb20gJy4vRm9vdGVyL0luZGV4JztcclxuaW1wb3J0IHtcclxuICBIZWFkZXIsXHJcbiAgTmF2aWdhdGlvbk1lbnUsXHJcbiAgVXNlck1lbnUsXHJcbiAgTWVudVN3aXRjaGVyXHJcbn0gZnJvbSAnLi9IZWFkZXInO1xyXG5cclxuZXhwb3J0IHtcclxuICBGb290ZXIsXHJcbn07XHJcblxyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCBkZWZhdWx0VG9vbGJhciBmcm9tICcuL1dpZGdldHMvRGVmYXVsdFRvb2xiYXInO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWRPYnNvbGV0ZSBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZE9ic29sZXRlJztcclxuaW1wb3J0IGRlZmF1bHRUcmVlTGlzdCBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0VHJlZUxpc3QnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgKiBhcyBpbWFnZUNyb3BEaWFsb2cgZnJvbSAnLi9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZyc7XHJcbmltcG9ydCB7IEFjY291bnRTZXR0aW5nc1BhZ2UgfSBmcm9tICcuL1BhZ2VzL0FjY291bnRTZXR0aW5ncyc7XHJcbmltcG9ydCAqIGFzIHN0eWxpbmcgZnJvbSAnLi9TdHlsaW5nL0luZGV4JztcclxuaW1wb3J0ICogYXMgcG9wdXAgZnJvbSAnLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0ICogYXMgY29uZmlybSBmcm9tICcuL1dpZGdldHMvQ29uZmlybSc7XHJcbmltcG9ydCAqIGFzIGxhbmRpbmcgZnJvbSAnLi9XaWRnZXRzL0xhbmRpbmcnO1xyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vVXRpbHMvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyBhY2Nlc3NEZW5pZWQgZnJvbSAnLi9XaWRnZXRzL0FjY2Vzc0RlbmllZFRvUmVwb3J0JztcclxuaW1wb3J0IGdyaWRDb2x1bW5UeXBlcyBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzJztcclxuaW1wb3J0ICogYXMgQ0RNIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgeyBTZXNzaW9uTm90aWZpZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyJztcclxuaW1wb3J0IHsgRmlsZUltcG9ydGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4vQ29tcG9uZW50cy9GaWxlVXBsb2FkZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcblxyXG5pbXBvcnQgR3JpZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSW5kZXgnO1xyXG5pbXBvcnQgU2xpZGVzaG93UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4JztcclxuaW1wb3J0IERhc2hib2FyZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBEWFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL1JlcG9ydC9JbmRleCc7XHJcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleCc7XHJcbmltcG9ydCBDRE1SZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgR2FudHRDaGFydFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dhbm50Q2hhcnQvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL0NvbmZpZy9JbmRleCc7XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuY29uc3QgSXN6b2xlYVVJID0ge1xyXG4gIGNvbmZpZyxcclxuXHJcbiAgSGVhZGVyLFxyXG4gIEZvb3RlcixcclxuICBOYXZpZ2F0aW9uTWVudSxcclxuICBVc2VyTWVudSxcclxuICBNZW51U3dpdGNoZXIsXHJcblxyXG4gIGRhdGEsXHJcblxyXG4gIHdpZGdldHM6IHtcclxuICAgIG5vdGlmeSxcclxuICAgIGZ1bGxTY3JlZW4sXHJcbiAgICBwb3B1cCxcclxuICAgIGNvbmZpcm0sXHJcbiAgICBsYW5kaW5nLFxyXG4gICAgYWNjZXNzRGVuaWVkLFxyXG4gICAgZGVmYXVsdEdyaWRPYnNvbGV0ZSxcclxuICAgIGRlZmF1bHRUcmVlTGlzdCxcclxuICAgIGRlZmF1bHRHcmlkLFxyXG4gICAgZGVmYXVsdFRvb2xiYXIsXHJcbiAgICBiYWNrZ3JvdW5kSW1hZ2VWaWV3ZXIsXHJcbiAgICBpbWFnZUNyb3BEaWFsb2dcclxuICB9LFxyXG4gIHBhZ2VzOiB7XHJcbiAgICBBY2NvdW50U2V0dGluZ3NQYWdlXHJcbiAgfSxcclxuICBjb21wb25lbnRzOiB7XHJcbiAgICBDRE0sXHJcbiAgICBTZXNzaW9uTm90aWZpZXIsXHJcbiAgICBGaWxlSW1wb3J0ZXIsXHJcbiAgICBGaWxlVXBsb2FkZXIsXHJcbiAgfSxcclxuXHJcbiAgc3R5bGluZyxcclxuICBoZWxwZXJzLFxyXG4gIHV0aWxzLFxyXG5cclxuICByZXBvcnRzOiB7XHJcbiAgICBDRE1SZXBvcnRQYWdlLFxyXG4gICAgRGlhZ3JhbVJlcG9ydFBhZ2UsXHJcbiAgICBHcmlkUmVwb3J0UGFnZSxcclxuICAgIERhc2hib2FyZFJlcG9ydFBhZ2UsXHJcbiAgICBEWFJlcG9ydFBhZ2UsXHJcbiAgICBTbGlkZXNob3dSZXBvcnRQYWdlLFxyXG4gICAgR2FudHRDaGFydFJlcG9ydFBhZ2UsXHJcbiAgICBncmlkQ29sdW1uVHlwZXMsXHJcbiAgfSxcclxuICBidXNpbmVzczoge1xyXG4gICAgTGljZW5jZVN0YXR1cyxcclxuICAgIE1lbnVJdGVtVHlwZSxcclxuICAgIENkbUltcG9ydEZpbGVNb2RlLFxyXG4gICAgRm9vdGVySW5kaWNhdG9yU3RhdHVzLFxyXG4gICAgR3JpZERhdGFDb2x1bW5EYXRhVHlwZVxyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IElzem9sZWFVSTtcclxuXHJcbih3aW5kb3cgYXMgYW55KS5Jc3pvbGVhVUkgPSBJc3pvbGVhVUk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsbUJBQWMsSUFBTSxJQUFNO0FBQUEsaUJBQ0osQUFBaEIsT0FBTyxNQUFTLGNBQWEsS0FBTyxFQUFFLFNBQU8sVUFDeEIsQUFBaEIsT0FBTyxNQUFT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LGtCQUVsQyxZQUFZO0FBQUEsa0JBQ1o7QUFBQTtBQUVGO0FBQUEsbUJBQ0c7QUFDSCxzQkFBTSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsT0FBTztBQUNwRCw4QkFBYyxTQUFTLGlCQUFpQixTQUFTO0FBRWpELHNDQUFzQixTQUFTO0FBQy9CLDhCQUFjLElBQUksV0FBVyxpQ0FDdkIsS0FBSyxzQkFBc0IsdUJBQTRCLEtBRGhDO0FBQUEsa0JBRTNCLHFCQUFxQjtBQUFBLGtCQUNyQjtBQUFBO0FBRUY7QUFBQSxtQkFDRztBQUFBLG1CQUNBO0FBQ0g7QUFBQTtBQUdKLGdCQUFJLGFBQWE7QUFDZiwwQkFBWTtBQUNaLG1CQUFLLFFBQVEsS0FBSztBQUFBO0FBQUEsYUFFbkI7QUFFSCx3QkFBYyxTQUFTO0FBQUE7QUFBQTtBQUkzQixXQUFLLFlBQVksU0FBUyxVQUFVO0FBRXBDLGVBQVMsU0FBUztBQUVsQixXQUFLLGVBQWUsSUFBSSxhQUFhLEVBQUMsVUFBVSxNQUFNLEtBQUssV0FBVyxpQkFBaUIsQ0FBQyxNQUFNO0FBQUE7QUFDOUYsV0FBSyxhQUFhLE1BQU0sS0FBSyxRQUFRLGFBQWE7QUFBQTtBQUFBOzs7QUMzSHRELE1BQU0sWUFBWTtBQUFBLElBQ2hCO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUVBO0FBQUEsSUFFQSxTQUFTO0FBQUEsTUFDUDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFBQSxJQUVGLE9BQU87QUFBQSxNQUNMO0FBQUE7QUFBQSxJQUVGLFlBQVk7QUFBQSxNQUNWO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFBQSxJQUdGO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUVBLFNBQVM7QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBO0FBQUEsSUFFRixVQUFVO0FBQUEsTUFDUjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQTtBQUFBO0FBSUosTUFBTyxrQkFBUTtBQUVmLEVBQUMsT0FBZSxZQUFZOyIsCiAgIm5hbWVzIjogW10KfQo=
10403
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvVXRpbHMvR3JpZEV4cG9ydC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvSGVhZGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQnVzaW5lc3MvY2RtSW1wb3J0RmlsZU1vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9JR3JpZFN0YXRlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0Zvb3Rlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0F1dG9SZXNpemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9GdWxsU2NyZWVuLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVGhlbWUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9Ub29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRGVmYXVsdFRvb2xiYXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9QYW5lbEhlaWdodC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvQ3JlYXRlRnVsbFNjcmVlbkdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgd3JhcHBlckF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGlkZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICBvblNob3duOiAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hEcm9wRG93bi5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c0luOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5hZGRDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCAmJiB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQoKTtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoJ2lucHV0LmR4LXRleHRlZGl0b3ItaW5wdXQnKS52YWwoKSBhcyBzdHJpbmcpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZvY3VzT3V0OiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoJ2lucHV0LmR4LXRleHRlZGl0b3ItaW5wdXQnKS52YWwoKSkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuZWxlbWVudCgpLnJlbW92ZUNsYXNzKCdmb2N1c2VkJyk7XHJcbiAgICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbktleVVwOiAoZSkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZXZlbnQ6IEtleWJvYXJkRXZlbnQgPSBlLmV2ZW50IGFzIGFueTtcclxuXHJcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICAgIHRoaXMuY2hlY2tTZWFyY2hSZXN1dFBvcHVwVmlzaWJpbGl0eSh2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5zZWFyY2hCeVRleHQodmFsdWUpO1xyXG4gICAgICAgICAgY29uc3QgdHJpZ2dlcmVkRm9jdXNCdXR0b25zID0gWydUYWInLCAnRW50ZXInLCAnQXJyb3dEb3duJywgJ0Fycm93VXAnXTtcclxuICAgICAgICAgIGlmICh0cmlnZ2VyZWRGb2N1c0J1dHRvbnMuc29tZSgoYikgPT4gYiA9PT0gZXZlbnQua2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5mb2N1cyh0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5nZXRDZWxsRWxlbWVudCgwLCAnTmFtZScpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgb25LZXlEb3duOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tTZWFyY2hSZXN1dFBvcHVwVmlzaWJpbGl0eShlLnZhbHVlKTtcclxuICAgICAgfSxcclxuICAgIH0pLmFkZENsYXNzKFsnZm9ybS1jb250cm9sJywgJ21yLXNtLTInLCAnc2VhcmNoLWRyb3Bkb3duJ10pO1xyXG5cclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24gPSAkaW5wdXQuZHhEcm9wRG93bkJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICBmb3JtRWxlbWVudC5hcHBlbmRDaGlsZCgkaW5wdXRbMF0pO1xyXG4gICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZChmb3JtRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9NZW51SXRlbShtZW51SXRlbTogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGNvbnN0IHVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKG1lbnVJdGVtKTtcclxuXHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VTZWFyY2hEcm9wRG93bigpO1xyXG5cclxuICAgICAgY29uc3QgYXJnczogTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCA9IHtcclxuICAgICAgICBpdGVtOiBtZW51SXRlbSxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBudWxsLFxyXG4gICAgICAgIGNhbmNlbDogZmFsc2VcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMub25NZW51SXRlbUNsaWNrPy4oYXJncyk7XHJcblxyXG4gICAgICBpZiAoYXJncy5jYW5jZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub25NZW51SXRlbU9wZW5lZCAmJiB0aGlzLm9uTWVudUl0ZW1PcGVuZWQoeyBtZW51SXRlbSB9KTtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlU2VhcmNoRHJvcERvd24oKSB7XHJcbiAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5vcHRpb24oJ2ZvY3VzZWRSb3dLZXknLCB1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8ub3B0aW9uKCd2YWx1ZScsICcnKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/LmZvY3VzKCk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5ibHVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wZW4oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24/LmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERhdGFTb3VyY2VGb3JTZWFyY2goZHM6IElTZWFyY2hEYXRhU291cmNlKTogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIWRzKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ2V0UmVkdWNlciA9IChpc0dsb2JhbDogYm9vbGVhbikgPT4ge1xyXG4gICAgICBjb25zdCByZWR1Y2VyID0gKHJlczogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSwgaXRlbTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uSXRlbXMgJiYgaXRlbS5JdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGl0ZW0uSXRlbXMgPSBpdGVtLkl0ZW1zLnJlZHVjZShyZWR1Y2VyLCBbXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBpdGVtLlZpc2libGUgPT09IHVuZGVmaW5lZCB8fCBpdGVtLlZpc2libGUgPT09IG51bGwgfHwgaXRlbS5WaXNpYmxlID09PSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpdGVtLkRpc2FibGVkID09PSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoaXNWaXNpYmxlICYmICFpc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgICByZXMucHVzaCh7IC4uLml0ZW0sIGlzR2xvYmFsIH0gYXMgSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiByZWR1Y2VyO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoZHMucGVyc29uYWxJdGVtcyAmJiBkcy5wZXJzb25hbEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBnbG9iYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnR2xvYmFsIE1lbnUnLCBJZDogLTEsIGlzR2xvYmFsOiB0cnVlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLmdsb2FiYWxJdGVtcy5yZWR1Y2UoZ2V0UmVkdWNlcih0cnVlKSwgW10pXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBwZXJzb25hbE1lbnVSb290ID0ge1xyXG4gICAgICAgIE5hbWU6ICdQZXJzb25hbCBNZW51JywgSWQ6IC0yLCBpc0dsb2JhbDogZmFsc2UsIFR5cGU6IE1lbnVJdGVtVHlwZS5NZW51Tm9kZSxcclxuICAgICAgICBJdGVtczogZHMucGVyc29uYWxJdGVtcy5yZWR1Y2UoZ2V0UmVkdWNlcihmYWxzZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSA/IFtnbG9iYWxNZW51Um9vdCwgcGVyc29uYWxNZW51Um9vdF0gOiBbcGVyc29uYWxNZW51Um9vdCwgZ2xvYmFsTWVudVJvb3RdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRzLmdsb2FiYWxJdGVtcy5yZWR1Y2UoZ2V0UmVkdWNlcih0cnVlKSwgW10pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IHsgRGV2RXhwcmVzc0V2ZW50QXJncyB9IGZyb20gJy4vRGV2RXhwcmVzc0V2ZW50QXJncyc7XHJcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vRXZlbnRFbWl0dGVyJztcclxuZXhwb3J0IHsgZ2V0R2VuZXJhbFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSB9IGZyb20gJy4vR2VuZXJhbFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSc7XHJcbmV4cG9ydCB7IGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbiB9IGZyb20gJy4vR3JpZEV4cG9ydCc7XHJcbiIsICJcdUZFRkZleHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TGlzdGVuZXJzOiBhbnlbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb24oZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgaWYgKCF0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0pIHtcclxuICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1tldnRdID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ldmVudExpc3RlbmVyc1tldnRdLnB1c2gobGlzdGVuZXIpO1xyXG5cclxuICAgIHJldHVybiBsaXN0ZW5lcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbmNlKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIHRoaXMub24oZXZ0LCAoZSkgPT4ge1xyXG4gICAgICBsaXN0ZW5lcihlKTtcclxuICAgICAgdGhpcy5vZmYoZXZ0LCBsaXN0ZW5lcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0KGV2dCwgZSA9IG51bGwpIHtcclxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XTtcclxuXHJcbiAgICBpZiAobGlzdGVuZXJzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIpIHtcclxuICAgICAgICAgIGN1cnJlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9mZihldnQsIGxpc3RlbmVyKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBjdXJyZW50TGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRMaXN0ZW5lciAhPT0gbGlzdGVuZXIpIHtcclxuICAgICAgICAgIGZpbHRlcmVkLnB1c2goY3VycmVudExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IGZpbHRlcmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFkZEhhbmRsZXIoZXZlbnQ6IHN0cmluZywgb3JpZ2luSGFuZGxlciwgZ2V0QXJndW1lbnRzKSB7XHJcbiAgICBjb25zdCBpbnRlcm5hbEhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgIG9yaWdpbkhhbmRsZXIoXHJcbiAgICAgICAgZ2V0QXJndW1lbnRzKCksXHJcbiAgICAgICAgKCkgPT4gdGhpcy5vZmYoZXZlbnQsIGludGVybmFsSGFuZGxlcilcclxuICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vbihldmVudCwgaW50ZXJuYWxIYW5kbGVyKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCBzYXZlQXMgZnJvbSAnZmlsZS1zYXZlcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uKHJlcG9ydE5hbWU6IHN0cmluZyk6IChlOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuRXhwb3J0aW5nRXZlbnQpID0+IHZvaWQge1xyXG4gIHJldHVybiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB7XHJcbiAgICBjb25zdCB3b3JrYm9vayA9IG5ldyAod2luZG93IGFzIGFueSkuRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gd29ya2Jvb2suYWRkV29ya3NoZWV0KHJlcG9ydE5hbWUpO1xyXG5cclxuICAgIERldkV4cHJlc3MuZXhjZWxFeHBvcnRlci5leHBvcnREYXRhR3JpZCh7XHJcbiAgICAgIHdvcmtzaGVldCxcclxuICAgICAgY29tcG9uZW50OiBlLmNvbXBvbmVudCxcclxuICAgICAgY3VzdG9taXplQ2VsbDogKG9wdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBleGNlbENlbGwgPSBvcHRpb25zLmV4Y2VsQ2VsbDtcclxuXHJcbiAgICAgICAgZXhjZWxDZWxsLmZvbnQgPSB7IG5hbWU6ICdBcmlhbCcsIHNpemU6IDEyIH07XHJcbiAgICAgICAgZXhjZWxDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ2xlZnQnIH07XHJcbiAgICAgIH1cclxuICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGZ1bmN0aW9uKGJ1ZmZlcikge1xyXG4gICAgICAgIHNhdmVBcyhuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KSwgYCR7cmVwb3J0TmFtZX0ueGxzeGApO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgZS5jYW5jZWwgPSB0cnVlO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IsIE11dGFibGUgfSBmcm9tICcuLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBJTGF5b3V0QnJlYWtwb2ludCwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMsIGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IFVzZXJNZW51LCBVc2VyTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi9Vc2VyTWVudSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25NZW51LCBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi9OYXZpZ2F0aW9uTWVudSc7XHJcbmltcG9ydCB7IExvZ28gfSBmcm9tICcuL0xvZ28nO1xyXG5pbXBvcnQgeyBNZW51U3dpdGNoZXIgfSBmcm9tICcuL01lbnVTd2l0Y2hlcic7XHJcbmltcG9ydCB7IElVc2VyTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSVVzZXJNZW51SXRlbSc7XHJcbmltcG9ydCB7IElNZW51U2V0dGluZ3MgfSBmcm9tICcuL0lNZW51U2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBJQXBwTWVudU1vZGVsIH0gZnJvbSAnLi9JQXBwTWVudU1vZGVsJztcclxuaW1wb3J0IHsgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5pbXBvcnQgU2VhcmNoLCB7IElPcGVuUmVwb3J0RXZlbnRBcmdzLCBJU2VhcmNoRGF0YVNvdXJjZSB9IGZyb20gJy4vU2VhcmNoJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vVXRpbHMvSW5kZXgnO1xyXG5cclxuY29uc3QgSEVBREVSX0RBVEFfQ0FDSEVfRklFTEQgPSAnaXN6b2xlYS11aXxoZWFkZXItZGF0YS1jYWNoZSc7XHJcbmNvbnN0IFNIT1dfR0xPQkFMX01FTlVfS0VZID0gJ2lzem9sZWEtdWl8c2hvdy1nbG9iYWwtbWVudSc7XHJcblxyXG5jb25zdCBnZXREYXRhU291cmNlQ2FjaGVGaWVsZCA9ICh1c2VyTmFtZT86IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiBgJHtIRUFERVJfREFUQV9DQUNIRV9GSUVMRH0ke3VzZXJOYW1lID8gYHwke3VzZXJOYW1lfWAgOiAnJ31gO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgSGVhZGVyVGhlbWVzID0gJ2lzem9sZWEnO1xyXG5leHBvcnQgaW50ZXJmYWNlIElIZWFkZXJPcHRpb25zIHtcclxuICAkZWw6IEpRdWVyeTtcclxuICBtZW51U2V0dGluZ3M/OiBJTWVudVNldHRpbmdzO1xyXG4gIGxvZ29TZXR0aW5ncz86IElMb2dvU2V0dGluZ3MgfCBzdHJpbmc7XHJcbiAgZGlzcGxheVNlYXJjaD86IGJvb2xlYW47XHJcbiAgaW1tZWRpYXRlUmVuZGVyPzogYm9vbGVhbjtcclxuICB0aGVtZT86IEhlYWRlclRoZW1lcztcclxuICBvbkluaXQ/OiAoKSA9PiB2b2lkO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUhlYWRlckVsZW1lbnRzIHtcclxuICByZWFkb25seSByb290PzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgbG9nb0NvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IGNvbnRlbnRDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSB0b2dnbGVCdXR0b25Db250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSB0b2dnbGVCdXR0b24/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBtZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgbWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQWpheFBhZ2VNYXJrZXIge1xyXG4gIGlzTG9hZGVkQnlBamF4OiB0cnVlO1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIGlzTWVudVN3aXRjaGVyR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSGVhZGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQgPSAnbWVudS1zd2l0Y2hlci1pbml0aWFsaXplZC1ldmVudCc7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdMT0JBTF9VUkxfUkVHRVggPSBuZXcgUmVnRXhwKCdeKD86W2Etel0rOik/Ly8nLCAnaScpO1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERPQ1RZUEVfTUFSS0VSX1JFR0VYID0gbmV3IFJlZ0V4cCgnIURPQ1RZUEUgaHRtbD4nLCAnaScpO1xyXG5cclxuICBwdWJsaWMgdXNlck1lbnU6IFVzZXJNZW51IHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBuYXZpZ2F0aW9uTWVudTogTmF2aWdhdGlvbk1lbnUgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIG1lbnVTd2l0Y2hlcjogTWVudVN3aXRjaGVyIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBsb2dvOiBMb2dvIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyBkYXRhOiBJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHRoZW1lOiBIZWFkZXJUaGVtZXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtZW51U2V0dGluZ3M6IElNZW51U2V0dGluZ3MgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5U2VhcmNoOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRQYW5lbDogRGV2RXhwcmVzcy51aS5keExvYWRQYW5lbDtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyOiBKUXVlcnkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25QYXJ0aWFsVmlld0xvYWRlZDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrSGFuZGxlciA9IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyID0gdGhpcy5vbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZC5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Vc2VyTWVudUl0ZW1DbGlja0hhbmRsZXIgPSB0aGlzLm9uVXNlck1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHNlYXJjaDogU2VhcmNoIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyBlbGVtZW50c1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGVsOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50czogTXV0YWJsZTxJSGVhZGVyRWxlbWVudHM+ID0ge307XHJcbiAgcHJpdmF0ZSAkbG9hZEJhcjogSlF1ZXJ5IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJSGVhZGVyT3B0aW9ucykge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLiRlbCA9IG9wdGlvbnMuJGVsO1xyXG4gICAgdGhpcy5tZW51U2V0dGluZ3MgPSBvcHRpb25zLm1lbnVTZXR0aW5ncztcclxuICAgIHRoaXMubG9nb1NldHRpbmdzID0gb3B0aW9ucy5sb2dvU2V0dGluZ3M7XHJcbiAgICB0aGlzLnRoZW1lID0gb3B0aW9ucy50aGVtZSB8fCAnaXN6b2xlYSc7XHJcbiAgICB0aGlzLmRpc3BsYXlTZWFyY2ggPSBvcHRpb25zLmRpc3BsYXlTZWFyY2g7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcblxyXG4gICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlciA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5wYXJ0aWFsVmlld1BsYWNlSG9sZGVyO1xyXG4gICAgdGhpcy51cGRhdGVVcmxBZnRlclBhcnRpYWxMb2FkaW5nID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LnVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmc7XHJcbiAgICB0aGlzLm9uUGFydGlhbFZpZXdMb2FkZWQgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8ub25QYXJ0aWFsVmlld0xvYWRlZDtcclxuICAgIHRoaXMuYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZztcclxuXHJcbiAgICB0aGlzLmxvYWRQYW5lbCA9IHRoaXMuY3JlYXRlTG9hZFBhbmVsKCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlUmVuZGVyID09PSBmYWxzZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS53YXJuKCdUaGUgXFwnaW1tZWRpYXRlUmVuZGVyID09PSBmYWxzZVxcJyBvcHRpb24gaXNuXFwndCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudC4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvL05PVEU6IFRvIG92ZXJyaWRlIGJvb3RzdHJhcCBoZWFkZXIgei1pbmRleCB3aGljaCBpcyAxNjAwXHJcbiAgICBEZXZFeHByZXNzLnVpLmR4T3ZlcmxheS5iYXNlWkluZGV4KDE3MDApO1xyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gICAgICAudGhlbigoKSA9PiBvcHRpb25zPy5vbkluaXQ/LigpKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZU9uSGlzdG9yeVBvcFN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpO1xyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICAvKipcclxuICAgICAqIDxSb290PlxyXG4gICAgICogIDxCcmFuZD5cclxuICAgICAqICAgIDxMb2dvIC8+XHJcbiAgICAgKiAgPC9CcmFuZD5cclxuICAgICAqICA8Q29udGVudFRvZ2dsZXIgLz5cclxuICAgICAqICA8Q29udGVudD5cclxuICAgICAqICAgIDxTZWFyY2ggLz5cclxuICAgICAqICAgIDxOYXZpZ2F0aW9uTWVudSAvPlxyXG4gICAgICogICAgPFVzZXJNZW51IC8+XHJcbiAgICAgKiAgPC9Db250ZW50PlxyXG4gICAgICogIDxNZW51U3dpdGNoZXIgLz5cclxuICAgICAqIDwvUm9vdD5cclxuICAgICAqIDxMb2FkQmFyIC8+XHJcbiAgICAgKi9cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVyQnJhbmQoKTtcclxuICAgIHRoaXMucmVuZGVyQ29udGVudFRvZ2dsZXIoKTtcclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gICAgdGhpcy5yZW5kZXJMb2FkQmFyKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVDb250ZW50QW5kVG9nZ2xlclZpc2libGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3Vic2NyaWJlT25IaXN0b3J5UG9wU3RhdGUoKSB7XHJcbiAgICBpZiAodGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlcikge1xyXG4gICAgICAkKHdpbmRvdykuYmluZCgncG9wc3RhdGUnLCAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50IGFzIFBvcFN0YXRlRXZlbnQ7XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBldmVudC5zdGF0ZSBhcyBJQWpheFBhZ2VNYXJrZXI7XHJcbiAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLmlzTG9hZGVkQnlBamF4KSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRQYWdlVmlhQWpheENvcmUoc3RhdGUudXJsKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoc3RhdGUuaXNNZW51U3dpdGNoZXJHbG9iYWwpO1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUxvYWRQYW5lbCgpOiBEZXZFeHByZXNzLnVpLmR4TG9hZFBhbmVsIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhMb2FkUGFuZWwoe1xyXG4gICAgICBzaGFkaW5nQ29sb3I6ICdyZ2JhKDAsMCwwLDAuNCknLFxyXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgc2hvd0luZGljYXRvcjogdHJ1ZSxcclxuICAgICAgc2hvd1BhbmU6IHRydWUsXHJcbiAgICAgIHNoYWRpbmc6IHRydWUsXHJcbiAgICAgIGhpZGVPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRlbCkuZHhMb2FkUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QgPSB0aGlzLiRlbFswXTtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5jbGFzc0xpc3QuYWRkKCdoZWFkZXInLCB0aGlzLnRoZW1lLCAnbmF2YmFyJywgJ25hdmJhci1kYXJrJywgYG5hdmJhci1leHBhbmQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCcmFuZCgpIHtcclxuICAgIGlmICh0aGlzLmxvZ28gfHwgIXRoaXMubG9nb1NldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJyYW5kRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGJyYW5kRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2JyYW5kJywgJ25hdmJhci1icmFuZCcpO1xyXG4gICAgYnJhbmRFbGVtZW50LmhyZWYgPSAnLyc7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQoYnJhbmRFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIgPSBicmFuZEVsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5sb2dvID0gbmV3IExvZ28oJCh0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIpLCB0aGlzLmxvZ29TZXR0aW5ncyk7XHJcbiAgICB0aGlzLmxvZ28uaW5pdFdpZGdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJTZWFyY2goKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheVNlYXJjaCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xyXG4gICAgICAkY29udGFpbmVyOiAkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lciksXHJcbiAgICAgIGdldE1lbnVEYXRhU291cmNlOiAoKSA9PiB0aGlzLmdldFNlYXJjaERhdGFTb3VyY2UodGhpcy5kYXRhKSxcclxuICAgICAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSxcclxuICAgICAgb25EaW1lbnNpb25zQ2hhbmdlZDogKCkgPT4gdGhpcy5uYXZpZ2F0aW9uTWVudT8uYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpLFxyXG4gICAgICBvbk1lbnVJdGVtQ2xpY2s6IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgIG9uTWVudUl0ZW1PcGVuZWQ6IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlYXJjaC5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNHbG9iYWxNZW51U2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCkgfHwgIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQoZTogSU9wZW5SZXBvcnRFdmVudEFyZ3MpIHtcclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5tZW51SXRlbS5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIudmFsdWUgIT09IGlzR2xvYmFsKSB7XHJcbiAgICAgIHRoaXMubWVudVN3aXRjaGVyLnNldFZhbHVlKGlzR2xvYmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudFRvZ2dsZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCduYXZiYXItdG9nZ2xlcicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdjb2xsYXBzZScpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcsICcuaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0U2VhcmNoVGV4dCgnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyLWljb24nKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX190b2dnbGUtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmFwcGVuZENoaWxkKGljb24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2UnLCAnbmF2YmFyLWNvbGxhcHNlJywgJ2hlYWRlcl9fY29udGVudCcpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJTZWFyY2goKTtcclxuICAgIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUoW10pO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlck1lbnUoW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYXZpZ2F0aW9uTWVudShtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxNZW51ID0gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpO1xyXG5cclxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25NZW51KSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlRGF0YShtZW51SXRlbU1vZGVscywgaXNHbG9iYWxNZW51KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUgPSBuZXcgTmF2aWdhdGlvbk1lbnUoXHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLFxyXG4gICAgICAgIG1lbnVJdGVtTW9kZWxzLFxyXG4gICAgICAgIGlzR2xvYmFsTWVudSxcclxuICAgICAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblVzZXJNZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uVXNlck1lbnVDbGljaz8uKGUpO1xyXG4gICAgaWYgKGUuY2FuY2VsIHx8IHRoaXMuaXNLZXlQcmVzc2VkKGUub3JpZ2luYWxFdmVudCBhcyBNb3VzZUV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXJsID0gZS5pdGVtLlVybDtcclxuXHJcbiAgICBpZiAoZS5pdGVtLkFsd2F5c1JlbG9hZFBhZ2UpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlLmNhbmNlbCA9IHRoaXMudHJ5RG9QYXJ0aWFsUGFnZUxvYWRpbmcodXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncy5vbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUuaXRlbS5pc0dsb2JhbCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEoZS5pdGVtKTtcclxuICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0tleVByZXNzZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudCAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgJiYgdXJsICYmIHRoaXMuY2hlY2tJc0xvY2FsVXJsKHVybCkpIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlOiBJQWpheFBhZ2VNYXJrZXIgPSB7XHJcbiAgICAgICAgICBpc0xvYWRlZEJ5QWpheDogdHJ1ZSxcclxuICAgICAgICAgIGlzTWVudVN3aXRjaGVyR2xvYmFsOiAhIXRoaXMubWVudVN3aXRjaGVyPy52YWx1ZSxcclxuICAgICAgICAgIHVybFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHVybCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzTG9jYWxVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAhSGVhZGVyLkdMT0JBTF9VUkxfUkVHRVgudGVzdCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgIUhlYWRlci5ET0NUWVBFX01BUktFUl9SRUdFWC50ZXN0KGNvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZVZpYUFqYXhDb3JlKHVybDogc3RyaW5nKSB7XHJcbiAgICB3aW5kb3cuaXNJc296U2VydmVyRXhjZXB0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwuc2hvdygpO1xyXG5cclxuICAgIGNvbnN0IHVybEZvclBhcnRpYWxMb2FkaW5nID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgdXJsKTtcclxuICAgIHVybEZvclBhcnRpYWxMb2FkaW5nLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2lzb3pQYXJ0aWFsTG9hZGluZycsICd0cnVlJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsVXJsID0gdXJsRm9yUGFydGlhbExvYWRpbmcudG9TdHJpbmcoKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZz8uKCk7XHJcblxyXG4gICAgJC5hamF4KHBhcnRpYWxVcmwsIHsgZGF0YVR5cGU6ICdodG1sJyB9KS5hbHdheXMoKGRhdGEsIHRleHRTdGF0dXMpID0+IHtcclxuICAgICAgaWYgKHRleHRTdGF0dXMgIT09ICdzdWNjZXNzJyB8fCAhdGhpcy5jaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGRhdGEpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlci5odG1sKGRhdGEpO1xyXG4gICAgICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZD8uKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkUGFuZWwuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVXNlck1lbnUoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudXNlck1lbnUpIHtcclxuICAgICAgY29uc3QgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInKTtcclxuICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xyXG5cclxuICAgICAgdGhpcy51c2VyTWVudSA9IG5ldyBVc2VyTWVudSh7XHJcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgdXNlck5hbWU6IHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lLFxyXG4gICAgICAgIHVzZXJBdmF0YXI6IHRoaXMubWVudVNldHRpbmdzLnVzZXJBdmF0YXIsXHJcbiAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgICBnZXREaXNwbGF5ZWRVc2VySW5mbzogdGhpcy5tZW51U2V0dGluZ3MuZ2V0RGlzcGxheWVkVXNlckluZm9cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXNlck1lbnUucmVuZGVyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJNZW51LnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTWVudVN3aXRjaGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGE/LkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIpIHtcclxuICAgICAgaWYgKHRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/LnJlbW92ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCd0b2dnbGVCdXR0b25Db250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtZW51LXN3aXRjaGVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IG5ldyBNZW51U3dpdGNoZXIoe1xyXG4gICAgICBkZXNrdG9wQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsXHJcbiAgICAgIG1vYmlsZUNvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIsXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludDogdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQsXHJcbiAgICAgIHN0YXJ0VmFsdWU6IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpLFxyXG4gICAgICBvblN3aXRjaDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShuYXZpZ2F0aW9uSXRlbXMgfHwgW10pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tZW51U3dpdGNoZXIucmVuZGVyKCk7XHJcbiAgICB0aGlzLmVtaXQoSGVhZGVyLk1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLCB0aGlzLnVzZXJNZW51Py5yb290KTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciwgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMb2FkQmFyKCkge1xyXG4gICAgdGhpcy4kbG9hZEJhciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9hZC1iYXInKS5oaWRlKCkuYXBwZW5kVG8odGhpcy4kZWwpO1xyXG5cclxuICAgIGNvbnN0ICRsb2FkID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkJykuYXBwZW5kVG8odGhpcy4kbG9hZEJhcik7XHJcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2JhcicpLmFwcGVuZFRvKCRsb2FkKTtcclxuXHJcbiAgICBmdW5jdGlvbiByb3RhdGUoc2VsZWN0b3I6IHN0cmluZykge1xyXG4gICAgICAkKHNlbGVjdG9yKS5hbmltYXRlKHsgbGVmdDogJCgnLmxvYWQnKS53aWR0aCgpIH0sIDIwMDAsICgpID0+IHtcclxuICAgICAgICAkKHNlbGVjdG9yKS5jc3MoJ2xlZnQnLCBgJHstJChzZWxlY3Rvcikud2lkdGgoKSF9cHhgKTtcclxuICAgICAgICByb3RhdGUoc2VsZWN0b3IpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGUoJy5iYXInKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVyZW5kZXJNZW51cygpIHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCB1c2VySXRlbXMgPSB0aGlzLmdldFVzZXJJdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgLy8gSWYgaXRlbXMgYXJlIHVuZGVmaW5lZCB3ZSBkb24ndCB1cGRhdGUgbWVudXNcclxuICAgIG5hdmlnYXRpb25JdGVtcyAmJiB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyk7XHJcbiAgICB1c2VySXRlbXMgJiYgdGhpcy5yZW5kZXJVc2VyTWVudSh1c2VySXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyICYmICF0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCBpc1Zpc2libGUgPSAobmF2aWdhdGlvbkl0ZW1zICYmIG5hdmlnYXRpb25JdGVtcy5sZW5ndGggPiAwKVxyXG4gICAgICB8fCB0aGlzLm1lbnVTZXR0aW5ncz8udXNlck5hbWVcclxuICAgICAgfHwgKHVzZXJJdGVtcyAmJiB1c2VySXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUoISFpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTxJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGhlYWRlciBkb2VzblxcJ3QgaGF2ZSBtZW51IHNldHRpbmdzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhICE9PSAnc3RyaW5nJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5tZW51U2V0dGluZ3MuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LnNob3coKTtcclxuICAgICAgZGF0YSA9IGF3YWl0IHNlbmRSZXF1ZXN0PElBcHBNZW51TW9kZWw+KHRoaXMubWVudVNldHRpbmdzLmRhdGEpO1xyXG4gICAgICB0aGlzLmNhY2hlQXBwTWVudU1vZGVsKGRhdGEpO1xyXG4gICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKHRydWUpO1xyXG4gICAgICB0aGlzLiRsb2FkQmFyPy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25JdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hvd0dsb2JhbE1lbnUgPSB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKTtcclxuXHJcbiAgICByZXR1cm4gc2hvd0dsb2JhbE1lbnUgfHwgIWFwcE1lbnVNb2RlbC5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyXHJcbiAgICAgID8gYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtc1xyXG4gICAgICA6IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VhcmNoRGF0YVNvdXJjZShhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpOiBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgICBpZiAoIWFwcE1lbnVNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdsb2FiYWxJdGVtczogYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtcyxcclxuICAgICAgcGVyc29uYWxJdGVtczogYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIgPyBhcHBNZW51TW9kZWwuUGVyc29uYWxOYXZpZ2F0aW9uSXRlbXMgOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJJdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFwcE1lbnVNb2RlbC5Vc2VySXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENhY2hlZEFwcE1lbnVNb2RlbCgpOiBJQXBwTWVudU1vZGVsIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhd1ZhbHVlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gcmF3VmFsdWUgPT09IG51bGwgPyByYXdWYWx1ZSA6IEpTT04ucGFyc2UocmF3VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZUFwcE1lbnVNb2RlbChkYXRhOiBJQXBwTWVudU1vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvd0dsb2JhbE1lbnUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByYXdJc0dsb2JhbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTSE9XX0dMT0JBTF9NRU5VX0tFWSk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHJhd0lzR2xvYmFsID09PSBudWxsID8gcmF3SXNHbG9iYWwgYXMgbnVsbCA6IEpTT04ucGFyc2UocmF3SXNHbG9iYWwpIGFzIGJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIGlzR2xvYmFsID09PSBudWxsIHx8IGlzR2xvYmFsO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgZ3JpZENvbHVtblR5cGVzID0gWydkZWZhdWx0JywgJ3N0cmluZycsICdudW1iZXInLCAnZGF0ZScsICdib29sZWFuJywgJ29iamVjdCcsICdkYXRldGltZSddO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ3JpZENvbHVtblR5cGVzO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gQ2RtSW1wb3J0RmlsZU1vZGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxLFxyXG4gIFJlcGxhY2VBbGxSb3dzID0gMixcclxufVxyXG4iLCAiXHVGRUZGXHJcbmV4cG9ydCBlbnVtIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUge1xyXG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXHJcbiAgU3RyaW5nID0gJ3N0cmluZycsXHJcbiAgTnVtYmVyID0gJ251bWJlcicsXHJcbiAgRGF0ZSA9ICdkYXRlJyxcclxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG4gIE9iamVjdCA9ICdvYmplY3QnLFxyXG4gIERhdGV0aW1lID0gJ2RhdGV0aW1lJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQ29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGdyb3VwSW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IG51bWJlcjtcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUgZXh0ZW5kcyBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XHJcbiAgY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW107XHJcbn1cclxuIiwgImNvbnN0IGxvYWRlZFVybHM6IHN0cmluZ1tdID0gW11cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludGVnZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93ICgkY29udGFpbmVyOiBKUXVlcnksIGltYWdlVXJsczogc3RyaW5nW10sIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIgPSA1LCB0cmFuc2l0aW9uVGltZVNlYzogbnVtYmVyID0gMikge1xyXG4gIC8vIFNodWZmbGUgdXJsc1xyXG4gIGNvbnN0IHNodWZmbGVkVXJscyA9IGltYWdlVXJscy5zb3J0KChhLCBiKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcclxuXHJcbiAgJGNvbnRhaW5lci5hZGRDbGFzcygnaXN6b2xlYS1iYWNrZ3JvdW5kLWltYWdlLXZpZXdlcicpLmNzcyh7XHJcbiAgICAndHJhbnNpdGlvbic6IGBiYWNrZ3JvdW5kLWltYWdlICR7dHJhbnNpdGlvblRpbWVTZWN9cyBlYXNlLWluLW91dCAwc2AsXHJcbiAgfSk7XHJcblxyXG4gIHNodWZmbGVkVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcclxuICAgICAgbG9hZGVkVXJscy5wdXNoKHVybCk7XHJcblxyXG4gICAgICBpZihsb2FkZWRVcmxzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGluaXRJbWFnZXNDaGFuZ2luZygkY29udGFpbmVyLCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaW1nLnNyYyA9IHVybDtcclxuICAgIH0sIGluZGV4ICogMTAwKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV4dEluZGV4VG9TaG93IChjdXJyZW50SW5kZXg6IG51bWJlcikge1xyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwID8gMSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXh0SW5kZXggPSByYW5kb21JbnRlZ2VyKDAsIGxvYWRlZFVybHMubGVuZ3RoIC0gMSk7XHJcblxyXG4gIGlmKG5leHRJbmRleCA9PT0gY3VycmVudEluZGV4KSB7XHJcbiAgICByZXR1cm4gbmV4dEluZGV4ID09PSBsb2FkZWRVcmxzLmxlbmd0aCAtIDEgPyAwIDogbmV4dEluZGV4ICsgMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXh0SW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRJbWFnZXNDaGFuZ2luZyAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbWdDaGFuZ2VJbnRlcnZhbFNlYzogbnVtYmVyKSB7XHJcbiAgbGV0IGN1cnJlbnRTaG93bkluZGV4ID0gMDtcclxuXHJcbiAgc2hvd0ltYWdlKCRjb250YWluZXIsIGN1cnJlbnRTaG93bkluZGV4KTtcclxuXHJcbiAgd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U2hvd25JbmRleCA9IGdldE5leHRJbmRleFRvU2hvdyhjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG4gIH0sIGltZ0NoYW5nZUludGVydmFsU2VjICogMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dJbWFnZSAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgJGNvbnRhaW5lci5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCBgdXJsKFwiJHtsb2FkZWRVcmxzW2luZGV4XX1cIilgKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxpY2VuY2UgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcblxyXG5leHBvcnQgZW51bSBGb290ZXJJbmRpY2F0b3JTdGF0dXMge1xyXG4gIFN1Y2Nlc3MsXHJcbiAgV2FybmluZyxcclxuICBFcnJvclxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJJbmRpY2F0b3JWYWx1ZSB7XHJcbiAgc3RhdHVzOiBGb290ZXJJbmRpY2F0b3JTdGF0dXM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvck9wdGlvbnMge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZTtcclxuICBnZXRWYWx1ZT86ICgpID0+IFByb21pc2U8SUZvb3RlckluZGljYXRvclZhbHVlPjtcclxuICBnZXRWYWx1ZUludGVydmFsTXM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3Rlck9wdGlvbnMge1xyXG4gICRyb290OiBKUXVlcnk7XHJcbiAgbmFtZTogc3RyaW5nIHwgZmFsc2U7XHJcbiAgbGljZW5jZTogSUxpY2VuY2UgfCBmYWxzZTtcclxuICB5ZWFyPzogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlO1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgc2VydmVyTmFtZT86IHN0cmluZztcclxuICBkYXRhYmFzZT86IHN0cmluZztcclxuICBpbmRpY2F0b3JzPzogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8SUZvb3Rlck9wdGlvbnM+ID0ge1xyXG4gIHllYXI6ICdsb2NhbCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvb3RlciB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q3VycmVudFllYXIoY3VycmVudFllYXI6IG51bWJlciB8ICdsb2NhbCcgfCBmYWxzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gY3VycmVudFllYXIgPT09ICdsb2NhbCcgfHwgY3VycmVudFllYXIgPT09IGZhbHNlXHJcbiAgICAgID8gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXHJcbiAgICAgIDogY3VycmVudFllYXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWRUbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd05hbWU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaWNlbmNlOiBJTGljZW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dMaWNlbmNlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgeWVhcjogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1llYXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93Q29ubmVjdGVkVG86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzT3B0aW9uczogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeU5hbWU6IE1hcDxzdHJpbmcsIEpRdWVyeT47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JDbGFzc0J5U3RhdHVzID0gbmV3IE1hcDxGb290ZXJJbmRpY2F0b3JTdGF0dXMsIHN0cmluZz4oW1xyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5TdWNjZXNzLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV9zdWNjZXNzJ10sXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLldhcm5pbmcsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3dhcm5pbmcnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuRXJyb3IsICdmb290ZXJfX2luZGljYXRvcl90eXBlX2Vycm9yJ11cclxuICBdKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZvb3Rlck9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmRlZmF1bHRPcHRpb25zIH0gYXMgUmVxdWlyZWQ8SUZvb3Rlck9wdGlvbnM+O1xyXG5cclxuICAgIHRoaXMuJHJvb3QgPSBtZXJnZWRPcHRpb25zLiRyb290O1xyXG4gICAgdGhpcy5uYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubmFtZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubGljZW5jZSA9IG1lcmdlZE9wdGlvbnMubGljZW5jZSAhPT0gZmFsc2UgPyBtZXJnZWRPcHRpb25zLmxpY2VuY2UgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnllYXIgPSBGb290ZXIuZ2V0Q3VycmVudFllYXIobWVyZ2VkT3B0aW9ucy55ZWFyKTtcclxuICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5zaG93TmFtZSA9IG1lcmdlZE9wdGlvbnMubmFtZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1llYXIgPSBtZXJnZWRPcHRpb25zLnllYXIgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gPSAhIW1lcmdlZE9wdGlvbnMuc2VydmVyTmFtZSAmJiAhIW1lcmdlZE9wdGlvbnMuZGF0YWJhc2U7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zID0gb3B0aW9ucy5pbmRpY2F0b3JzIHx8IFtdO1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEpRdWVyeT4oKTtcclxuXHJcbiAgICB0aGlzLmNvbm5lY3RlZFRvID0gdGhpcy5zaG93Q29ubmVjdGVkVG8gPyBgJHttZXJnZWRPcHRpb25zLnNlcnZlck5hbWV9IC0gJHttZXJnZWRPcHRpb25zLmRhdGFiYXNlfWAgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuJHJvb3QuYWRkQ2xhc3MoJ2Zvb3RlcicpO1xyXG5cclxuICAgIHRoaXMucmVuZGVySW5kaWNhdG9ycygpO1xyXG4gICAgdGhpcy5yZW5kZXJDb3B5cmlnaHQoKTtcclxuICAgIHRoaXMuc2hvd1llYXIgJiYgdGhpcy5yZW5kZXJZZWFyKCk7XHJcbiAgICB0aGlzLnNob3dOYW1lICYmIHRoaXMucmVuZGVyTmFtZSgpO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gJiYgdGhpcy5yZW5kZXJDb25uZWN0ZWRUbygpO1xyXG4gICAgdGhpcy5zaG93TGljZW5jZSAmJiB0aGlzLnJlbmRlckxpY2VuY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRpY2F0b3JWYWx1ZShpbmRpY2F0b3JOYW1lOiBzdHJpbmcsIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9IHRoaXMuaW5kaWNhdG9yc0J5TmFtZS5nZXQoaW5kaWNhdG9yTmFtZSk7XHJcbiAgICBpZiAoJGluZGljYXRvckVsKSB7XHJcbiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJJbmRpY2F0b3JzKCkge1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzT3B0aW9ucz8uZm9yRWFjaCgobykgPT4ge1xyXG4gICAgICBpZiAoby50ZXh0KSB7XHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pbmRpY2F0b3ItdGV4dCcpXHJcbiAgICAgICAgICAuaHRtbChgJHtvLnRleHR9OmApXHJcbiAgICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9ICQoJzxzcGFuPicpXHJcbiAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvcicpXHJcbiAgICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG5cclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCBvLnZhbHVlKTtcclxuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lLnNldChvLm5hbWUsICRpbmRpY2F0b3JFbCk7XHJcblxyXG4gICAgICBpZiAoby5nZXRWYWx1ZSAmJiBvLmdldFZhbHVlSW50ZXJ2YWxNcykge1xyXG4gICAgICAgIHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgby5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICAgICAgfSwgby5nZXRWYWx1ZUludGVydmFsTXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbDogSlF1ZXJ5LCB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlKSB7XHJcbiAgICAkaW5kaWNhdG9yRWwuYXR0cigndGl0bGUnLCB2YWx1ZS50aXRsZSk7XHJcbiAgICAkaW5kaWNhdG9yRWwucmVtb3ZlQ2xhc3MoWy4uLnRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy52YWx1ZXMoKV0pO1xyXG4gICAgJGluZGljYXRvckVsLmFkZENsYXNzKHRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy5nZXQodmFsdWUuc3RhdHVzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvcHlyaWdodCgpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb3B5cmlnaHQnKVxyXG4gICAgICAuaHRtbCgnJmNvcHk7JylcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYW1lKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2FwcC1uYW1lJylcclxuICAgICAgLnRleHQodGhpcy5uYW1lICsgKCEhdGhpcy52ZXJzaW9uID8gYDogJHt0aGlzLnZlcnNpb259YCA6ICcnKSlcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb25uZWN0ZWRUbygpIHtcclxuICAgIHRoaXMubmFtZSAmJiAkKCc8c3Bhbj4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb25uZWN0ZWQtdG8nKVxyXG4gICAgICAudGV4dChgQ29ubmVjdGVkIHRvOiAke3RoaXMuY29ubmVjdGVkVG99LmApXHJcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWWVhcigpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2N1cnJlbnQteWVhcicpXHJcbiAgICAgIC50ZXh0KHRoaXMueWVhcilcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaWNlbmNlKCkge1xyXG4gICAgdGhpcy5saWNlbmNlICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtaW5mbycpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19saWNlbmNlLW93bmVyJylcclxuICAgICAgICAgIC50ZXh0KGAke3RoaXMuZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQodGhpcy5saWNlbmNlKX0uIGApXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtZGF0ZScpXHJcbiAgICAgICAgICAudGV4dCh0aGlzLmdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KHRoaXMubGljZW5jZSkpXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dChsaWNlbmNlOiBJTGljZW5jZSkge1xyXG4gICAgcmV0dXJuIGBMaWNlbmNlZCB0bzogJHtsaWNlbmNlLk93bmVyfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICBjb25zdCBkYXRlID0gdHlwZW9mIGxpY2VuY2UuRXhwaXJhdGlvbkRhdGUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUobGljZW5jZS5FeHBpcmF0aW9uRGF0ZSkgOiBsaWNlbmNlLkV4cGlyYXRpb25EYXRlO1xyXG5cclxuICAgIHJldHVybiBgTGljZW5jZSBFeHBpcnk6ICR7ZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX1gO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGbGV0IHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuY29uc3QgcmVzaXplSGFuZGxlcnMgPSBbXTtcclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgaWYgKHJlcGFpbnRUaW1lb3V0KSB7XHJcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHJlcGFpbnRUaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHJlcGFpbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgcmVzaXplSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcigpKTtcclxuICAgIHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuICB9LCAxMDApO1xyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uUmVzaXplOiAoKSA9PiB2b2lkKSB7XHJcbiAgcmVzaXplSGFuZGxlcnMucHVzaChvblJlc2l6ZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgbWFpbjogJy5tYWluJyxcclxuICBoZWFkZXI6ICcubWFpbiAuaGVhZGVyJyxcclxuICBjb250ZW50OiAnLmNvbnRlbnQtYXJlYScsXHJcbiAgcGFuZWw6ICcucGFuZWwnLFxyXG4gIGZvb3RlcjogJ2Zvb3RlcidcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICRjb250ZW50ID0gJChDU1MuY29udGVudCk7XHJcblxyXG4gICRjb250ZW50LmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4sIGlnbm9yZVNpYmxpbmdzOiBib29sZWFuID0gZmFsc2UsIGFkZE93blNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGNvbnN0ICRtYWluID0gJChDU1MubWFpbik7XHJcbiAgY29uc3QgJGhlYWRlciA9ICQoQ1NTLmhlYWRlcik7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuICBjb25zdCAkZm9vdGVyID0gJChDU1MuZm9vdGVyKTtcclxuXHJcbiAgY29uc3QgcGFkZGluZ3MgPSAkY29udGVudC5vdXRlckhlaWdodCgpIC0gJGNvbnRlbnQuaGVpZ2h0KCk7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ID0gJG1haW4uaGVpZ2h0KCkgLSAkaGVhZGVyLmhlaWdodCgpIC0gJGZvb3Rlci5vdXRlckhlaWdodCgpIC0gcGFkZGluZ3M7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgY29uc3QgJGNvbnRlbnRFbGVtZW50cyA9ICRjb250ZW50LmNoaWxkcmVuKCk7XHJcbiAgbGV0IGNvbnRlbnRFbGVtZW50c0hlaWdodCA9IDA7XHJcblxyXG4gIGlmICghaWdub3JlU2libGluZ3MpIHtcclxuICAgIGNvbnN0ICR3aWRnZXRFbGVtZW50ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICAgICRjb250ZW50RWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0ICRjaGlsZCA9ICQoZWwpO1xyXG5cclxuICAgICAgaWYgKCRjaGlsZC5pcygkd2lkZ2V0RWxlbWVudCkgfHwgJGNoaWxkLmhhcygkd2lkZ2V0RWxlbWVudFswXSkubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250ZW50RWxlbWVudHNIZWlnaHQgKz0gKCRjaGlsZC5pcygnOnZpc2libGUnKSAmJiAkY2hpbGQuY3NzKCdwb3NpdGlvbicpICE9PSAnYWJzb2x1dGUnKSA/ICRjaGlsZC5vdXRlckhlaWdodCh0cnVlKSA6IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxhc3RXaWRnZXRIZWlnaHQgPSBsYXN0Q29udGVudEhlaWdodCAtIGNvbnRlbnRFbGVtZW50c0hlaWdodDtcclxuXHJcbiAgaWYgKGFkZE93blNpemUpIHtcclxuICAgIGxhc3RXaWRnZXRIZWlnaHQgKz0gd2lkZ2V0LmVsZW1lbnQoKS5vdXRlckhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0IHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9IHdpbmRvd0hlaWdodDtcclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCwgaWdub3JlU2libGluZ3MsIGFkZE93blNpemUpO1xyXG5cclxuICBhdXRvUmVzaXplKCgpID0+IHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZjb25zdCBESVNBQkxFRF9DTEFTUyA9ICdpc296LWljb24tZGlzYWJsZWQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRIRU1FX0NMQVNTRVMgPSB7XHJcbiAgbGc6ICdpc3pvbGVhLWxnJyxcclxuICBtZDogJ2lzem9sZWEtbWQnLFxyXG4gIHNtOiAnaXN6b2xlYS1zbSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaGVtZUhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWlkZGxlU2l6ZShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XHJcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMubWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50U21hbGxTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5zbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldE1pZGRsZVNpemUoaW5zdGFuY2U6IGFueSkge1xyXG4gICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZSwgVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldFNtYWxsU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNsYXNzKGljb246IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuLCBzaXplOiAxNiB8IDI0ID0gMTYpIHtcclxuICAgIGNvbnN0IGljb25DbGFzcyA9IGBpc296IGlzb3otaWNvbi0ke2ljb259LSR7c2l6ZX1gO1xyXG5cclxuICAgIHJldHVybiAhZGlzYWJsZWRcclxuICAgICAgPyBpY29uQ2xhc3NcclxuICAgICAgOiBgJHtpY29uQ2xhc3N9ICR7RElTQUJMRURfQ0xBU1N9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHNldFdpZGdldFNpemUoaW5zdGFuY2U6IGFueSwgc2l6ZUNsYXNzOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICBpbnN0YW5jZS5vcHRpb24oJ2VsZW1lbnRBdHRyJywgeyBjbGFzczogc2l6ZUNsYXNzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbGJhckhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBnZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbCA9ICQoYDxzcGFuIGNsYXNzPVwiJHtDTEFTU0VTLnRpdGxlfVwiPiR7dGl0bGV9PC9zcGFuPmApO1xyXG5cclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICRlbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdSZXBvcnQgZGV0YWlscycpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkZWw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVG9vbGJhclNldHRpbmcge1xyXG4gIG9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENMQVNTRVMgPSB7XHJcbiAgdGl0bGU6ICdpc296LXRpdGxlJyxcclxuICBoZWFkZXI6ICdpc296LXRvb2xiYXItaGVhZGVyJyxcclxuICBkcm9wRG93bkJ1dHRvbjogJ2R4LWRyb3Bkb3dubWVudS1idXR0b24nXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcjogc3RyaW5nLCBzZXR0aW5nczogSVRvb2xiYXJTZXR0aW5nID0geyB0aXRsZTogJycsIGRlc2NyaXB0aW9uOiAnJywgb3B0aW9uczoge30gfSk6XHJcbiAgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIge1xyXG4gIGNvbnN0IHtcclxuICAgIHRpdGxlID0gJycsXHJcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxyXG4gICAgb3B0aW9ucyA9IHt9LFxyXG4gIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7XHJcbiAgICBpdGVtcyA9IFtdLFxyXG4gICAgZWxlbWVudEF0dHIgPSB7fVxyXG4gIH0gPSBvcHRpb25zO1xyXG5cclxuICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBtaWRsZGVTaXplRWxlbWVudEF0dHIgPSB7IGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kIH07XHJcblxyXG4gICAgaWYgKGl0ZW0ub3B0aW9ucykge1xyXG4gICAgICBsZXQgeyBlZGl0b3JPcHRpb25zIH0gPSBpdGVtLm9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoIWVkaXRvck9wdGlvbnMpIHtcclxuICAgICAgICBlZGl0b3JPcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVkaXRvck9wdGlvbnMuZWxlbWVudEF0dHIgPSBtaWRsZGVTaXplRWxlbWVudEF0dHI7XHJcbiAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVkaXRvck90aW9ucyA9IGVkaXRvck9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKGUpID0+IHtcclxuICAgIGUuZWxlbWVudFxyXG4gICAgICAuZmluZChgLiR7Q0xBU1NFUy5kcm9wRG93bkJ1dHRvbn1gKVxyXG4gICAgICAuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgIG9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuICQoYCR7c2VsZWN0b3J9YClcclxuICAgIC5keFRvb2xiYXIoe1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHRpdGxlLCBkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgLi4uaXRlbXNcclxuICAgICAgXSxcclxuICAgICAgb25Db250ZW50UmVhZHksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgLi4uZWxlbWVudEF0dHIsXHJcbiAgICAgICAgY2xhc3M6IENMQVNTRVMuaGVhZGVyXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuZHhUb29sYmFyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xyXG5cclxuY29uc3QgQ1NTID0ge1xyXG4gIHBhbmVsOiAnLnBhbmVsLWJvZHknXHJcbn07XHJcblxyXG5sZXQgbGFzdFdpbmRvd0hlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0Q29udGVudEhlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0V2lkZ2V0SGVpZ2h0ID0gbnVsbDtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUhlaWdodCh3aWRnZXQpIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSAkd2lkZ2V0LnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgJHBhbmVsLmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSB3aWRnZXQuZWxlbWVudCgpLnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgY29uc3QgcGFuZWxUb3AgPSAkcGFuZWwucG9zaXRpb24oKS50b3A7XHJcbiAgY29uc3QgcGFuZWxIZWlnaHQgPSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3QgcGFuZWxQYWRkaW5nID0gJHBhbmVsLm91dGVySGVpZ2h0KCkgLSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3Qgd2lkZ2V0VG9wID0gJHdpZGdldC5wb3NpdGlvbigpLnRvcDtcclxuXHJcbiAgY29uc3Qgd2lkZ2V0SGVpZ2h0ID0gcGFuZWxIZWlnaHQgLSAod2lkZ2V0VG9wIC0gcGFuZWxUb3ApICsgcGFuZWxQYWRkaW5nIC8gMjtcclxuXHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0Jywgd2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHBhbmVsSGVpZ2h0IGZyb20gJy4uL1BhbmVsSGVpZ2h0JztcclxuaW1wb3J0IHsgQ1NTX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIGluUGFuZWxHcmlkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChpZDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBpc0luUGFuZWxHcmlkID0gZmFsc2UpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEYXRhR3JpZChpZCwgb3B0aW9ucyk7XHJcblxyXG4gIGlmICghb3B0aW9ucy5oZWlnaHQpIHtcclxuICAgIGlmIChpc0luUGFuZWxHcmlkKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KGdyaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZnVsbFNjcmVlbihncmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0YUdyaWQoZWw6IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGVsLmR4RGF0YUdyaWQob3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KFxyXG4gIGVsOiBzdHJpbmcgfCBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdC5Qcm9wZXJ0aWVzLCBpc0luUGFuZWwgPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3Qge1xyXG4gIGNvbnN0IHRyZWVMaXN0ID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgPyAkKGVsKSA6IGVsKS5keFRyZWVMaXN0KG9wdGlvbnMpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XHJcblxyXG4gIHRyZWVMaXN0LmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbCkge1xyXG4gICAgICBwYW5lbEhlaWdodCh0cmVlTGlzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKHRyZWVMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cmVlTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgVG9vbGJhckhlbHBlciB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVG9vbGJhcic7XHJcbmltcG9ydCB7IFRoZW1lSGVscGVyLCBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uLy4uL0NvbmZpZy9JbmRleCc7XHJcbmltcG9ydCB7IGNyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbiB9IGZyb20gJy4uLy4uL1V0aWxzL0dyaWRFeHBvcnQnO1xyXG5cclxuaW50ZXJmYWNlIElHcmlkU2V0dGluZ3NCYXNlPFQ+IHtcclxuICBvcHRpb25zPzogVDtcclxuXHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG4gIGlzRnVsbFNjcmVlbj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgc2V0RGVmYXVsdENvbHVtbldpZHRoPzogYm9vbGVhbjtcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb24/OiBib29sZWFuO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJJdGVtcz86IGFueVtdO1xyXG4gIGJ1dHRvbnNTaXplPzogJ3NtJyB8ICdtZCc7XHJcbn1cclxuXHJcbmNvbnN0IGdldFdpZGdldE5hbWUgPSAod2lkZ2V0OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gd2lkZ2V0XHJcbiAgICAuc2xpY2UoJ2R4Jy5sZW5ndGgpXHJcbiAgICAudG9Mb3dlckNhc2UoKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFNlbGVjdG9ycyA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IGdyaWROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VhcmNoUGFuZWw6IGAuZHgtJHtncmlkTmFtZX0tc2VhcmNoLXBhbmVsYCxcclxuICAgIHRvb2xiYXJFZGl0QnV0dG9uOiBgLmR4LSR7Z3JpZE5hbWV9LXRvb2xiYXItYnV0dG9uLmR4LWVkaXQtYnV0dG9uYCxcclxuICAgIHRvb2xiYXJFeHBvcnRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tZXhwb3J0LWJ1dHRvbiAuZHgtYnV0dG9uYCxcclxuICAgIHNlbGVjdENoZWNrQm94OiAnLmR4LXNlbGVjdC1jaGVja2JveCdcclxuICB9O1xyXG59O1xyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhR3JpZFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTGlzdFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncykge1xyXG4gIGNvbnN0IHJlc3VsdDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyBnZXRMZWdhY3lEZWZhdWx0T3B0aW9ucyhzZXR0aW5ncykgOiBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4pIHtcclxuICAgIChyZXN1bHQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMpLnN1bW1hcnkgPSB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4sXHJcbiAgICAgICAgc2hvd0luQ29sdW1uOiBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uIHx8IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXN1bHQuZXhwb3J0ID0ge1xyXG4gICAgZW5hYmxlZDogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcclxuICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICByZXN1bHQuZ3JvdXBQYW5lbCA9IHsgdmlzaWJsZTogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG5cclxuICByZXN1bHQuc2VsZWN0aW9uID0geyBtb2RlOiAnbm9uZScgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnNcclxuICA8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5ncyk6IFQge1xyXG4gIHJldHVybiB7XHJcbiAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgY2FjaGVFbmFibGVkOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRydWUsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogODAgfSxcclxuICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgc2Nyb2xsaW5nOiB7XHJcbiAgICAgIG1vZGU6ICd2aXJ0dWFsJyxcclxuICAgICAgcm93UmVuZGVyaW5nTW9kZTogJ3ZpcnR1YWwnXHJcbiAgICB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHtcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDI0MCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nXHJcbiAgICB9LFxyXG4gICAgc2hvd1Jvd0xpbmVzOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBzZWxlY3Rpb246IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgd29yZFdyYXBFbmFibGVkOiB0cnVlXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMZWdhY3lEZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG5cclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwIH0sXHJcbiAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJyB9LFxyXG4gIH0gYXMgVDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlcGFyZURlZmF1bHRUb29sYmFyQnV0dG9ucyh0b29sYmFyT3B0aW9uczogYW55LCB0b29sYmFyQWNjZW50QnV0dG9uTmFtZT86IHN0cmluZykge1xyXG4gIGNvbnN0IGZpbmRUb29sYmFySXRlbSA9IChpdGVtczogYW55W10sIG5hbWU6IHN0cmluZykgPT4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcclxuXHJcbiAgaWYgKHRvb2xiYXJPcHRpb25zPy5pdGVtcykge1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgaWYgKHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IGFjY2VudEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuICAgICAgaWYgKGFjY2VudEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgICBhY2NlbnRCdXR0b25JdGVtLm9wdGlvbnMudHlwZSA9ICdkZWZhdWx0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNhdmVCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAnc2F2ZUJ1dHRvbicpO1xyXG4gICAgaWYgKHNhdmVCdXR0b25JdGVtKSB7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdTYXZlJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXZlcnRCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmV2ZXJ0QnV0dG9uJyk7XHJcbiAgICBpZiAocmV2ZXJ0QnV0dG9uSXRlbSkge1xyXG4gICAgICByZXZlcnRCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ0Rpc2NhcmQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmVmcmVzaCcpO1xyXG4gICAgaWYgKHJlZnJlc2hCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdSZWZyZXNoJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy5oaW50ID0gJ1JlbG9hZCBEYXRhJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFuZGxlcnM8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihcclxuICB3aWRnZXQ6ICdkeERhdGFHcmlkJyB8ICdkeFRyZWVMaXN0JyxcclxuICBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5nc1xyXG4pOiBUIHtcclxuICBjb25zdCBzZWxlY3RvcnMgPSBnZXRTZWxlY3RvcnMod2lkZ2V0KTtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnaGVhZGVyJykge1xyXG4gICAgICAgICAgZS5jZWxsRWxlbWVudC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25DZWxsUHJlcGFyZWQpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZChlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgZGF0YUdyaWQuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgY29uc29sZS5sb2coJ0JFR0lOJyk7XHJcblxyXG4gICAgICBpZiAoIXNldHRpbmdzLmRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uKSB7XHJcbiAgICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZGF0YUdyaWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIGlzR3JpZEluaXRpYWxpemFlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vdG8gZml4IGF1dG9zY3JvbGxcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSBkYXRhR3JpZC5nZXRTY3JvbGxhYmxlKCk7XHJcblxyXG4gICAgICAgICAgaWYgKHNjcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7IHRvcDogMCB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhR3JpZC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZGF0YVR5cGUnKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnNldERlZmF1bHRDb2x1bW5XaWR0aCB8fCBzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgaWYgKCFkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzQ1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMzVweCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTQwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCBkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnYWxpZ25tZW50JywgJ3JpZ2h0Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnZGQgTU1NIHl5eXknKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnSEg6bW0sIGRkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRNaWRkbGVTaXplKCQoc2VsZWN0b3JzLnNlYXJjaFBhbmVsKS5keFRleHRCb3goJ2luc3RhbmNlJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgVGhlbWVIZWxwZXIuc2V0RWxlbWVudFNtYWxsU2l6ZShlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZChzZWxlY3RvcnMuc2VsZWN0Q2hlY2tCb3gpKTtcclxuXHJcbiAgICAgICAgaWYgKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJykge1xyXG4gICAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTbWFsbFNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5keEJ1dHRvbignaW5zdGFuY2UnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zb2xlLmxvZygnRU5EIDEnKTtcclxuICAgICAgZGF0YUdyaWQuZW5kVXBkYXRlKCk7XHJcbiAgICB9LFxyXG4gICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMgPSB7fVxyXG4gICAgICB9ID0gZTtcclxuXHJcbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XHJcblxyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgaXRlbXMgPSBbXVxyXG4gICAgICB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckVsID0gJCgnPGgyIC8+JykuYWRkQ2xhc3MoJ2dyaWQtaGVhZGVyJykudGV4dChzZXR0aW5ncy50aXRsZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJFbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdDbGljayB0byBzZWUgZnVydGhlciBkZXRhaWxzJykpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJyAmJiBpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MudGl0bGUpIHtcclxuICAgICAgICAgIGl0ZW1zLnVuc2hpZnQoVG9vbGJhckhlbHBlci5nZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0oc2V0dGluZ3MudGl0bGUsIHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0ud2lkZ2V0ID09PSAnZHhCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGljb25TaXplID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyAxNiA6IDI0O1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChpdGVtLm5hbWUpIHtcclxuICAgICAgICAgICAgICBjYXNlICdhZGRSb3dCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3BsdXMnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3NhdmVCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ3NhdmUnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGNhc2UgJ3JldmVydEJ1dHRvbic6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IFRoZW1lSGVscGVyLmdldEljb25DbGFzcygnY2xvc2UnLCBmYWxzZSwgaWNvblNpemUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0cikge1xyXG4gICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIuY2xhc3MgPSBzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJyA/IFRIRU1FX0NMQVNTRVMuc20gOiBUSEVNRV9DTEFTU0VTLm1kO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByZXBhcmVEZWZhdWx0VG9vbGJhckJ1dHRvbnModG9vbGJhck9wdGlvbnMsIHNldHRpbmdzLnRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRvb2xiYXJJdGVtcykge1xyXG4gICAgICAgICAgaXRlbXMucHVzaCguLi5zZXR0aW5ncy50b29sYmFySXRlbXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9vbGJhck9wdGlvbnMuZWxlbWVudEF0dHIgPSB7XHJcbiAgICAgICAgICBjbGFzczogJ2lzb3otdG9vbGJhci1oZWFkZXInXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbkluZGV4ID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3NhdmVCdXR0b24nKTtcclxuICAgICAgY29uc3Qgc2VhcmNoUGFuZWxJbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzZWFyY2hQYW5lbCcpO1xyXG4gICAgICBsZXQgaW5kZXhGb3JVcGRhdGUgPSAtMTtcclxuXHJcbiAgICAgIGlmIChzYXZlQnV0dG9uSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2F2ZUJ1dHRvbkluZGV4O1xyXG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaFBhbmVsSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2VhcmNoUGFuZWxJbmRleDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLnNwbGljZShpbmRleEZvclVwZGF0ZSwgMCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIG5hbWU6ICdyZWZyZXNoJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgaWNvbjogJ3JlZnJlc2gnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IDMwIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogYGR4LWRhdGFncmlkLXRvb2xiYXItYnV0dG9uICR7c2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZH1gIH0sXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2RlOiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAndGV4dCcgOiAnY29udGFpbmVkJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gZGF0YUdyaWQ/LnJlZnJlc2goKSxcclxuICAgICAgICAgICAgb25Db250ZW50UmVhZHk6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IChjb250ZW50UmVhZHlFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnRSZWFkeUV2ZW50LmVsZW1lbnQuZmluZCgnLmR4LWJ1dHRvbi1jb250ZW50JykuY3NzKHtcclxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6IDYsXHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiA2XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbi5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uVG9vbGJhclByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnMub25Ub29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgZS5lZGl0b3JPcHRpb25zID0ge1xyXG4gICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLFxyXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICAgICAgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhTZWxlY3RCb3gnKSB7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAuLi5lLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zLFxyXG4gICAgICAgICAgICBvblNob3dpbmc6IChhcmdzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB3aWRnZXROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG4gICAgICAgICAgICAgIGFyZ3MuY29tcG9uZW50Ll8kcG9wdXBDb250ZW50LmFkZENsYXNzKGBpc296LSR7d2lkZ2V0TmFtZX0tc2VsZWN0Ym94LXBvcHVwYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhDaGVja0JveCcpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5lZGl0b3JFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAoZS5wYXJlbnRUeXBlKSB7XHJcbiAgICAgICAgY2FzZSAnZmlsdGVyUm93JzpcclxuICAgICAgICAgIGNvbnN0IGFwcGx5RmlsdGVyOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmVsZW1lbnQgJiYgZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlGaWx0ZXI7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5RmlsdGVyO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdzZWFyY2hQYW5lbCc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseVNlYXJjaDogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9ICgpID0+IHsgfTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5U2VhcmNoO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25FZGl0b3JQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uRWRpdG9yUHJlcGFyaW5nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25Db250ZXh0TWVudVByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS50YXJnZXQgPT09ICdjb250ZW50JyAmJiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSB7XHJcbiAgICAgICAgICBpZiAoIWUuaXRlbXMpIHtcclxuICAgICAgICAgICAgZS5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgIHRleHQ6ICdFeHBvcnQgYWxsIGRhdGEnLFxyXG4gICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmV4cG9ydFRvRXhjZWwoZmFsc2UpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpY29uOiAneGxzeGZpbGUnXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhDb250ZXh0TWVudUl0ZW0pO1xyXG5cclxuICAgICAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zLnNlbGVjdGlvbj8ubW9kZSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IGUuY29tcG9uZW50LmdldFNlbGVjdGVkUm93S2V5cygpO1xyXG5cclxuICAgICAgICAgICAgZS5pdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IHNlbGVjdGVkIHJvd3MnLFxyXG4gICAgICAgICAgICAgIG9uSXRlbUNsaWNrOiAoKSA9PiBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKHRydWUpLFxyXG4gICAgICAgICAgICAgIGljb246ICdleHBvcnRzZWxlY3RlZCcsXHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFzZWxlY3RlZFJvd3MgfHwgIXNlbGVjdGVkUm93cy5sZW5ndGhcclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNvbnRleHRNZW51UHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRXhwb3J0aW5nOiAhIXNldHRpbmdzLmV4cG9ydEZpbGVOYW1lID8gY3JlYXRlR3JpZEV4cG9ydEZ1bmN0aW9uKHNldHRpbmdzLmV4cG9ydEZpbGVOYW1lKSA6IHZvaWQgMCxcclxuICB9IGFzIFQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IHsgZ2V0R3JpZERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycywgSURhdGFHcmlkU2V0dGluZ3MgfSBmcm9tICcuL0RlZmF1bHRHcmlkQmFzZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbDogSlF1ZXJ5LCBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zPignZHhEYXRhR3JpZCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5pc0Z1bGxTY3JlZW4gfHwgc2V0dGluZ3MuaXNGdWxsU2NyZWVuID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQoZWwsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGNyZWF0ZURhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4vRGVmYXVsdEdyaWQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXHJcbiAgaWQ6IHN0cmluZywgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxyXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgcmV0dXJuIGRlZmF1bHRHcmlkKCQoYCMke2lkfWApLCB7XHJcbiAgICBvcHRpb25zOiBkYXRhR3JpZE9wdGlvbnMsXHJcbiAgICBleHBvcnRGaWxlTmFtZTogYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICBpblBhbmVsR3JpZDogYWRkaXRpb25hbE9wdGlvbnMuaW5QYW5lbEdyaWQsXHJcbiAgICBzaG93U3VtbWFyeUluQ29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zaG93U3VtbWFyeUluQ29sdW1uLFxyXG4gICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcclxuICAgIGhlYWRlckRlc2NyaXB0aW9uLFxyXG4gICAgdGl0bGU6IGhlYWRlclRleHRcclxuICB9KTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVRyZWVMaXN0U2V0dGluZ3MsIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMsIGdldEhhbmRsZXJzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QgfSBmcm9tICcuL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcgfCBKUXVlcnksXHJcbiAgc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzID0ge31cclxuKTogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0IHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG4gIGxldCBtZXJnZWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBzZXR0aW5ncy5vcHRpb25zKTtcclxuICBjb25zdCBoYW5kbGVycyA9IGdldEhhbmRsZXJzPERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KCdkeFRyZWVMaXN0JywgJC5leHRlbmQodHJ1ZSwge30sIHNldHRpbmdzLCB7IG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMgfSkpO1xyXG5cclxuICBtZXJnZWRPcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIG1lcmdlZE9wdGlvbnMsIGhhbmRsZXJzKTtcclxuXHJcbiAgcmV0dXJuIGNyZWF0ZUZ1bGxTY3JlZW5UcmVlTGlzdChpZCwgbWVyZ2VkT3B0aW9ucywgc2V0dGluZ3MuaW5QYW5lbEdyaWQpO1xyXG59XHJcbiIsICJpbXBvcnQgQ3JvcHByIGZyb20gJ2Nyb3Bwcic7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uL1BvcHVwJztcclxuXHJcbmltcG9ydCBJbml0aWFsaXplZEV2ZW50SW5mbyA9IERldkV4cHJlc3MuZXZlbnRzLkluaXRpYWxpemVkRXZlbnRJbmZvO1xyXG5cclxuY29uc3QgYXZhdGFyU2l6ZSA9IHtcclxuICBoZWlnaHQ6IDMwMCxcclxuICB3aWR0aDogMzAwLFxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRJbWFnZVRvUHJldmlldyAocHJldmlldzogSlF1ZXJ5LCBiYXNlNjRJbWc6IHN0cmluZyB8IG51bGwpIHtcclxuICBwcmV2aWV3LmF0dHIoJ3NyYycsIGJhc2U2NEltZyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRNYXJrdXAgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgY29uc3QgJGF2YXRhclBvcHVwQ29udGVudCA9ICQoJzxkaXY+JylcclxuICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX19kcm9wem9uZScpO1xyXG4gIC8vLm9uKCdkcm9wJyAsIGV2ID0+IGV2LmRhdGFUcmFuc2Zlci5maWxlcylcclxuXHJcbiAgY29uc3QgJGNyb3BwZXJDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fY3JvcC1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRhdmF0YXJQb3B1cENvbnRlbnQpO1xyXG5cclxuICBjb25zdCAkY3JvcEltYWdlID0gJCgnPGltZyAvPicpLnByZXBlbmRUbygkY3JvcHBlckNvbnRhaW5lcik7XHJcblxyXG4gIHNldEltYWdlVG9QcmV2aWV3KCRjcm9wSW1hZ2UsIGltYWdlQmFzZTY0KTtcclxuXHJcbiAgY29uc3QgY3JvcHBlciA9IG5ldyBDcm9wcHIoJGNyb3BJbWFnZVswXSwge1xyXG4gICAgYXNwZWN0UmF0aW86IDEsXHJcbiAgICBzdGFydFNpemU6IFs5MCwgOTBdLFxyXG4gIH0pO1xyXG5cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgICRjb250ZW50OiAkYXZhdGFyUG9wdXBDb250ZW50LFxyXG4gICAgY3JvcHBlclxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dQb3B1cCAoJGNvbnRlbnQ6IEpRdWVyeSwgY3JvcHBlcjogQ3JvcHByLCBvbkF2YXRhclVwZGF0ZWQ6IChwaG90b0Jhc2U2NDogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgY3JlYXRlRGlhbG9nKFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ1VwZGF0ZSBwcm9maWxlIHBpY3R1cmUnLFxyXG4gICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgaGlkZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgbWF4V2lkdGg6IDEwMjQsXHJcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlOiBJbml0aWFsaXplZEV2ZW50SW5mbzxEZXZFeHByZXNzLnVpLmR4UG9wdXA+KSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQgJiYgZS5jb21wb25lbnQub3B0aW9uKCdmdWxsU2NyZWVuJywgd2luZG93LmlubmVyV2lkdGggPD0gMTAyNCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkY29udGVudCxcclxuICAgIHtcclxuICAgICAgdGV4dDogJ1VwZGF0ZScsXHJcbiAgICAgIG9uQ2xpY2s6IChjbG9zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNyb3BPcHRpb25zID0gY3JvcHBlci5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGNvbnN0ICRjYW52YXM6IEpRdWVyeTxIVE1MQ2FudmFzRWxlbWVudD4gPSAkKCc8Y2FudmFzPicpLmF0dHIoJ2hlaWdodCcsIGF2YXRhclNpemUuaGVpZ2h0KS5hdHRyKCd3aWR0aCcsIGF2YXRhclNpemUud2lkdGgpIGFzIEpRdWVyeTxIVE1MQ2FudmFzRWxlbWVudD47XHJcbiAgICAgICAgY29uc3QgY3R4ID0gKCRjYW52YXNbMF0gYXMgYW55KS5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgIGNvbnN0ICRpbWFnZSA9ICRjb250ZW50LmZpbmQoJ2ltZy5jcm9wcHItaW1hZ2UnKVswXTtcclxuXHJcbiAgICAgICAgY3R4LmRyYXdJbWFnZSgkaW1hZ2UsIGNyb3BPcHRpb25zLngsIGNyb3BPcHRpb25zLnksIGNyb3BPcHRpb25zLndpZHRoLCBjcm9wT3B0aW9ucy5oZWlnaHQsIDAsIDAsIGF2YXRhclNpemUud2lkdGgsIGF2YXRhclNpemUuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgY29uc3QgY3JvcHBlZCA9ICRjYW52YXNbMF0udG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgMC45KTtcclxuXHJcbiAgICAgICAgb25BdmF0YXJVcGRhdGVkKGNyb3BwZWQpO1xyXG4gICAgICAgIGNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2UpID0+IGNsb3NlKClcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2hvdyAoaW1hZ2VCYXNlNjQ6IHN0cmluZyB8IG51bGwsIG9uQXZhdGFyVXBkYXRlZDogKHBob3RvQmFzZTY0OiBzdHJpbmcpID0+IHZvaWQpIHtcclxuICBjb25zdCBjb250ZW50ID0gY3JlYXRlQ29udGVudE1hcmt1cChpbWFnZUJhc2U2NCk7XHJcblxyXG4gIHNob3dQb3B1cChjb250ZW50LiRjb250ZW50LCBjb250ZW50LmNyb3BwZXIsIG9uQXZhdGFyVXBkYXRlZCk7XHJcbn1cclxuIiwgImV4cG9ydCBjb25zdCBnZXRCYXNlNjQgPSAoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbGVSZWFkZXIucmVzdWx0O1xyXG4gICAgICAgIHJlc29sdmUodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgPyByZXN1bHQgOiBudWxsKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59O1xyXG4iLCAiaW1wb3J0IHtJUmVuZGVyZWR9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7RGV2RXhwcmVzc0V2ZW50QXJnc30gZnJvbSAnLi4vLi4vVXRpbHMvRGV2RXhwcmVzc0V2ZW50QXJncyc7XHJcbmltcG9ydCB7IHNob3cgfSBmcm9tICcuLi8uLi9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZyc7XHJcbmltcG9ydCB7Z2V0QmFzZTY0fSBmcm9tICcuLi8uLi9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzJztcclxuaW1wb3J0IGR4VGV4dEJveE9wdGlvbnMgPSBEZXZFeHByZXNzLnVpLmR4VGV4dEJveE9wdGlvbnM7XHJcbmltcG9ydCBkeFRleHRCb3ggPSBEZXZFeHByZXNzLnVpLmR4VGV4dEJveDtcclxuaW1wb3J0IElzem9sZWFVSSBmcm9tICcuLi8uLi9pbmRleCc7XHJcblxyXG5jb25zdCBtYXhGaWxlTWJTaXplID0gMTA7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBY2NvdW50U2V0dGluZ3NEYXRhIHtcclxuICBVc2VyTmFtZTogc3RyaW5nO1xyXG4gIEZpcnN0TmFtZTogc3RyaW5nO1xyXG4gIExhc3ROYW1lOiBzdHJpbmc7XHJcbiAgUGhvbmVOdW1iZXI6IHN0cmluZztcclxuICBFbWFpbDogc3RyaW5nO1xyXG4gIE9sZFBhc3N3b3JkOiBzdHJpbmc7XHJcbiAgTmV3UGFzc3dvcmQ6IHN0cmluZztcclxuICBOZXdQYXNzd29yZFJlcGVhdDogc3RyaW5nO1xyXG4gIEF2YXRhcjogc3RyaW5nO1xyXG4gIEhhc0NoYW5nZXM6IGJvb2xlYW47XHJcbiAgRXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXIge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxuICBGaXJzdE5hbWU6IHN0cmluZztcclxuICBMYXN0TmFtZTogc3RyaW5nO1xyXG4gIFVzZXJBdmF0YXI6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFjY291bnRTZXR0aW5nc1BhZ2UgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFVzZXJJbmZvOiBJVXNlciB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgcmVhZG9ubHkgYWNjb3VudFNldHRpbmdzRGF0YTogSUFjY291bnRTZXR0aW5nc0RhdGEgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1BY3Rpb246IHN0cmluZztcclxuICBwcml2YXRlIGF2YXRhclVwbG9hZGVyOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgYWNjb3VudFNldHRpbmdzRm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIGVsZW1lbnRzXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfJHJvb3RFbGVtZW50OiBKUXVlcnk8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICRjb250YWluZXI6IEpRdWVyeTxIVE1MRGl2RWxlbWVudD4sXHJcbiAgICBmb3JtQWN0aW9uOiBzdHJpbmcsXHJcbiAgICBhY2NvdW50U2V0dGluZ3NEYXRhOiBJQWNjb3VudFNldHRpbmdzRGF0YSB8IHVuZGVmaW5lZCxcclxuICAgIHVzZXJJbmZvOiBJVXNlciB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhID0gYWNjb3VudFNldHRpbmdzRGF0YTtcclxuICAgIHRoaXMuY3VycmVudFVzZXJJbmZvID0gdXNlckluZm87XHJcbiAgICB0aGlzLl8kcm9vdEVsZW1lbnQgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5mb3JtQWN0aW9uID0gZm9ybUFjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLnJlbmRlclVwbG9hZGVyKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICAgIHRoaXMucmVuZGVyQWNjb3VudFNldHRpbmdzRm9ybSh0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCAkcm9vdEVsZW1lbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuXyRyb290RWxlbWVudCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByb290IGVsZW1lbnQgaXMgdW5kZWZpbmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuXyRyb290RWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVXBsb2FkZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICB0aGlzLmF2YXRhclVwbG9hZGVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fdXBsb2FkZXInKVxyXG4gICAgICAuZHhGaWxlVXBsb2FkZXIoe1xyXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcclxuICAgICAgICB1cGxvYWRNb2RlOiAndXNlRm9ybScsXHJcbiAgICAgICAgYWNjZXB0OiAnaW1hZ2UvKicsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgbWF4RmlsZVNpemU6IG1heEZpbGVNYlNpemUgKiAxMDAwMDAwLFxyXG5cclxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGU6IERldkV4cHJlc3NFdmVudEFyZ3M8RGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlck9wdGlvbnMsICdvblZhbHVlQ2hhbmdlZCc+KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50IHx8ICFlLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBlLnZhbHVlWzBdO1xyXG4gICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IGUuY29tcG9uZW50Lm9wdGlvbignbWF4RmlsZVNpemUnKSB8fCBtYXhGaWxlTWJTaXplO1xyXG5cclxuICAgICAgICAgIGlmICghZmlsZSB8fCBmaWxlLnNpemUgPiBtYXhTaXplKSB7XHJcbiAgICAgICAgICAgIERldkV4cHJlc3MudWkubm90aWZ5KGBGaWxlIHNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAke21heEZpbGVNYlNpemV9IE1CLiBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgZmlsZWAsICdlcnJvcicsIDUwMDApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGdldEJhc2U2NChmaWxlKVxyXG4gICAgICAgICAgICAudGhlbigoaW1hZ2VCYXNlNjQpID0+IHtcclxuICAgICAgICAgICAgICBzaG93KGltYWdlQmFzZTY0LCAobmV3SW1nU291cmNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LnVwZGF0ZURhdGEoJ0F2YXRhcicsIG5ld0ltZ1NvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LnJlcGFpbnQoKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gRGV2RXhwcmVzcy51aS5ub3RpZnkoZXJyb3IsICdlcnJvcicsIDMwMDApKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICAgICAgLmR4RmlsZVVwbG9hZGVyKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJBY2NvdW50U2V0dGluZ3NGb3JtKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgaWYgKHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtID0gJCgnPGZvcm0gLz4nKVxyXG4gICAgICAuYXR0cignYWN0aW9uJywgdGhpcy5mb3JtQWN0aW9uKVxyXG4gICAgICAuYXR0cignbWV0aG9kJywgJ3Bvc3QnKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2Zvcm0nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvcm0tY29udGVudCcpXHJcbiAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKVxyXG4gICAgICAuZHhGb3JtKHRoaXMuZ2V0Rm9ybU9wdGlvbnMoKSlcclxuICAgICAgLmR4Rm9ybSgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICBpZiAodGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhPy5IYXNDaGFuZ2VzICYmICF0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEuRXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gSXN6b2xlYVVJLndpZGdldHMubm90aWZ5KCdDaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZCcsIHRydWUpLCA1MDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JtT3B0aW9ucygpIDogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEsXHJcbiAgICAgIG1pbkNvbFdpZHRoOiAyMDAsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBhbGlnbkl0ZW1MYWJlbHM6IHRydWUsXHJcbiAgICAgIHNob3dWYWxpZGF0aW9uU3VtbWFyeTogdHJ1ZSxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICAgIGNvbENvdW50OiAxNixcclxuICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb2xTcGFuOiA2LFxyXG4gICAgICAgICAgICAgIGNhcHRpb246ICdQcm9maWxlIFBpY3R1cmUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnQXZhdGFyJyxcclxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkYXZhdGFyVmlld0NvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLXZpZXctY29udGFpbmVyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0ICRhdmF0YXJDb250YWluZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkKCRhdmF0YXJWaWV3Q29udGFpbmVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLWJ1dHRvbicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAncGhvdG8nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1VwbG9hZCBuZXcgaW1hZ2UnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHRoaXMuYXZhdGFyVXBsb2FkZXIgJiYgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ2RpYWxvZ1RyaWdnZXInLCBlLmVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICkuYXBwZW5kVG8oJGF2YXRhckNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF2YXRhckJhc2U2NCA9IGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSB8fCB0aGlzLmN1cnJlbnRVc2VySW5mbz8uVXNlckF2YXRhcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF2YXRhckJhc2U2NCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgJCgnPGltZz4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci12aWV3JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3NyYycsIGF2YXRhckJhc2U2NClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJWaWV3Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dD4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLWlucHV0JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICd0ZXh0JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdBdmF0YXInKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyQ29udGFpbmVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgJCgnPGk+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKFsnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLXZpZXctZGVmYXVsdCcsICdmYXMnLCAnZmEtdXNlciddKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhclZpZXdDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYodGhpcy5hdmF0YXJVcGxvYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ2Ryb3Bab25lJywgJGF2YXRhckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignb25Ecm9wWm9uZUVudGVyJywgKCkgPT4gJGF2YXRhckNvbnRhaW5lci5hZGRDbGFzcygnZHJvcCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdvbkRyb3Bab25lTGVhdmUnLCAoKSA9PiAkYXZhdGFyQ29udGFpbmVyLnJlbW92ZUNsYXNzKCdkcm9wJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRhdmF0YXJDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2VtcHR5JyxcclxuICAgICAgICAgICAgICBjb2xTcGFuOiAxXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb2xTcGFuOiA5LFxyXG4gICAgICAgICAgICAgIGNhcHRpb246ICdBY2NvdW50IERldGFpbHMnLFxyXG4gICAgICAgICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRXJyb3JNZXNzYWdlJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBkYXRhICYmIGRhdGEuZWRpdG9yT3B0aW9ucyAmJiBkYXRhLmVkaXRvck9wdGlvbnMudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2UgJiYgJCgnPGRpdiAvPicpLnRleHQoZXJyb3JNZXNzYWdlKS5hZGRDbGFzcygnZXJyb3ItbWVzc2FnZScpO1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgIC8vICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgLy8gICBkYXRhRmllbGQ6ICdIYXNDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgIC8vICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgIC8vICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgLy8gICB9LFxyXG4gICAgICAgICAgICAgICAgLy8gICB2aXNpYmxlOiB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGE/Lkhhc0NoYW5nZXMgJiYgIXRoaXMuYWNjb3VudFNldHRpbmdzRGF0YS5FcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICAvLyAgIHRlbXBsYXRlOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS50ZXh0KCdDaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZCcpLmFkZENsYXNzKCdzdWNjZXNzLW1lc3NhZ2UnKTtcclxuICAgICAgICAgICAgICAgIC8vICAgfSxcclxuICAgICAgICAgICAgICAgIC8vIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnVXNlck5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdVc2VybmFtZSdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnVXNlcm5hbWUgaXMgcmVxdWlyZWQnIH0sXHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgICAgICAgICAgICBjb2xDb3VudDogMixcclxuICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdGaXJzdE5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0ZpcnN0IE5hbWUnXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0ZpcnN0IE5hbWUgaXMgcmVxdWlyZWQnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdMYXN0TmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnTGFzdCBOYW1lJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdMYXN0IE5hbWUgaXMgcmVxdWlyZWQnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1Bob25lTnVtYmVyJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnUGhvbmUgTnVtYmVyJ1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0VtYWlsJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRW1haWwnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0VtYWlsIGlzIHJlcXVpcmVkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2VtYWlsJywgbWVzc2FnZTogJ1BsZWFzZSB1c2UgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJyB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgY3NzQ2xhc3M6ICdhY2NvdW50LXNldHRpbmdzX19wYXNzd29yZC1hcmVhJyxcclxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+ICQoJzxkaXYgLz4nKS5jc3MoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKS50ZXh0KCdDaGFuZ2UgUGFzc3dvcmQnKVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdPbGRQYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0N1cnJlbnQgcGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVldmFsdWF0ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighIXRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8uZ2V0RWRpdG9yKCdOZXdQYXNzd29yZCcpPy5vcHRpb24oJ3ZhbHVlJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFwYXJhbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdPbGQgcGFzc3dvcmQgaXMgcmVxdWlyZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdOZXdQYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ05ldyBwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRBdHRyOiB7IGF1dG9jb21wbGV0ZTogJ25ldy1wYXNzd29yZCcgfVxyXG4gICAgICAgICAgICAgICAgICB9IGFzIGR4VGV4dEJveE9wdGlvbnM8ZHhUZXh0Qm94PixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmV3UGFzc3dvcmRSZXBlYXQnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdDb25maXJtIG5ldyBwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZWV2YWx1YXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5nZXRFZGl0b3IoJ05ld1Bhc3N3b3JkJyk/Lm9wdGlvbigndmFsdWUnKSB8fCAnJykgPT09IHBhcmFtcy52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUGFzc3dvcmQgbWlzbWF0Y2gnLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcclxuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ3JpZ2h0JyxcclxuICAgICAgICAgICAgICAgICAgY3NzQ2xhc3M6ICdhY2NvdW50LXNldHRpbmdzX19zdWJtaXQtYnRuJyxcclxuICAgICAgICAgICAgICAgICAgYnV0dG9uT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdTYXZlIENoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgICB1c2VTdWJtaXRCZWhhdmlvcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbmZpcm0odGV4dDogc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgJGRlZmZlcmVkOiBKUXVlcnlEZWZlcnJlZDxib29sZWFuPiA9ICQuRGVmZXJyZWQoKTtcclxuICAgIGNvbnN0ICRlbGVtZW50ID0gJCgnPGRpdi8+JykuYXBwZW5kVG8od2luZG93LmRvY3VtZW50LmJvZHkpO1xyXG5cclxuICAgIGNvbnN0IHBvcHVwID0gJGVsZW1lbnQuZHhQb3B1cCh7XHJcbiAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcclxuICAgICAgICBoZWlnaHQ6IDE0MCxcclxuICAgICAgICB3aWR0aDogMzcwLFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCRjb250ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICRjb250ZW50LmFkZENsYXNzKCdpc3pvbGVhLWR4LWNvbmZpcm0nKTtcclxuXHJcbiAgICAgICAgICAgICQoJzxiLz4nKS5hZGRDbGFzcygnbWVzc2FnZScpLnRleHQodGV4dCkuYXBwZW5kVG8oJGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgJGJ1dHRvbnNTZWN0aW9uID0gJCgnPGRpdi8+JykuYWRkQ2xhc3MoJ2J1dHRvbnMnKS5hcHBlbmRUbygkY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICAkKCc8ZGl2Lz4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdkYW5nZXInLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJGRlZmZlcmVkLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zU2VjdGlvbik7XHJcblxyXG4gICAgICAgICAgICAkKCc8ZGl2Lz4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3B1cC5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnNTZWN0aW9uKTtcclxuICAgICAgICB9LFxyXG4gICAgICBvbkhpZGRlbjogKCkgPT4ge1xyXG4gICAgICAgIHBvcHVwLmRpc3Bvc2UoKTtcclxuICAgICAgICBwb3B1cC5lbGVtZW50KCkucmVtb3ZlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgcG9wdXAuc2hvdygpO1xyXG5cclxuICAgIHJldHVybiAkZGVmZmVyZWQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElMb2dvU2V0dGluZ3MgfSBmcm9tICcuLi9EYXRhJztcclxuaW1wb3J0IHsgTE9HT19TRVRUSU5HU19DQUNIRV9LRVkgfSBmcm9tICcuLi9Db25zdGFudHMvQ2FjaGVLZXlzJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5pbXBvcnQgeyBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MgfSBmcm9tICcuLi9EYXRhL0lCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyc7XHJcbmltcG9ydCB7IHNob3cgYXMgc2hvd0ltYWdlVmlld2VyIH0gZnJvbSAnLi4vV2lkZ2V0cy9CYWNrZ3JvdW5kSW1hZ2VWaWV3ZXInO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhbmRpbmcoJGNvbnRhaW5lcjogSlF1ZXJ5LCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcsIHNob3dTaWduSW5CdXR0b246IGJvb2xlYW4sIHBob3RvR2FsbGVyeVNldHRpbmdzOiBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH0pIHtcclxuICBnZXRMb2dvU2V0dGluZ3MobG9nb1NldHRpbmdzKS50aGVuKChzZXR0aW5ncykgPT4ge1xyXG4gICAgY3JlYXRlTGFuZGluZ01hcmt1cCgkY29udGFpbmVyLCBzZXR0aW5ncywgc2hvd1NpZ25JbkJ1dHRvbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3MpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMb2dvU2V0dGluZ3MobG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8SUxvZ29TZXR0aW5ncz4ge1xyXG4gIGNvbnN0ICRkZWZmZXJlZDogSlF1ZXJ5RGVmZXJyZWQ8SUxvZ29TZXR0aW5ncz4gPSAkLkRlZmVycmVkKCk7XHJcblxyXG4gIGlmICh0eXBlb2YgbG9nb1NldHRpbmdzID09PSAnc3RyaW5nJykge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcbiAgICBpZiAoY2FjaGVkU2V0dGluZ3NSYXcpIHtcclxuICAgICAgJGRlZmZlcmVkLnJlc29sdmUoSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZW5kUmVxdWVzdChsb2dvU2V0dGluZ3MsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgICAgICAgIGFwcGxpY2F0aW9uTmFtZTogZGF0YS5BcHBsaWNhdGlvbk5hbWUsXHJcbiAgICAgICAgICBidXNpbmVzc05hbWU6IGRhdGEuQnVzaW5lc3NOYW1lLFxyXG4gICAgICAgICAgbGFuZGluZ1BhZ2VMb2dvOiBkYXRhLkxhbmRpbmdQYWdlTG9nbyxcclxuICAgICAgICAgIGxvZ29JbWFnZTogZGF0YS5Mb2dvSW1hZ2UsXHJcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5EZXNjcmlwdGlvblxyXG4gICAgICAgIH0gYXMgSUxvZ29TZXR0aW5ncztcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSwgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XHJcbiAgICAgICAgJGRlZmZlcmVkLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgICRkZWZmZXJlZC5yZXNvbHZlKGxvZ29TZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gJGRlZmZlcmVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVMYW5kaW5nTWFya3VwKCRjb250YWluZXI6IEpRdWVyeSwgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzLCBzaG93U2lnbkluQnV0dG9uOiBib29sZWFuLCBwaG90b0dhbGxlcnlTZXR0aW5nczogSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzKSB7XHJcbiAgY29uc3QgJGxhbmRpbmdQYWdlID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdpc3pvbGVhLWxhbmRpbmctcGFnZScpLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gIGxldCAkbGFuZGluZ0NvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbGFuZGluZy1jb250YWluZXInKS5hcHBlbmRUbygkbGFuZGluZ1BhZ2UpO1xyXG5cclxuICBpZihwaG90b0dhbGxlcnlTZXR0aW5ncy5lbmFibGVkKSB7XHJcbiAgICAkbGFuZGluZ1BhZ2UuYWRkQ2xhc3MoJ3Bob3RvLWdhbGxlcnktbW9kZScpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAkbGFuZGluZ1BhZ2UuYWRkQ2xhc3MoJ2RlZmF1bHQtbW9kZScpO1xyXG4gICAgJGxhbmRpbmdDb250YWluZXIgPSAkbGFuZGluZ1BhZ2U7XHJcbiAgfVxyXG5cclxuICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2xvZ28tY29udGFpbmVyJylcclxuICAgIC5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcilcclxuICAgIC5hcHBlbmQoXHJcbiAgICAgICQoJzxpbWcgLz4nKS5hdHRyKCdzcmMnLCBsb2dvU2V0dGluZ3MubGFuZGluZ1BhZ2VMb2dvKS5hZGRDbGFzcygnbG9nby1sYXJnZScpLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKSxcclxuICAgICAgJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnYnVzaW5lc3MtbmFtZScpLnRleHQobG9nb1NldHRpbmdzLmJ1c2luZXNzTmFtZSkuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpXHJcbiAgKTtcclxuXHJcbiAgJCgnPGgyIC8+JykudGV4dChgV2VsY29tZSB0byAke2xvZ29TZXR0aW5ncy5kZXNjcmlwdGlvbn1gKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcik7XHJcblxyXG4gIGlmIChzaG93U2lnbkluQnV0dG9uKSB7XHJcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ3NpZ24taW4tYnV0dG9uJykuYXBwZW5kKCQoJzxkaXYgLz4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6ICdTaWduIEluJyxcclxuICAgICAgd2lkdGg6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IHVuZGVmaW5lZCA6ICcyMDBweCcsXHJcbiAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYC9Ib21lL0xvZ2luP3JldHVyblVybD0ke2VuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZi50b1N0cmluZygpKX1gO1xyXG4gICAgICB9XHJcbiAgICB9KSkuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgaWYocGhvdG9HYWxsZXJ5U2V0dGluZ3MuZW5hYmxlZCkge1xyXG4gICAgc2hvd0ltYWdlVmlld2VyKFxyXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy4kY29udGFpbmVyIHx8ICRsYW5kaW5nUGFnZSxcclxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuaW1hZ2VVcmxzIHx8IFtdLFxyXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy5pbWdDaGFuZ2VJbnRlcnZhbFNlYyB8fCA4LFxyXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy50cmFuc2l0aW9uVGltZVNlYyB8fCAyXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFjY2Vzc0RlbmllZFRvUmVwb3J0KCRjb250YWluZXI6IEpRdWVyeSwgYWxsb3dlZFJlcG9ydFJvbGVzOiBzdHJpbmdbXSwgYWxsb3dlZENvbm5lY3Rpb25Sb2xlczogc3RyaW5nW10pIHtcclxuICBjb25zdCAkaXN6b2xlYUNvbnRhaW5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2FjY2Vzcy1kZW5pZWQtdG8tcmVwb3J0LXBhZ2UnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAkKCc8aDI+JykuYWRkQ2xhc3MoJ2Vycm9yLXRleHQnKS50ZXh0KCdBY2Nlc3MgZGVuaWVkIHRvIHRoZSByZXBvcnQnKS5hcHBlbmRUbygkaXN6b2xlYUNvbnRhaW5lcik7XHJcblxyXG4gIGlmIChhbGxvd2VkUmVwb3J0Um9sZXMgJiYgYWxsb3dlZFJlcG9ydFJvbGVzLmxlbmd0aCkge1xyXG4gICAgY29uc3QgcmVwb3J0Um9sZXMgPSBhbGxvd2VkUmVwb3J0Um9sZXMubWFwKChyKSA9PiAkKCc8c3Bhbj4nKS5hZGRDbGFzcygncm9sZScpLnRleHQocikpO1xyXG4gICAgJCgnPHA+JykudGV4dCgnUmVxdWlyZWQgcm9sZXMgZm9yIHJlcG9ydDogJykuYXBwZW5kKHJlcG9ydFJvbGVzKS5hcHBlbmRUbygkaXN6b2xlYUNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBpZiAoYWxsb3dlZENvbm5lY3Rpb25Sb2xlcyAmJiBhbGxvd2VkQ29ubmVjdGlvblJvbGVzLmxlbmd0aCkge1xyXG4gICAgY29uc3QgY29ubmVjdGlvbnNSb2xlcyA9IGFsbG93ZWRDb25uZWN0aW9uUm9sZXMubWFwKChyKSA9PiAkKCc8c3Bhbj4nKS5hZGRDbGFzcygncm9sZScpLnRleHQocikpO1xyXG4gICAgJCgnPHA+JykudGV4dCgnUmVxdWlyZWQgcm9sZXMgZm9yIGRiIGNvbm5lY3Rpb246ICcpLmFwcGVuZChjb25uZWN0aW9uc1JvbGVzKS5hcHBlbmRUbygkaXN6b2xlYUNvbnRhaW5lcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0Z1bGxTY3JlZW4nO1xyXG5pbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJQ2RtUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IENvbnRyb2xDb25maWd1cmF0b3IsIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmltcG9ydCB7IENvbnRyb2xEaXNwbGF5LCBJQ29udHJvbERpc3BsYXlPcHRpb25zIH0gZnJvbSAnLi9Db250cm9sRGlzcGxheSc7XHJcbmltcG9ydCB7IERpc3BsYXlNYW5hZ2VyLCBJRGlzcGxheU1hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9EaXNwbGF5TWFuYWdlcic7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgeyBDb250cm9sQ29uZmlndXJhdG9yIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuZXhwb3J0IHsgQ29udHJvbERpc3BsYXkgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5JztcclxuZXhwb3J0IHsgRGlzcGxheU1hbmFnZXIgfSBmcm9tICcuL0Rpc3BsYXlNYW5hZ2VyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNETVJlcG9ydFBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RNUmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIFNldHRpbmdzJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGlzcGxheSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTVE9SQUdFX01PREVfS0VZID0gJ0NETV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sQ29uZmlndXJhdG9yT3B0aW9uczogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheU1hbmFnZXJPcHRpb25zOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbERpc3BsYXlPcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgbXVsdGlWaWV3OiBEZXZFeHByZXNzLnVpLmR4TXVsdGlWaWV3O1xyXG4gIHByaXZhdGUgdGFiUGFuZWw6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyO1xyXG5cclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDRE1SZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgY29uc3QgYmFzZVVybCA9IGAvJHtvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmx9LyR7b3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YDtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50ID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zID0gdGhpcy5nZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG4gICAgdGhpcy5kaXNwbGF5TWFuYWdlck9wdGlvbnMgPSB0aGlzLmdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsKTtcclxuICAgIHRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zID0gdGhpcy5nZXRDb250cm9sRGlzcGxheU9wdGlvbnMoYmFzZVVybCwgb3B0aW9ucy51c2VyTmFtZSwgb3B0aW9ucy5yZXBvcnRQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLm11bHRpVmlldz8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy50YWJQYW5lbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlclRhYlBhbmVsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKGJhc2VVcmw6IHN0cmluZywgY2RtUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKTogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBhdmFpbGFibGVSb2xlc1VybDogYC8ke2NkbVJlcG9ydENvbnRyb2xsZXJVcmx9L0F2YWlsYWJsZVJvbGVzYCxcclxuICAgICAgZ3JvdXBGaWVsZHNVcmw6IGAke2Jhc2VVcmx9L0FsbENvbnRyb2xGaWVsZHNgLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29uZmlndXJhdG9yRGF0YWAsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgXHJcbiAgICB9IGFzIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGlzcGxheU1hbmFnZXJPcHRpb25zKGJhc2VVcmw6IHN0cmluZyk6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2AsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlckFzc2lnbm1lbnRzYFxyXG4gICAgfSBhcyBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250cm9sRGlzcGxheU9wdGlvbnMoXHJcbiAgICBiYXNlVXJsOiBzdHJpbmcsXHJcbiAgICB1c2VyTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zXHJcbiAgKTogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB1c2VyQ29uZmlnVXJsOiBgJHtiYXNlVXJsfS9GaWVsZHNQZXJtaXNzaW9uc2AsXHJcbiAgICAgIGNvbnRyb2xMb2dzVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sTG9nc2AsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1c2VyTmFtZSxcclxuICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHJlcG9ydFBhcmFtcy5BbGxvd0ltcG9ydGluZyA/IHtcclxuICAgICAgICBtb2RlOiByZXBvcnRQYXJhbXMuSW1wb3J0RmlsZU1vZGUsXHJcbiAgICAgICAgY3JlYXRlVGFibGVVcmw6IGAke2Jhc2VVcmx9L2NyZWF0ZS10YWJsZWAsXHJcbiAgICAgICAgYWRkUm93c1VybDogYCR7YmFzZVVybH0vYWRkLXJvd3NgLFxyXG4gICAgICAgIGZpbGVVcGxvYWRVcmw6IGAke2Jhc2VVcmx9L2dldC1jb2x1bW5zYCxcclxuICAgICAgICBwcmVkZWZpbmVkVGFibGU6IHJlcG9ydFBhcmFtcy5GaWxlSW1wb3J0ZXJUYWJsZUluZm9cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRmlsdGVyc2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbEZpbHRlcmBcclxuICAgICAgfSxcclxuICAgICAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbFZpZXdzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sVmlld2AsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbFZpZXdgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xWaWV3YFxyXG4gICAgICB9LFxyXG4gICAgICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheXNgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xEaXNwbGF5YCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheWAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbERpc3BsYXlgXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXHJcbiAgICAgIH1cclxuICAgIH0gYXMgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEaXNwbGF5KCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy5tdWx0aVZpZXcgPSAkdmlldy5keE11bHRpVmlldyh7XHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xEaXNwbGF5KHsgLi4udGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2NkbS1yZXBvcnRfX2Rpc3BseS1ncmlkJykuZHhNdWx0aVZpZXcoJ2luc3RhbmNlJyk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMubXVsdGlWaWV3LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhYlBhbmVsKCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcblxyXG4gICAgY29uc3QgJG1haW5UYWJQYW5lbCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy50YWJQYW5lbCA9IHRoaXMuY3JlYXRlVGFiUGFuZWwoJG1haW5UYWJQYW5lbCk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMudGFiUGFuZWwsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFiUGFuZWwoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbCB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5keFRhYlBhbmVsKHtcclxuICAgICAgc3dpcGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgIGZvY3VzU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWN0aXZlU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0b3InLFxyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xDb25maWd1cmF0b3IoeyAuLi50aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnRGlzcGxheSBNYW5hZ2VyJyxcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBEaXNwbGF5TWFuYWdlcih7IC4uLnRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fY29uZmlndXJhdGlvbi10YWItcGFuZWwnKVxyXG4gICAgICAuZHhUYWJQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGluaXRQb3BvdmVyKGxpbms6IHN0cmluZywgZGV0YWlsczogc3RyaW5nKTogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIge1xyXG4gIGNvbnN0IGh0bWwgPSAkKCc8cC8+JykuaHRtbChkZXRhaWxzKS50ZXh0KCk7XHJcblxyXG4gIGNvbnN0IHBvcG92ZXIgPSAkKCc8ZGl2PicsIHsgY2xhc3M6ICdyZXBvcnQtZGV0YWlscy1wb3BvdmVyJyB9KVxyXG4gICAgLmh0bWwoaHRtbClcclxuICAgIC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgcmV0dXJuICQocG9wb3ZlcikuZHhQb3BvdmVyKHtcclxuICAgIHRhcmdldDogbGluayxcclxuICAgIHNob3dFdmVudDogJ2R4Y2xpY2snLFxyXG4gICAgcG9zaXRpb246ICdib3R0b20nLFxyXG4gICAgd2lkdGg6IDUwMFxyXG4gIH0pLmR4UG9wb3ZlcignaW5zdGFuY2UnKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHtDU1NfQ0xBU1NFU30gZnJvbSAnLi4vLi4vLi4vU3R5bGluZy9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbE9wdGlvbnMge1xyXG4gIGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgc2hvd1N1bW1hcnlJbkNvbHVtbj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRhR3JpZChcclxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXHJcbiAgaGVhZGVyVGV4dD86IHN0cmluZywgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsIGRlZmF1bHRDb2x1bW5XaWR0aCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgbGV0IGlzR3JpZEluaXRpYWxpemFlZCA9IGZhbHNlO1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgZXhwb3J0OiB7XHJcbiAgICAgIGVuYWJsZWQ6ICEhYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuXHJcbiAgICBzZWxlY3Rpb246IHttb2RlOiAnbXVsdGlwbGUnfSxcclxuICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge2VuYWJsZWQ6IGZhbHNlfSxcclxuICAgIHBhZ2luZzoge3BhZ2VTaXplOiA1MH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgZmlsdGVyUm93OiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIHNjcm9sbGluZzoge21vZGU6ICd2aXJ0dWFsJ30sXHJcbiAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZS5jb21wb25lbnQpO1xyXG5cclxuICAgICAgaWYgKGlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXNHcmlkSW5pdGlhbGl6YWVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghZGVmYXVsdENvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmNvbXBvbmVudC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICdkYXRhVHlwZScpO1xyXG5cclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMDBweCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTUwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy90byBmaXggYXV0b3Njcm9sbFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZS5jb21wb25lbnQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsYWJsZSkge1xyXG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7dG9wOiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmIChoZWFkZXJUZXh0KSB7XHJcbiAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoaGVhZGVyVGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgIGhlYWRlckVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ0NsaWNrIHRvIHNlZSBmdXJ0aGVyIGRldGFpbHMnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5XHJcbiAgICA/IChlKSA9PiB7XHJcbiAgICAgIGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgICA6IGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5O1xyXG5cclxuICB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIGRhdGFHcmlkT3B0aW9ucywge29uQ29udGVudFJlYWR5fSk7XHJcblxyXG4gIGNvbnN0IGdyaWQgPSAkdGFyZ2V0LmR4RGF0YUdyaWQobWVyZ2VkT3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucykge1xyXG4gIGlmIChkYXRhR3JpZE9wdGlvbnM/LnN1bW1hcnk/LnRvdGFsSXRlbXM/LnNvbWUoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBsZXQgc3VtbWFyeUNvbHVtbiA9IGFkZGl0aW9uYWxPcHRpb25zPy5zdW1tYXJ5Q29sdW1uO1xyXG4gIGlmICghc3VtbWFyeUNvbHVtbiAmJiBkYXRhR3JpZE9wdGlvbnM/LmNvbHVtbnM/Lmxlbmd0aCkge1xyXG4gICAgc3VtbWFyeUNvbHVtbiA9IHR5cGVvZiBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXSA9PT0gJ3N0cmluZydcclxuICAgICAgPyBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXVxyXG4gICAgICA6IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdLmRhdGFGaWVsZDtcclxuICB9XHJcblxyXG4gIGlmIChzdW1tYXJ5Q29sdW1uKSB7XHJcbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5KSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zKSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICBjb2x1bW46IHN1bW1hcnlDb2x1bW4sXHJcbiAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKFxyXG4gICR0YXJnZXQsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2UsIHNraXBGdWxsU2NyZWVuID0gZmFsc2VcclxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gY3JlYXRlRGVmYXVsdERhdGFHcmlkKCR0YXJnZXQsIGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIGhlYWRlclRleHQsIGhlYWRlckRlc2NyaXB0aW9uLCBkZWZhdWx0Q29sdW1uV2lkdGgpO1xyXG5cclxuICBpZiAoIXNraXBGdWxsU2NyZWVuKSB7XHJcbiAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUodGV4dCwgdGl0bGUpIHtcclxuICByZXR1cm4gJCgnPHNwYW4+JylcclxuICAgIC5hdHRyKCd0aXRsZScsIHRpdGxlKVxyXG4gICAgLnRleHQodGV4dCk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHtJTG9va3VwRHRvfSBmcm9tICcuLi8uLi8uLi9EYXRhL0FwaVJlc3BvbnNlJztcclxuXHJcbi8vIE5PVEU6IGNvbnN0IGRlZmF1bHRTaG93ZWRSb2xlcyA9IFsnUHJvZHVjdGlvbicsICdTYWxlcycsICdGbG9vciddO1xyXG5jb25zdCByb2xlc09yZGVyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIERpc3BsYXlUeXBlIHtcclxuICBJY29ucyA9IDEsXHJcbiAgUHJlZGVmaW5lZFZhbHVlcyA9IDIsXHJcbiAgUmFiYml0QWN0aW9uID0gM1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJY29uc0NvbHVtbkVkaXRvckl0ZW0ge1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBpbWFnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbSB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgYWN0aW9uVHlwZTogc3RyaW5nO1xyXG4gIGZpZWxkczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElEaXNwbGF5VHlwZVNldHRpbmdzID0gSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3M7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SWNvbnNUeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLkljb25zO1xyXG4gIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUlQcmVkZWZpbmVkVmFsdWVzVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzO1xyXG4gIGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uO1xyXG4gIGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcclxuICBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhIHtcclxuICBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbENvbmZpZ3VyYXRvciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGF2YWlsYWJsZVJvbGVzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5VHlwZXM6IGFueVtdID0gW1xyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLkljb25zLCB2YWx1ZTogJ0ljb25zJyB9LFxyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMsIHZhbHVlOiAnUHJlZGVmaW5lZFZhbHVlcycgfSxcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24sIHZhbHVlOiAnUmFiYml0QWN0aW9uJyB9XHJcbiAgXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnMgPSB7XHJcbiAgICBbRGlzcGxheVR5cGUuSWNvbnNdOiBJY29uc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzXTogUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dOiBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3IsXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnNJbml0RGF0YSA6IHtbaWQ6IG51bWJlcl0gOiBvYmplY3Q7fSA9IHt9O1xyXG4gIHByaXZhdGUgcm9sZXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5hdmFpbGFibGVSb2xlc1VybCA9IG9wdGlvbnMuYXZhaWxhYmxlUm9sZXNVcmw7XHJcbiAgICB0aGlzLmdyb3VwRmllbGRzVXJsID0gb3B0aW9ucy5ncm91cEZpZWxkc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoJ2Fwcy1ncmlkJyk7XHJcblxyXG4gICAgUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZVJvbGVzKCksXHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlRmllbGRzKClcclxuICAgIF0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLnJvbGVzID0gcmVzdWx0WzBdO1xyXG4gICAgICB0aGlzLmZpZWxkcyA9IHJlc3VsdFsxXTtcclxuICAgICAgdGhpcy5lZGl0b3JzSW5pdERhdGFbRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uXSA9IHsgZmllbGRzOiB0aGlzLmZpZWxkcyB9O1xyXG4gICAgICB0aGlzLmNyZWF0ZU1haW5HcmlkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlUm9sZXMoKSB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3Q8QXJyYXk8eyBOYW1lOiBzdHJpbmcgfT4+KHRoaXMuYXZhaWxhYmxlUm9sZXNVcmwpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5tYXAoKHIpID0+IHIuTmFtZSkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGEpIHx8IDk5OTk7XHJcbiAgICAgICAgY29uc3QgYk9yZGVyID0gcm9sZXNPcmRlci5nZXQoYikgfHwgOTk5OTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdmFpbGFibGVGaWVsZHMoKTogUHJvbWlzZTxJTG9va3VwRHRvPHN0cmluZz5bXT4ge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZ3JvdXBGaWVsZHNVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZUVkaXRvcigkY29udGFpbmVyLCB0eXBlLCBkYXRhKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcnNbdHlwZV07XHJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMuZWRpdG9yc0luaXREYXRhW3R5cGVdO1xyXG5cclxuICAgIHJldHVybiBlZGl0b3JcclxuICAgICAgPyBuZXcgZWRpdG9yKCRjb250YWluZXIsIGRhdGEsIGluaXREYXRhKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKCkge1xyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKSxcclxuICAgICAgY29sdW1uQ2hvb3Nlcjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWxsb3dTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ3NlbGVjdCdcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczoge1xyXG4gICAgICAgIHN1bW1hcnk6IHRydWUsXHJcbiAgICAgICAgcGFnaW5nOiB0cnVlLFxyXG4gICAgICAgIGdyb3VwaW5nOiBmYWxzZSxcclxuICAgICAgICBzb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBmaWx0ZXJpbmc6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgYWxsb3dDb2xsYXBzaW5nOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IGZhbHNlLFxyXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbkF1dG9XaWR0aDogZmFsc2UsXHJcbiAgICAgIHJvd0FsdGVybmF0aW9uRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1uTWluV2lkdGg6IDgwLFxyXG4gICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5uZXdEYXRhIHx8ICFlLm9sZERhdGEpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFJvbGVzID0gZS5uZXdEYXRhLlJvbGVzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlcyA9IGUub2xkRGF0YS5Sb2xlcztcclxuXHJcbiAgICAgICAgY29uc3QgYWRkT2xkRGF0YVRvTmV3RGF0YSA9IChmaWVsZE5hbWU6IHN0cmluZywgbmV3RGF0YVNlY3Rpb24gPSBlLm5ld0RhdGEsIG9sZERhdGFTZWN0aW9uID0gZS5vbGREYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIW5ld0RhdGFTZWN0aW9uLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgICAgbmV3RGF0YVNlY3Rpb25bZmllbGROYW1lXSA9IG9sZERhdGFTZWN0aW9uW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRSb2xlcyAmJiBjdXJyZW50Um9sZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHVwZGF0ZWRSb2xlcylcclxuICAgICAgICAgICAgLmZvckVhY2goKHJvbGVOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJvbGUgPSB1cGRhdGVkUm9sZXNbcm9sZU5hbWVdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlID0gY3VycmVudFJvbGVzW3JvbGVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgdXBkYXRlZFJvbGUuSWQgPSBjdXJyZW50Um9sZS5JZDtcclxuXHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVDcmVhdGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVJlYWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlVXBkYXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVEZWxldGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdMYWJlbCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ09yZGVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnVG9vbFRpcCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzRGVmYXVsdFZpZXdGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzS2V5Q29sdW1uJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnR3JvdXBGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0Rpc3BsYXlUeXBlJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnRGF0YU93bmVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnWExTU2NoZWR1bGVMYWJlbCcpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblJvd1VwZGF0ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogdGhpcy5wcmVwYXJlTWFpbkdyaWRDb2x1bW5zKFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgIGNhcHRpb246ICdGaWVsZCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgZml4ZWQ6IHRydWUsXHJcbiAgICAgICAgICBmaXhlZFBvc2l0aW9uOiAnbGVmdCcsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0dyb3VwRmllbGQnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0dyb3VwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IFsuLi5uZXcgU2V0KGdyaWQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLkdyb3VwRmllbGQpLm1hcCgoaSkgPT4gaS5Hcm91cEZpZWxkKS5zb3J0KCkpXSxcclxuICAgICAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnTGFiZWwnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1R5cGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0RhdGFPd25lcicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRE8nLCAnRGF0YSBPd25lcicpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdYTFNTY2hlZHVsZUxhYmVsJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdYTFMnLCAnWExTIFNjaGVkdWxlIExhYmVsJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0Rpc3BsYXlUeXBlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxNjAsXHJcbiAgICAgICAgICBjdXN0b21pemVUZXh0OiAoY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjZWxsSW5mby52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUgYXMgc3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGlzcGxheVR5cGVzXHJcbiAgICAgICAgICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBzZXR0aW5ncy50eXBlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZXR0aW5ncyA/IHNldHRpbmdzLnR5cGUgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXRhIDogW107XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICAgICAgICAgIGRyb3BEb3duT3B0aW9uczogeyB3aWR0aDogNDAwIH0sXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5kaXNwbGF5VHlwZXMsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaXRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RvciA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRib2R5ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRidXR0b25zID0gJCgnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkc2F2ZUJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRjYW5jZWxCdXR0b24gPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7XCIgLz4nKS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRvciA9IHR5cGVcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCB0eXBlLCBkYXRhKVxyXG4gICAgICAgICAgICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICRzZWxlY3Rvci5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLmRpc3BsYXlUeXBlcyxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCBlLnZhbHVlLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oJ2luc3RhbmNlJykub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFlZGl0b3IsXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhID0gZWRpdG9yLmdldERhdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlZGl0b3JEYXRhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAkc2VsZWN0b3IuZHhTZWxlY3RCb3goJ2luc3RhbmNlJykub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWRpdG9yRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICRjYW5jZWxCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jbG9zZUVkaXRDZWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkY29udGFpdGVyLmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaXRlcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNEZWZhdWx0Vmlld0ZpZWxkJyxcclxuICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5IGluIGRlZmF1bHQgdmlldycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ09yZGVyJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDAsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ09yZGVyIGNhblxcJ3QgYmUgbmVnYXRpdmUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdXaWR0aCcsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnV2lkdGgnLCAnV2lkdGggKGluIHBpeGVscyknKSxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDEsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1dpZHRoIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDFweCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0hpZGluZ09yZGVyJyxcclxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdIaWRlJywgJ0hpZGluZyBPcmRlcicpLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnSGlkaW5nIG9yZGVyIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDEnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogNzAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdUb29sVGlwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1pbldpZHRoOiAxODBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdSb2xlcycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0hpZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgICAgY29sdW1uczogdGhpcy5jcmVhdGVSb2xlc0NvbHVtbnModGhpcy5yb2xlcylcclxuICAgICAgICB9XHJcbiAgICAgIF0pLFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnTmFtZSdcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWFpbkdyaWRDb2x1bW5zKGNvbHVtbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLmFsbG93SGlkaW5nID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmFsbG93SGlkaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLmFsbG93SGlkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzQ29sdW1ucyhyb2xlczogc3RyaW5nW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gcm9sZXNcclxuICAgICAgLm1hcCgocm9sZSkgPT4gKHtcclxuICAgICAgICBuYW1lOiByb2xlLFxyXG4gICAgICAgIGNhcHRpb246IHJvbGUsXHJcbiAgICAgICAgYWxsb3dIaWRpbmc6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVJlYWQnLCB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdSZWFkJywgJ1JlYWQnKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihyb2xlLCAnQ2FuQmVVcGRhdGVkJywge1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRWRpdCcsICdFZGl0JylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihcclxuICAgIHJvbGU6IHN0cmluZywgcGVybWlzc2lvbk5hbWU6IHN0cmluZywgYmFzZUNvbHVtbk9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5cclxuICApOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uYmFzZUNvbHVtbk9wdGlvbnMsXHJcbiAgICAgIG5hbWU6IGAke3JvbGV9XyR7cGVybWlzc2lvbk5hbWV9YCxcclxuICAgICAgZGF0YUZpZWxkOiBgUm9sZXMuJHtyb2xlfS4ke3Blcm1pc3Npb25OYW1lfWAsXHJcbiAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcclxuICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogZmFsc2UsXHJcbiAgICAgIGFsbG93SGVhZGVyRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgYWxsb3dGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICBtaW5XaWR0aDogNjBcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybCxcclxuICAgICAgICBrZXk6ICdOYW1lJyxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBJY29uc0NvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5kYXRhLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHVzZUljb25zOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBncm91cGluZzogeyBjb250ZXh0TWVudUVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3RpdGxlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2ltYWdlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGNvbnRhaW5lciwgY2VsbERhdGEpID0+IHtcclxuICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsRGF0YS5kYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjZWxsSW5mby52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkaW1nID0gJChgPGltZyBzcmM9XCIke2ltZ31cIiAvPmApO1xyXG4gICAgICAgICAgICBjb25zdCAkbGluayA9ICQoJzxhIGNsYXNzPVwiZHgtbGluayBkeC1pY29uLXVwbG9hZFwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogOHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMThweDtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkZmlsZUlucHV0ID0gJCgnPGlucHV0IHR5cGU9XCJmaWxlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgLz4nKTtcclxuXHJcbiAgICAgICAgICAgICRsaW5rLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgICAkZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0IGFzIGFueSkuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSAoZS50YXJnZXQgYXMgYW55KS5maWxlc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICRpbWcuYXR0cignc3JjJywgJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkaW1nLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgICAgICAkbGluay5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICdlZGl0JyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgIGljb246ICd0cmFzaCcsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5ncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQoXHJcbiAgICAgICRncmlkLFxyXG4gICAgICB7XHJcbiAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGF0YSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICB1c2VJY29uczogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgY29udGV4dE1lbnVFbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgJ2VkaXQnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGludDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCByb3dzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCgkZ3JpZCwge1xyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFJhYmJpdEFjdGlvbkNvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGE7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSwgaW5pdERhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLmluaXREYXRhID0gaW5pdERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5mb3JtID0gJCgnPGRpdiAvPicpLmR4Rm9ybSh7XHJcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2FjdGlvblR5cGUnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnZmllbGRzJyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAoZS52YWx1ZSBhcyBhbnkpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1aXJlZCdcclxuICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGFnQm94JyxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5pbml0RGF0YS5maWVsZHMsXHJcbiAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnVGV4dCcsXHJcbiAgICAgICAgICAgIHZhbHVlRXhwcjogJ1ZhbHVlJyxcclxuICAgICAgICAgICAgc2VhcmNoRW5hYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGFnQm94T3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdhY3Rpb25UeXBlJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZztcclxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybS5nZXRFZGl0b3IoJ2ZpZWxkcycpLm9wdGlvbigndmFsdWUnKSBhcyBzdHJpbmdbXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICBmaWVsZHNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4oRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIGFzIGFueSkucmVnaXN0ZXJNb2R1bGUoJ2NvbHVtbkNob29zZXJTb3J0aW5nJywge1xyXG4gIGV4dGVuZGVyczoge1xyXG4gICAgY29udHJvbGxlcnM6IHtcclxuICAgICAgY29sdW1uczoge1xyXG4gICAgICAgIGdldENob29zZXJDb2x1bW5zKGxvYWRBbGxDb2x1bW5zKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcyBhcyBhbnkpLmNhbGxCYXNlKGxvYWRBbGxDb2x1bW5zKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGNvbHVtbjEsIGNvbHVtbjIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjEgPSBjb2x1bW4xPy5jYXB0aW9uIHx8ICcnO1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uMiA9IGNvbHVtbjI/LmNhcHRpb24gfHwgJyc7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbjEubG9jYWxlQ29tcGFyZShjYXB0aW9uMik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iLCAiXHVGRUZGY29uc3QgYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwgPSAocHJldjogYW55W10gfCBudWxsLCBuZXh0OiBhbnlbXSB8IG51bGwpID0+IHtcclxuICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAocHJldltpXSAhPT0gbmV4dFtpXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW1vaXplID0gPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZnVuYzogVCk6IFQgPT4ge1xyXG4gIGxldCBsYXN0QXJnczogYW55W10gfCBudWxsID0gbnVsbDtcclxuICBsZXQgbGFzdFJlc3VsdDogdW5rbm93biB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG9ubHktYXJyb3ctZnVuY3Rpb25zXHJcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgIGlmICghYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwobGFzdEFyZ3MsIGFyZ3MpKSB7XHJcbiAgICAgIGxhc3RSZXN1bHQgPSBmdW5jKC4uLmFyZ3MgYXMgYW55KTtcclxuICAgIH1cclxuXHJcbiAgICBsYXN0QXJncyA9IGFyZ3M7XHJcblxyXG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XHJcbiAgfSBhcyBUO1xyXG59O1xyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3IHtcclxuICByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG4gIGlzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgR3JpZFN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZFZpZXdJZDogbnVtYmVyO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlWaWV3LCAnbmFtZScgfCAnZ3JpZFN0YXRlJyB8ICdpc0dsb2JhbCc+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRDb250cm9sRGlzcGxheVZpZXc6IElDb250cm9sRGlzcGxheVZpZXcgPSB7XHJcbiAgICBpZDogMCxcclxuICAgIG5hbWU6ICdEZWZhdWx0JyxcclxuICAgIGdyaWRTdGF0ZTogbnVsbCxcclxuICAgIGlzR2xvYmFsOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRWaWV3cyA9IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50Vmlld0lkOiBudW1iZXIgPSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcbiAgcHJpdmF0ZSB2aWV3czogSUNvbnRyb2xEaXNwbGF5Vmlld1tdID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3M7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFZpZXdCeUlkSW50ZXJuYWwgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdzICYmIHRoaXMudmlld3MuZmluZCgodikgPT4gdi5pZCA9PT0gdmlld0lkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRWaWV3QnlJZCh0aGlzLl9jdXJyZW50Vmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXdJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Vmlld0lkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Vmlld0lkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRWaWV3SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3cygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXdbXT4ge1xyXG4gICAgaWYgKHRoaXMudmlld3MgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdFZpZXdzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudFZpZXcodmlld1VwZGF0ZXM6IENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMpIHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZpZXcodGhpcy5jdXJyZW50Vmlldy5pZCwgdmlld1VwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld1ZpZXcodmlld05hbWU6IHN0cmluZywgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlLCBpc0dsb2JhbCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlldz4ge1xyXG4gICAgbGV0IG5ld1ZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHtcclxuICAgICAgaWQ6IC0xLFxyXG4gICAgICBuYW1lOiB2aWV3TmFtZSxcclxuICAgICAgZ3JpZFN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgfSk7XHJcblxyXG4gICAgbmV3Vmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwVmlld0R0b1RvTW9kZWwobmV3Vmlld0R0byk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmlldyh2aWV3SWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkVmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcclxuICAgICAgLi4udmlldyxcclxuICAgICAgLi4udXBkYXRlc1xyXG4gICAgfTtcclxuICAgIGxldCB1cGRhdGVkVmlld0R0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byA9IHRoaXMubWFwVmlld01vZGVsVG9EdG8odXBkYXRlZFZpZXcpO1xyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICB1cGRhdGVkVmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHVwZGF0ZWRWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVmlldyh2aWV3SWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IHZpZXdJZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3cygpIHtcclxuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5Vmlld0R0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICB0aGlzLnZpZXdzID0gdmlld3MubWFwKChkdG8pID0+IHRoaXMubWFwVmlld0R0b1RvTW9kZWwoZHRvKSk7XHJcbiAgICB0aGlzLnZpZXdzLnVuc2hpZnQoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3KTtcclxuICAgIC8vIE5PVEU6IHJlc2V0IG1lbW9pemVcclxuICAgIHRoaXMucmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwVmlld01vZGVsVG9EdG8obW9kZWw6IElDb250cm9sRGlzcGxheVZpZXcpOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgR3JpZFN0YXRlOiBKU09OLnN0cmluZ2lmeShtb2RlbC5ncmlkU3RhdGUpLFxyXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFZpZXdEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byk6IElDb250cm9sRGlzcGxheVZpZXcge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGR0by5JZCxcclxuICAgICAgbmFtZTogZHRvLk5hbWUsXHJcbiAgICAgIGdyaWRTdGF0ZTogSlNPTi5wYXJzZShkdG8uR3JpZFN0YXRlKSxcclxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKSB7XHJcbiAgICB0aGlzLmdldFZpZXdCeUlkID0gbWVtb2l6ZSh0aGlzLmdldFZpZXdCeUlkSW50ZXJuYWwpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBpbml0aWFsU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIge1xyXG4gIHB1YmxpYyBjdXJyZW50U2F2ZWRHcmlkU3RhdGU6IElHcmlkU3RhdGU7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gb3B0aW9ucy5pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3RhdGVTdG9yaW5nJywge1xyXG4gICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgY3VzdG9tTG9hZDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdGF0ZVN0b3JpbmcnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICAvLyBUT0RPOiB1c2UgZGVlcCBlcXVhbFxyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlICE9PSBudWxsICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUpICE9PSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VW5zYXZlZEdyaWRTdGF0ZSgpOiBJR3JpZFN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVbnNhdmVkR3JpZFN0YXRlKHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseShncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsLCByZXNldEZpbHRlciA9IHRydWUpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSByZXNldEZpbHRlciA/IHVuZGVmaW5lZCA6IHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoKTtcclxuXHJcbiAgICAgIC8qIE5PVEU6IFNvbWV0aW1lcyBhIGdyaWQgY2FuIHJldHVybiBhIG5ldyBzdGF0ZSB3aXRoIG9sZCBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICBzbyB3ZSBzaG91bGQgcmVzZXQgdGhlIGZpbHRlclZhbHVlIGJlZm9yZSBzdGF0ZSBhcHBseWluZ1xyXG4gICAgICAgIGlmIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgb24gdGhlIERldkV4dHJlbWUgc2lkZSB3ZSBjYW4gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZVxyXG4gICAgICAqL1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNsZWFyRmlsdGVyKCdmaWx0ZXJWYWx1ZScpO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKGdyaWRTdGF0ZSk7XHJcblxyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMub3B0aW9ucy5vd25lci5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbHRlcigoYykgPT4gIWMudHlwZSk7XHJcblxyXG4gICAgICBpZiAodmlzaWJsZUNvbHVtbnNbMF0gJiYgdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3VtbWFyeScsIHtcclxuICAgICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkLFxyXG4gICAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VycmVudEZpbHRlciAmJiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKGN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuZW5kVXBkYXRlKCk7XHJcblxyXG4gICAgICBjb25zdCBvbkNvbnRlbnRSZWFkeSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9mZignY29udGVudFJlYWR5Jywgb25Db250ZW50UmVhZHkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9uKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgPSB0aGlzLmN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodW5zYXZlZEdyaWRTdGF0ZTogSUdyaWRTdGF0ZSk6IElHcmlkU3RhdGUge1xyXG4gICAgaWYgKHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB2aXNpYmxlQ29sdW1uc1t2aXNpYmxlQ29sdW1ucy5sZW5ndGggLSAxXTtcclxuICAgICAgbGFzdENvbHVtbi53aWR0aCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5zYXZlZEdyaWRTdGF0ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIsIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkU3RhdGVNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlTWFuYWdlcjogT25lVGltZUdyaWRTdGF0ZU1hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgb25WaWV3RGVsZXRlZD86ICh2aWV3SWQ6IG51bWJlcikgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xyXG4gIC8vIHRvb2xiYXIgaXRlbXNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfdmlld3NUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIHZpZXdzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB2aWV3c0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50Vmlld1RpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVWaWV3QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZVZpZXdBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNvbHVtbkNob29zZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGdyaWRTdGF0ZU1hbmFnZXI6IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA/IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA6IG5ldyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcih7XHJcbiAgICAgICAgb3duZXI6IG9wdGlvbnMub3duZXIsXHJcbiAgICAgICAgaW5pdGlhbFN0YXRlOiBudWxsXHJcbiAgICAgIH0pLFxyXG4gICAgICBncmlkVmlld3NNYW5hZ2VyOiBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgPyBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgOiBuZXcgR3JpZFZpZXdzTWFuYWdlcihvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlWaWV3KHZpZXdJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc0NhbkJlVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG5cclxuICAgIGlmIChpc0NhbkJlVmlld0FwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodmlld0lkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDYW5CZVZpZXdBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5iZWdpblZpZXdBcHBseWluZ0xvYWRpbmcoKTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID0gdmlld0lkO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuYXBwbHkodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuZ3JpZFN0YXRlLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5lbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCk7XHJcbiAgICB0aGlzLnN5bmNVSVdpdGhDdXJyZW50VmlldygpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkKHZpZXdJZCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtcyk7XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLnZpZXdzVG9vbGJhckl0ZW0sXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXM6IEFycmF5PHsgbmFtZT86IHN0cmluZyB9Pikge1xyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSh0b29sYmFySXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJyksIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgdmlld3NUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fdmlld3NUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl92aWV3c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVWaWV3c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpc0RlZmF1bHRWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3O1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpICE9PSBjdXJyZW50Vmlldy5uYW1lIHx8IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmhhc0NoYW5nZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdWaWV3cycsXHJcbiAgICAgIHZpc2libGU6IHRoaXMub3B0aW9ucy52aXNpYmxlLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy12aWV3c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgaXRlbXM6IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddLFxyXG4gICAgICAgIHZhbHVlOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQsXHJcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICAgIHdpZHRoOiA1NTBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUudmFsdWUgPT09IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgfHwgIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5VmlldyhlLnZhbHVlKTtcclxuICAgICAgICAgIGlmIChpc1ZpZXdBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkID0gdGhpcy5jcmVhdGVWaWV3c0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudFZpZXdUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbkNob29zZXJCdXR0b24gPSB0aGlzLmNyZWF0ZUNvbHVtbkNob29zZXJCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2hlYWRlcicpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50Vmlld1RpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QXNCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuaGVpZ2h0KCcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy52aWV3c0RhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB2aWV3PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBsb2FkUGFuZWw6IHtcclxuICAgICAgICAgIHNoYWRpbmc6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzR2xvYmFsJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA3MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoZSkgPT4gZS5yb3cgJiYgZS5yb3cua2V5ICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgc2hvd0NvbHVtbkxpbmVzOiBmYWxzZSxcclxuICAgICAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3NpbmdsZScgfSxcclxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gdmlld3MnLFxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzICYmIGUuc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA/IGUuc2VsZWN0ZWRSb3dLZXlzWzBdIDogMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmRhdGFGaWVsZCA9PT0gJ2lzR2xvYmFsJykge1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMudmlzaWJsZSA9IGUucm93LmRhdGEuaWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSBhc3luYyAob3B0KSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZVZpZXcoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxyXG4gICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cyk7XHJcblxyXG4gICAgICAgICAgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgJChjKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICB9KS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGVsZXRlVmlldyhlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudFZpZXdUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jdXJyZW50LXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLmlzRGVmYXVsdFZpZXdcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGVmYXVsdFZpZXcsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5zYXZlLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiA4N1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXctYXMgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlU2F2ZUFzRGlhbG9nLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxMThcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY29sdW1uLWNob29zZXIgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgb25DbGljazogdGhpcy5vcGVuQ29sdW1uQ2hvb3Nlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdjb2x1bW4tY2hvb3NlcidcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdWaWV3IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveFZhbGlkYXRvciA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VmFsaWRhdG9yKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHZpZXdOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgY29uc3Qgdmlld0lzR2xvYmFsQ2hlY2tib3ggPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiIC8+JylcclxuICAgICAgLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgIHRleHQ6ICdHbG9iYWwgdmlldycsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3NcclxuICAgICAgfSlcclxuICAgICAgLmR4Q2hlY2tCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdmlld0lzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgVmlldycsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmlld05hbWVUZXh0Qm94VmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlQXModmlld05hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKSwgdmlld0lzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkNvbHVtbkNob29zZXIoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc2hvd0NvbHVtbkNob29zZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMudmlld3NEcm9wZG93bkJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xyXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgIGtleTogJ2lkJyxcclxuICAgICAgZGF0YTogdmlld3NcclxuICAgIH0pO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIudXBkYXRlQ3VycmVudFZpZXcoe1xyXG4gICAgICBuYW1lOiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICBncmlkU3RhdGU6IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbm90aWZ5KCdTYXZlZCcsIHRydWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUFzKHZpZXdOYW1lOiBzdHJpbmcsIGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVmlldyA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmNyZWF0ZU5ld1ZpZXcoXHJcbiAgICAgIHZpZXdOYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICApO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodXBkYXRlZFZpZXcuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnVmlldyBpcyBjcmVhdGVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmRlbGV0ZVZpZXcodmlld0lkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCh2aWV3SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xyXG4gICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgdHJ1ZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnQXBwbHlpbmcuLi4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kVmlld0FwcGx5aW5nTG9hZGluZygpIHtcclxuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIGZhbHNlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNVSVdpdGhDdXJyZW50VmlldyhpZ25vcmVDdXJyZW50Vmlld1RpdGxlID0gZmFsc2UpIHtcclxuICAgIGlmICghaWdub3JlQ3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5uYW1lKTtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLmlzRGVmYXVsdFZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudmlld3NEYXRhR3JpZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzQnlJbmRleGVzKFswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzKFt0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxWaWV3ID0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuaXNHbG9iYWxcclxuICAgICAgJiYgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcclxuXHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRoaXMuaXNEZWZhdWx0VmlldyB8fCBpc0dsb2JhbFZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL01lbW9pemUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlGaWx0ZXIge1xyXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICByZWFkb25seSBpc0dsb2JhbDogYm9vbGVhbjtcclxuICByZWFkb25seSBmaWx0ZXJTdGF0ZTogYW55IHwgbnVsbDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0OiBib29sZWFuO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG4gIEZpbHRlclN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIHtcclxuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkRmlsdGVySWQ6IG51bWJlcjtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlGaWx0ZXIsICduYW1lJyB8ICdmaWx0ZXJTdGF0ZScgfCAnaXNHbG9iYWwnPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyczogSUNvbnRyb2xEaXNwbGF5RmlsdGVyW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RmlsdGVyQnlJZEludGVybmFsID0gKGZpbHRlcklkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnMgJiYgdGhpcy5maWx0ZXJzLmZpbmQoKHYpID0+IHYuaWQgPT09IGZpbHRlcklkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZpbHRlckJ5SWQodGhpcy5fY3VycmVudEZpbHRlcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudEZpbHRlcklkKGlkOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbHRlcnMoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXJbXT4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudEZpbHRlcihmaWx0ZXJVcGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpIHtcclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudEZpbHRlciAmJiB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuaWQsIGZpbHRlclVwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld0ZpbHRlcihmaWx0ZXJOYW1lOiBzdHJpbmcsIGZpbHRlclN0YXRlOiBhbnksIGlzRGVmYXVsdDogYm9vbGVhbiwgaXNHbG9iYWw6IGJvb2xlYW4pXHJcbiAgICA6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyPiB7XHJcbiAgICBsZXQgbmV3RmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8oe1xyXG4gICAgICBpZDogLTEsXHJcbiAgICAgIG5hbWU6IGZpbHRlck5hbWUsXHJcbiAgICAgIGlzRGVmYXVsdCxcclxuICAgICAgaXNHbG9iYWwsXHJcbiAgICAgIGZpbHRlclN0YXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXdGaWx0ZXJEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCxcclxuICAgICAgJ1BPU1QnLCBuZXdGaWx0ZXJEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwobmV3RmlsdGVyRHRvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRGaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlciA9IHtcclxuICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAuLi51cGRhdGVzXHJcbiAgICB9O1xyXG4gICAgbGV0IHVwZGF0ZWRGaWx0ZXJEdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byA9IHRoaXMubWFwRmlsdGVyTW9kZWxUb0R0byh1cGRhdGVkRmlsdGVyKTtcclxuXHJcbiAgICB1cGRhdGVkRmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsXHJcbiAgICAgICdQVVQnLCB1cGRhdGVkRmlsdGVyRHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGZpbHRlcklkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVycygpIHtcclxuICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG9bXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycy5tYXAoKGR0bykgPT4gdGhpcy5tYXBGaWx0ZXJEdG9Ub01vZGVsKGR0bykpO1xyXG4gICAgLy8gTk9URTogcmVzZXQgbWVtb2l6ZVxyXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyTW9kZWxUb0R0byhtb2RlbDogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgSXNEZWZhdWx0OiBtb2RlbC5pc0RlZmF1bHQsXHJcbiAgICAgIElzR2xvYmFsOiBtb2RlbC5pc0dsb2JhbCxcclxuICAgICAgRmlsdGVyU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmZpbHRlclN0YXRlKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyRHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byk6IElDb250cm9sRGlzcGxheUZpbHRlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogZHRvLklkLFxyXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcclxuICAgICAgaXNEZWZhdWx0OiBkdG8uSXNEZWZhdWx0IHx8IGZhbHNlLFxyXG4gICAgICBpc0dsb2JhbDogZHRvLklzR2xvYmFsIHx8IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJTdGF0ZTogSlNPTi5wYXJzZShkdG8uRmlsdGVyU3RhdGUpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCkge1xyXG4gICAgdGhpcy5nZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElDb250cm9sRGlzcGxheUZpbHRlciwgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxuICByZWFkb25seSBvbkZpbHRlckFwcGxpZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBvbkZpbHRlckRlbGV0ZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxudHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucztcclxuICAvLyB0b29sYmFyIGl0ZW1zXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2ZpbHRlcnNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIGZpbHRlcnNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyc0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RmlsdGVyVGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbmV3RmlsdGVyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHdpZGdldHNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZmlsdGVyUG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlck5hbWVUZXh0Qm94OiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlckJ1aWxkZXI6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3I6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyO1xyXG4gIHByaXZhdGUgZmlsdGVySXNHbG9iYWxDaGVja2JveDogRGV2RXhwcmVzcy51aS5keENoZWNrQm94IHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlclxyXG4gICAgICAgID8gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcclxuICAgICAgICA6IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIob3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgICB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHRyeUFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGlzQ2FuQmVGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuXHJcbiAgICBpZiAoaXNDYW5CZUZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ2FuQmVGaWx0ZXJBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmVycmVkTG9hZGluZyA9IGZhbHNlKSB7XHJcbiAgICAvLyBOT1RFOiBJZiB3ZSBjaGFuZ2UgdGhlIGZpbHRlciwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZCBpbiB0aGUgZmlsdGVyc0Ryb3Bkb3duQm94Lm9uVmFsdWVDaGFuZ2VkXHJcbiAgICAvLyBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgIT09IGZpbHRlcklkO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgPSBmaWx0ZXJJZDtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuXHJcbiAgICBsZXQgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgLy8gTk9URTogbmVlZCB0byBwcm9jZXNzIGZpbHRlciB2YWx1ZSBieSB0aGUgZ2V0RmlsdGVyRXhwcmVzc2lvbiBtZXRob2RcclxuICAgICAgLy8gdG8gYmUgc3VyZSBpdCB3aWxsIHdvcmsgaW4gZGF0YXNvdXJjZSAoZm9yIGV4YW1wbGUsIHRoZSAnYmV0d2VlbicgY29uZGl0aW9uKVxyXG4gICAgICAvLyB3aWxsIGJlIG1vZGlmaWVkIHRvIFwiPj0gYW5kIDw9XCIgYmVjYXVzZSBkYXRhIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgJ2JldHdlZW4nLlxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlKTtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5nZXRGaWx0ZXJFeHByZXNzaW9uKCk7XHJcblxyXG4gICAgICBpZiAoZ3JpZERhdGFTb3VyY2UuaXNMb2FkaW5nKCkpIHtcclxuICAgICAgICBjb25zdCBhcHBseVZhbHVlID0gKCkgPT4ge1xyXG4gICAgICAgICAgZ3JpZERhdGFTb3VyY2Uub2ZmKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGdyaWREYXRhU291cmNlID0gdGhpcy5vcHRpb25zLm93bmVyLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5vbignbG9hZGluZ0NoYW5nZWQnLCBhcHBseVZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoIWZpbHRlckNoYW5nZWQpIHtcclxuICAgIGlmICghZGVmZXJyZWRMb2FkaW5nKSB7XHJcbiAgICAgIGF3YWl0IGdyaWREYXRhU291cmNlLmxvYWQoKTtcclxuICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vbkZpbHRlckFwcGxpZWQoZmlsdGVySWQpO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLmZpbHRlcnNUb29sYmFySXRlbVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlcnNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlclBvcHVwKCkge1xyXG4gICAgaWYgKCF0aGlzLl9maWx0ZXJQb3B1cCkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJQb3B1cCA9IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyUG9wdXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY3VycmVudEZpbHRlciA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcjtcclxuXHJcbiAgICBjb25zdCBuZXdOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveCAmJiB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZE5hbWUgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIubmFtZTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXIgPSB0aGlzLmZpbHRlckJ1aWxkZXIgJiYgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZEZpbHRlciA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZTtcclxuXHJcbiAgICBjb25zdCBuZXdJc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCAmJiB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkSXNHbG9iYWwgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuaXNHbG9iYWw7XHJcblxyXG4gICAgcmV0dXJuIG5ld05hbWUgIT09IG9sZE5hbWUgfHwgbmV3RmlsdGVyICE9PSBvbGRGaWx0ZXIgfHwgbmV3SXNHbG9iYWwgIT09IG9sZElzR2xvYmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEYXRhIFNldHMnLFxyXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtZmlsdGVyc19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgdmFsdWU6IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIGNvbnN0IFssIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgIHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLmdldFVzZXJTZXR0aW5ncygpXHJcbiAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkICYmIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCB2YWx1ZSA9IGUudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFsdWUgPSBlLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyh2YWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgJiYgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUub3B0aW9uKCd2YWx1ZScsXHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndGV4dCcpIHx8IGUuY29tcG9uZW50Lm9wdGlvbigncGxhY2Vob2xkZXInKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbk9wZW5lZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3MoZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCA9IHRoaXMuY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50RmlsdGVyVGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5uZXdGaWx0ZXJCdXR0b24gPSB0aGlzLmNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19oZWFkZXInKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudEZpbHRlclRpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLm5ld0ZpbHRlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5jc3MoJ2hlaWdodCcsICcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5maWx0ZXJzRGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGF0YSBzZXQ/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzRGVmYXVsdCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBEZWZhdWx0JyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgR2xvYmFsJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDcwXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpY29uOiAnZWRpdCcsXHJcbiAgICAgICAgICAgICAgICBoaW50OiAnRWRpdCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIoZS5yb3cua2V5KTtcclxuICAgICAgICAgICAgICAgICAgaXNGaWx0ZXJBcHBsaWVkICYmICF0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndmlzaWJsZScpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vcGVuRWRpdEZpbHRlclBvcHVwKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAnZGVsZXRlJ1xyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdzaW5nbGUnIH0sXHJcbiAgICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gNTFweCknLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRhdGEgc2V0cycsXHJcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgPyBlLnNlbGVjdGVkUm93S2V5c1swXSA6IG51bGwpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5kYXRhRmllbGQgPT09ICdpc0dsb2JhbCcpIHtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRpc2FibGVkID0gIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZWQgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IGFzeW5jIChvcHQpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci51cGRhdGVGaWx0ZXIoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlID09PSAnYnV0dG9ucycpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9ICFlLmRhdGEuaXNHbG9iYWxcclxuICAgICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAkKGMpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2RkZCAhaW1wb3J0YW50JyxcclxuICAgICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dVcGRhdGluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkgfHwgZS5uZXdEYXRhLmlzRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZS5jb21wb25lbnQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuaXNEZWZhdWx0KTtcclxuICAgICAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIuaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51cGRhdGVVc2VyU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVySWQ6IGUubmV3RGF0YS5pc0RlZmF1bHQgPyBlLmtleSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXIoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2N1cnJlbnQtZmlsdGVyJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgcmVhZE9ubHk6IHRydWVcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTmV3RmlsdGVyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19hZGQtbmV3LWZpbHRlciBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnTmV3IERhdGEgU2V0JyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5OZXdGaWx0ZXJQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3BsdXMnXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCAkcG9wdXBSb290ID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKCdib2R5Jyk7XHJcbiAgICBsZXQgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiAkcG9wdXBSb290LmR4UG9wdXAoe1xyXG4gICAgICBjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCksXHJcbiAgICAgIHNoYWRpbmc6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogNjUwLFxyXG4gICAgICBoZWlnaHQ6IDUwMCxcclxuICAgICAgb25TaG93aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94LmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkaW5nOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8IGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLmNhbmNlbCA9IHRydWU7XHJcbiAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcbiAgICAgICAgaWYgKGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIERhdGEgU2V0IE5hbWUuLi4nLFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhDaGVja0JveCh7XHJcbiAgICAgICAgdGV4dDogJ0dsb2JhbCBkYXRhIHNldCcsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1ucywgLi4ucmVzdCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcclxuICAgICAgaWYgKHNvdXJjZUNvbHVtbi5jb2x1bW5zICYmIHNvdXJjZUNvbHVtbi5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1uLmNvbHVtbnMpO1xyXG5cclxuICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KG5lc3RlZENvbHVtbnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9ICQuZXh0ZW5kKHt9LCBzb3VyY2VDb2x1bW4pO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZScgfHwgY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICBjb25zdCBpc0RhdGVUaW1lID0gY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9ICdkZCBNTU0geXknO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZVRpbWVGb3JtYXQgPSAnaGg6bW0sIGRkIE1NTSB5eSc7XHJcbiAgICAgICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gaXNEYXRlVGltZSA/IGRhdGVUaW1lRm9ybWF0IDogZGF0ZUZvcm1hdDtcclxuXHJcbiAgICAgICAgICBjb25zdCBwYXJzZURhdGVUaW1lID0gKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZVBhcnRzID0gZGF0ZVN0ci5zcGxpdCgnLCAnKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShkYXRlVGltZVBhcnRzWzFdLCBkYXRlRm9ybWF0KSB8fCBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0aW1lUGFydHMgPSBkYXRlVGltZVBhcnRzWzBdLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMocGFyc2VJbnQodGltZVBhcnRzWzBdKSk7XHJcbiAgICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKHBhcnNlSW50KHRpbWVQYXJ0c1sxXSkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0ID0gZGlzcGxheUZvcm1hdDtcclxuICAgICAgICAgIGNvbHVtbi5lZGl0b3JUZW1wbGF0ZSA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEYXRlQm94KHtcclxuICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0LFxyXG4gICAgICAgICAgICAgIHR5cGU6IGlzRGF0ZVRpbWUgPyAnZGF0ZXRpbWUnIDogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24uZm9ybWF0RGF0ZSh2YWx1ZSwgZGlzcGxheUZvcm1hdCkpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IChpc0RhdGVUaW1lID8gcGFyc2VEYXRlVGltZShlLnZhbHVlKSA6IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShlLnZhbHVlLCBkaXNwbGF5Rm9ybWF0KSlcclxuICAgICAgICAgICAgICAgIHx8IG51bGxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29sdW1uLmZpbHRlck9wZXJhdGlvbnMgPSBbJz0nLCAnPD4nLCAnPCcsICc+JywgJzw9JywgJz49JywgJ2lzYmxhbmsnLCAnaXNub3RibGFuayddO1xyXG4gICAgICAgICAgY29sdW1uLmNhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24gPSBmdW5jdGlvbihmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gW3NvdXJjZUNvbHVtbnMsIC4uLnJlc3RdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0pIHtcclxuICAgICAgICAgICAgICBpZiAoaXNEYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgYXJnc1swXSA9IHBhcnNlRGF0ZVRpbWUoYXJnc1swXSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZmlsdGVyVmFsdWUsIGRpc3BsYXlGb3JtYXQpIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Q2FsY3VsYXRlRmlsdGVyRXhwcmVzc2lvbiguLi5hcmdzKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KChjb2wxLCBjb2wyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24xID0gKGNvbDEuY2FwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgY2FwdGlvbjIgPSAoY29sMi5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgaWYgKGNhcHRpb24xIDwgY2FwdGlvbjIpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjYXB0aW9uMSA+IGNhcHRpb24yKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlckJ1aWxkZXIoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJCdWlsZGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgIGNvbnN0ICRuYW1lQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImFwcy1maWx0ZXJzX19uYW1lLWNvbnRhaW5lclwiIC8+JykuaGVpZ2h0KCczNnB4Jyk7XHJcblxyXG4gICAgLy8gTk9URTogUmVjcmVhdGUgd2lkZ2V0c1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveCA9IHRoaXMuY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKTtcclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlciA9IHRoaXMuY3JlYXRlRmlsdGVyQnVpbGRlcigpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ID0gdGhpcy5jcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5uYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIuaXNHbG9iYWwpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94LmVsZW1lbnQoKS5hcHBlbmRUbygkbmFtZUNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XHJcblxyXG4gICAgJG5hbWVDb250YWluZXIuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmZpbHRlclN0YXRlKTtcclxuXHJcbiAgICBjb25zdCAkZmlsdGVyQnVpbGRlckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJ2NhbGMoMTAwJSAtIDM2cHgpJykuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLmVsZW1lbnQoKS5hcHBlbmRUbygkZmlsdGVyQnVpbGRlckNvbnRhaW5lcik7XHJcblxyXG4gICAgJGZpbHRlckJ1aWxkZXJDb250YWluZXIuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgc2Nyb2xsQnlDb250ZW50OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gJHBvcHVwQ29udGVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbXMoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtW10ge1xyXG4gICAgcmV0dXJuIGZpbHRlciA/IFtcclxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKVxyXG4gICAgXSA6IFt0aGlzLmNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0FwcGx5IGFuZCBTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFVwZGF0ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMgTmV3JyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZXNldEZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdSZXNldCcsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgdW5zYXZlZCBjaGFuZ2VzPycsXHJcbiAgICAgICAgICAgICdSZXNldCB0aGUgZGF0YSBzZXQnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZXNldENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICd1bmRvJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnRGVsZXRlIERhdGEgU2V0JyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgXCIke3RoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lfVwiIGRhdGEgc2V0P2AsXHJcbiAgICAgICAgICAgICdEZWxldGUgdGhlIGRhdGEgc2V0J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUG9wdXAuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3RyYXNoJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTmV3RmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuRWRpdEZpbHRlclBvcHVwKGZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb24gPSB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJyk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndGl0bGUnLCBmaWx0ZXIgPyBgRWRpdCB0aGUgXCIke2ZpbHRlci5uYW1lfVwiIGRhdGEgc2V0YCA6ICdDcmVhdGUgYSBuZXcgZGF0YSBzZXQnKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdjb250ZW50VGVtcGxhdGUnLCAoKSA9PiB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0b29sYmFySXRlbXMnLCB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcikpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5yZXBhaW50KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIGN1cnJlbnRBbmltYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyTmFtZVRleHRCb3ggfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sRGlzcGxheUZpbHRlciA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3JlYXRlTmV3RmlsdGVyKFxyXG4gICAgICBmaWx0ZXJOYW1lLCBmaWx0ZXJCdWlsZGVyU3RhdGUsIGlzRGVmYXVsdCwgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoY29udHJvbERpc3BsYXlGaWx0ZXIuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnQ3JlYXRlZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGZpbHRlclN0YXRlID0gdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzVXBkYXRlZCA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGZpbHRlci5pZCwge1xyXG4gICAgICBuYW1lOiBmaWx0ZXJOYW1lLFxyXG4gICAgICBmaWx0ZXJTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFpc1VwZGF0ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVwZGF0ZSB0aXRsZVxyXG4gICAgbm90aWZ5KCdVcGRhdGVkJywgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pZCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuZGVsZXRlRmlsdGVyKGZpbHRlcklkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25GaWx0ZXJEZWxldGVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQoZmlsdGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENoYW5nZXMoKSB7XHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIubmFtZSk7XHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBbdXNlclNldHRpbmdzLCBmaWx0ZXJzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci5nZXRVc2VyU2V0dGluZ3MoKSxcclxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5nZXRGaWx0ZXJzKClcclxuICAgIF0pO1xyXG5cclxuICAgIGlmICh1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKSB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoKGYpID0+IGYuaWQgPT09IHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xyXG4gICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgIChkZWZhdWx0RmlsdGVyIGFzIGFueSkuaXNEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICBrZXk6ICdpZCcsXHJcbiAgICAgIGRhdGE6IGZpbHRlcnNcclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gTk9URTogRGVsYXkgZm9yIHBvcHVwIHZpc2liaWxpdHkgY2hlY2tpbmdcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMCkpO1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJykpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElBcGlSZXNwb25zZSwgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi4vLi4vRGF0YSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlVXBsb2FkZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG4gIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgb25WYWx1ZUNoYW5nZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZDtcclxuICBvblVwbG9hZFN0YXJ0ZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25VcGxvYWRlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgc2VsZWN0QnV0dG9uVGV4dD86IHN0cmluZztcclxuICBjc3NDbGFzcz86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblZhbHVlQ2hhbmdlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVmFsdWVDaGFuZ2VkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZFN0YXJ0ZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBsb2FkZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjc3NDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0QnV0dG9uVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlcjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVVcGxvYWRlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuY3NzQ2xhc3MgPSBvcHRpb25zLmNzc0NsYXNzO1xyXG4gICAgdGhpcy5tYXhGaWxlU2l6ZSA9IG9wdGlvbnMubWF4RmlsZVNpemU7XHJcbiAgICB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gb3B0aW9ucy5hY2NlcHRlZEZpbGVUeXBlcztcclxuICAgIHRoaXMuc2VsZWN0QnV0dG9uVGV4dCA9IG9wdGlvbnMuc2VsZWN0QnV0dG9uVGV4dDtcclxuICAgIHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zID0gb3B0aW9ucy5hbGxvd2VkRmlsZUV4dGVuc2lvbnM7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIHRoaXMub25VcGxvYWRTdGFydGVkID0gb3B0aW9ucy5vblVwbG9hZFN0YXJ0ZWQ7XHJcbiAgICB0aGlzLm9uVXBsb2FkZWQgPSBvcHRpb25zLm9uVXBsb2FkZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3QgJGZpbGVVcGxvYWRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XHJcbiAgICAgICRmaWxlVXBsb2FkZXIuYWRkQ2xhc3ModGhpcy5jc3NDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIgPSAkZmlsZVVwbG9hZGVyLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgc2VsZWN0QnV0dG9uVGV4dDogdGhpcy5zZWxlY3RCdXR0b25UZXh0LFxyXG4gICAgICBsYWJlbFRleHQ6ICcnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zLFxyXG4gICAgICBhY2NlcHQ6IHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMsXHJcbiAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgbWF4RmlsZVNpemU6IHRoaXMubWF4RmlsZVNpemUsXHJcbiAgICAgIHNob3dGaWxlTGlzdDogZmFsc2UsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbignbGFiZWxUZXh0JywgZS52YWx1ZVswXSA/IGUudmFsdWVbMF0ubmFtZSA6ICcnKTtcclxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkU3RhcnRlZDogKGUpID0+IHtcclxuICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWZpbGV1cGxvYWRlci11cGxvYWQtYnV0dG9uJykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRTdGFydGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBsb2FkPFQ+KHVwbG9hZFVybDogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSAodGhpcy5maWxlVXBsb2FkZXIuZWxlbWVudCgpLmZpbmQoJ2lucHV0JylbMF0gYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNbMF07XHJcblxyXG4gICAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcclxuXHJcbiAgICAgIC8qIGVzbGludCBndWFyZC1mb3ItaW46IG9mZiAqL1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYXJhbXMpIHtcclxuICAgICAgICBmZC5hcHBlbmQocHJvcCwgcGFyYW1zW3Byb3BdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICB1cmw6IHVwbG9hZFVybCxcclxuICAgICAgICB0eXBlOiAncG9zdCcsXHJcbiAgICAgICAgZGF0YTogZmQsXHJcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2U6IElBcGlSZXNwb25zZTxUPikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLkRhdGEgYXMgYW55KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdChyZXNwb25zZS5NZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZSkgPT4gcmVqZWN0KCdVbmtub3duIGVycm9yJylcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4uL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IElGaWxlSW1wb3J0ZXJDb2x1bW5JbmZvLCBJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSB9IGZyb20gJy4vSUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGEnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXZlbnRFbWl0dGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB7XHJcbiAgc2NoZW1hOiBzdHJpbmc7XHJcbiAgdGFibGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGdldFRhYmxlc0xpc3RVcmw/OiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlPzogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcclxuICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU/OiBJbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZUJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlTW9kZVRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVNb2RlVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gSW1wb3J0RmlsZU1vZGUge1xyXG4gIENyZWF0ZU5ld1RhYmxlID0gMCxcclxuICBBZGROZXdSb3dzID0gMVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZUltcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRBQkxFX1VQREFURURfRVZFTlQgPSAnZmlsZS1pbXBvcnRlci10YWJsZS11cGRhdGVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFRhYmxlc0xpc3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkNoYW5nZU1vZGU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVRhYmxlQnV0dG9uVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHBvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXA7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRmlsZVVwbG9hZGVyO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJvd3NDb3VudGVyQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByb3dzQ291bnRlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgbW9kZTogSW1wb3J0RmlsZU1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkVXJsID0gb3B0aW9ucy5maWxlVXBsb2FkVXJsO1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICB0aGlzLmdldFRhYmxlc0xpc3RVcmwgPSBvcHRpb25zLmdldFRhYmxlc0xpc3RVcmw7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlVXJsID0gb3B0aW9ucy5jcmVhdGVUYWJsZVVybDtcclxuICAgIHRoaXMuYWRkUm93c1VybCA9IG9wdGlvbnMuYWRkUm93c1VybDtcclxuICAgIHRoaXMucHJlZGVmaW5lZFRhYmxlID0gb3B0aW9ucy5wcmVkZWZpbmVkVGFibGU7XHJcbiAgICB0aGlzLmNhbkNoYW5nZU1vZGUgPSBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlIDogSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVCdXR0b25UZXh0IHx8ICdDcmVhdGUgVGFibGUnO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICAgIHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVNb2RlVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcclxuICAgIHRoaXMudXBkYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVNb2RlVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93KCkge1xyXG4gICAgdGhpcy5wb3B1cCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpXHJcbiAgICAgIC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBoaWRlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgIGZ1bGxTY3JlZW46IHRydWUsXHJcbiAgICAgICAgbWF4V2lkdGg6IDEzMDAsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiA4MDAsXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgJHNjcm9sbFZpZXcgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5jcmVhdGVGb3JtKCk7XHJcbiAgICAgICAgICAkc2Nyb2xsVmlldy5hcHBlbmQodGhpcy5mb3JtLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgICAgIH0pLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdG9vbGJhckl0ZW1zOiBbe1xyXG4gICAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgdGV4dDogdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCksXHJcbiAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbiA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRSb3dzVG9UYWJsZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnBvcHVwLmhpZGUoKVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMucG9wdXAuc2hvdygpO1xyXG4gICAgdGhpcy5vbk1vZGVTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgaWYgKHRoaXMucG9wdXApIHtcclxuICAgICAgdGhpcy5wb3B1cC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKTogRGV2RXhwcmVzcy51aS5keEZvcm0ge1xyXG4gICAgY29uc3QgZm9ybSA9ICQoJzxkaXY+JykuZHhGb3JtKHtcclxuICAgICAgc2hvd0NvbG9uQWZ0ZXJMYWJlbDogdHJ1ZSxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGNvbENvdW50QnlTY3JlZW46IHsgbWQ6IDQsIHNtOiAxIH0sXHJcbiAgICAgIHNjcmVlbkJ5V2lkdGg6ICh3aWR0aCkgPT4gd2lkdGggPCAxMjU2ID8gJ3NtJyA6ICdtZCcsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ01vZGUnLFxyXG4gICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICB0ZW1wbGF0ZTogKF9kYXRhLCAkY29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZU1vZGVTd2l0Y2hlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTY2hlbWEnLFxyXG4gICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgIGRpc2FibGVkOiAhdGhpcy5jYW5DaGFuZ2VNb2RlXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1RhYmxlJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZVNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdGV4dDogJ1RhYmxlJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBjb2xTcGFuOiAyLFxyXG4gICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgIGxvYWRVcmw6IHRoaXMuZ2V0VGFibGVzTGlzdFVybCxcclxuICAgICAgICAgICAgICBsb2FkUGFyYW1zOiB7IGNvbnRleHROYW1lOiAnJywgdGFibGVzT25seTogdHJ1ZSwgaXNXYXJlaG91c2VDb250ZXh0OiB0cnVlIH0sXHJcbiAgICAgICAgICAgICAgbG9hZE1ldGhvZDogJ3Bvc3QnLFxyXG4gICAgICAgICAgICAgIG5vdGlmeUVycm9yOiBmYWxzZVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgcGFnaW5hdGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzb3J0OiAndGhpcycsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHNlYXJjaEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgIHR5cGU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgfV1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ1NvdXJjZSBGaWxlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVGaWxlc1VwbG9hZGVyKCRjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGRhdGFGaWVsZDogJ0NvbHVtbnMgU2VsZWN0b3InLFxyXG4gICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sU3BhbjogNCxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVEYXRhR3JpZCgkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1dXHJcbiAgICB9KS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1vZGVTd2l0Y2hlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgICQoJzxkaXYgLz4nKS5keEJ1dHRvbkdyb3VwKHtcclxuICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgdGV4dDogdGhpcy5jcmVhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnR0YWJsZScsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB0ZXh0OiB0aGlzLnVwZGF0ZVRhYmxlTW9kZVRleHQsXHJcbiAgICAgICAgaWNvbjogJ2luc2VydHJvd2JlbG93JyxcclxuICAgICAgICB2YWx1ZTogSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93c1xyXG4gICAgICB9XSBhcyBhbnksXHJcbiAgICAgIGtleUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgIGRpc2FibGVkOiAhdGhpcy5jYW5DaGFuZ2VNb2RlLFxyXG4gICAgICBzdHlsaW5nTW9kZTogJ291dGxpbmVkJyxcclxuICAgICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXHJcbiAgICAgIHNlbGVjdGVkSXRlbUtleXM6IFt0aGlzLm1vZGVdLFxyXG4gICAgICBvbkl0ZW1DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSBlLml0ZW1EYXRhLnZhbHVlO1xyXG4gICAgICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIHRoaXMuZmlsZVVwbG9hZGVyID0gbmV3IEZpbGVVcGxvYWRlcih7XHJcbiAgICAgICRjb250YWluZXIsXHJcbiAgICAgIGNzc0NsYXNzOiAndGFibGUtY3JlYXRvcl9fdXBsb2FkJyxcclxuICAgICAgbWF4RmlsZVNpemU6IDEwICogMTAwMDAwMCxcclxuICAgICAgYWNjZXB0ZWRGaWxlVHlwZXM6ICcueGxzLCAueGxzeCcsXHJcbiAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogWycueGxzJywgJy54bHN4J10sXHJcbiAgICAgIHNlbGVjdEJ1dHRvblRleHQ6ICdTZWxlY3QgRXhjZWwgZmlsZScsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BhcnNpbmcgc2VsZWN0ZWQgZmlsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YT4odGhpcy5maWxlVXBsb2FkVXJsKS50aGVuKCh0YWJsZU1ldGEpID0+IHtcclxuICAgICAgICAgIGlmICh0YWJsZU1ldGEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRSb3dzQ291bnQodGFibGVNZXRhLlJvd3NDb3VudCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgIHN0b3JlOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxyXG4gICAgICAgICAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogdGFibGVNZXRhLkNvbHVtbnNcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgIG5vdGlmeShgUGFyc2luZyBFcnJvciA6ICR7ZX1gLCBmYWxzZSk7XHJcbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlci5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICBjb25zdCBncmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9IHtcclxuICAgICAgbm9EYXRhVGV4dDogJ1NlbGVjdCBFeGNlbCBGaWxlJyxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICBmaWx0ZXJSb3c6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBzb3J0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgIHBhZ2VTaXplOiAxMDAwMCxcclxuICAgICAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICB9LFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW3tcclxuICAgICAgICBkYXRhRmllbGQ6ICdJZCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTZWxlY3RlZCcsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdJc0tleUNvbHVtbicsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICBjYXB0aW9uOiAnQ29sdW1uIE5hbWUnXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUeXBlJyxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdJc051bGxhYmxlJyxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgJiYgdGhpcy5jYW5DaGFuZ2VNb2RlLFxyXG4gICAgICAgIHNldENlbGxWYWx1ZTogKG5ld0RhdGEsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBuZXdEYXRhLklzTnVsbGFibGUgPSB2YWx1ZTtcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBuZXdEYXRhLklzS2V5Q29sdW1uID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgICAgIHRvb2xiYXJJdGVtcy5wdXNoKHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCd0YWJsZS1jcmVhdG9yX190YWJsZS1oZWFkZXInKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoJ1BhcnNlZCBGaWxlIE1ldGFkYXRhJyksXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZSdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJvd3NDb3VudGVyID0gJCgnPHNwYW4+JykudGV4dCgnMTAwMCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJvd3NDb3VudGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JykudGV4dCgnUm93cyBDb3VudDogJyksIHRoaXMucm93c0NvdW50ZXIpLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudGVyQ29udGFpbmVyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdkYXRhUm93JyAmJiBlLmRhdGFGaWVsZCA9PT0gJ0lzS2V5Q29sdW1uJykge1xyXG4gICAgICAgICAgY29uc3QgZWRpdG9yT3B0aW9ucyA9IGUuZWRpdG9yT3B0aW9ucyBhcyBEZXZFeHByZXNzLnVpLmR4Q2hlY2tCb3hPcHRpb25zO1xyXG4gICAgICAgICAgZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9IGUucm93LmRhdGEuSXNOdWxsYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kYXRhR3JpZCA9IGRlZmF1bHRHcmlkKCQoJzxkaXYgLz4nKSwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgc3VtbWFyeUNvbHVtbjogJ05hbWUnLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICAkY29udGFpbmVyLmFwcGVuZCh0aGlzLmRhdGFHcmlkLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVRhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGlmICghdGhpcy5hcmVDb2x1bW5zVmFsaWQoY29sdW1ucykpIHtcclxuICAgICAgICBub3RpZnkoJ0F0IGxlYXN0IDEga2V5IGNvbHVtbiBtdXN0IGJlIHNldCcsIGZhbHNlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuU2NoZW1hLFxyXG4gICAgICAgICAgdGFibGU6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuVGFibGUsXHJcbiAgICAgICAgICBjb2x1bW5zOiBKU09OLnN0cmluZ2lmeShjb2x1bW5zKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0NyZWF0aW5nIGFuZCBmaWxsaW5nIERCIHRhYmxlLi4uJyk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkZXIudXBsb2FkPGJvb2xlYW4+KHRoaXMuY3JlYXRlVGFibGVVcmwsIHBhcmFtcykudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgICAgbm90aWZ5KGBUaGUgdGFibGUgWyR7cGFyYW1zLnNjaGVtYX1dLlske3BhcmFtcy50YWJsZX1dIGhhcyBiZWVuIGNyZWF0ZWRgLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5UKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vdGlmeSgnVGhlIHRhYmxlIGhhcyBub3QgYmVlbiBjcmVhdGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFRhYmxlIGNyZWF0aW5nIGVycm9yOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkUm93c1RvVGFibGUoKSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhR3JpZC5nZXREYXRhU291cmNlKCk7XHJcbiAgICAgIGlmICghZHMpIHtcclxuICAgICAgICBub3RpZnkoJ1NlbGVjdCBmaWxlIHdpdGggZGF0YScsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gZHMuaXRlbXMoKTtcclxuICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlU2VsZWN0b3IsXHJcbiAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0FkZGluZyByb3dzIHRvIERCIHRhYmxlLi4uJyk7XHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmFkZFJvd3NVcmwsIHBhcmFtcykudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMucG9wdXAuaGlkZSgpO1xyXG4gICAgICAgICAgbm90aWZ5KGBUaGUgdGFibGUgJHtwYXJhbXMudGFibGV9IGhhcyBiZWVuIHVwZGF0ZWRgLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vdGlmeSgnVGhlIHRhYmxlIGhhcyBub3QgYmVlbiB1cGRhdGVkJywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICBub3RpZnkoYFRhYmxlIHVwZGF0aW5nIGVycm9yOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uTW9kZVN3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGlzQ3JlYXRlVGFibGVNb2RlID0gdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZTtcclxuXHJcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLmdldEFjdGlvbkJ1dHRvblRleHQoKSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNLZXlDb2x1bW4nLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIHRoaXMuZGF0YUdyaWQuY29sdW1uT3B0aW9uKCdJc051bGxhYmxlJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNhbkNoYW5nZU1vZGUpIHtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1NjaGVtYScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdTY2hlbWEnLCB0aGlzLnByZWRlZmluZWRUYWJsZS5zY2hlbWEpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlJywgJ3Zpc2libGUnLCB0cnVlKTtcclxuICAgICAgdGhpcy5mb3JtLnVwZGF0ZURhdGEoJ1RhYmxlJywgdGhpcy5wcmVkZWZpbmVkVGFibGUudGFibGUpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlU2VsZWN0b3InLCAndmlzaWJsZScsIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgICAgdGhpcy5mb3JtLml0ZW1PcHRpb24oJ1RhYmxlJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCAhaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBY3Rpb25CdXR0b25UZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZSA/IHRoaXMuY3JlYXRlVGFibGVCdXR0b25UZXh0IDogdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFyZUNvbHVtbnNWYWxpZChjb2x1bW5zOiBJRmlsZUltcG9ydGVyQ29sdW1uSW5mb1tdKSB7XHJcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMuU2VsZWN0ZWQpLnNvbWUoKHMpID0+IHMuSXNLZXlDb2x1bW4pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRSb3dzQ291bnQoY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lci5zaG93KCk7XHJcbiAgICB0aGlzLnJvd3NDb3VudGVyLnRleHQoY291bnQpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciB9IGZyb20gJy4vR3JpZERpc3BsYXlzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uL0J1c2luZXNzJztcclxuaW1wb3J0IHsgRmlsZUltcG9ydGVyLCBJRmlsZUltcG9ydGVyVGFibGVJbmZvLCBJbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvRmlsZUltcG9ydGVyL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlck9wdGlvbnMge1xyXG4gIG1vZGU6IENkbUltcG9ydEZpbGVNb2RlO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGZpbGVVcGxvYWRVcmw6IHN0cmluZztcclxuICBwcmVkZWZpbmVkVGFibGU6IElGaWxlSW1wb3J0ZXJUYWJsZUluZm87XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgcmVhZG9ubHkgZWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlcjogR3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zPzogSUZpbGVJbXBvcnRlck9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlcjogR3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zOiBJRmlsZUltcG9ydGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBkaXNwbGF5c0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY3VycmVudERpc3BsYXlUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUFzQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbGVJbXBvcnRlcjogRmlsZUltcG9ydGVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZGlzcGxheXNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2ltcG9ydEZpbGVUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCkge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZERpc3BsYXlzTWFuYWdlcjtcclxuICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlcjtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgICB0aGlzLmltcG9ydEZpbGVPcHRpb25zID0gb3B0aW9ucy5pbXBvcnRGaWxlT3B0aW9ucztcclxuXHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGFpc0xvYWRlZCA9IChkaXNwbGF5cykgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5BcnJheVN0b3JlKHtcclxuICAgICAgICBrZXk6ICdJZCcsXHJcbiAgICAgICAgZGF0YTogZGlzcGxheXNcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG5cclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICB0aGlzLmRhdGFHcmlkICYmIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGF5Q2hhbmdlZCA9IChkaXNwbGF5KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCAmJiB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIGRpc3BsYXkgPyBkaXNwbGF5LklkIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCd2YWx1ZScsIGRpc3BsYXkgPyBkaXNwbGF5Lk5hbWUgOiBudWxsKTtcclxuICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlICYmIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG4gICAgICB0aGlzLnNhdmVBc0J1dHRvbiAmJiB0aGlzLnNhdmVBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG4gICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhZGlzcGxheSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kYXRhR3JpZCkge1xyXG4gICAgICAgIGRpc3BsYXlcclxuICAgICAgICAgID8gdGhpcy5kYXRhR3JpZC5zZWxlY3RSb3dzKFtkaXNwbGF5LklkXSwgZmFsc2UpXHJcbiAgICAgICAgICA6IHRoaXMuZGF0YUdyaWQuZGVzZWxlY3RBbGwoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdJdGVtcyA9IFt0aGlzLmRpc3BsYXlzVG9vbGJhckl0ZW1dO1xyXG5cclxuICAgIGlmICh0aGlzLmltcG9ydEZpbGVPcHRpb25zICYmIHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSAhPT0gQ2RtSW1wb3J0RmlsZU1vZGUuTm9uZSkge1xyXG4gICAgICBuZXdJdGVtcy5wdXNoKHRoaXMuaW1wb3J0RmlsZVRvb2xiYXJJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsIC4uLm5ld0l0ZW1zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdGhpcy5vcHRpb25zLmVkaXRNb2RlLFxyXG4gICAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcclxuICAgICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1EZWxldGVNZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGRpc3BsYXk/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZFBhbmVsOiB7XHJcbiAgICAgICAgICBzaGFkaW5nOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbkF1dG9XaWR0aDogdHJ1ZSxcclxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgY29sdW1uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0Rpc3BsYXknXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdGaWx0ZXJJZCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEYXRhIFNldCcsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ1ZpZXdJZCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdWaWV3JyxcclxuICAgICAgICAgICAgbG9va3VwOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XHJcbiAgICAgICAgICBlZGl0T25LZXlQcmVzczogZmFsc2UsXHJcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dCb3JkZXJzOiBmYWxzZSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICdjYWxjKDEwMCUgLSA1MXB4KScgOiAnMTAwJScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gZGlzcGxheXMnLFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gYXdhaXQgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuZ2V0RmlsdGVycygpO1xyXG4gICAgICAgICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLmdyaWRWaWV3c01hbmFnZXIuZ2V0Vmlld3MoKTtcclxuXHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oJ0ZpbHRlcklkJywgJ2xvb2t1cC5kYXRhU291cmNlJywgZmlsdGVycyk7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oJ1ZpZXdJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIHZpZXdzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbENsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUucm93VHlwZSAhPT0gJ2RhdGEnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndmFsdWUnLCBlLmRhdGEuSWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuZGVsZXRlRGlzcGxheShlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgY29uc3QgYmFzaWNPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXMgfCBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3guUHJvcGVydGllcyA9IHtcclxuICAgICAgdmFsdWVFeHByOiAnSWQnLFxyXG4gICAgICBkaXNwbGF5RXhwcjogJ05hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnTm9uZScsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmdldERpc3BsYXlzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbHRlckNoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuRmlsdGVySWQgIT09IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZDtcclxuICAgICAgICBjb25zdCB2aWV3Q2hhbmdlZCA9IGRpc3BsYXkgJiYgZGlzcGxheS5WaWV3SWQgIT09IHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCAoZmlsdGVyQ2hhbmdlZCB8fCB2aWV3Q2hhbmdlZFxyXG4gICAgICAgICAgPyB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpXHJcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh0cnVlKSk7XHJcblxyXG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheUlkID0gZS52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZHJvcERvd25Cb3hPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3hPcHRpb25zID0ge1xyXG4gICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICB3aWR0aDogODAwXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogIXRoaXMub3B0aW9ucy5lZGl0TW9kZSA/IHZvaWQgMCA6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZCA9IHRoaXMuY3JlYXRlRGF0YUdyaWQoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX2hlYWRlcicpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5lbGVtZW50KCkpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZUJ1dHRvbi5lbGVtZW50KCkpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZUFzQnV0dG9uLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJzEwMCUnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lZGl0TW9kZSkge1xyXG4gICAgICAgICAgZHJvcGRvd25Db250ZW50LmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZHJvcGRvd25Db250ZW50LmFwcGVuZCh0aGlzLmRhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uT3BlbmVkOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiAmJiB0aGlzLnNhdmVCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gKCdkeERyb3BEb3duQm94JyBhcyBhbnkpIDogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEaXNwbGF5cycsXHJcbiAgICAgIGNzc0NsYXNzOiAnYXBzLWRpc3BsYXlzX190b29sYmFyLWl0ZW0nLFxyXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAkLmV4dGVuZChiYXNpY09wdGlvbnMsIGRyb3BEb3duQm94T3B0aW9ucykgOiBiYXNpY09wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUltcG9ydEZpbGVUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICd1cGxvYWQnLFxyXG4gICAgICAgIGhpbnQ6ICdJbXBvcnQgZmlsZScsXHJcbiAgICAgICAgaGVpZ2h0OiAzMCxcclxuICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZpbGVJbXBvcnRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIgPSBuZXcgRmlsZUltcG9ydGVyKHtcclxuICAgICAgICAgICAgJGNvbnRhaW5lcjogdGhpcy5vcHRpb25zLm93bmVyLmVsZW1lbnQoKS5wYXJlbnQoKSxcclxuICAgICAgICAgICAgdGl0bGU6ICdJbXBvcnQgRmlsZSB0byBDRE0nLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZVVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5jcmVhdGVUYWJsZVVybCxcclxuICAgICAgICAgICAgYWRkUm93c1VybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5hZGRSb3dzVXJsLFxyXG4gICAgICAgICAgICBmaWxlVXBsb2FkVXJsOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLmZpbGVVcGxvYWRVcmwsXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRJbXBvcnRGaWxlTW9kZTogdGhpcy5nZXRQcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUodGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5tb2RlKSxcclxuICAgICAgICAgICAgcHJlZGVmaW5lZFRhYmxlOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLnByZWRlZmluZWRUYWJsZSxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVCdXR0b25UZXh0OiAnUmVwbGFjZSBBbGwgUm93cycsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlTW9kZVRleHQ6ICdSZXBsYWNlIFJvd3MnLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIub24oRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQsICgpID0+IHRoaXMub3B0aW9ucy5vd25lci5yZWZyZXNoKCkpO1xyXG4gICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuc2hvdygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWJ1dHRvbi1jb250ZW50JykuY3NzKHtcclxuICAgICAgICAgICAgcGFkZGluZ1RvcDogNSxcclxuICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUobW9kZTogQ2RtSW1wb3J0RmlsZU1vZGUpOiBJbXBvcnRGaWxlTW9kZSB7XHJcbiAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgY2FzZSBDZG1JbXBvcnRGaWxlTW9kZS5BZGROZXdSb3dzOlxyXG4gICAgICAgIHJldHVybiBJbXBvcnRGaWxlTW9kZS5BZGROZXdSb3dzO1xyXG5cclxuICAgICAgY2FzZSBDZG1JbXBvcnRGaWxlTW9kZS5SZXBsYWNlQWxsUm93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbW9kZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50RGlzcGxheVRpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX2N1cnJlbnQtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5c19fc2F2ZS1kaXNwbGF5IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheSxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci51cGRhdGVDdXJyZW50RGlzcGxheShcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogMTI1XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheV9fc2F2ZS1kaXNwbGF5LWFzIGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgIHRleHQ6ICdTYXZlIEFzJyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiAoXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNhdmVBc0RpYWxvZygpXHJcbiAgICAgICAgKSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDE2MFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVBc0RpYWxvZygpIHtcclxuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nQ29udGVudEVsZW1lbnQgPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTo4cHg7XCIgLz4nKS5keFRleHRCb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ0Rpc3BsYXkgTmFtZScsXHJcbiAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgIH0pLmR4VmFsaWRhdG9yKHtcclxuICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnIH0sXHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgbmFtZVRleHRCb3ggPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFZhbGlkYXRvcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICBuYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURpYWxvZyhcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiAnQ3JlYXRlIE5ldyBEaXNwbGF5JyxcclxuICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnMzAwcHgnLFxyXG4gICAgICB9LFxyXG4gICAgICAkcG9wdXBDb250ZW50LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ09rJyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoY2xvc2VQb3B1cCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2YWxpZGF0b3IudmFsaWRhdGUoKS5pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jcmVhdGVOZXdEaXNwbGF5KFxyXG4gICAgICAgICAgICBuYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgY2xvc2VQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZGlzcGxheXNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVEaXNwbGF5c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpbXBvcnRGaWxlVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2ltcG9ydEZpbGVUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZUltcG9ydEZpbGVUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIHtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIGluc2VydERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheSB7XHJcbiAgcmVhZG9ubHkgSWQ6IG51bWJlcjtcclxuICByZWFkb25seSBOYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgRmlsdGVySWQ6IG51bWJlcjtcclxuICByZWFkb25seSBWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWREaXNwbGF5c01hbmFnZXIge1xyXG4gIHByaXZhdGUgZGlzcGxheXM6IElDb250cm9sRGlzcGxheVtdIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyczoge1xyXG4gICAgY2hhbmdlZDogQXJyYXk8KGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZD4sXHJcbiAgICBsb2FkZWQ6IEFycmF5PChkaXNwbGFpczogSUNvbnRyb2xEaXNwbGF5W10pID0+IHZvaWQ+XHJcbiAgfTtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50RGlzcGxheUlkOiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XHJcblxyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzID0ge1xyXG4gICAgICBjaGFuZ2VkOiBbXSxcclxuICAgICAgbG9hZGVkOiBbXVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkRGlzcGxheXMoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXlzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5W10+KHRoaXMubG9hZERhdGFVcmwpO1xyXG4gICAgdGhpcy5vbkRpc3BsYWlzTG9hZGVkUHJpdmF0ZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERpc3BsYXlzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheXMgfHwgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREaXNwbGF5QnlJZCA9IChpZDogbnVtYmVyKSA9PiB7XHJcbiAgICBpZiAoIWlkIHx8ICF0aGlzLmRpc3BsYXlzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzLmZpbmQoKHYpID0+IHYuSWQgPT09IGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdEaXNwbGF5KG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5ld1ZpZXdEdG8gPSB7XHJcbiAgICAgIElkOiAwLFxyXG4gICAgICBOYW1lOiBuYW1lLFxyXG4gICAgICBGaWx0ZXJJZDogZmlsdGVySWQsXHJcbiAgICAgIFZpZXdJZDogdmlld0lkXHJcbiAgICB9O1xyXG5cclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlRGlzcGxheShpZDogbnVtYmVyKSB7XHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGlkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVEaXNwbGF5KHRoaXMuY3VycmVudERpc3BsYXkuSWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZURpc3BsYXkoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy51cGRhdGVEYXRhVXJsLCAnUFVUJywge1xyXG4gICAgICBpZCwgbmFtZSwgZmlsdGVySWQsIHZpZXdJZFxyXG4gICAgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRpc3BsYXlDaGFuZ2VkUHJpdmF0ZSgpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5jaGFuZ2VkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXHJcbiAgICAgIGhhbmRsZXJzKHRoaXMuY3VycmVudERpc3BsYXkpXHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXHJcbiAgICAgIGhhbmRsZXJzKHRoaXMuZGlzcGxheXMpXHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudERpc3BsYXlJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50RGlzcGxheUlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50RGlzcGxheUlkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnREaXNwbGF5SWQgPSBpZDtcclxuICAgIHRoaXMub25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudERpc3BsYXkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5QnlJZCh0aGlzLl9jdXJyZW50RGlzcGxheUlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGF5Q2hhbmdlZChoYW5kbGVyOiAoZGlzcGxheTogSUNvbnRyb2xEaXNwbGF5KSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5wdXNoKGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBvbkRpc3BsYWlzTG9hZGVkKGhhbmRsZXI6IChkaXNwbGFpczogSUNvbnRyb2xEaXNwbGF5W10pID0+IHZvaWQpIHtcclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5sb2FkZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zIHtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyA9XHJcbiAgTXV0YWJsZTxPbWl0PElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMsIGtleW9mIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+O1xyXG5cclxuZXhwb3J0IGNsYXNzIE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXHJcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBncmlkLm9wdGlvbignc2VsZWN0aW9uJywge1xyXG4gICAgICBtb2RlOiAnbXVsdGlwbGUnXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3NlbGVjdGlvbiddKTtcclxuICAgIGdyaWQub24oJ2VkaXRvclByZXBhcmluZycsIHRoaXMub25HcmlkRWRpdG9yUHJlcGFyaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkRWRpdG9yUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvbkVkaXRvclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGlmICghZS5jb21wb25lbnQgfHwgIWUuZWRpdG9yT3B0aW9ucyB8fCBlLnBhcmVudFR5cGUgIT09ICdkYXRhUm93JyB8fCAhZS5kYXRhRmllbGQgfHwgIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGUuZGF0YUZpZWxkO1xyXG4gICAgY29uc3QgZWRpdG9yS2V5ID0gZS5yb3cua2V5O1xyXG4gICAgY29uc3QgZGVmYXVsdExpc3RlbmVyID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gKGV2ZW50OiB7IHZhbHVlOiBhbnkgfSkgPT4ge1xyXG4gICAgICBkZWZhdWx0TGlzdGVuZXIoZXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVNdWx0aXBsZVJvd3MoZGF0YUZpZWxkLCBlZGl0b3JLZXksIGV2ZW50LnZhbHVlKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU11bHRpcGxlUm93czxUPihkYXRhRmllbGQ6IHN0cmluZywgZWRpdG9yS2V5OiBzdHJpbmcsIHZhbHVlOiBUKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFJvd0tleXM6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5vcHRpb25zLm93bmVyLmdldFNlbGVjdGVkUm93S2V5cygpO1xyXG4gICAgaWYgKCFzZWxlY3RlZFJvd0tleXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlZGl0b3JLZXlTZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRSb3dLZXlzLmZpbmRJbmRleCgoaykgPT4gayA9PT0gZWRpdG9yS2V5KTtcclxuICAgIGlmIChlZGl0b3JLZXlTZWxlY3RlZEluZGV4IDwgMCB8fCBzZWxlY3RlZFJvd0tleXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RlZFJvd0tleXMuc3BsaWNlKGVkaXRvcktleVNlbGVjdGVkSW5kZXgsIDEpO1xyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuY2VsbFZhbHVlKHRoaXMub3B0aW9ucy5vd25lci5nZXRSb3dJbmRleEJ5S2V5KGtleSksIGRhdGFGaWVsZCwgdmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3Mge1xyXG4gIHJlYWRvbmx5IGRlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHJlYWRvbmx5IGRlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0byB7XHJcbiAgRGVmYXVsdEZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgRGVmYXVsdFZpZXdJZDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zIHtcclxuICByZWFkb25seSB1c2VySWQ6IHN0cmluZztcclxuICByZWFkb25seSBsb2FkZWRVc2VyU2V0dGluZ3M/OiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M7XHJcbn1cclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZW1wdHktaW50ZXJmYWNlXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyRGVmYXVsdE9wdGlvbnMge1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBUFNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zID1cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIE11dGFibGU8T21pdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucywga2V5b2YgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyA9IHtcclxuICAgIGRlZmF1bHRGaWx0ZXJJZDogdW5kZWZpbmVkLFxyXG4gICAgZGVmYXVsdFZpZXdJZDogR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkXHJcbiAgfTtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcm90ZWN0ZWQgX2xhdGVzdExvYWRlZFVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGF1dG9SZXNldHRpbmdDYWNoZVRpbWVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvYWRlZFVzZXJTZXR0aW5ncykge1xyXG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGFydEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyh2YWx1ZTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzKSB7XHJcbiAgICB0aGlzLl9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBpZiAoIXRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMubG9hZFVzZXJTZXR0aW5ncygpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5ncyh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXMpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPjtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcblxyXG4gIHByb3RlY3RlZCBzdGFydEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCkge1xyXG4gICAgdGhpcy5hdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5pc0xhdGVzdExvYWRlZFVzZXJTZXR0aW5nc0V4cGlyZWQgPSB0cnVlO1xyXG4gICAgfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3RvcEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCkge1xyXG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciBleHRlbmRzIENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB7XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSB1c2VyU2V0dGluZ3NTdG9yYWdlS2V5ID0gJ2Fwczpjb250cm9sLWRpc3BsYXk6dXNlci1zZXR0aW5ncyc7XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCByYXdVc2VyU2V0dGluZ3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51c2VyU2V0dGluZ3NTdG9yYWdlS2V5KTtcclxuICAgIGlmICghcmF3VXNlclNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSBKU09OLnBhcnNlKHJhd1VzZXJTZXR0aW5ncyk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3MgPSB7IC4uLmN1cnJlbnRVc2VyU2V0dGluZ3MsIC4uLnVwZGF0ZXMgfTtcclxuXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51c2VyU2V0dGluZ3NTdG9yYWdlS2V5LFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh1cGRhdGVkVXNlclNldHRpbmdzKSk7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zID1cclxuICBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyAmIElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHN1cGVyKG9wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nc0R0byA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5nc0R0byA/IHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKHVzZXJTZXR0aW5nc0R0bykgOiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5nc0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4oXHJcbiAgICAgIHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsXHJcbiAgICAgIHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKHVwZGF0ZWRVc2VyU2V0dGluZ3MpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1cGRhdGVkVXNlclNldHRpbmdzRHRvKTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJpdmF0ZSBtYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01vZGVsVG9EdG8obW9kZWw6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBEZWZhdWx0RmlsdGVySWQ6IG1vZGVsLmRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgRGVmYXVsdFZpZXdJZDogbW9kZWwuZGVmYXVsdFZpZXdJZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHJpdmF0ZSBtYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwoZHRvOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8pOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3Mge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGVmYXVsdEZpbHRlcklkOiBkdG8uRGVmYXVsdEZpbHRlcklkLFxyXG4gICAgICBkZWZhdWx0Vmlld0lkOiBkdG8uRGVmYXVsdFZpZXdJZFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBnZXRTdW1tYXJ5Q29sdW1uKGNvbHVtbnM6IEFycmF5PHsgdmlzaWJsZUluZGV4OiBudW1iZXIsIHZpc2libGU6IGJvb2xlYW4sIGRhdGFGaWVsZDogc3RyaW5nIH0+IHxcclxuICBSZWFkb25seUFycmF5PFBpY2s8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLCAndmlzaWJsZUluZGV4JyB8ICd2aXNpYmxlJyB8ICdkYXRhRmllbGQnPj4pIHtcclxuICBsZXQgY29sdW1uRm9yU3VtbWFyeSA9ICcnO1xyXG5cclxuICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpO1xyXG4gIGNvbnN0IGNvbHVtbnNXaXRoSW5kZXggPSB2aXNpYmxlQ29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZUluZGV4ICE9PSBudWxsICYmIGMudmlzaWJsZUluZGV4ICE9PSB2b2lkIDApO1xyXG5cclxuICBpZiAoISFjb2x1bW5zV2l0aEluZGV4Lmxlbmd0aCkge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9IGNvbHVtbnNXaXRoSW5kZXguc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleClbMF0uZGF0YUZpZWxkO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb2x1bW5Gb3JTdW1tYXJ5ID0gKHZpc2libGVDb2x1bW5zWzBdICYmIHZpc2libGVDb2x1bW5zWzBdLmRhdGFGaWVsZCkgfHwgJyc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29sdW1uRm9yU3VtbWFyeTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCwgSUZpbGVJbXBvcnRlck9wdGlvbnMgfSBmcm9tICcuL0dyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRGlzcGxheXNNYW5hZ2VyLCBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyLCBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB9IGZyb20gJy4vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4nO1xyXG5pbXBvcnQgeyBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMsIFJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgRGlzcGxheVR5cGUsIElEaXNwbGF5VHlwZVNldHRpbmdzLCBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuaW1wb3J0IHsgY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgZ2V0U3VtbWFyeUNvbHVtbiB9IGZyb20gJy4vR3JpZFN1bW1hcnlIZWxwZXInO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4uLy4uL0J1c2luZXNzJztcclxuXHJcbmludGVyZmFjZSBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbiB7XHJcbiAgUGVybWlzc2lvbnM6IENvbnRyb2xSb2xlUGVybWlzc2lvbnM7XHJcbiAgTmFtZTogc3RyaW5nO1xyXG4gIFR5cGU6ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbicgfCAnb2JqZWN0JyB8ICdkYXRlJyB8ICdkYXRldGltZSc7XHJcbiAgTGFiZWw6IHN0cmluZztcclxuICBPcmRlcjogbnVtYmVyO1xyXG4gIFRvb2xUaXA6IHN0cmluZztcclxuICBJc0RlZmF1bHRWaWV3RmllbGQ6IGJvb2xlYW47XHJcbiAgSXNLZXlDb2x1bW46IGJvb2xlYW47XHJcbiAgR3JvdXBGaWVsZDogc3RyaW5nO1xyXG4gIERpc3BsYXlUeXBlOiBzdHJpbmc7XHJcbiAgV2lkdGg/OiBudW1iZXI7XHJcbiAgSGlkaW5nT3JkZXI/OiBudW1iZXI7XHJcbiAgQ29sdW1ucz86IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVXNlckNvbmZpZ3VyYXRpb25SZXNwb25zZSB7XHJcbiAgRmllbGRzQ29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXTtcclxuICBDYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZUZpbHRlcnM6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlRGlzcGxheXM6IGJvb2xlYW47XHJcbiAgQ2FuQXBwbGF5RGlzcGxheXM6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qIGVzbGludCBuby1iaXR3aXNlOiBvZmYgKi9cclxuLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuY29uc3QgZW51bSBDb250cm9sUm9sZVBlcm1pc3Npb25zIHtcclxuICBOb25lID0gMCxcclxuICBSZWFkID0gMSA8PCAwLFxyXG4gIENyZWF0ZSA9IDEgPDwgMSxcclxuICBVcGRhdGUgPSAxIDw8IDIsXHJcbiAgRGVsZXRlID0gMSA8PCAzLFxyXG59XHJcbi8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHVzZXJDb25maWdVcmw6IHN0cmluZztcclxuICBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIGltcG9ydEZpbGVPcHRpb25zPzogSUZpbGVJbXBvcnRlck9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sRGlzcGxheSB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRGaWxlTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlck5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDb25maWdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xMb2dzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgbWFpbkdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkVmlld3NUb29sYmFyQ29tcG9uZW50OiBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudDogR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQ6IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgbXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW46IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPSBvcHRpb25zLmlzU3RhbmRhbG9uZVBhZ2U7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gICAgdGhpcy5leHBvcnRGaWxlTmFtZSA9IG9wdGlvbnMuZXhwb3J0RmlsZU5hbWU7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMudXNlckNvbmZpZ1VybCA9IG9wdGlvbnMudXNlckNvbmZpZ1VybDtcclxuICAgIHRoaXMuY29udHJvbExvZ3NVcmwgPSBvcHRpb25zLmNvbnRyb2xMb2dzVXJsO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucyA9IG9wdGlvbnMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgICB0aGlzLmltcG9ydEZpbGVPcHRpb25zID0gb3B0aW9ucy5pbXBvcnRGaWxlT3B0aW9ucztcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoWydhcHMtZ3JpZCcsICdjb250cm9sLWRpc3BsYXktZ3JpZCddKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBzZW5kUmVxdWVzdDxJVXNlckNvbmZpZ3VyYXRpb25SZXNwb25zZT4odGhpcy51c2VyQ29uZmlnVXJsKVxyXG4gICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JpZEZpbHRlcnNNYW5hZ2VyID0gbmV3IEdyaWRGaWx0ZXJzTWFuYWdlcih0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGdyaWRWaWV3c01hbmFnZXIgPSBuZXcgR3JpZFZpZXdzTWFuYWdlcih0aGlzLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkRGlzcGxheXNNYW5hZ2VyID0gbmV3IEdyaWREaXNwbGF5c01hbmFnZXIodGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMubWFpbkdyaWQgPSB0aGlzLmNyZWF0ZU1haW5HcmlkKHJlcy5GaWVsZHNDb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlRGlzcGxheXMgPSByZXMuQ2FuQ3JlYXRlRGlzcGxheXMgJiYgcmVzLkNhbkNyZWF0ZVZpZXdzICYmIHJlcy5DYW5DcmVhdGVGaWx0ZXJzO1xyXG5cclxuICAgICAgICBpZiAoY2FuQ3JlYXRlRGlzcGxheXMgfHwgcmVzLkNhbkFwcGxheURpc3BsYXlzKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgICBlZGl0TW9kZTogY2FuQ3JlYXRlRGlzcGxheXMsXHJcbiAgICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgICAgZ3JpZFZpZXdzTWFuYWdlcixcclxuICAgICAgICAgICAgZ3JpZERpc3BsYXlzTWFuYWdlcixcclxuICAgICAgICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnNcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvblZpZXdBcHBsaWVkOiB0aGlzLm9uVmlld0FwcGxpZWQsXHJcbiAgICAgICAgICBvblZpZXdEZWxldGVkOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IGdyaWREaXNwbGF5c01hbmFnZXIubG9hZERpc3BsYXlzKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYXV0b0ludGVncmF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgZ3JpZFZpZXdzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbFZpZXdzOiByZXMuQ2FuQ3JlYXRlR2xvYmFsVmlld3MsXHJcbiAgICAgICAgICB2aXNpYmxlOiByZXMuQ2FuQ3JlYXRlVmlld3NcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogbmV3IFJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcih7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VyTmFtZSxcclxuICAgICAgICAgICAgbG9hZERhdGFVcmw6IHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgICAgIHVwZGF0ZURhdGFVcmw6IHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMudXBkYXRlRGF0YVVybFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgIG9uRmlsdGVyRGVsZXRlZDogYXN5bmMgKGZpbHRlcklkKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IGdyaWREaXNwbGF5c01hbmFnZXIubG9hZERpc3BsYXlzKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYXV0b0ludGVncmF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyLFxyXG4gICAgICAgICAgY2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogcmVzLkNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMsXHJcbiAgICAgICAgICB2aXNpYmxlOiByZXMuQ2FuQ3JlYXRlRmlsdGVyc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luID0gbmV3IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luKHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIub25EaXNwbGF5Q2hhbmdlZCA9IGFzeW5jIChkaXNwbGF5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGlzcGxheSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC5hcHBseUZpbHRlcihkaXNwbGF5LkZpbHRlcklkLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhkaXNwbGF5LlZpZXdJZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC5hcHBseUZpbHRlcih2b2lkIDAsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQuYXBwbHlWaWV3KEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiB0c2xpbnQ6ZGlzYWJsZTogbm8tYml0d2lzZSAqL1xyXG4gIHByaXZhdGUgaGFzUGVybWlzc29uKHJ1bGVzLCBwZXJtaXNzb24pIHtcclxuICAgIHJldHVybiBydWxlcyAmIHBlcm1pc3NvbjtcclxuICB9XHJcbiAgLyogdHNsaW50OmVuYWJsZTogbm8tYml0d2lzZSAqL1xyXG5cclxuICBwcml2YXRlIGJ1aWxkVHJlZShjb2x1bW5zKSB7XHJcbiAgICBjb25zdCBncm91cFByZWZpeCA9ICdfX0dST1VQX18nO1xyXG5cclxuICAgIGxldCBjb2x1bW5zTWFwID0gY29sdW1ucy5yZWR1Y2UoKGFjYywgY29sdW1uKSA9PiB7XHJcbiAgICAgIGNvbHVtbi5Db2x1bW5zID0gW107XHJcbiAgICAgIGNvbHVtbi5Hcm91cEZpZWxkID0gY29sdW1uLkdyb3VwRmllbGRcclxuICAgICAgICA/IGAke2dyb3VwUHJlZml4fSR7Y29sdW1uLkdyb3VwRmllbGR9YFxyXG4gICAgICAgIDogbnVsbDtcclxuICAgICAgYWNjW2NvbHVtbi5OYW1lXSA9IGNvbHVtbjtcclxuXHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCB7fSk7XHJcblxyXG4gICAgY29sdW1uc01hcCA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uR3JvdXBGaWVsZClcclxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uR3JvdXBGaWVsZClcclxuICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleClcclxuICAgICAgLnJlZHVjZSgoYWNjLCBncm91cEZpZWxkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGdyb3VwRmllbGQucmVwbGFjZShncm91cFByZWZpeCwgJycpO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IHtcclxuICAgICAgICAgIE5hbWU6IGdyb3VwRmllbGQsXHJcbiAgICAgICAgICBMYWJlbDogY29sdW1uTmFtZSxcclxuICAgICAgICAgIENvbHVtbnM6IFtdLFxyXG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGU6IG1heC1saW5lLWxlbmd0aCAqL1xyXG4gICAgICAgICAgR3JvdXBGaWVsZDogY29sdW1uc01hcFtjb2x1bW5OYW1lXSAmJiBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdLkdyb3VwRmllbGQgJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICE9PSBncm91cEZpZWxkXHJcbiAgICAgICAgICAgID8gY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkXHJcbiAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGFjY1tncm91cEZpZWxkXSA9IGdyb3VwQ29sdW1uO1xyXG5cclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICB9LCBjb2x1bW5zTWFwKTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgaW4gY29sdW1uc01hcCkge1xyXG4gICAgICBpZiAoY29sdW1uc01hcC5oYXNPd25Qcm9wZXJ0eShjb2x1bW5OYW1lKSkge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnNNYXBbY29sdW1uTmFtZV07XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW4uR3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgY29sdW1uc01hcFtjb2x1bW4uR3JvdXBGaWVsZF0uQ29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyRGlzcGxheVR5cGUoc2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzLCBjb2x1bW46IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgcGVybWlzc2lvbnM6IENvbnRyb2xSb2xlUGVybWlzc2lvbnMpIHtcclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICBjb2x1bW4uY2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKG9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGNlbGxTZXR0aW5ncyA9IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0udmFsdWUpID09PSBzdHJpbmdWYWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChjZWxsU2V0dGluZ3MpIHtcclxuICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgY2VsbFNldHRpbmdzLnRpdGxlKVxyXG4gICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGNlbGxTZXR0aW5ncy5pbWFnZSB9KSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAudGV4dChvcHRpb25zLnZhbHVlKVxyXG4gICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHNldHRpbmdzLmRhdGEsXHJcbiAgICAgICAgICBkaXNwbGF5VmFsdWU6ICd0aXRsZScsXHJcbiAgICAgICAgICBpdGVtVGVtcGxhdGU6IChkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGRhdGEudGl0bGUpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBkYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICBmaWVsZFRlbXBsYXRlOiAoZGF0YSwgZWwpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IHBhcnNlSW50KGl0ZW0udmFsdWUpID09PSBjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRpdGVtTmFtZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbS1uYW1lJyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRyZXN1bHQgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1pY29uLWVkaXRvcl9fY3VzdG9tLWl0ZW0nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY3VycmVudEl0ZW0gPyBjdXJyZW50SXRlbS5pbWFnZSA6ICcnIH0pLmF0dHIoJ3RpdGxlJywgY3VycmVudEl0ZW0gPyBjdXJyZW50SXRlbS50aXRsZSA6ICcnKSlcclxuICAgICAgICAgICAgICAuYXBwZW5kKCRpdGVtTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAkaXRlbU5hbWVcclxuICAgICAgICAgICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBlbC5hcHBlbmQoJHJlc3VsdCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlLCBjb21wb25lbnQgfSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShwYXJzZUludCh2YWx1ZS52YWx1ZSkpO1xyXG4gICAgICAgICAgICBjb21wb25lbnQuYmx1cigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZhbHVlOiAoY2VsbEluZm8udmFsdWUgIT09IG51bGwgJiYgY2VsbEluZm8gIT09IHZvaWQgMCkgJiYgY2VsbEluZm8udmFsdWUudG9TdHJpbmcoKSxcclxuICAgICAgICAgIHNlbGVjdGVkSXRlbTogc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5hbGxvd1NlYXJjaCA9IGZhbHNlO1xyXG4gICAgICBjb2x1bW4uYWxsb3dGaWx0ZXJpbmcgPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93SGVhZGVyRmlsdGVyaW5nID0gdHJ1ZTtcclxuICAgICAgY29sdW1uLmFsbG93R3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUHJlZGVmaW5lZFZhbHVlcykge1xyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHNldHRpbmdzLmRhdGEubWFwKChpKSA9PiBpLnZhbHVlKS5zb3J0KCksXHJcbiAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUodmFsdWUgfHwgJycpO1xyXG4gICAgICAgICAgICBjb21wb25lbnQuYmx1cigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSxcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24pIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keENoZWNrQm94KHtcclxuICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSB8fCBmYWxzZSxcclxuICAgICAgICAgIHJlYWRPbmx5OiAhdGhpcy5oYXNQZXJtaXNzb24ocGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2VsbFZhbHVlKGNlbGxJbmZvLnJvd0luZGV4LCBjZWxsSW5mby5jb2x1bW4uZGF0YUZpZWxkLCBlLnZhbHVlKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1uKGNvbHVtbkNvbmZpZzogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgY29uc3QgdGl0bGUgPSBjb2x1bW5Db25maWcuTGFiZWwgfHwgY29sdW1uQ29uZmlnLk5hbWU7XHJcbiAgICBjb25zdCB0b29sdGlwID0gY29sdW1uQ29uZmlnLlRvb2xUaXAgfHwgdGl0bGU7XHJcblxyXG4gICAgY29uc3QgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4gPSAhY29sdW1uQ29uZmlnLkNvbHVtbnMubGVuZ3RoXHJcbiAgICAgID8ge1xyXG4gICAgICAgIGRhdGFGaWVsZDogY29sdW1uQ29uZmlnLk5hbWUsXHJcbiAgICAgICAgZGF0YVR5cGU6IGNvbHVtbkNvbmZpZy5UeXBlLFxyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRpdGxlLCB0b29sdGlwKSxcclxuICAgICAgICB2aXNpYmxlOiBjb2x1bW5Db25maWcuSXNEZWZhdWx0Vmlld0ZpZWxkLFxyXG4gICAgICAgIHZpc2libGVJbmRleDogY29sdW1uQ29uZmlnLk9yZGVyLFxyXG4gICAgICAgIGFsbG93Rml4aW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0VkaXRpbmc6ICEhdGhpcy5oYXNQZXJtaXNzb24oY29sdW1uQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgd2lkdGg6IGNvbHVtbkNvbmZpZy5XaWR0aCxcclxuICAgICAgICBoaWRpbmdQcmlvcml0eTogY29sdW1uQ29uZmlnLkhpZGluZ09yZGVyXHJcbiAgICAgIH0gOiB7XHJcbiAgICAgICAgY2FwdGlvbjogdGl0bGUsXHJcbiAgICAgICAgY29sdW1uczogY29sdW1uQ29uZmlnLkNvbHVtbnMubWFwKChjKSA9PiB0aGlzLmNvbmZpZ3VyZUNvbHVtbihjKSlcclxuICAgICAgfTtcclxuXHJcbiAgICBpZiAoY29sdW1uQ29uZmlnLkRpc3BsYXlUeXBlKSB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlTZXR0aW5nczogSURpc3BsYXlUeXBlU2V0dGluZ3MgPSBKU09OLnBhcnNlKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSk7XHJcblxyXG4gICAgICBpZiAoZGlzcGxheVNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLkljb25zKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBkaXNwbGF5U2V0dGluZ3MuZGF0YS5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgICAgICB0ZXh0OiBpdGVtLnRpdGxlLFxyXG4gICAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWVcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIGl0ZW1zLnNwbGljZSgwLCAwLCB7XHJcbiAgICAgICAgICB0ZXh0OiAnQmxhbmsnLFxyXG4gICAgICAgICAgdmFsdWU6IG51bGxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLmhlYWRlckZpbHRlciA9IHtcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGl0ZW1zXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5VHlwZShkaXNwbGF5U2V0dGluZ3MsIGNvbHVtbiwgY29sdW1uQ29uZmlnLlBlcm1pc3Npb25zKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sdW1uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVDb2x1bW5zKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pIHtcclxuICAgIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmZpbHRlcihcclxuICAgICAgKGMpID0+IHRoaXMuaGFzUGVybWlzc29uKGMuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuUmVhZClcclxuICAgICk7XHJcblxyXG4gICAgY29uZmlndXJhdGlvbiA9IHRoaXMuYnVpbGRUcmVlKGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgY29uc3QgY29sdW1ucyA9IGNvbmZpZ3VyYXRpb24ubWFwKChjKSA9PiB0aGlzLmNvbmZpZ3VyZUNvbHVtbihjKSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pIHtcclxuICAgIGNvbnN0IGhhc0tleXMgPSBjb25maWd1cmF0aW9uLnNvbWUoKGMpID0+IGMuSXNLZXlDb2x1bW4pO1xyXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5Gb3JTdW1tYXJ5ID0gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zKTtcclxuICAgIGNvbnN0IGdyaWRPcHRpb25zID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZShjb25maWd1cmF0aW9uKSxcclxuICAgICAgY29sdW1uUmVzaXppbmdNb2RlOiAnd2lkZ2V0JyxcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IGhhc0tleXMsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgIG1vZGU6ICdiYXRjaCdcclxuICAgICAgfSxcclxuICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJywgcHJlbG9hZEVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuICAgICAgcGFnZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPyB1bmRlZmluZWQgOiAnMTAwJScsXHJcbiAgICAgIGNvbHVtbkNob29zZXI6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdkcmFnQW5kRHJvcCdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uRml4aW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBmaWx0ZXJQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgIGNyZWF0ZUZpbHRlcjogJ05vbmUnLFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc3VtbWFyeToge1xyXG4gICAgICAgIHRvdGFsSXRlbXM6IFt7IHN1bW1hcnlUeXBlOiAnY291bnQnLCBjb2x1bW46IGNvbHVtbkZvclN1bW1hcnkgfV1cclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgY29sdW1uSGlkaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBjb2x1bW5zLFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IHRydWUsXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgY29udGV4dE1lbnVFbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1hc3RlckRldGFpbDogIWhhc0tleXMgPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0ZW1wbGF0ZTogKGNvbnRhaW5lciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xyXG4gICAgICAgICAgY29uZmlndXJhdGlvbi5maWx0ZXIoKGMpID0+IGMuSXNLZXlDb2x1bW4pLmZvckVhY2goKGMpID0+IGtleXNbYy5OYW1lXSA9IG9wdGlvbnMuZGF0YVtjLk5hbWVdKTtcclxuXHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICAgICAgICBkYXRhU291cmNlOiB7XHJcbiAgICAgICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICAgICAgbG9hZFVybDogYCR7dGhpcy5jb250cm9sTG9nc1VybH0/a2V5PSR7SlNPTi5zdHJpbmdpZnkoa2V5cyl9YCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuICAgICAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnVXNlcicsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwXHJcbiAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnQ3JlYXRlZEF0JyxcclxuICAgICAgICAgICAgICAgIGNhcHRpb246ICdEYXRlJyxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnZGF0ZScsXHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6ICdzaG9ydERhdGVTaG9ydFRpbWUnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAoYywgbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gby5kYXRhLkNoYW5nZXNcclxuICAgICAgICAgICAgICAgICAgICAubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19maWVsZCc+JHtpdGVtLkZpZWxkfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX29sZC12YWx1ZSc+JHtpdGVtLk9sZFZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjE5MlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fbmV3LXZhbHVlJz4ke2l0ZW0uTmV3VmFsdWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgJChgPGRpdiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9ncyc+JHtjb250ZW50fTwvZGl2PmApLmFwcGVuZFRvKGMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmVwYXJlRmlsdGVyUGFuZWwoZS5jb21wb25lbnQpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgaWYgKCFmaWVsZENvbmZpZykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGlzYWJsZUVkaXRpbmcgPSAhdGhpcy5oYXNQZXJtaXNzb24oZmllbGRDb25maWcuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKTtcclxuXHJcbiAgICAgICAgZS5lZGl0b3JPcHRpb25zLnJlYWRPbmx5ID0gZGlzYWJsZUVkaXRpbmc7XHJcblxyXG4gICAgICAgIGlmICghZGlzYWJsZUVkaXRpbmcgJiYgZmllbGRDb25maWcuVHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnN0IGJhc2VTZXRWYWx1ZSA9IGUuc2V0VmFsdWU7XHJcblxyXG4gICAgICAgICAgKGUgYXMgYW55KS5zZXRWYWx1ZSA9IChuZXdWYWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGJhc2VTZXRWYWx1ZShuZXdWYWx1ZS50cmltKCkpO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdkYXRhJykge1xyXG4gICAgICAgICAgY29uc3QgZmllbGRDb25maWcgPSBjb25maWd1cmF0aW9uLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gZS5jb2x1bW4uZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcgJiYgIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSkpIHtcclxuICAgICAgICAgICAgJChlLmNlbGxFbGVtZW50KS5hZGRDbGFzcygnYXBzLWdyaWRfX2Rpc2FibGVkLWNlbGwnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uUm93RXhwYW5kZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsUm93SW5kZXggPSBlLmNvbXBvbmVudC5nZXRSb3dJbmRleEJ5S2V5KGUua2V5KSArIDE7XHJcbiAgICAgICAgY29uc3QgJGRldGFpbENlbGwgPSBlLmNvbXBvbmVudC5nZXRDZWxsRWxlbWVudChkZXRhaWxSb3dJbmRleCwgMCkucGFyZW50KCkuZmluZCgnLmR4LW1hc3Rlci1kZXRhaWwtY2VsbCcpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFHcmlkID0gJGRldGFpbENlbGwuZmluZCgnLmR4LWRhdGFncmlkJykuZmlyc3QoKS5wYXJlbnQoKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBkYXRhR3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgIH0sXHJcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnM7XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UsXHJcbiAgICAgIHNldERlZmF1bHRDb2x1bW5XaWR0aDogdHJ1ZSxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHRoaXMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb246IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ2RhdGFTb3VyY2UnXSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICBrZXk6IGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5tYXAoKGMpID0+IGMuTmFtZSksXHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybFxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25WaWV3QXBwbGllZCA9ICh2aWV3SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgdGhpcy5jbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlRmlsdGVyUGFuZWwoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxFbGVtZW50ID0gZ3JpZC5lbGVtZW50KClcclxuICAgICAgLmZpbmQoJy5keC1kYXRhZ3JpZC1maWx0ZXItcGFuZWwnKTtcclxuICAgIGNvbnN0ICRmaWx0ZXJJY29uRmlsdGVyID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtaWNvbi1maWx0ZXInKTtcclxuICAgIGNvbnN0ICRmaWx0ZXJQYW5lbFRleHQgPSAkZmlsdGVyUGFuZWxFbGVtZW50LmZpbmQoJy5keC1kYXRhZ3JpZC1maWx0ZXItcGFuZWwtdGV4dCcpO1xyXG5cclxuICAgICRmaWx0ZXJJY29uRmlsdGVyLm9mZignY2xpY2snKTtcclxuICAgICRmaWx0ZXJQYW5lbFRleHQub2ZmKCdjbGljaycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Um93c0NvdW50U3VtbWFyeShncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4gPSBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZCgoYykgPT4gISFjLmRhdGFGaWVsZCk7XHJcbiAgICBpZiAoIWZpcnN0VmlzaWJsZURhdGFDb2x1bW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvd3NDb3VudFN1bW1hcnlOYW1lID0gJ1Jvd3NDb3VudCc7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgY29uc3QgdG90YWxJdGVtczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddID0gKGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ10gKSB8fCBbXTtcclxuICAgIGNvbnN0IHJvd3NDb3VudFN1bW1hcnlJdGVtID0gdG90YWxJdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0ubmFtZSA9PT0gcm93c0NvdW50U3VtbWFyeU5hbWUpO1xyXG4gICAgaWYgKHJvd3NDb3VudFN1bW1hcnlJdGVtICYmIHJvd3NDb3VudFN1bW1hcnlJdGVtLmNvbHVtbiA9PT0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSkge1xyXG4gICAgICByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPSBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvdGFsSXRlbXMucHVzaCh7XHJcbiAgICAgICAgbmFtZTogcm93c0NvdW50U3VtbWFyeU5hbWUsXHJcbiAgICAgICAgY29sdW1uOiBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50JyxcclxuICAgICAgICBhbGlnbm1lbnQ6ICdsZWZ0JyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYWluR3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtcycsIHRvdGFsSXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gTk9URTogV29ya2Fyb3VuZC4gVGhlIGdyaWQgY2FuJ3QgY2xlYXIgdGhlIGZpbHRlciByb3csIHNvIHdlIGNsZWFyIHRoYXQgbWFudWFsbHlcclxuICBwcml2YXRlIGNsZWFyRmlsdGVyUm93QWZ0ZXJWaWV3U3dpdGNoaW5nKCkge1xyXG4gICAgY29uc3QgY2xlYXJIZWFkZXIgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXM6IHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIH0gPSB7fTtcclxuXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZS5jb2x1bW5zXHJcbiAgICAgICAgfHwgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkNvbHVtbltdO1xyXG5cclxuICAgICAgY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZUluZGV4ICYmIChjLmZpbHRlclZhbHVlIHx8IGMuZmlsdGVyVmFsdWVzKSlcclxuICAgICAgICAuZm9yRWFjaCgoYykgPT4gY29sdW1uc1dpdGhGaWx0ZXJlZFZhbHVlc1tjLnZpc2libGVJbmRleF0gPSBjKTtcclxuXHJcbiAgICAgICQoJ3RkIFthcmlhLWxhYmVsKj1cIkZpbHRlciBjZWxsXCJdJylcclxuICAgICAgICAuZmlsdGVyKChpbmRleCkgPT4gIWNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbaW5kZXhdKVxyXG4gICAgICAgIC52YWwoJycpO1xyXG4gICAgICB0aGlzLm1haW5HcmlkLm9mZignY29udGVudFJlYWR5JywgY2xlYXJIZWFkZXIpO1xyXG4gICAgfTtcclxuICAgIHRoaXMubWFpbkdyaWQub24oJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgY3JlYXRlRGVmYXVsdERhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcclxuaW1wb3J0IGNyZWF0ZURlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcblxyXG5pbnRlcmZhY2UgSUFwcFVzZXIge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElEaXNwbGF5IHtcclxuICBJZDogbnVtYmVyO1xyXG4gIE5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheXNVc2VyQXNzaWdubWVudCB7XHJcbiAgRGlzcGxheUlkOiBudW1iZXI7XHJcbiAgVXNlcklkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZENvbHVtbiB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBDYXB0aW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQVBTQ29udHJvbERpc3BsYXlBc3NpZ25tZW50c0RhdGEge1xyXG4gIFVzZXJzOiBJQXBwVXNlcltdO1xyXG4gIERpc3BsYXlzOiBJRGlzcGxheVtdO1xyXG4gIEFzc2lnbm1lbnRzOiBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnRbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheU1hbmFnZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwYWdlVGl0bGU6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERpc3BsYXlNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSURpc3BsYXlNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XHJcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IG9wdGlvbnMucGFnZVRpdGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIGxldCBjb2x1bW5zOiBJR3JpZENvbHVtbltdID0gW107XHJcblxyXG4gICAgY29uc3QgbG9hZERhdGFQcm9taXNlID0gc2VuZFJlcXVlc3Q8SUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhPih0aGlzLmxvYWREYXRhVXJsLCAnZ2V0JylcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbHVtbnMgPSByZXMuRGlzcGxheXMubWFwKChkKSA9PiAoeyBJZDogZC5JZC50b1N0cmluZygpLCBDYXB0aW9uOiBkLk5hbWUgfSkpO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRhID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgdXNlciBvZiByZXMuVXNlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7IFVzZXJOYW1lOiB1c2VyLlVzZXJOYW1lLCBVc2VySWQ6IHVzZXIuSWQgfTtcclxuICAgICAgICAgIGNvbnN0IHVzZXJBc3NpZ25tZW50cyA9IHJlcy5Bc3NpZ25tZW50cy5maWx0ZXIoKGEpID0+IGEuVXNlcklkID09PSB1c2VyLklkKTtcclxuXHJcbiAgICAgICAgICB1c2VyQXNzaWdubWVudHMuZm9yRWFjaCgoYXNzaWdubWVudCkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtW2Fzc2lnbm1lbnQuRGlzcGxheUlkXSA9IHRydWU7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBkYXRhLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IFtcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnVXNlck5hbWUnLCB3aWR0aDogMzAwLCBmaXhlZDogdHJ1ZSwgZml4ZWRQb3NpdGlvbjogJ2xlZnQnLCBhbGxvd0VkaXRpbmc6IGZhbHNlIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJJZCcsIHZpc2libGU6IGZhbHNlIH1cclxuICAgICAgICBdIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgICAgZ3JpZC5vcHRpb24oJ2NvbHVtbnMnLCBncmlkQ29sdW1ucy5jb25jYXQoY29sdW1ucy5tYXAoKGNvbCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiBjb2wuSWQsXHJcbiAgICAgICAgICAgIGNhcHRpb246IGNvbC5DYXB0aW9uLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgICBjYWxjdWxhdGVDZWxsVmFsdWU6IChyb3dEYXRhKSA9PiAhIXJvd0RhdGFbY29sLklkXVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgbGV0IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2Fwcy1kaXNwbGF5LW1hbmFnZXInfSxcclxuICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgIHN0b3JlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkN1c3RvbVN0b3JlKHtcclxuICAgICAgICAgIGtleTogJ1VzZXJJZCcsXHJcbiAgICAgICAgICBsb2FkTW9kZTogJ3JhdycsXHJcbiAgICAgICAgICBsb2FkOiAoKSA9PiBsb2FkRGF0YVByb21pc2UsXHJcbiAgICAgICAgICB1cGRhdGU6IChrZXksIHZhbHVlczogeyBbZGlzcGxheUlkOiBudW1iZXJdOiBib29sZWFuIH0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHRvQWRkOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0aGVyZUlzQ3VycmVudFVwZGF0aW5nID0gdXBkYXRpbmdJc0luUHJvZ3Jlc3M7XHJcblxyXG4gICAgICAgICAgICB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5SWRzID0gT2JqZWN0LmtleXModmFsdWVzKTtcclxuXHJcbiAgICAgICAgICAgIGRpc3BsYXlJZHMuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodmFsdWVzW2lkXSkge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0b1JlbW92ZS5wdXNoKHBhcnNlSW50KGlkKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIE5PVEU6IG5vdGlmeSBhYm91dCBzdWNjZXNzZnVsIHJlcXVlc3Qgb25seSBmb3IgdGhlIGZpcnN0IHJlcXVlc3QgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSBmYWxzZTsgfSwgMCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2VuZFJlcXVlc3QodGhpcy51cGRhdGVEYXRhVXJsLCAncHV0Jywge1xyXG4gICAgICAgICAgICAgIHVzZXJJZDoga2V5LFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlzVG9SZW1vdmU6IHRvUmVtb3ZlLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlzVG9BZGQ6IHRvQWRkXHJcbiAgICAgICAgICAgIH0sICF0aGVyZUlzQ3VycmVudFVwZGF0aW5nKS5wcm9taXNlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgIHJlZnJlc2hNb2RlOiAncmVwYWludCdcclxuICAgICAgfVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcztcclxuXHJcbiAgICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6ICdEaXNwbGF5TWFuYWdlbWVudCcsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdVc2VyTmFtZSdcclxuICAgIH0gYXMgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucztcclxuXHJcbiAgICBsZXQgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGluZ1Jlc3VsdCB7XHJcbiAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uTm90aWZpZXJPcHRpb25zIHtcclxuICBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgZGlzcGxheUR1cmF0aW9uTXM6IG51bWJlcjtcclxuICBzZXNzaW9uUGluZ1VybDogc3RyaW5nO1xyXG4gIGxvZ291dFVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk5vdGlmaWVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25FeHBpcmVUaW1lTXM6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uUGluZ1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nb3V0VXJsOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgd2F0aW5nVGltZW91dElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBjb3VudGVySW50ZXJ2YWxJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcGluZ0ludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIGV4cGlyYXRpb25UaW1lOiBEYXRlO1xyXG4gIHByaXZhdGUgJHRleHRDb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIGNvbnRpbnVlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIG9rQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG4gIHByaXZhdGUgbG9nb3V0QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uO1xyXG5cclxuICBwcml2YXRlIF9wb3B1cDogRGV2RXhwcmVzcy51aS5keFBvcHVwO1xyXG4gIHByaXZhdGUgZ2V0IHBvcHVwKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cCB7XHJcbiAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XHJcbiAgICAgIHRoaXMuX3BvcHVwID0gdGhpcy5jcmVhdGVQb3B1cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9wb3B1cDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElTZXNzaW9uTm90aWZpZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMgPSBvcHRpb25zLnNlc3Npb25FeHBpcmVUaW1lTXM7XHJcbiAgICB0aGlzLmRpc3BsYXlEdXJhdGlvbk1zID0gb3B0aW9ucy5kaXNwbGF5RHVyYXRpb25NcztcclxuICAgIHRoaXMuc2Vzc2lvblBpbmdVcmwgPSBvcHRpb25zLnNlc3Npb25QaW5nVXJsO1xyXG4gICAgdGhpcy5sb2dvdXRVcmwgPSBvcHRpb25zLmxvZ291dFVybDtcclxuXHJcbiAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSA9IHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwPy5oaWRlKCk7XHJcblxyXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IHRoaXMuZ2V0RXhwaXJhdGlvblRpbWUoKTtcclxuXHJcbiAgICB0aGlzLndhdGluZ1RpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCk7XHJcbiAgICB9LCBNYXRoLm1heCh0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMgLSB0aGlzLmRpc3BsYXlEdXJhdGlvbk1zLCAwKSk7XHJcblxyXG4gICAgdGhpcy5waW5nSW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKCk7XHJcbiAgICB9LCA2MCAqIDEwMDApO1xyXG5cclxuICAgICQoZG9jdW1lbnQpLm9uKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd05vdGlmaWNhdGlvbigpIHtcclxuICAgIHRoaXMucG9wdXA/LnNob3coKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgdGhpcy5jb3VudGVySW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlUG9wdXBDb250ZW50KCk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpIHtcclxuICAgIGlmICh0aGlzLndhdGluZ1RpbWVvdXRJZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy53YXRpbmdUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY291bnRlckludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBpbmdJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgJChkb2N1bWVudCkub2ZmKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFeHBpcmF0aW9uVGltZSgpOiBEYXRlIHtcclxuICAgIGNvbnN0IGV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIGV4cGlyYXRpb25UaW1lLnNldE1pbGxpc2Vjb25kcyhleHBpcmF0aW9uVGltZS5nZXRNaWxsaXNlY29uZHMoKSArIHRoaXMuc2Vzc2lvbkV4cGlyZVRpbWVNcyk7XHJcblxyXG4gICAgcmV0dXJuIGV4cGlyYXRpb25UaW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFBvcHVwKHtcclxuICAgICAgdGl0bGU6ICdTZXNzaW9uIEV4cGlyaW5nJyxcclxuICAgICAgaGlkZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHNob3dDbG9zZUJ1dHRvbjogZmFsc2UsXHJcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgbWF4SGVpZ2h0OiAxOTAsXHJcbiAgICAgIG1heFdpZHRoOiAzNzAsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICB0aGlzLiR0ZXh0Q29udGFpbmVyID0gJCgnPHNwYW4gLz4nKTtcclxuICAgICAgICB0aGlzLiR0ZXh0Q29udGFpbmVyLmFwcGVuZCh0aGlzLmdldENvdW50ZXJUZXh0KCkpO1xyXG4gICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHRoaXMuJHRleHRDb250YWluZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgfSxcclxuICAgICAgdG9vbGJhckl0ZW1zOiBbe1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgdGV4dDogJ0NvbnRpbnVlIHNlc3Npb24nLFxyXG4gICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHRoaXMuY29udGludWVyQnV0dG9uID0gZS5jb21wb25lbnQsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlc3Npb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICB0ZXh0OiAnUmVsb2FkIHBhZ2UnLFxyXG4gICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHRoaXMub2tCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgdGV4dDogJ0xvZyBPdXQnLFxyXG4gICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHRoaXMubG9nb3V0QnV0dG9uID0gZS5jb21wb25lbnQsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nT3V0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSxcclxuICAgIH0pLmFwcGVuZFRvKCQoZG9jdW1lbnQuYm9keSkpLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvdW50ZXJUZXh0KCk6IEpRdWVyeSB7XHJcbiAgICBjb25zdCByZW1haW5lZFNlY29uZHMgPSBNYXRoLm1heCh0aGlzLmdldFNlY29uZHNUb0V4cGlyYXRpb24oKSwgMCk7XHJcbiAgICBpZiAocmVtYWluZWRTZWNvbmRzID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAkKCc8c3BhbiAvPicpLnRleHQoJ1lvdXIgc2Vzc2lvbiBoYXMgYmVlbiBleHBpcmVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCAkc3RhcnRUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCdZb3VyIHNlc3Npb24gd2lsbCBleHBpcmUgaW4gJyk7XHJcbiAgICAgIGNvbnN0ICRjb3VudGVyID0gJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnc2Vzc2lvbi1ub3RpZmllcl9fY291bnRlcicpLnRleHQocmVtYWluZWRTZWNvbmRzLnRvRml4ZWQoMCkpO1xyXG4gICAgICBjb25zdCAkZmluaXNoVGV4dCA9ICQoJzxzcGFuIC8+JykudGV4dCgnIHNlY29uZHMnKTtcclxuXHJcbiAgICAgIHJldHVybiAkKCc8c3BhbiAvPicpLmFwcGVuZCgkc3RhcnRUZXh0LCAkY291bnRlciwgJGZpbmlzaFRleHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWNvbmRzVG9FeHBpcmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuZXhwaXJhdGlvblRpbWUuZ2V0VGltZSgpIC0gbmV3IERhdGUoKS5nZXRUaW1lKCkpIC8gMTAwMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFNlc3Npb24oKSB7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgc2VuZFJlcXVlc3Q8SVBpbmdSZXN1bHQ+KHRoaXMuc2Vzc2lvblBpbmdVcmwsICdHRVQnLCBudWxsLCBmYWxzZSwgeyBub3RpZnlFcnJvcjogZmFsc2UgfSkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgIGlmICghcmVzLmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKCkge1xyXG4gICAgaWYgKGRvY3VtZW50LmhpZGRlbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZFJlcXVlc3Q8SVBpbmdSZXN1bHQ+KHRoaXMuc2Vzc2lvblBpbmdVcmwsICdHRVQnLCBudWxsLCBmYWxzZSwgeyBub3RpZnlFcnJvcjogZmFsc2UgfSkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgIGlmICghcmVzLmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgIHRoaXMuc2V0RXhwaXJlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RXhwaXJlZCgpIHtcclxuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2dPdXQoKSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMubG9nb3V0VXJsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVQb3B1cENvbnRlbnQoKSB7XHJcbiAgICBjb25zdCBpc0FscmVhZHlFeHBpcmVkID0gdGhpcy5nZXRTZWNvbmRzVG9FeHBpcmF0aW9uKCkgPD0gMDtcclxuXHJcbiAgICB0aGlzLiR0ZXh0Q29udGFpbmVyPy5odG1sKCcnKS5hcHBlbmQodGhpcy5nZXRDb3VudGVyVGV4dCgpKTtcclxuICAgIHRoaXMub2tCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgaXNBbHJlYWR5RXhwaXJlZCk7XHJcbiAgICB0aGlzLmNvbnRpbnVlckJ1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCAhaXNBbHJlYWR5RXhwaXJlZCk7XHJcbiAgICB0aGlzLmxvZ291dEJ1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCAhaXNBbHJlYWR5RXhwaXJlZCk7XHJcbiAgfVxyXG59XHJcbiIsICJjb25zdCBHUklEX0lORElDQVRPUl9TVEFURSA9IHtcclxuICBlZGl0OiAnZWRpdCcsXHJcbiAgc2F2aW5nOiAnc2F2aW5nJyxcclxuICBzYXZlZDogJ3NhdmVkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgR1JJRF9JTkRJQ0FUT1JfU1RBVEU7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZERhdGFMYXllciB9IGZyb20gJy4uLy4uL0RhdGEvSW5kZXgnO1xyXG5pbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZSwgSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlLCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vLi4vVXRpbHMvSW5kZXgnO1xyXG5cclxuaW50ZXJmYWNlIElMb2FkZWRDb2x1bW5zIHsgW2RhdGFGaWVsZDogc3RyaW5nXTogYm9vbGVhbjsgfVxyXG5pbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU2V0dGluZ3MgeyBbZGF0YUZpZWxkOiBzdHJpbmddOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZTsgfVxyXG5pbnRlcmZhY2UgSUNvbHVtbldpZHRocyB7IFt2aXNpYmxlSW5kZXg6IG51bWJlcl06IG51bWJlciB8IHN0cmluZzsgfVxyXG5cclxuaW50ZXJmYWNlIElDb2x1bW5DYXB0aW9uIHtcclxuICBkYXRhRmllbGQ6IHN0cmluZztcclxuICBjYXB0aW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWRTdGF0ZU1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBPVVREQVRFX0NPTFVNTlNfRk9VTkRfRVZFTlQgPSAnb3V0ZGF0ZWQtY29sdW1ucy1mb3VuZC1ldmVudCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERhdGFMYXllcjogSUdyaWREYXRhTGF5ZXI7XHJcblxyXG4gIHByaXZhdGUgc3RhdGVMb2FkZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGxvYWRlZENvbHVtbnM6IElMb2FkZWRDb2x1bW5zID0ge307XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TZXR0aW5ncyA9IHt9O1xyXG5cclxuICBwcml2YXRlIGxhc3RDb2x1bW5TZXR0aW5nc1N0cjogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihncmlkSWQ6IG51bWJlciwgZ3JpZERhdGFMYXllcjogSUdyaWREYXRhTGF5ZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy5pZCA9IGdyaWRJZDtcclxuICAgIHRoaXMuZ3JpZERhdGFMYXllciA9IGdyaWREYXRhTGF5ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZChjaGVja091dGRhdGVkQ29sdW1uczogYm9vbGVhbiwgb3V0ZGF0ZWRDb2x1bW5zQ2FsbGJhY2s6IChjb2x1bW5zKSA9PiB2b2lkKTogSlF1ZXJ5UHJvbWlzZTxJR3JpZFN0YXRlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkRGF0YUxheWVyLmdldEdyaWRWaWV3U2V0dGluZ3ModGhpcy5pZClcclxuICAgICAgLnRoZW4oKGRhdGE6IElHcmlkU3RhdGUpID0+IHtcclxuICAgICAgICB0aGlzLm9uRGF0YUxvYWRlZChkYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrT3V0ZGF0ZWRDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmNoZWNrQ29sdW1uc1JlbGV2YW5jZShkYXRhLmNvbHVtbnMsIG91dGRhdGVkQ29sdW1uc0NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKHN0YXRlOiBJR3JpZFN0YXRlLCBzYXZpbmdDYWxsYmFjaz86ICgpID0+IHZvaWQsIHNhdmVkQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogSUNvbHVtbldpZHRocyB7XHJcbiAgICBjb25zdCBjb2x1bW5XaWR0aHM6IElDb2x1bW5XaWR0aHMgPSB7fTtcclxuXHJcbiAgICBpZiAoIXN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRlLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFkZFNldHRpbmdzID0gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdO1xyXG5cclxuICAgICAgaWYgKGFkZFNldHRpbmdzKSB7XHJcbiAgICAgICAgY29sdW1uLmNhcHRpb24gPSBhZGRTZXR0aW5ncy5jYXB0aW9uO1xyXG4gICAgICAgIGNvbHVtbi50b29sdGlwID0gYWRkU2V0dGluZ3MudG9vbHRpcDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9OT1RFOiBpZiBEQiB0YWJsZSBoYXMgbm8gZGF0YSBpbiBhIGNvbHVtbiwgZGF0YSBncmlkIGNhbid0IGluZmVyIGRhdGEgdHlwZSBhbmQgZG9lc24ndCBzZXQgdGhlIGRhdGFUeXBlIGZpZWxkXHJcbiAgICAgIGlmICghY29sdW1uLmRhdGFUeXBlKSB7XHJcbiAgICAgICAgY29sdW1uLmRhdGFUeXBlID0gR3JpZERhdGFDb2x1bW5EYXRhVHlwZS5EZWZhdWx0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoISFjb2x1bW4ud2lkdGggJiYgY29sdW1uLnZpc2libGUpIHtcclxuICAgICAgICBjb2x1bW5XaWR0aHNbY29sdW1uLnZpc2libGVJbmRleF0gPSBjb2x1bW4ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtblNldHRpbmdzU3RyID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29sdW1ucyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnN0YXRlTG9hZGVkIHx8IGNvbHVtblNldHRpbmdzU3RyID09PSB0aGlzLmxhc3RDb2x1bW5TZXR0aW5nc1N0cikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RDb2x1bW5TZXR0aW5nc1N0ciA9IGNvbHVtblNldHRpbmdzU3RyO1xyXG5cclxuICAgIGlmIChzYXZpbmdDYWxsYmFjaykge1xyXG4gICAgICBzYXZpbmdDYWxsYmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ3JpZERhdGFMYXllci51cGRhdGVHcmlkVmlld1NldHRpbmdzKHRoaXMuaWQsIHN0YXRlKVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgaWYgKHNhdmVkQ2FsbGJhY2spIHtcclxuICAgICAgICAgIHNhdmVkQ2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5XaWR0aHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tOZXdDb2x1bW5zKHN0YXRlOiBJR3JpZFN0YXRlKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgbmV3Q29sdW1uRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBzdGF0ZS5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiAhdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdICYmIGNvbHVtbi52aXNpYmxlKTtcclxuXHJcbiAgICAgIGlmIChuZXdDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgIG5ld0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICBuZXdDb2x1bW5GaWVsZHMucHVzaChjb2x1bW4uZGF0YUZpZWxkKTtcclxuICAgICAgICAgIHRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3Q29sdW1uRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENvbHVtbkNhcHRpb25zKCk6IElDb2x1bW5DYXB0aW9uW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5ncykubWFwKChkYXRhRmllbGQpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBkYXRhRmllbGQsXHJcbiAgICAgICAgY2FwdGlvbjogdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0uY2FwdGlvblxyXG4gICAgICB9IGFzIElDb2x1bW5DYXB0aW9uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q29sdW1uQ2FwdGlvbihkYXRhRmllbGQ6IHN0cmluZywgY2FwdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdKSB7XHJcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdID0geyBjYXB0aW9uOiAnJywgdG9vbHRpcDogJycgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXS5jYXB0aW9uID0gY2FwdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb2x1bW5BZGRpdGlvbmFsU2V0dGluZ3MoZGF0YUZpZWxkOiBzdHJpbmcpOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tDb2x1bW5zUmVsZXZhbmNlKGNvbHVtbnM6IElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZVtdLCBjYWxsYmFjazogKG91dGRhdGVkQ29sdW1uczogc3RyaW5nW10pID0+IHZvaWQpIHtcclxuICAgIHRoaXMuZ3JpZERhdGFMYXllci5nZXRDb2x1bW5zQnlSZXBvcnRJZCh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbENvbHVtbnMgPSB7fTtcclxuXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChjKSA9PiBhY3R1YWxDb2x1bW5zW2MuTmFtZV0gPSB0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3V0ZGF0ZWRDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoKGMpID0+ICFhY3R1YWxDb2x1bW5zW2MuZGF0YUZpZWxkXSkubWFwKChjKSA9PiBjLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgIGlmIChvdXRkYXRlZENvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKGBHcmlkIHNldHRpbmdzIGNvbnRhaW4gc29tZSBjb2x1bm1zIHdoaWNoIGRvbid0IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB0YWJsZSBhbnltb3JlOlxyXG5cclxuICAgICAgICAgICcke291dGRhdGVkQ29sdW1ucy5qb2luKCcsICcpfScuXHJcblxyXG4gICAgICAgICAgRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZXNlIGNvbHVtbnMgZnJvbSBncmlkIHNldHRpbmdzP1xyXG4gICAgICAgICAgYCwgJ1JlbW92ZSByZWR1bmRhbnQgY29sdW1ucz8nKVxyXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNhbGxiYWNrKG91dGRhdGVkQ29sdW1ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRTZXR0aW5ncygpOiBKUXVlcnlQcm9taXNlPElHcmlkU3RhdGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhTGF5ZXIucmVzZXRTZXR0aW5ncyh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25EYXRhTG9hZGVkKGRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGF0YUxvYWRlZChkYXRhOiBJR3JpZFN0YXRlKSB7XHJcbiAgICBjb25zdCBsb2FkZWRHcmlkU3RhdGVDb2x1bW5zID0gZGF0YSAmJiBkYXRhLmNvbHVtbnM7XHJcbiAgICBsZXQgdmlzaWJsZUluZGV4Q291bnRlciA9IDA7XHJcblxyXG4gICAgdGhpcy5zdGF0ZUxvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zID0ge307XHJcblxyXG4gICAgICBsb2FkZWRHcmlkU3RhdGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHNldCB2aXNpYmxlIGluZGV4ZXMgaWYgdGhleSBoYXZlIG5vdCBiZWVuIHNldC4gSXQncyByZXF1aXJlZCBmb3IgcHJvcGVyIGR4RGF0YUdyaWQgYXBwZWFyYW5jZS5cclxuICAgICAgICBpZiAoY29sdW1uLnZpc2libGUgJiYgY29sdW1uLnZpc2libGVJbmRleCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgY29sdW1uLnZpc2libGVJbmRleCA9IHZpc2libGVJbmRleENvdW50ZXIrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHJlbW92ZSBlbXB0eSB2YWx1ZXMgYmVjYXVzZSB0aGV5IGxlYWQgdG8gd3JvbmcgZHhEYXRhR3JpZCBiZWhhdmlvclxyXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbHVtbikuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29sdW1uW2tleV0gPT09IG51bGwgfHwgY29sdW1uW2tleV0gPT09IHZvaWQgMCB8fCBjb2x1bW5ba2V5XSA9PT0gJycpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGNvbHVtbltrZXldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsU2V0dGluZ3MgPSB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF07XHJcblxyXG4gICAgICAgIGlmICghYWRkaXRpb25hbFNldHRpbmdzKSB7XHJcbiAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF0gPSB7XHJcbiAgICAgICAgICAgIGNhcHRpb246IGNvbHVtbi5jYXB0aW9uLFxyXG4gICAgICAgICAgICB0b29sdGlwOiBjb2x1bW4udG9vbHRpcFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLmNhcHRpb24gPSBjb2x1bW4uY2FwdGlvbjtcclxuICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwID0gY29sdW1uLnRvb2x0aXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOT1RFOiByZW1vdmUgY29sdW1ucyB3aGljaCBkeERhdGFHcmlkIGRvZXNuJ3QgZXhwZWN0LlxyXG4gICAgICAgIGRlbGV0ZSBjb2x1bW4uY2FwdGlvbjtcclxuICAgICAgICBkZWxldGUgY29sdW1uLnRvb2x0aXA7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jb2x1bW5zKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmVudW0gR3JpZE1vZGUge1xyXG4gIFZpZXcgPSAxLFxyXG4gIEVkaXQgPSAyXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdyaWRNb2RlO1xyXG4iLCAiXHVGRUZGaW1wb3J0IEdyaWRNb2RlIGZyb20gJy4uL1BhZ2VzL0dyaWQvTW9kZSc7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IElDb2x1bW5NZXRhRGF0YSB9IGZyb20gJy4uL0NvbHVtbk1ldGFEYXRhJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVEeERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9EYXRhL0R4RGF0YVNvdXJjZSc7XHJcbmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi8uLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZERhdGFMYXllciB7XHJcbiAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQocmVwb3J0SWQ6IG51bWJlcik6IEpRdWVyeURlZmVycmVkPElDb2x1bW5NZXRhRGF0YVtdPjtcclxuICBnZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXQ6IGJvb2xlYW4pOiBEZXZFeHByZXNzLmRhdGEuQ3VzdG9tU3RvcmU8YW55LCBhbnk+O1xyXG4gIHJlc2V0U2V0dGluZ3MocmVwb3J0SWQ6IG51bWJlcik6IEpRdWVyeURlZmVycmVkPElHcmlkU3RhdGU+O1xyXG4gIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3MocmVwb3J0SWQ6IG51bWJlciwgc3RhdGU6IElHcmlkU3RhdGUpOiBKUXVlcnlEZWZlcnJlZDxhbnk+O1xyXG4gIGdldEdyaWRWaWV3U2V0dGluZ3MocmVwb3J0SWQ6IG51bWJlcik6IEpRdWVyeURlZmVycmVkPElHcmlkU3RhdGU+O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlR3JpZERhdGFMYXllcjogKGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpID0+IElHcmlkRGF0YUxheWVyID0gKGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpID0+IHtcclxuICBjb25zdCB1cmxzID0ge1xyXG4gICAgZ3JpZFJlc3VsdDogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L0dyaWRWaWV3UmVzdWx0YCxcclxuICAgIGdldENvbHVtbnNCeVJlcG9ydElkOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR2V0RGJUYWJsZUZpZWxkc2AsXHJcbiAgICByZXNldEdyaWRTZXR0aW5nczogYCR7Z3JpZFJlcG9ydENvbnRyb2xsZXJVcmx9L1Jlc2V0R3JpZFZpZXdTZXR0aW5nc2AsXHJcbiAgICB1cGRhdGVHcmlkVmlld1NldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vVXBkYXRlR3JpZFZpZXdTZXR0aW5nc2AsXHJcbiAgICBnZXRHcmlkVmlld1NldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR2V0R3JpZFZpZXdTZXR0aW5nc2BcclxuICB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0KSB7XHJcbiAgICAgIHJldHVybiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgIGxvYWRQYXJhbXM6IHtcclxuICAgICAgICAgIGlkOiByZXBvcnRQYXJhbXMuUmVwb3J0SWQsXHJcbiAgICAgICAgICBhcHBOYW1lOiByZXBvcnRQYXJhbXMuQXBwTmFtZSxcclxuICAgICAgICAgIGdyaWRNb2RlLFxyXG4gICAgICAgICAgcm93c0xpbWl0OiBncmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCAmJiAhc2hvd0FsbERhdGFJbkVkaXQgPyAxNSA6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRVcmw6IHVybHMuZ3JpZFJlc3VsdCxcclxuICAgICAgICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2VcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENvbHVtbnNCeVJlcG9ydElkOiAocmVwb3J0SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5nZXRDb2x1bW5zQnlSZXBvcnRJZCwgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc2V0U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLnJlc2V0R3JpZFNldHRpbmdzLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSkgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy51cGRhdGVHcmlkVmlld1NldHRpbmdzLCAncG9zdCcsIHtcclxuICAgICAgICBpZDogcmVwb3J0SWQsIGNvbHVtbnNTZXR0aW5nczogSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29sdW1ucylcclxuICAgICAgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRHcmlkVmlld1NldHRpbmdzOiAocmVwb3J0SWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5nZXRHcmlkVmlld1NldHRpbmdzLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9O1xyXG59O1xyXG5cclxuY29uc3QgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlID0gKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpOiBzdHJpbmcgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLiBQbGVhc2UgY29udGFjdCB0aGUgcmVwb3J0IGF1dGhvciB0byBjb25maXJtIHRoZSBkYXRhIHJlcXVpcmVtZW50cy4nO1xyXG5cclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiAnJztcclxuICB9XHJcbn07XHJcbiIsICJleHBvcnQgaW50ZXJmYWNlIElSZWZyZXNoT3B0aW9ucyB7XHJcbiAgY2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgZWxhcHNlZENhbGxiYWNrOiAodGltZTogbnVtYmVyKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jb25zdCB1cGRhdGVUaW1lb3V0ID0gMTAwO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmcmVzaFRpbWVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxhcHNlZENhbGxiYWNrOiAodGltZTogbnVtYmVyKSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgYWN0aXZlVGltZXJJZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIGN1cnJlbnRJbnRlcnZhbDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIGxhc3RTdGF0ZUNoZWNrZWQ6IERhdGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZWZyZXNoT3B0aW9ucykge1xyXG4gICAgdGhpcy5lbGFwc2VkQ2FsbGJhY2sgPSBvcHRpb25zLmVsYXBzZWRDYWxsYmFjaztcclxuICAgIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0KGludGVydmFsOiBudW1iZXIpIHtcclxuICAgIGlmIChpbnRlcnZhbCA8PSAwKSB7XHJcbiAgICAgIHRoaXMuY2FsbGJhY2soKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5jdXJyZW50SW50ZXJ2YWwgPSBpbnRlcnZhbDtcclxuXHJcbiAgICBjb25zdCB0aW1lcklkID0gdGhpcy5hY3RpdmVUaW1lcklkID0gTWF0aC5yYW5kb20oKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRJbnRlcnZhbCA8IDApIHtcclxuICAgICAgdGhpcy5lbGFwc2VkQ2FsbGJhY2sodGhpcy5jdXJyZW50SW50ZXJ2YWwpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGlja1RpbWVyRnVuY3Rpb24odGltZXJJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJpZ2dlckNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmNhbGxiYWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIC8vQ2hhbmdlIHRpbWVySWQgZm9yIGJyZWFraW5nIHJlZnJlc2ggcHJvY2VzcyBpbiBuZXh0IHNldFRpbWVvdXQgY2FsbC4gZGtsaW1hbm92XHJcbiAgICB0aGlzLmFjdGl2ZVRpbWVySWQtLTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGlja1RpbWVyRnVuY3Rpb24odGltZXJJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGltZXJJZCAhPT0gdGhpcy5hY3RpdmVUaW1lcklkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBsZXQgdGltZVRvVXBkYXRlOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCAtIChuZXcgRGF0ZSgpIC0gdGhpcy5sYXN0U3RhdGVDaGVja2VkKTtcclxuICAgIGlmICh0aW1lVG9VcGRhdGUgPD0gMCkge1xyXG4gICAgICB0aW1lVG9VcGRhdGUgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCArIDk5OTtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gICAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpLCB1cGRhdGVUaW1lb3V0KTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCBSZWZyZXNoQ29tcG9uZW50IGZyb20gJy4vSW5kZXgnO1xyXG5cclxuY29uc3QgZGVmYXVsdFJlZnJlc2hFbnRyaWVzOiBJUmVmcmVzaEVudHJ5W10gPSBbe1xyXG4gIHRpbWVvdXQ6IDAsXHJcbiAgdGV4dDogJ3JlZnJlc2ggbm93JyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICcnLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTUgKiAxMDAwLFxyXG4gIHRleHQ6ICcxNSBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMCAqIDEwMDAsXHJcbiAgdGV4dDogJzMwIHNlYycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwICogMTAwMCxcclxuICB0ZXh0OiAnMSBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAxODAgKiAxMDAwLFxyXG4gIHRleHQ6ICczIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDMwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzUgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogNjAwICogMTAwMCxcclxuICB0ZXh0OiAnMTAgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogLTEsXHJcbiAgdGV4dDogJ29mZicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGU6IG9mZicsXHJcbiAgaXNEZWZhdWx0OiB0cnVlXHJcbn1dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaEVudHJ5IHtcclxuICB0aW1lb3V0OiBudW1iZXIsXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogc3RyaW5nLFxyXG4gIGlzRGVmYXVsdD86IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmcmVzaEJ1dHRvbiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wRG93bkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRNZW51OiBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnU7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoQ29tcG9uZW50OiBSZWZyZXNoQ29tcG9uZW50O1xyXG4gIHByaXZhdGUgbWVudUlzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZEVudHJ5OiBJUmVmcmVzaEVudHJ5O1xyXG5cclxuICBjb25zdHJ1Y3RvcigkdGFyZ2V0OiBKUXVlcnksIGNhbGxiYWNrOiAoKSA9PiB2b2lkLCByZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdIHwgbnVsbCA9IGRlZmF1bHRSZWZyZXNoRW50cmllcykge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50ID0gbmV3IFJlZnJlc2hDb21wb25lbnQoeyBjYWxsYmFjaywgZWxhcHNlZENhbGxiYWNrOiAoZSkgPT4gdGhpcy5lbGFwc2VkQ2FsbGJhY2soZSkgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSByZWZyZXNoRW50cmllcy5maW5kKChlKSA9PiBlLmlzRGVmYXVsdCkgfHwgcmVmcmVzaEVudHJpZXMuZmlsdGVyKChlKSA9PiAhIWUudGltZW91dClbMF07XHJcblxyXG4gICAgdGhpcy5jb250ZXh0TWVudSA9ICQoJzxkaXYgLz4nKS5keENvbnRleHRNZW51KHtcclxuICAgICAgZGF0YVNvdXJjZTogcmVmcmVzaEVudHJpZXMsXHJcbiAgICAgIHRhcmdldDogJHRhcmdldCxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdyaWdodCB0b3AnLCBhdDogJ3JpZ2h0IGJvdHRvbScgfSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgaWYoIShlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbnRyeSA9IGUuaXRlbURhdGEgYXMgSVJlZnJlc2hFbnRyeTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQoKGUuaXRlbURhdGEgYXMgYW55KS50aW1lb3V0KTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1lbnVJc09wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgKGUuY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIoKVswXS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzem9sZWEtdGhlbWUnKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAoZW50cnkpID0+IGVudHJ5LnRleHQsXHJcblxyXG4gICAgICBjc3NDbGFzczogJ2lzem9sZWEtdGhlbWUnXHJcbiAgICB9KS5hcHBlbmRUbygnYm9keScpLmR4Q29udGV4dE1lbnUoJ2luc3RhbmNlJyk7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcblxyXG4gICAgdGhpcy5kcm9wRG93bkJ1dHRvbiA9ICR0YXJnZXQuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLnNlbGVjdGVkRW50cnkudGV4dCxcclxuICAgICAgdGVtcGxhdGU6IChidXR0b25EYXRhLCBjb250ZW50KSA9PiB7XHJcbiAgICAgICAgJCgnPGkgLz4nKS5hZGRDbGFzcygnZHgtaWNvbiBkeC1pY29uLXJlZnJlc2gnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuICAgICAgICAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYnV0dG9uLXdpdGgtZXhwYW5kLXRleHQnKS50ZXh0KGJ1dHRvbkRhdGEudGV4dCkuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC1pY29uIGlzb3otaWNvbi0xNiBpc296LWljb24tYXJyb3ctZG93bi0xNicpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICBjbGFzczogJ2lzem9sZWEtbWQgYnV0dG9uLXdpdGgtZXhwYW5kJ1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LmVsZW1lbnQoKS53aWR0aCgkdGFyZ2V0Lm91dGVyV2lkdGgoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWVudUlzT3BlbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuXHJcbiAgICAodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQgPiAwKSAmJiB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQudHJpZ2dlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbGFwc2VkQ2FsbGJhY2sodGltZVRvVXBkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5zZWxlY3RlZEVudHJ5LnJlZnJlc2hUZW1wbGF0ZS5yZXBsYWNlKCclJywgTWF0aC5mbG9vcih0aW1lVG9VcGRhdGUgLyAxMDAwKS50b1N0cmluZygpKSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4uLy4uL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XHJcbmltcG9ydCB7aW5pdFBvcG92ZXJ9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQge0lHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IEdSSURfSU5ESUNBVE9SX1NUQVRFIGZyb20gJy4vR3JpZEluZGljYXRvclN0YXRlJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBHcmlkU3RhdGVNYW5hZ2VyIGZyb20gJy4vR3JpZFN0YXRlTWFuYWdlcic7XHJcbmltcG9ydCBHcmlkTW9kZSBmcm9tICcuL01vZGUnO1xyXG5pbXBvcnQge2NyZWF0ZUdyaWREYXRhTGF5ZXIsIElHcmlkRGF0YUxheWVyfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHtHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZX0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmNvbnN0IFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUID0gMzAwMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRPcHRpb25zIHtcclxuICBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElHcmlkUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgc2hvd0hlYWRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50R3JpZE1vZGU6IEdyaWRNb2RlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzaG93QWxsRGF0YUluRWRpdCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkU3RhdGVNYW5hZ2VyOiBHcmlkU3RhdGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFN0YXRlSW5kaWNhdG9yOiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRncmlkRXJyb3JQbGFjZWhvbGRlcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFRhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG4gIHByaXZhdGUgZWRpdFdpZHRoRWRpdEJveGVzOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveFtdIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFJlcGFpbnRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGNvbHVtbk5hbWVzVXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5ncmlkUG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudEdyaWRNb2RlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gR3JpZE1vZGUuVmlldztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQ/LnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmdyaWQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gbnVsbDtcclxuICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG5cclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEludGVybmFsKCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICB0aGlzLmRhdGFMYXllciA9IGNyZWF0ZUdyaWREYXRhTGF5ZXIodGhpcy5ncmlkUmVwb3J0Q29udHJvbGxlclVybCk7XHJcblxyXG4gICAgaWYgKHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50ID0gJCgnPGRpdiAvPicpLmluc2VydEFmdGVyKHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyKTtcclxuXHJcbiAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIgPSBuZXcgR3JpZFN0YXRlTWFuYWdlcih0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCwgdGhpcy5kYXRhTGF5ZXIpO1xyXG5cclxuICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyID0gJCgnPGRpdiAvPicpLnRleHQoJ0RhdGEgbG9hZGluZyBmYWlsZWQuJykuYWRkQ2xhc3MoJ2R4LWRhdGFncmlkLW5vZGF0YScpLmNzcyh7IHpJbmRleDogMSB9KTtcclxuICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmFwcGVuZFRvKHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyKTtcclxuICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmhpZGUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICAvLyBUT0RPOiBlbGVtZW50IHNlbGVjdG9yIGFzIGEgcGFyYW1cclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lZGl0V2lkdGhFZGl0Qm94ZXMgPSBbXTtcclxuICAgIGNvbnN0IGdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgICBkYXRhU291cmNlOiB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSxcclxuICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0ID8gJ2VkaXQtbW9kZScgOiAndmlldy1tb2RlJyB9LFxyXG4gICAgICByZXBhaW50Q2hhbmdlc09ubHk6IHRydWUsXHJcbiAgICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyAmJiB0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICAgICAgY29uc3Qgc2VhcmNoUGFuZWwgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3NlYXJjaFBhbmVsJylbMF07XHJcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbEluZGV4ID0gaXRlbXMuaW5kZXhPZihzZWFyY2hQYW5lbCk7XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3dpdGNoVG9FZGl0QnRuID0ge1xyXG4gICAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1N3aXRjaCB0byBFZGl0IE1vZGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc3dpdGNoVG9Nb2RlKEdyaWRNb2RlLkVkaXQpLFxyXG4gICAgICAgICAgICAgIGljb246ICdzd2l0Y2gtdG8tZWRpdC1tb2RlJyxcclxuICAgICAgICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9XHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShzZWFyY2hQYW5lbEluZGV4LCAxKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goc3dpdGNoVG9FZGl0QnRuKTtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goc2VhcmNoUGFuZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICBjb25zdCBjb2x1bW5DaG9vc2VyQnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJylbMF07XHJcbiAgICAgICAgICBjb25zdCBjb2x1bW50Q2hvb3NlckJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihjb2x1bW5DaG9vc2VyQnRuKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzaG93RGF0YUl0ZW0gPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggI2UwZTBlMCBzb2xpZCcsXHJcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICczcHggNnB4JyxcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcclxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3doaXRlJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHsgbWFyZ2luOiAnMCA1cHggMCAwJywgd2lkdGg6ICc1NHB4JyB9KVxyXG4gICAgICAgICAgICAgICAgLmR4U3dpdGNoKHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2hvd0FsbERhdGFJbkVkaXQsXHJcbiAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QWxsRGF0YUluRWRpdCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS50ZXh0KCdTaG93IGFsbCBkYXRhICcpLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCAkaGludFRhcmdldCA9ICQoJzxhIC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3MoeyB0ZXh0RGVjb3JhdGlvbjogJ3VuZGVybGluZScsIGNvbG9yOiAnYmx1ZScgfSlcclxuICAgICAgICAgICAgICAgIC50ZXh0KCcoPyknKVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC50ZXh0KGBJZiB0aGUgdGFibGUgY29udGFpbnMgYSBsb3Qgb2YgY29sdW1ucyBzaG93aW5nIGFsbCBkYXRhIGNhbiBsZWFkIHRvIHNsb3cgcGFnZSBwZXJmb3JtYW5jZSB3aGVuIHlvdSdyZSBlZGl0aW5nIHRoZSBncmlkLlxyXG5CeSBkZWZhdWx0IGdyaWQgc2hvd3Mgb25seSBmaXJzdCAxMCByb3dzIGluIHRoZSBFZGl0IG1vZGUuYClcclxuICAgICAgICAgICAgICAgIC5keFBvcG92ZXIoe1xyXG4gICAgICAgICAgICAgICAgICB0YXJnZXQ6ICRoaW50VGFyZ2V0LFxyXG4gICAgICAgICAgICAgICAgICBzaG93RXZlbnQ6ICdtb3VzZWVudGVyJyxcclxuICAgICAgICAgICAgICAgICAgaGlkZUV2ZW50OiAnbW91c2VsZWF2ZScsXHJcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDUwMFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN3aXRjaFRvVmlld0J0biA9IHtcclxuICAgICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdTd2l0Y2ggdG8gVmlldyBNb2RlJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnN3aXRjaFRvTW9kZShHcmlkTW9kZS5WaWV3KSxcclxuICAgICAgICAgICAgICBpY29uOiAnc3dpdGNoLXRvLXZpZXctbW9kZScsXHJcbiAgICAgICAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoY29sdW1udENob29zZXJCdG5JbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZXhwb3J0QnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdleHBvcnRCdXR0b24nKVswXTtcclxuICAgICAgICAgIGNvbnN0IGV4cG9ydEJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihleHBvcnRCdG4pO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShleHBvcnRCdG5JbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgaXRlbXMucHVzaChzaG93RGF0YUl0ZW0pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb1ZpZXdCdG4pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChjb2x1bW5DaG9vc2VyQnRuKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBlZGl0U3RhdHVzID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2VkaXQtZ3JpZC1zdGF0ZScpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5lZGl0KTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMudW5zaGlmdChlZGl0U3RhdHVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFkZFJlZnJlc2hCdXR0b24pIHtcclxuICAgICAgICAgIGNvbnN0IHJlZnJlc2hCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3JlZnJlc2gnKVswXTtcclxuICAgICAgICAgIGNvbnN0IHJlZnJlc2hCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YocmVmcmVzaEJ0bik7XHJcblxyXG4gICAgICAgICAgaXRlbXNbcmVmcmVzaEJ0bkluZGV4XSA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hCdXR0b24gPSBuZXcgUmVmcmVzaEJ1dHRvbigkY29udGFpbmVyLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ2VsbFByZXBhcmVkOiAoeyByb3dUeXBlLCBjb2x1bW4sIGNlbGxFbGVtZW50IH0pID0+IHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGlmIChyb3dUeXBlID09PSAnaGVhZGVyJyAmJiAhY29sdW1uLmNvbW1hbmQpIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFGaWVsZCA9IGNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsU2V0dGluZ3MgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuZ2V0Q29sdW1uQWRkaXRpb25hbFNldHRpbmdzKGRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5pbml0R3JpZEhlYWRlckNlbGwoY2VsbEVsZW1lbnQsIGFkZGl0aW9uYWxTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEdyaWRIZWFkZXJDZWxsRWRpdFBhbmVsKGNvbHVtbiwgY2VsbEVsZW1lbnQsIGFkZGl0aW9uYWxTZXR0aW5ncyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEdyaWQgPSBlLmNvbXBvbmVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGU6IElHcmlkU3RhdGUgPSBjdXJyZW50R3JpZC5zdGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY29sdW1uTmFtZXNVcGRhdGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWluZyhjdXJyZW50U3RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBOT1RFOiBjb2x1bW4gbmFtZSB1cGRhdGluZyB0cmlnZ2VycyBvbkNvbnRlbnRSZWFkeSBldmVudCByYWlzaW5nIGFnYWluLlxyXG4gICAgICAgICAgLy8gV2UgbmVlZCBub3QgdG8gZXhldWN1dGUgdGhlIHNhbWUgb25lIG1vcmUgdGltZS5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGN1cnJlbnRHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSAhPT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV3Q29sdW1ucyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5jaGVja05ld0NvbHVtbnMoY3VycmVudFN0YXRlKTtcclxuXHJcbiAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW5OYW1lKSA9PiBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oY29sdW1uTmFtZSwgJ3Zpc2libGUnLCBmYWxzZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBjb2x1bW5DYXB0aW9ucyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5nZXRDb2x1bW5DYXB0aW9ucygpO1xyXG5cclxuICAgICAgICBjb2x1bW5DYXB0aW9ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYy5jYXB0aW9uICYmIGN1cnJlbnRHcmlkLmNvbHVtbk9wdGlvbihjLmRhdGFGaWVsZCwgJ2NhcHRpb24nKSAhPT0gYy5jYXB0aW9uKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRHcmlkLmNvbHVtbk9wdGlvbihjLmRhdGFGaWVsZCwgJ2NhcHRpb24nLCBjLmNhcHRpb24pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZVN0b3Jpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgIGN1c3RvbUxvYWQ6ICgpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIubG9hZCh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCwgKG91dGRhdGVkQ29sdW1ucykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ3JpZC5zdGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgc3RhdGUuY29sdW1ucyA9IChzdGF0ZS5jb2x1bW5zIGFzIGFueVtdKS5maWx0ZXIoKGNvbHVtbikgPT4gb3V0ZGF0ZWRDb2x1bW5zLmluZGV4T2YoY29sdW1uLmRhdGFGaWVsZCkgPCAwKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShzdGF0ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGN1c3RvbVNhdmU6IChzdGF0ZSkgPT4gdGhpcy5zYXZlR3JpZFN0YXRlKHN0YXRlKVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3LCBhcHBseUZpbHRlcjogJ29uQ2xpY2snIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyB9LFxyXG4gICAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuVmlldyB9LFxyXG4gICAgICBlcnJvclJvd0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICBzb3J0aW5nOiB7IG1vZGU6ICdtdWx0aXBsZScgfSxcclxuICAgICAgZ3JvdXBQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7IGF1dG9FeHBhbmRBbGw6IGZhbHNlIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVvcmRlcmluZzogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQsXHJcbiAgICAgIGNvbHVtbkNob29zZXI6IHsgZW5hYmxlZDogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgfSxcclxuICAgICAgc2hvd0NvbHVtbkhlYWRlcnM6IHRydWUsXHJcbiAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge2VuYWJsZWQ6IGZhbHNlfSxcclxuXHJcbiAgICAgIHNob3dCb3JkZXJzOiB0cnVlLFxyXG4gICAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwLCBlbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcblxyXG4gICAgICBzdW1tYXJ5OiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW4gPyB7XHJcbiAgICAgICAgdG90YWxJdGVtczogW3tcclxuICAgICAgICAgIGNvbHVtbjogdGhpcy5yZXBvcnRQYXJhbXMuVG90YWxTdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgICB9XVxyXG4gICAgICB9IDogdW5kZWZpbmVkLFxyXG5cclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmcoZSkge1xyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdmaWx0ZXJSb3cnKSB7XHJcbiAgICAgICAgICBjb25zdCBhcHBseSA9ICgpID0+IGUuZWxlbWVudC5maW5kKCcuZHgtYXBwbHktYnV0dG9uJykudHJpZ2dlcignZHhjbGljaycpO1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHk7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnc2VhcmNoUGFuZWwnKSB7XHJcbiAgICAgICAgICBjb25zdCBhcHBseVNlYXJjaDogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkVudGVyS2V5ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBkZWZhdWx0R3JpZCh0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCwge1xyXG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHRoaXMucmVwb3J0UGFyYW1zLk5hbWUsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnNob3dIZWFkZXIgPyB0aGlzLnJlcG9ydFBhcmFtcy5OYW1lIDogbnVsbCxcclxuICAgICAgaGVhZGVyRGVzY3JpcHRpb246IHRoaXMuc2hvd0hlYWRlciA/IHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMgOiBudWxsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50Py5yZW1vdmUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudCA9ICQoJzxzcGFuIC8+JylcclxuICAgICAgICAuY3NzKHtcclxuICAgICAgICAgIGZsb2F0OiAncmlnaHQnLFxyXG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXHJcbiAgICAgICAgICBib3R0b206ICc4cHgnXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKVxyXG4gICAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgICB0ZXh0OiAnUmVzZXQgc2V0dGluZ3MnLFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5yZXNldFNldHRpbmdzKCksXHJcbiAgICAgICAgICBpY29uOiAncmVzZXQtZ3JpZC1zZXR0aW5ncydcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hcHBlbmRUbygnZm9vdGVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKHN0YXRlOiBzdHJpbmcpIHtcclxuICAgIE9iamVjdC5rZXlzKEdSSURfSU5ESUNBVE9SX1NUQVRFKS5mb3JFYWNoKChzKSA9PiB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IucmVtb3ZlQ2xhc3MoR1JJRF9JTkRJQ0FUT1JfU1RBVEVbc10pKTtcclxuXHJcbiAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IuYWRkQ2xhc3Moc3RhdGUpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQpIHtcclxuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGF0ZSA9PT0gR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQpIHtcclxuICAgICAgdGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQpO1xyXG4gICAgICB9LCBSRVNFVF9TQVZFRF9JTkRJQ0FUT1JfVElNRU9VVCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRpdGxlID0gJyc7XHJcblxyXG4gICAgc3dpdGNoIChzdGF0ZSkge1xyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQ6XHJcbiAgICAgICAgdGl0bGUgPSAnRWRpdCBtb2RlJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQ6XHJcbiAgICAgICAgdGl0bGUgPSAnU2F2ZWQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZpbmc6XHJcbiAgICAgICAgdGl0bGUgPSAnU2F2aW5nJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IuYXR0cigndGl0bGUnLCB0aXRsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbk5hbWluZyhzdGF0ZTogSUdyaWRTdGF0ZSkge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAvLyBIQUNLOiBEZXZFeHRyZW1lIGdyaWQgZG9lc24ndCBzaG93IGNvbHVtbnMgZGF0YSBpZiBhIGRhdGFGaWVsZCBoYXMgc3BlY2lhbCBzeW1ib2xzLlxyXG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LmRldmV4cHJlc3MuY29tL1N1cHBvcnQvQ2VudGVyL1F1ZXN0aW9uL0RldGFpbHMvVDYyMTgzOC9keGRhdGFncmlkLWEtY29sdW1uLWlzLWVtcHR5LWlmLWRhdGFmaWVsZC1jb250YWlucy1zcGVjaWFsLWNoYXJhY3RlcnNcclxuICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBpZiAoc3RhdGUuY29sdW1ucykge1xyXG4gICAgICBzdGF0ZS5jb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICBpZiAoL1teYS16QS1aMC05X10vLnRlc3QoYy5kYXRhRmllbGQpKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FsY3VsYXRlQ2VsbFZhbHVlJywgKHJvd0RhdGEpID0+IHJvd0RhdGFbYy5kYXRhRmllbGRdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2UocmVwb3J0UGFyYW1zRGF0YVNvdXJjZTogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdERhdGFTb3VyY2U6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5kYXRhTGF5ZXIuZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zRGF0YVNvdXJjZSwgZ3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZSk7XHJcbiAgICBjb25zdCBkcyA9IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgIHN0b3JlLFxyXG4gICAgICBvbkNoYW5nZWQ6IGdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3ID8gdm9pZCAwIDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uTG9hZEVycm9yOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZHMuaXNMb2FkZWQoKSkge1xyXG4gICAgICAgICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuc2hvdygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ncmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgICAgfSxcclxuICAgICAgb25Mb2FkaW5nQ2hhbmdlZDogKGlzTG9hZGluZykgPT4ge1xyXG4gICAgICAgIGlmIChpc0xvYWRpbmcpIHtcclxuICAgICAgICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdQbGVhc2Ugd2FpdCwgZGF0YSBsb2FkaW5nIGluIHByb2dyZXNzLicpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAxMDAwMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0aGlzLmxvYWRpbmdUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRpbmdUaW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nVGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGRzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFNldHRpbmdzKCkge1xyXG4gICAgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybSgnUmVzZXQgZ3JpZCBzZXR0aW5ncyB0byBkZWZhdWx0IHZhbHVlcz8nLCAnUmVzZXQgdG8gZGVmYXVsdD8nKVxyXG4gICAgICAudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG4gICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyXHJcbiAgICAgICAgICAgIC5yZXNldFNldHRpbmdzKClcclxuICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQuc3RhdGUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hUb01vZGUobW9kZTogR3JpZE1vZGUpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gbW9kZSB8fCBtb2RlID09PSBHcmlkTW9kZS5FZGl0ICYmICF0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBtb2RlO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID0gdGhpcy5ncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zWzBdLmNvbHVtbicpIGFzIHN0cmluZztcclxuXHJcbiAgICBjb25zdCBuZXdSZXBvcnRQYXJhbXMgPSB7XHJcbiAgICAgIC4uLnRoaXMucmVwb3J0UGFyYW1zLFxyXG4gICAgICBUb3RhbFN1bW1hcnlDb2x1bW46IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID8gY3VycmVudFN1bW1hcnlDb2x1bW4gOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW5cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBuZXdSZXBvcnRQYXJhbXM7XHJcblxyXG4gICAgdGhpcy5ncmlkLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy5ncmlkID0gdGhpcy5pbml0SW50ZXJuYWwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZUdyaWRTdGF0ZShzdGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlICE9PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHdpZHRocyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKHN0YXRlLFxyXG4gICAgICAoKSA9PiB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5zYXZpbmcpLFxyXG4gICAgICAoKSA9PiB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZCkpO1xyXG5cclxuICAgIGlmICh3aWR0aHMpIHtcclxuICAgICAgT2JqZWN0LmtleXMod2lkdGhzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBlZGl0V2lkdGhCb3ggPSB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlc1trZXldO1xyXG5cclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHdpZHRoc1trZXldID09PSAnaW5oZXJpdCcgPyAnJyA6IHdpZHRoc1trZXldO1xyXG5cclxuICAgICAgICBpZiAoZWRpdFdpZHRoQm94ICYmIGVkaXRXaWR0aEJveC5vcHRpb24oJ3ZhbHVlJykgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICBlZGl0V2lkdGhCb3gub3B0aW9uKCd2YWx1ZScsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0R3JpZEhlYWRlckNlbGxFZGl0UGFuZWwoXHJcbiAgICBjb2x1bW46IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbixcclxuICAgICRjZWxsOiBKUXVlcnksXHJcbiAgICBhZGRpdGlvbmFsU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlXHJcbiAgKSB7XHJcbiAgICBjb25zdCBkYXRhRmllbGQgPSBjb2x1bW4uZGF0YUZpZWxkO1xyXG4gICAgY29uc3QgJGNvbHVtbkNhcHRpb25FbCA9ICRjZWxsLmZpbmQoJy5keC1kYXRhZ3JpZC10ZXh0LWNvbnRlbnQnKTtcclxuICAgIGNvbnN0ICRlZGl0b3JBcmVhID0gJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnY29sdW1uLWVkaXRvci1hcmVhJykuaW5zZXJ0QWZ0ZXIoJGNvbHVtbkNhcHRpb25FbCk7XHJcblxyXG4gICAgJGNvbHVtbkNhcHRpb25FbC5jc3MoJ21heFdpZHRoJywgJzU1JScpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VHlwZVBhbmVsID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZWRpdC10eXBlLXBhbmVsJylcclxuICAgICAgLndpZHRoKCcxMDAlJylcclxuICAgICAgLmFwcGVuZFRvKCRjZWxsKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFdpZHRoUGFuZWwgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdlZGl0LXdpZHRoLXBhbmVsJylcclxuICAgICAgLndpZHRoKCcxMDAlJylcclxuICAgICAgLmFwcGVuZFRvKCRjZWxsKTtcclxuXHJcbiAgICAkZWRpdFR5cGVQYW5lbFswXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgIGNvbnN0IHNlbGVjdEJveCA9ICRlZGl0VHlwZUJveC5keFNlbGVjdEJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RCb3gub3B0aW9uKCdvcGVuZWQnKSkge1xyXG4gICAgICAgIHNlbGVjdEJveC5jbG9zZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdEJveC5vcGVuKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHRydWUpO1xyXG5cclxuICAgIGxldCBsYXN0Q2FwdGlvblZhbHVlID0gY29sdW1uLmNhcHRpb247XHJcblxyXG4gICAgY29uc3QgJGVkaXRDYXB0aW9uQnRuID0gJCgnPHNwYW4gLz4nKS5keEJ1dHRvbih7XHJcbiAgICAgIGhpbnQ6ICdFZGl0IGNvbHVtbiBjYXB0aW9uJyxcclxuICAgICAgdGVtcGxhdGU6IChkYXRhLCAkY29udGVudCkgPT4gJGNvbnRlbnQuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2VkaXQtY2FwdGlvbi1idG4nKSksXHJcbiAgICAgIG9uQ2xpY2s6ICh7IGV2ZW50IH0pID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLmhpZGUoKTtcclxuICAgICAgICAkZWRpdENhcHRpb25CdG4uaGlkZSgpO1xyXG4gICAgICAgICRlZGl0VG9vbHRpcEJ0bi5oaWRlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRlZGl0ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xyXG4gICAgICAgICAgdmFsdWU6IGxhc3RDYXB0aW9uVmFsdWUsXHJcbiAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogJ2NhcHRpb24tZWRpdG9yJyB9LFxyXG4gICAgICAgICAgb25FbnRlcktleTogKGUpID0+IHtcclxuICAgICAgICAgICAgZWRpdEJ0bi5ibHVyKCk7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uRm9jdXNPdXQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdEJ0bi5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICAgICAgICAkZWRpdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJGNvbHVtbkNhcHRpb25FbC50ZXh0KG5ld1ZhbHVlKS5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0VG9vbHRpcEJ0bi5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBsYXN0Q2FwdGlvblZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5zZXRDb2x1bW5DYXB0aW9uKGRhdGFGaWVsZCwgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVHcmlkU3RhdGUodGhpcy5ncmlkLnN0YXRlKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcclxuICAgICAgICAgIC5hcHBlbmRUbygkZWRpdG9yQXJlYSlcclxuICAgICAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdEJ0biA9ICRlZGl0LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZWRpdEJ0bi5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9KS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFRvb2x0aXBCdG4gPSAkKCc8c3BhbiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgaGludDogJ0VkaXQgY29sdW1uIHRvb2x0aXAnLFxyXG4gICAgICB0ZW1wbGF0ZTogKGRhdGEsICRjb250ZW50KSA9PiAkY29udGVudC5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZWRpdC10b29sdGlwLWJ0bicpKSxcclxuICAgICAgb25DbGljazogKHsgZXZlbnQgfSkgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xyXG4gICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRUb29sdGlwQnRuLmhpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGVkaXQgPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICB2YWx1ZTogYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwLFxyXG4gICAgICAgICAgdGV4dDogYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwLFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdFbnRlciBjb2x1bW4gdG9vbHRpcC4uLicsXHJcbiAgICAgICAgICBvbkVudGVyS2V5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlZGl0QnRuLmJsdXIoKTtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbktleURvd246IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25Gb2N1c091dDogKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGVkaXRCdG4ub3B0aW9uKCd2YWx1ZScpO1xyXG5cclxuICAgICAgICAgICAgJGVkaXQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICRjb2x1bW5DYXB0aW9uRWwuc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdENhcHRpb25CdG4uc2hvdygpO1xyXG4gICAgICAgICAgICAkZWRpdFRvb2x0aXBCdG4uc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgJGNlbGwuYXR0cigndGl0bGUnLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUdyaWRTdGF0ZSh0aGlzLmdyaWQuc3RhdGUoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAgICAgLmFwcGVuZFRvKCRlZGl0b3JBcmVhKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0QnRuID0gJGVkaXQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBlZGl0QnRuLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmluc2VydEFmdGVyKCRlZGl0Q2FwdGlvbkJ0bik7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUeXBlQm94ID0gJCgnPHNwYW4gLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgIGRhdGFTb3VyY2U6IGdyaWRDb2x1bW5UeXBlcyxcclxuICAgICAgdmFsdWU6IGNvbHVtbi5kYXRhVHlwZSB8fCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLkRlZmF1bHQsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbHVtbiB0eXBlLi4uJyxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGRhdGFGaWVsZCwgJ2RhdGFUeXBlJywgdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpLmFwcGVuZFRvKCRlZGl0VHlwZVBhbmVsKTtcclxuXHJcbiAgICBsZXQgcHJldlZhbHVlID0gISFjb2x1bW4ud2lkdGggPyBjb2x1bW4ud2lkdGgudG9TdHJpbmcoKSA6ICcnO1xyXG5cclxuICAgIGNvbnN0IG9uV2lkdGhWYWx1ZUNoYW5nZWQgPSAoZSkgPT4ge1xyXG4gICAgICBsZXQgbmV3VmFsdWUgPSBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICBpZiAoIW5ld1ZhbHVlIHx8IG5ld1ZhbHVlID09PSAnaW5oZXJpdCcpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXByZXZWYWx1ZSB8fCBwcmV2VmFsdWUgPT09ICdpbmhlcml0Jykge1xyXG4gICAgICAgIHByZXZWYWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmV3VmFsdWUgIT09IHByZXZWYWx1ZSkge1xyXG4gICAgICAgIHByZXZWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oZGF0YUZpZWxkLCAnd2lkdGgnLCBuZXdWYWx1ZSB8fCAnaW5oZXJpdCcpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQpIHtcclxuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkLnJlcGFpbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0ICRlZGl0V2lkdGhCb3ggPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgIHRleHQ6IHByZXZWYWx1ZSA9PT0gJ2luaGVyaXQnID8gJycgOiBwcmV2VmFsdWUsXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2V0IHdpZHRoLi4uJyxcclxuICAgICAgb25FbnRlcktleTogKCkgPT4gJGVkaXRXaWR0aEJveC5keFRleHRCb3goJ2luc3RhbmNlJykuYmx1cigpLFxyXG4gICAgICBvbkZvY3VzT3V0OiBvbldpZHRoVmFsdWVDaGFuZ2VkLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogb25XaWR0aFZhbHVlQ2hhbmdlZFxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAuYXBwZW5kVG8oJGVkaXRXaWR0aFBhbmVsKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5lZGl0V2lkdGhFZGl0Qm94ZXNbY29sdW1uLnZpc2libGVJbmRleF0gPSAkZWRpdFdpZHRoQm94LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEdyaWRIZWFkZXJDZWxsKCRjZWxsRWw6IEpRdWVyeSwgYWRkaXRpb25hbFNldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSkge1xyXG4gICAgY29uc3QgJGNvbHVtbkNhcHRpb25FbCA9ICRjZWxsRWwuZmluZCgnLmR4LWRhdGFncmlkLXRleHQtY29udGVudCcpO1xyXG4gICAgY29uc3QgdG9vbHRpcCA9IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcDtcclxuICAgIGNvbnN0IGNhcHRpb24gPSBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLmNhcHRpb247XHJcblxyXG4gICAgJGNlbGxFbC5hdHRyKCd0aXRsZScsIHRvb2x0aXAgfHwgdm9pZCAwKTtcclxuXHJcbiAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAkY29sdW1uQ2FwdGlvbkVsLnRleHQoY2FwdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbnRlcmZhY2UgSUdhdWdlU3VidmFsdWVzT3B0aW9ucyB7XHJcbiAgc3VidmFsdWVzOiBJU3VidmFsdWVPcHRpb25zW107XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJU3VidmFsdWVPcHRpb25zIHtcclxuICBrZXk6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaXNCb3VuZDogYm9vbGVhbjtcclxuICBtZWFzdXJlSWQ6IHN0cmluZztcclxuICB2YWx1ZTogbnVtYmVyO1xyXG4gIGNvbG9yOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xyXG4gIHN1YnZhbHVlczogW10sXHJcbiAgdHlwZTogJ3RyaWFuZ2xlTWFya2VyJyxcclxuICBjb2xvcjogJyM4Nzk4YTUnLFxyXG4gIHNlY29uZENvbG9yOiAnI2UxOGU5MicsXHJcbiAgd2lkdGg6IDEwLFxyXG4gIGlzQ3VzdG9tUGFsZXR0ZTogZmFsc2UsXHJcbiAgcGFsZXR0ZTogbnVsbCxcclxuICBjdXN0b21QYWxldHRlOiBbJyM2MWE1OTUnLCAnR3JleScsICdyZ2IoMTUzLCAxMDIsIDI1NSknLCAnTmF2eSddXHJcbn0gYXMgSUdhdWdlU3VidmFsdWVzT3B0aW9ucztcclxuXHJcbmNvbnN0IENTU19DTEFTUyA9ICdpc296LXN1YnZhbHVlRWRpdG9yRm9ybUdyb3VwJztcclxuY29uc3QgTkFNRV9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX25hbWVgO1xyXG5jb25zdCBJU19CT1VORF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX2lzLWJvdW5kYDtcclxuY29uc3QgVkFMVUVfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X192YWx1ZWA7XHJcbmNvbnN0IE1FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19tZWFzdXJlLWlkYDtcclxuY29uc3QgQ09MT1JfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19jb2xvcmA7XHJcblxyXG5jb25zdCBDSVJDTFVBUl9JTkRJQ0FUT1JfVFlQRVMgPSBbJ3JlY3RhbmdsZU5lZWRsZScsICd0cmlhbmdsZU5lZWRsZScsICdyYW5nZUJhcicsICd0cmlhbmdsZU1hcmtlcicsICd0ZXh0Q2xvdWQnXTtcclxuY29uc3QgTElORUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlJywgJ2NpcmNsZScsICdyaG9tYnVzJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xyXG5cclxuY29uc3QgQ0lSQ1VMQVJfVklFV19UWVBFUzogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VWaWV3VHlwZVtdID0gWydDaXJjdWxhckZ1bGwnLCAnQ2lyY3VsYXJIYWxmJywgJ0NpcmN1bGFyUXVhcnRlckxlZnQnLCAnQ2lyY3VsYXJRdWFydGVyUmlnaHQnLCAnQ2lyY3VsYXJUaHJlZUZvdXJ0aCddO1xyXG5jb25zdCBMSU5FQVJfVklFV19UWVBFUzogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VWaWV3VHlwZVtdID0gWydMaW5lYXJIb3Jpem9udGFsJywgJ0xpbmVhclZlcnRpY2FsJ107XHJcblxyXG5jb25zdCBERUZBVUxUX1BBTEVUVEUgPSBbJyMxZGIyZjUnLCAnI2Y1NTY0YScsICcjOTdjOTVjJywgJyNmZmM3MjAnLCAnI2ViMzU3MycsICcjYTYzZGI4JywgJyM2NTkzYmMnLCAnI2ZhYTMzNScsICcjZmY4ODdjJ107XHJcblxyXG5jb25zdCBQUkVERUZJTkVEX1BBTEVUVEVTID0gWydCcmlnaHQnLCAnSGFybW9ueSBMaWdodCcsICdPY2VhbicsICdQYXN0ZWwnLCAnU29mdCcsICdTb2Z0IFBhc3RlbCcsICdWaW50YWdlJyxcclxuICAnVmlvbGV0JywgJ0Nhcm1pbmUnLCAnRGFyayBNb29uJywgJ0RhcmsgVmlvbGV0JywgJ0dyZWVuIE1pc3QnLCAnU29mdCBCbHVlJywgJ01hdGVyaWFsJywgJ09mZmljZSddO1xyXG5cclxuLy8gMS4gTW9kZWxcclxuY29uc3QgcHJvcGVydHkgPSB7XHJcbiAgb3duZXJUeXBlOiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0sXHJcbiAgcHJvcGVydHlOYW1lOiAnR2F1Z2VTdWJ2YWx1ZXNTZXR0aW5ncycsXHJcbiAgZGVmYXVsdFZhbHVlOiBKU09OLnN0cmluZ2lmeShkZWZhdWx0T3B0aW9ucyksXHJcbiAgdmFsdWVUeXBlOiAnc3RyaW5nJ1xyXG59IGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkN1c3RvbVByb3BlcnR5TWV0YWRhdGE7XHJcblxyXG5EZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5yZWdpc3RlckN1c3RvbVByb3BlcnR5KHByb3BlcnR5KTtcclxuXHJcbi8vIDIuIFZpZXdlclxyXG5mdW5jdGlvbiBvbkl0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQoYXJnczogRGV2RXhwcmVzcy5EYXNoYm9hcmQuSXRlbVdpZGdldE9wdGlvbkV2ZW50QXJncykge1xyXG4gIGlmIChhcmdzLmRhc2hib2FyZEl0ZW0gaW5zdGFuY2VvZiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0pIHtcclxuICAgIGNvbnN0IHN0b3JlZE9wdGlvbnMgPSBnZXRPcHRpb25zKGFyZ3MuZGFzaGJvYXJkSXRlbSk7XHJcblxyXG4gICAgY29uc3QgZ2F1Z2VPcHRpb25zID0gYXJncy5vcHRpb25zIGFzIERldkV4cHJlc3Mudml6LmR4TGluZWFyR2F1Z2VPcHRpb25zIHwgRGV2RXhwcmVzcy52aXouZHhDaXJjdWxhckdhdWdlT3B0aW9ucztcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMgPSBnYXVnZU9wdGlvbnMuc3VidmFsdWVzIHx8IFtdO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yID0gZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yIHx8IHt9O1xyXG5cclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci50eXBlID0gc3RvcmVkT3B0aW9ucy50eXBlIGFzIGFueTtcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci53aWR0aCA9IHN0b3JlZE9wdGlvbnMud2lkdGg7XHJcblxyXG4gICAgY29uc3QgaGFzVGFyZ2V0VmFsdWUgPSAhIWFyZ3MuZGFzaGJvYXJkSXRlbS5nYXVnZXMoKVswXT8udGFyZ2V0VmFsdWUoKTtcclxuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci5wYWxldHRlID0gc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzKSA9PiBoYXNUYXJnZXRWYWx1ZSB8fCBzLmtleSA+IC0xKS5tYXAoKHMpID0+IHMuY29sb3IpO1xyXG5cclxuICAgIHN0b3JlZE9wdGlvbnMuc3VidmFsdWVzLmZvckVhY2goKHN1YnZhbHVlKSA9PiB7XHJcbiAgICAgIGlmIChzdWJ2YWx1ZS5rZXkgPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZSA9IHN1YnZhbHVlLmlzQm91bmQgPyBhcmdzLml0ZW1EYXRhLmdldE1lYXN1cmVWYWx1ZShzdWJ2YWx1ZS5tZWFzdXJlSWQpLmdldFZhbHVlKCkgOiBzdWJ2YWx1ZS52YWx1ZTtcclxuICAgICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcy5wdXNoKHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLy8gMy4gRGVzaWduZXJcclxuZnVuY3Rpb24gb25DdXN0b21pemVTZWN0aW9ucyhhcmdzOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EZXNpZ25lci5DdXN0b21pemVTZWN0aW9uc0V2ZW50QXJncykge1xyXG4gIGNvbnN0IGdhdWdlSXRlbSA9IGFyZ3MuZGFzaGJvYXJkSXRlbTtcclxuICBpZiAoZ2F1Z2VJdGVtIGluc3RhbmNlb2YgRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtKSB7XHJcbiAgICBhcmdzLmFkZFNlY3Rpb24oe1xyXG4gICAgICB0aXRsZTogJ1N1YnZhbHVlcycsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiBwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgICB0ZW1wbGF0ZShhLCBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBuZXcgRGV2RXhwcmVzcy51aS5keEJ1dHRvbihidXR0b25Db250YWluZXIsIHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnRWRpdCBpbiBXaXphcmQnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93UG9wdXAoZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbkNvbnRhaW5lcjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1BvcHVwKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKSB7XHJcbiAgY29uc3QgcG9wdXBDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBvcHVwQ29udGFpbmVyKTtcclxuICBjb25zdCBwb3B1cE9wdGlvbnMgPSB7XHJcbiAgICB3aWR0aDogJzgwMHB4JyxcclxuICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgbWF4SGVpZ2h0OiAnMTAwJScsXHJcbiAgICBoaWRlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgY29udGVudFRlbXBsYXRlKHRoaXM6IGFueSwgY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zdCBzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IHN1YnZhbHVlc2Zvcm1PcHRpb25zID0gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9zdWJ2YWx1ZXNGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIHN1YnZhbHVlc2Zvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGluZGljYXRvckZvcm1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3QgaW5kaWNhdG9yZm9ybU9wdGlvbnMgPSBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9pbmRpY2F0b3JGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKGluZGljYXRvckZvcm1Db250YWluZXIsIGluZGljYXRvcmZvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIGluZGljYXRvckZvcm1Db250YWluZXIpO1xyXG5cclxuICAgICAgY29uc3Qgc2Nyb2xsVmlldyA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgc2Nyb2xsVmlldy5hcHBlbmQoY29udGVudCk7XHJcbiAgICAgIHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHNjcm9sbFZpZXc7XHJcbiAgICB9LFxyXG4gICAgb25IaWRkZW4oKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gICAgfSxcclxuICAgIHRpdGxlOiAnU3VidmFsdWVzIFdpemFyZCcsXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcztcclxuICBjb25zdCBwb3B1cCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4UG9wdXAocG9wdXBDb250YWluZXIsIHBvcHVwT3B0aW9ucyk7XHJcbiAgcG9wdXAuc2hvdygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRPcHRpb25zKGdhZ3VlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucyB7XHJcbiAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZ2FndWVJdGVtLmN1c3RvbVByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lKSBhcyBzdHJpbmcpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgY29uc3QgaGFzVGFyZ2V0VmFsdWUgPSAhIWdhZ3VlSXRlbS5nYXVnZXMoKVswXT8udGFyZ2V0VmFsdWUoKTtcclxuXHJcbiAgaWYgKGhhc1RhcmdldFZhbHVlICYmICghZGF0YS5zdWJ2YWx1ZXMgfHwgIWRhdGEuc3VidmFsdWVzLnNvbWUoKHMpID0+IHMua2V5ID09PSAtMSkpKSB7XHJcbiAgICBkYXRhLnN1YnZhbHVlcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICBrZXk6IC0xLFxyXG4gICAgICBuYW1lOiAnVGFyZ2V0IFZhbHVlJyxcclxuICAgICAgaXNCb3VuZDogZmFsc2UsXHJcbiAgICAgIG1lYXN1cmVJZDogJycsXHJcbiAgICAgIHZhbHVlOiAwLFxyXG4gICAgICBjb2xvcjogREVGQVVMVF9QQUxFVFRFWyhkYXRhLnN1YnZhbHVlcz8ubGVuZ3RoIHx8IDApICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXRhO1xyXG59XHJcbmZ1bmN0aW9uIHNldE9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0sIHZhbHVlOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zKSB7XHJcbiAgcmV0dXJuIGdhdWdlSXRlbS5jdXN0b21Qcm9wZXJ0aWVzLnNldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5TmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxufVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuZnVuY3Rpb24gY3JlYXRlTGlzdEFuZFRvb2xiYXIoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0sIGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogW0pRdWVyeSwgRGV2RXhwcmVzcy51aS5keExpc3QsIERldkV4cHJlc3MudWkuZHhUb29sYmFyXSB7XHJcbiAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgY29uc3QgJHRvb2xiYXJDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCR0b29sYmFyQ29udGFpbmVyKTtcclxuICBjb25zdCBlZGl0QnV0dG9uID0gbnVsbDtcclxuICBsZXQgbGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgPSBudWxsO1xyXG5cclxuICBjb25zdCB0b29sYmFyT3B0aW9ucyA9IHtcclxuICAgIGl0ZW1zOiBbe1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICdhZGQnLFxyXG4gICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICAgICAgb25DbGljayhlKSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5zdWJ2YWx1ZXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyA8IGl0ZW0ua2V5ID8gaXRlbS5rZXkgOiBhY2MsIDApICsgMTtcclxuICAgICAgICAgIGNvbnN0IG5ld1N1YnZhbHVlOiBJU3VidmFsdWVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIG5hbWU6IGBTdWJ2YWx1ZSAke2tleX1gLFxyXG4gICAgICAgICAgICBpc0JvdW5kOiBmYWxzZSxcclxuICAgICAgICAgICAgbWVhc3VyZUlkOiAnJyxcclxuICAgICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNvbG9yOiBERUZBVUxUX1BBTEVUVEVbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJywgbmV3U3VidmFsdWUpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGl0ZW1JbkRhdGFTb3VyY2UgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBuZXdTdWJ2YWx1ZS5rZXkpWzBdO1xyXG4gICAgICAgICAgaWYgKCFpdGVtSW5EYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnB1c2gobmV3U3VidmFsdWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKGl0ZW1JbkRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICBvcHRpb25zW2luZGV4XSA9IG5ld1N1YnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgICAgICAgIGxpc3QucmVsb2FkKCk7XHJcbiAgICAgICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH1cclxuICAgIH1dXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcblxyXG4gIGNvbnN0IHVwZGF0ZVRvb2xiYXJTdGF0ZSA9IChoYXNTZWxlY3RlZEl0ZW06IGJvb2xlYW4pID0+IHtcclxuICAgIGVkaXRCdXR0b24gJiYgZWRpdEJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWhhc1NlbGVjdGVkSXRlbSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG9vbGJhciA9IG5ldyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhcigkdG9vbGJhckNvbnRhaW5lciwgdG9vbGJhck9wdGlvbnMpO1xyXG4gIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICBjb25zdCBsaXN0T3B0aW9ucyA9IHtcclxuICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgIGxvYWQ6ICgpID0+IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKS5zdWJ2YWx1ZXMsXHJcbiAgICAgIHJlbW92ZTogKCkgPT4geyB9XHJcbiAgICB9IGFzIGFueSksXHJcbiAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgaGVpZ2h0OiAnMjAwcHgnLFxyXG4gICAga2V5RXhwcjogJ2tleScsXHJcbiAgICBub0RhdGFUZXh0OiAnQWRkIGEgU3VidmFsdWUnLFxyXG4gICAgYWxsb3dJdGVtRGVsZXRpbmc6IHRydWUsXHJcbiAgICBpdGVtRGVsZXRlTW9kZTogJ3N0YXRpYycsXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7IH0sXHJcbiAgICBvbkl0ZW1SZW5kZXJlZChlKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1EYXRhID0gZS5pdGVtRGF0YSBhcyBJU3VidmFsdWVPcHRpb25zO1xyXG4gICAgICBpZiAoaXRlbURhdGEua2V5ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUVsZW1lbnQgPSBlLml0ZW1FbGVtZW50WzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R4LWxpc3Qtc3RhdGljLWRlbGV0ZS1idXR0b24tY29udGFpbmVyJylbMF0gYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgZGVsZXRlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25TZWxlY3Rpb25DaGFuZ2VkKGUpIHtcclxuICAgICAgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJyk7XHJcbiAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIHNlbGVjdGVkSXRlbSk7XHJcbiAgICAgIGNvbnN0IHdhc2Zvcm1WaXNpYmxlID0gZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScpID09PSAnYmxvY2snO1xyXG4gICAgICBjb25zdCBzaG91bGRGb3JtQmVWaXNpYmxlID0gISFzZWxlY3RlZEl0ZW07XHJcbiAgICAgIGlmICghd2FzZm9ybVZpc2libGUgJiYgc2hvdWxkRm9ybUJlVmlzaWJsZSB8fCB3YXNmb3JtVmlzaWJsZSAmJiAhc2hvdWxkRm9ybUJlVmlzaWJsZSkge1xyXG4gICAgICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCBzaG91bGRGb3JtQmVWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkl0ZW1EZWxldGVkOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICBjb25zdCBrZXkgPSBlLml0ZW1EYXRhLmtleTtcclxuICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoc3VidmFsdWUpID0+IHN1YnZhbHVlLmtleSA9PT0ga2V5KVswXSk7XHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgbGlzdC5yZWxvYWQoKTtcclxuICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcclxuICAgIH1cclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhMaXN0T3B0aW9ucztcclxuXHJcbiAgY29uc3QgJGxpc3RDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCRsaXN0Q29udGFpbmVyKTtcclxuXHJcbiAgbGlzdCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4TGlzdCgkbGlzdENvbnRhaW5lciwgbGlzdE9wdGlvbnMpO1xyXG5cclxuICByZXR1cm4gWyRlbGVtZW50LCBsaXN0LCB0b29sYmFyXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgbGV0IGl0ZW1zTGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgfCBudWxsID0gbnVsbDtcclxuICBjb25zdCB1cGRhdGVGb3JtU3RhdGUgPSAoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0pID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBtZWFzdXJlSWRFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbWVhc3VyZUlkJyk7XHJcbiAgICBjb25zdCBuYW1lRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ25hbWUnKTtcclxuICAgIGNvbnN0IGlzQm91bmQgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKS5pc0JvdW5kO1xyXG4gICAgY29uc3QgaXNUYXJnZXRWYWx1ZSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmtleSA9PT0gLTE7XHJcblxyXG4gICAgdmFsdWVFZGl0b3IgJiYgdmFsdWVFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsIGlzQm91bmQpO1xyXG4gICAgbWVhc3VyZUlkRWRpdG9yICYmIG1lYXN1cmVJZEVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgIWlzQm91bmQpO1xyXG5cclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0lTX0JPVU5EX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke1ZBTFVFX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke01FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG5cclxuICAgIG5hbWVFZGl0b3IgJiYgbmFtZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNUYXJnZXRWYWx1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZvcm1EYXRhOiBudWxsLFxyXG4gICAgY29sQ291bnQ6IDIsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ1N1YnZhbHVlcyBpdGVtcycsXHJcbiAgICAgICAgdGVtcGxhdGU6IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBbJGNvbnRhaW5lciwgbGlzdF0gPSBjcmVhdGVMaXN0QW5kVG9vbGJhcihhcmdzLmNvbXBvbmVudCwgZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zTGlzdCA9IGxpc3Q7XHJcblxyXG4gICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdzdWJ2YWx1ZUVkaXRvcicsXHJcbiAgICAgICAgY3NzQ2xhc3M6IENTU19DTEFTUyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnSXRlbSBvcHRpb25zJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IE5BTUVfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFRleHRCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VFdmVudDogJ2tleXVwJ1xyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzQm91bmQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFJhZGlvR3JvdXAnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVW5ib3VuZCcsIHZhbHVlOiBmYWxzZVxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdCb3VuZCcsIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UmFkaW9Hcm91cC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdUeXBlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IFZBTFVFX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdWYWx1ZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdtZWFzdXJlSWQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnSGlkZGVuIG1lYXN1cmVzJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBnYXVnZUl0ZW0uaGlkZGVuTWVhc3VyZXMoKS5tYXAoKG1lYXN1cmUpID0+ICh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBnZXRNZWFzdXJlRGlzYXBsYXlUZXh0KG1lYXN1cmUpLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IG1lYXN1cmUudW5pcXVlTmFtZSgpXHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2NvbG9yJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IENPTE9SX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeENvbG9yQm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnQ29sb3InLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTsgfSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIGNvbnN0IGVkaXRlZFN1YnZhbHVlID0gb3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBmb3JtRGF0YS5rZXkpWzBdO1xyXG5cclxuICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihlZGl0ZWRTdWJ2YWx1ZSldID0gZm9ybURhdGE7XHJcbiAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuXHJcbiAgICAgIGlmIChlZGl0ZWRTdWJ2YWx1ZSAmJiBlZGl0ZWRTdWJ2YWx1ZS5uYW1lICE9PSBmb3JtRGF0YS5uYW1lICYmIGl0ZW1zTGlzdCkge1xyXG4gICAgICAgIGl0ZW1zTGlzdC5yZXBhaW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5NZWFzdXJlKTogc3RyaW5nIHtcclxuICBpZiAobWVhc3VyZS5uYW1lKCkpIHtcclxuICAgIHJldHVybiBtZWFzdXJlLm5hbWUoKTtcclxuICB9XHJcblxyXG4gIGxldCByZXN1bHQgPSBtZWFzdXJlLmRhdGFNZW1iZXIoKTtcclxuICBpZiAobWVhc3VyZS5zdW1tYXJ5VHlwZSAmJiBtZWFzdXJlLnN1bW1hcnlUeXBlKCkpIHtcclxuICAgIHJlc3VsdCArPSBgICgke21lYXN1cmUuc3VtbWFyeVR5cGUoKX0pYDtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEluZGljYXRvckZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICBjb25zdCBjdXJyZW50Vmlld1R5cGUgPSBnYXVnZUl0ZW0udmlld1R5cGUoKTtcclxuICBjb25zdCBpbmRpY2F0b3JUeXBlcyA9IExJTkVBUl9WSUVXX1RZUEVTLnNvbWUoKHQpID0+IHQgPT09IGN1cnJlbnRWaWV3VHlwZSlcclxuICAgID8gTElORUFSX0lORElDQVRPUl9UWVBFU1xyXG4gICAgOiBDSVJDTFVBUl9JTkRJQ0FUT1JfVFlQRVM7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBmb3JtRGF0YTogZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pIHx8IG51bGwsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgY2FwdGlvbjogJ0luZGljYXRvciBvcHRpb25zJyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd0eXBlJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpdGVtczogaW5kaWNhdG9yVHlwZXMubWFwKCh0KSA9PiAoeyB0ZXh0OiB0LCB2YWx1ZTogdCB9KSksXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd3aWR0aCcsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveE9wdGlvbnMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1dpZHRoJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcblxyXG4gICAgICBvcHRpb25zLndpZHRoID0gZm9ybURhdGEud2lkdGg7XHJcbiAgICAgIG9wdGlvbnMudHlwZSA9IGZvcm1EYXRhLnR5cGU7XHJcblxyXG4gICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLy8gNC4gRXZlbnQgU3Vic2NyaXB0aW9uXHJcbmV4cG9ydCBmdW5jdGlvbiBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbih0aGlzOiBhbnksIGRhc2hib2FyZENvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICB0aGlzLm5hbWUgPSAnR2F1Z2VTdWJ2YWx1ZXMnO1xyXG4gIHRoaXMuc3RhcnQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XHJcbiAgICBpZiAodmlld2VyQXBpRXh0ZW5zaW9uKSB7XHJcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vbignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zUGFuZWxFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ2l0ZW0tb3B0aW9ucy1wYW5lbCcpIGFzIGFueTtcclxuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcclxuICAgICAgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uLm9uKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgdGhpcy5zdG9wID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xyXG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xyXG4gICAgICB2aWV3ZXJBcGlFeHRlbnNpb24ub2ZmKCdpdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkJywgb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xyXG4gICAgaWYgKG9wdGlvbnNQYW5lbEV4dGVuc2lvbikge1xyXG4gICAgICBvcHRpb25zUGFuZWxFeHRlbnNpb24ub2ZmKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElEYXNoYm9hcmRQZXJtaXNzaW9ucywgSURhc2hib2FyZFVybHMsIElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24gfSBmcm9tICcuL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24nO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuY29uc3QgREFTSEJPQVJEX01PREVfS0VZID0gJ0RBU0hCT0FSRF9NT0RFX0tFWSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEYXNoYm9hcmRPcHRpb25zIHtcclxuICAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHBlcm1pc3Npb25zOiBJRGFzaGJvYXJkUGVybWlzc2lvbnM7XHJcbiAgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uczogSURhc2hib2FyZFBlcm1pc3Npb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZGFzaGJvYXJkOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEYXNoYm9hcmRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRkYXNoYm9hcmRDb250YWluZXIgPSBvcHRpb25zLiRkYXNoYm9hcmRDb250YWluZXI7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5yZXBvcnRJZCA9IG9wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnM7XHJcbiAgICB0aGlzLnVybHMgPSBvcHRpb25zLnVybHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCByZXBvcnRJZFN0ciA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkICYmIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgRGV2RXhwcmVzcy5EYXNoYm9hcmQuUmVzb3VyY2VNYW5hZ2VyLmVtYmVkQnVuZGxlZFJlc291cmNlcygpO1xyXG5cclxuICAgIGxldCBtb2RlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSA9IHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nXHJcbiAgICAgID8gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLldvcmtpbmdNb2RlIHx8ICdWaWV3ZXInXHJcbiAgICAgIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTk9URTogRGFzaGJvYXJkIDE4LjEgZG9lc24ndCBzdXBwb3J0IGV4cG9ydC4gV2UgaGlkZSB0aGUgZXhwb3J0IGJ1dHRvbiB2aWEgc3R5bGVzXHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKHRoaXMuJGRhc2hib2FyZENvbnRhaW5lclswXSwge1xyXG4gICAgICB3b3JraW5nTW9kZTogbW9kZSxcclxuICAgICAgaW5pdGlhbERhc2hib2FyZElkOiByZXBvcnRJZFN0cixcclxuICAgICAgZW5kcG9pbnQ6IHRoaXMudXJscy5FbmRQb2ludCxcclxuICAgICAgYWpheFJlbW90ZVNlcnZpY2U6IHtcclxuICAgICAgICBoZWFkZXJzOiAhdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW4gPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgICB0b2tlbjogdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW5cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRGFzaGJvYXJkSW5pdGlhbGl6aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlZ2lzdGVyRXh0ZW5zaW9uKG5ldyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbihlLmNvbXBvbmVudCkpO1xyXG5cclxuICAgICAgICBpZiAocmVwb3J0SWRTdHIgIT09IGUuZGFzaGJvYXJkSWQpIHtcclxuICAgICAgICAgIHJlcG9ydElkU3RyID0gZS5kYXNoYm9hcmRJZDtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZW5jb2RlVVJJKHRoaXMudXJscy5QcmV2aWV3VXJsICsgZS5kYXNoYm9hcmRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkJlZm9yZVJlbmRlcjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVGV4dEJveEl0ZW1FZGl0b3JFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgZXh0ZW5zaW9uczoge1xyXG4gICAgICAgICdkYXRhLXNvdXJjZS13aXphcmQnOiB7XHJcbiAgICAgICAgICBlbmFibGVDdXN0b21TcWw6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXNoYm9hcmQtZXhwb3J0Jzoge1xyXG4gICAgICAgICAgYWxsb3dFeHBvcnREYXNoYm9hcmRJdGVtczogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2RhdGEtaW5zcGVjdG9yJzoge1xyXG4gICAgICAgICAgYWxsb3dJbnNwZWN0QWdncmVnYXRlZERhdGE6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0luc3BlY3RSYXdEYXRhOiB0cnVlLFxyXG4gICAgICAgICAgb25HcmlkSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBlLmNvbXBvbmVudCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgICAgICAgICAgIGdyaWQub3B0aW9uKCdleHBvcnQuZW5hYmxlZCcsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVuZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gJ1ZpZXdlcicgPyAnU3dpdGNoIHRvIERlc2lnbmVyJyA6ICdTd2l0Y2ggdG8gVmlld2VyJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gJ1ZpZXdlcicgPyAnRGVzaWduZXInIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIG1vZGUpO1xyXG5cclxuICAgICAgICAgIGlmIChtb2RlID09PSAnVmlld2VyJykge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZC5zd2l0Y2hUb1ZpZXdlcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBEZXNpZ25lcicpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9EZXNpZ25lcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBWaWV3ZXInKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICByZW1vdmVSZWR1bmRhbnRUb29sYm94SXRlbXModGhpcy5kYXNoYm9hcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiAmJiAodGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIERBU0hCT0FSRF9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXNoYm9hcmQ/LnJlZnJlc2goKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZVJlZHVuZGFudFRvb2xib3hJdGVtcyhjb250cm9sOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKSB7XHJcbiAgY29uc3QgaXRlbXNUb1JlbW92ZSA9IFsnY3JlYXRlLWRhc2hib2FyZCcsICdvcGVuLWRhc2hib2FyZCddO1xyXG4gIGNvbnN0IHRvb2xib3ggPSBjb250cm9sLmZpbmRFeHRlbnNpb24oJ3Rvb2xib3gnKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5EZXNpZ25lci5Ub29sYm94RXh0ZW5zaW9uO1xyXG4gIGl0ZW1zVG9SZW1vdmUuZm9yRWFjaCgoaXRlbUlkKSA9PiB7XHJcbiAgICBjb25zdCBpdGVtID0gdG9vbGJveC5tZW51SXRlbXMoKS5maWx0ZXIoKGkpID0+IGkuaWQgPT09IGl0ZW1JZClbMF07XHJcblxyXG4gICAgaWYgKGl0ZW0pIHtcclxuICAgICAgdG9vbGJveC5yZW1vdmVNZW51SXRlbShpdGVtSWQpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IElSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdhbnR0Q2hhcnRPcHRpb25zIHtcclxuICBjaGFydFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdhbnR0UmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHNob3dIZWFkZXI6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRUYXNrIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFBhcmVudElkOiBudW1iZXI7XHJcbiAgVGl0bGU6IHN0cmluZztcclxuICBTdGFydDogRGF0ZTtcclxuICBFbmQ6IERhdGU7XHJcbiAgUHJvZ3Jlc3M6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dERlcGVuZGVuY3lcclxue1xyXG4gIElkOiBudW1iZXI7XHJcbiAgUHJlZGVjZXNzb3JJZDogbnVtYmVyO1xyXG4gIFN1Y2Nlc3NvcklkOiBudW1iZXI7XHJcbiAgVHlwZTogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0UmVzb3VyY2Uge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgVGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50IHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFRhc2tJZDogbnVtYmVyO1xyXG4gIFJlc291cmNlSWQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dENoYXJ0RGF0YU1vZGVsIHtcclxuICBUYXNrczogSUdhbnR0VGFza1tdO1xyXG4gIERlcGVuZGVuY2llczogSUdhbnR0RGVwZW5kZW5jeVtdO1xyXG4gIFJlc291cmNlczogSUdhbnR0UmVzb3VyY2VbXTtcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRzOiBJR2FudHRSZXNvdXJjZUFzc2lnbm1lbnRbXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dENvbHVtblN0YXRlIHtcclxuICBkYXRhRmllbGQ/OiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU/OiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nO1xyXG4gIHNvcnRJbmRleD86IG51bWJlcjtcclxuICBzb3J0T3JkZXI/OiBzdHJpbmc7XHJcbiAgY2FwdGlvbj86IHN0cmluZztcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbiAgdGFza0NvbHVtblR5cGU6IEdhbnR0VGFza3NDb2x1bW5UeXBlO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0U2V0dGluZ3Mge1xyXG4gIFRhc2tDb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdLFxyXG4gIERiQ29ubmVjdGlvbk5hbWU6IHN0cmluZyxcclxuICBUYWJsZU5hbWU6IHN0cmluZyxcclxuICBSZXNvdXJjZXNUYWJsZU5hbWU6IHN0cmluZyxcclxuICBSZXNvdXJjZXNLZXlGaWVsZDogc3RyaW5nLFxyXG4gIFJlc291cmNlc1RleHRGaWVsZDogc3RyaW5nLFxyXG4gIFJlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZTogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQ6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNUYWJsZU5hbWU6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNLZXlGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZDogc3RyaW5nO1xyXG4gIERlcGVuZGVuY2llc1N1Y2Nlc3NvcklkRmllbGQ6IHN0cmluZztcclxuICBEZXBlbmRlbmNpZXNUeXBlRmllbGQ6IHN0cmluZztcclxuXHJcbiAgVGFza1RpdGxlUG9zaXRpb246IERldkV4cHJlc3MudWkuZHhHYW50dC5HYW50dFRhc2tUaXRsZVBvc2l0aW9uO1xyXG4gIFNjYWxlVHlwZTogRGV2RXhwcmVzcy51aS5keEdhbnR0LkdhbnR0U2NhbGVUeXBlO1xyXG4gIFN0YXJ0RGF0ZVJhbmdlOiBzdHJpbmc7XHJcbiAgRW5kRGF0ZVJhbmdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmVudW0gR2FudHRUYXNrc0NvbHVtblR5cGVcclxue1xyXG4gIEtleSA9IDEsXHJcbiAgVGl0bGUgPSAyLFxyXG4gIFN0YXJ0ID0gMyxcclxuICBFbmQgPSA0LFxyXG4gIFBhcmVudElkID0gNSxcclxuICBQcm9ncmVzcyA9IDZcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FubnRDaGFydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IENIQVJUX1NUT1JBR0VfTU9ERV9LRVkgPSAnQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdhbnR0UmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGhhc0Zvcm0gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBjaGFydDogRGV2RXhwcmVzcy51aS5keEdhbnR0IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHYW50dENoYXJ0T3B0aW9ucykge1xyXG4gICAgdGhpcy5jaGFydFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5jaGFydFBvc2l0aW9uTWFya2VyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybCA9IG9wdGlvbnMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncyA9IHtcclxuICAgICAgRGJDb25uZWN0aW9uTmFtZTogJycsIFRhYmxlTmFtZTogJycsIFRhc2tDb2x1bW5zOiBbXSxcclxuICAgICAgUmVzb3VyY2VzVGFibGVOYW1lOiAnJywgUmVzb3VyY2VzVGV4dEZpZWxkOiAnJywgUmVzb3VyY2VzS2V5RmllbGQ6ICcnLFxyXG4gICAgICBSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiAnJyxcclxuICAgICAgRGVwZW5kZW5jaWVzS2V5RmllbGQ6ICcnLCBEZXBlbmRlbmNpZXNQcmVkZWNlc3NvcklkRmllbGQ6ICcnLCBEZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkOiAnJywgRGVwZW5kZW5jaWVzVGFibGVOYW1lOiAnJywgRGVwZW5kZW5jaWVzVHlwZUZpZWxkOiAnJyxcclxuICAgICAgRW5kRGF0ZVJhbmdlOiB2b2lkIDAsIFN0YXJ0RGF0ZVJhbmdlOiB2b2lkIDAsIFRhc2tUaXRsZVBvc2l0aW9uOiAnb3V0c2lkZScsIFNjYWxlVHlwZTogJ2F1dG8nXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10gPSBbXTtcclxuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdhbnR0Q2hhcnRTZXR0aW5nc2AsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHsgZGF0YVR5cGU6ICdqc29uJyB9KVxyXG4gICAgICAudGhlbigoZGF0YTogSUdhbnR0U2V0dGluZ3MpID0+IHtcclxuICAgICAgICBnYW50dFNldHRpbmdzID0gZGF0YTtcclxuXHJcbiAgICAgICAgaWYoIWdhbnR0U2V0dGluZ3MuRGJDb25uZWN0aW9uTmFtZSB8fCAhZ2FudHRTZXR0aW5ncy5UYWJsZU5hbWUgfHwgIWdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgfHwgIWdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zID0gW107XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSA9IDA7IGl0ZW0gPCA2OyBpdGVtKyspIHtcclxuICAgICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucy5wdXNoKHsgdGFza0NvbHVtblR5cGU6IEdhbnR0VGFza3NDb2x1bW5UeXBlW0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW0rMV1dIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsIHRydWUpO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEuVGFza0NvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgY29sdW1uc1tjLnRhc2tDb2x1bW5UeXBlLTFdID0gYztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IGNvbHVtbnM7XHJcblxyXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaERhdGEoKTtcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IHsgRGF0YTogSUdhbnR0Q2hhcnREYXRhTW9kZWwgfSkgPT4ge1xyXG4gICAgICAgIGlmKCFpc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLm1vZGUgPT09IE1vZGUuRGVzaWduZXIpIHtcclxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsICFpc0luaXRpYWxpemVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBDaGFydChjb2x1bW5zLCBnYW50dFNldHRpbmdzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YS5EYXRhKTtcclxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsIHRydWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLmRpYWdyYW0tZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoRGF0YSgpIHtcclxuICAgIHJldHVybiBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vR2V0R2FudHRDaGFydERhdGFgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRm9ybShnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncywgaW5pdGlhbFNldHVwOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhc0Zvcm0gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGZvcm1JdGVtczogRGV2RXhwcmVzcy51aS5keEZvcm0uSXRlbVtdID0gW1xyXG4gICAgICB7IGRhdGFGaWVsZDogJ0RiQ29ubmVjdGlvbk5hbWUnLCBjYXB0aW9uOiAnQ29ubmVjdGlvbiBOYW1lJyB9LFxyXG4gICAgICB7IGRhdGFGaWVsZDogJ1RhYmxlTmFtZScsIGNhcHRpb246ICdUYWJsZScgfSxcclxuICAgIF07XHJcblxyXG4gICAgZm9yIChsZXQgaXRlbSA9IDE7IGl0ZW0gPCA3OyBpdGVtKyspIHtcclxuICAgICAgZm9ybUl0ZW1zLnB1c2goeyBpdGVtVHlwZTogJ2dyb3VwJywgY29sQ291bnQ6IDgsIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udGFza0NvbHVtblR5cGVgLCB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmRhdGFGaWVsZGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogYCR7R2FudHRUYXNrc0NvbHVtblR5cGVbaXRlbV19IERhdGEgRmllbGRgIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5jYXB0aW9uYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnQ2FwdGlvbicgfSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmRhdGFUeXBlYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnRGF0YVR5cGUnIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS53aWR0aGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1dpZHRoJyB9LCBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uc29ydEluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU29ydEluZGV4JyB9LCBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uc29ydE9yZGVyYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU29ydE9yZGVyJyB9LCBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLCBlZGl0b3JPcHRpb25zOiB7IGl0ZW1zOiBbJ2FzYycsICdkZXNjJ10sIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllcyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnZpc2libGVgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdWaXNpYmxlJyB9LCBlZGl0b3JUeXBlOiAnZHhDaGVja0JveCcgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS52aXNpYmxlSW5kZXhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdWaXNpYmxlSW5kZXgnIH0gfSxcclxuICAgICAgICBdXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgIGNhcHRpb246ICdSZXNvdXJjZXMnLFxyXG4gICAgICBjb2xDb3VudDogNCxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyAsdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzVGV4dEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGV4dCBGaWVsZCcgfSB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnUmVzb3VyY2UgQXNzaWdubWVudHMnLFxyXG4gICAgICBjb2xDb3VudDogNSxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYXNrIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdSZXNvdXJjZSBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnRGVwZW5kZW5jaWVzJyxcclxuICAgICAgY29sQ291bnQ6IDYsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnRGVwZW5kZW5jaWVzS2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ0RlcGVuZGVuY2llc1ByZWRlY2Vzc29ySWRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1ByZWRlY2Vzc29yIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU3VjY2Vzc29yIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdEZXBlbmRlbmNpZXNUeXBlRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdEZXBlbmRlbmN5IFR5cGUgRmllbGQnIH0gfVxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcclxuICAgICAgYnV0dG9uT3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnNhdmVGb3JtRGF0YShmb3JtKS50aGVuKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goXHJcbiAgICAgIHtcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnQXBwZWFyYW5jZScsXHJcbiAgICAgICAgY29sQ291bnQ6IDUsXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnVGFza1RpdGxlUG9zaXRpb24nLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGl0ZW1zOiBbJ2luc2lkZScsICdvdXRzaWRlJywgJ25vbmUnXVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnU2NhbGVUeXBlJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBpdGVtczogWydhdXRvJywgJ21pbnV0ZXMnLCAnaG91cnMnLCAnZGF5cycsICd3ZWVrcycsICdtb250aHMnLCAncXVhcnRlcnMnLCAneWVhcnMnXVxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnU3RhcnREYXRlUmFuZ2UnLFxyXG4gICAgICAgICAgICBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgfSxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4RGF0ZUJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgc2hvd0NsZWFyQnV0dG9uOiB0cnVlIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGVCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnRW5kRGF0ZVJhbmdlJyxcclxuICAgICAgICAgICAgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnIH0sXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeERhdGVCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IHNob3dDbGVhckJ1dHRvbjogdHJ1ZSB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRlQm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcclxuICAgICAgICAgICAgYnV0dG9uT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdVcGRhdGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmNoYXJ0KSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0LmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Lm9wdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgIHNjYWxlVHlwZTogZGF0YS5TY2FsZVR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIHRhc2tUaXRsZVBvc2l0aW9uOiBkYXRhLlRhc2tUaXRsZVBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBzdGFydERhdGVSYW5nZTogZGF0YS5TdGFydERhdGVSYW5nZSA/IG5ldyBEYXRlKGRhdGEuU3RhcnREYXRlUmFuZ2UpIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgZW5kRGF0ZVJhbmdlOiBkYXRhLkVuZERhdGVSYW5nZSA/IG5ldyBEYXRlKGRhdGEuRW5kRGF0ZVJhbmdlKSA6IG51bGxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQuZW5kVXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0LnJlcGFpbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtRGF0YShmb3JtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9ICQoJzxkaXYgLz4nKS5jc3MoJ3BhZGRpbmcnLCAyMCkuaW5zZXJ0QWZ0ZXIodGhpcy5jaGFydFBvc2l0aW9uTWFya2VyKS5keEZvcm0oe1xyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICBoZWlnaHQ6IGluaXRpYWxTZXR1cCA/ICdjYWxjKDEwMCUgLSA1MHB4KScgOiAnY2FsYyg1MCUgLSA1MHB4KScsXHJcbiAgICAgIGZvcm1EYXRhOiBnYW50dFNldHRpbmdzLFxyXG4gICAgICBzY3JvbGxpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICBpdGVtczogZm9ybUl0ZW1zXHJcbiAgICB9KS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVGb3JtRGF0YShmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSkge1xyXG4gICAgY29uc3QgZGF0YSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYW50dFNldHRpbmdzO1xyXG5cclxuICAgIGlmIChkYXRhLlRhc2tDb2x1bW5zKSB7XHJcbiAgICAgIGRhdGEuVGFza0NvbHVtbnMgPSBkYXRhLlRhc2tDb2x1bW5zLmZpbHRlcigoYykgPT4gISFjLmRhdGFGaWVsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHtcclxuICAgICAgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLFxyXG4gICAgICBzZXR0aW5nczogSlNPTi5zdHJpbmdpZnkoZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykpXHJcbiAgICB9LCB0cnVlLCB7IGRhdGFUeXBlOiAnanNvbicgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwQ2hhcnQgKGNvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10sIGdhbnR0U2V0dGluZ3M6IElHYW50dFNldHRpbmdzKSB7XHJcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICBsZXQgdXNlQXV0b1dpZHRoID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgY29sdW1uc01hcHBpbmcgPSB7fTtcclxuXHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgaWYgKGMudGFza0NvbHVtblR5cGUpIHtcclxuICAgICAgICBjb2x1bW5zTWFwcGluZ1tjLnRhc2tDb2x1bW5UeXBlXSA9IGMuZGF0YUZpZWxkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgIGNvbnN0IHcgPSBwYXJzZUludChjLndpZHRoKTtcclxuXHJcbiAgICAgIGlmKCFpc05hTih3KSkge1xyXG4gICAgICAgIHRvdGFsV2lkdGggKz0gdztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1c2VBdXRvV2lkdGggPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNoYXJ0ID0gdGhpcy5jaGFydFBvc2l0aW9uTWFya2VyLmR4R2FudHQoe1xyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuaGFzRm9ybSA/ICc1MCUnIDogJ2NhbGMoMTAwJSAtIDYwcHgpJyxcclxuICAgICAgZmlyc3REYXlPZldlZWs6IDYsXHJcbiAgICAgIHRhc2tMaXN0V2lkdGg6ICghdXNlQXV0b1dpZHRoICYmIHRvdGFsV2lkdGggPiAwKSA/IHRvdGFsV2lkdGggOiB2b2lkIDAsXHJcbiAgICAgIHRvb2xiYXI6IHtcclxuICAgICAgICBpdGVtczogWyd6b29tSW4nLCAnem9vbU91dCcsICdzZXBhcmF0b3InLCAndGFza0RldGFpbHMnXVxyXG4gICAgICB9LFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBzdGFydERhdGVSYW5nZTogZ2FudHRTZXR0aW5ncy5TdGFydERhdGVSYW5nZSA/IG5ldyBEYXRlKGdhbnR0U2V0dGluZ3MuU3RhcnREYXRlUmFuZ2UpIDogdm9pZCAwLFxyXG4gICAgICBlbmREYXRlUmFuZ2U6IGdhbnR0U2V0dGluZ3MuRW5kRGF0ZVJhbmdlID8gbmV3IERhdGUoZ2FudHRTZXR0aW5ncy5FbmREYXRlUmFuZ2UpIDogdm9pZCAwLFxyXG4gICAgICBzY2FsZVR5cGU6IGdhbnR0U2V0dGluZ3MuU2NhbGVUeXBlLFxyXG4gICAgICB0YXNrVGl0bGVQb3NpdGlvbjogZ2FudHRTZXR0aW5ncy5UYXNrVGl0bGVQb3NpdGlvbixcclxuICAgICAgY29sdW1uczogY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogYy5kYXRhRmllbGQsXHJcbiAgICAgICAgICBkYXRhVHlwZTogYy5kYXRhVHlwZSxcclxuICAgICAgICAgIHdpZHRoOiBjLndpZHRoLFxyXG4gICAgICAgICAgdmlzaWJsZUluZGV4OiBjLnZpc2libGVJbmRleCxcclxuICAgICAgICAgIHNvcnRJbmRleDogYy5zb3J0SW5kZXgsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6IGMuc29ydE9yZGVyICYmIChjLnNvcnRPcmRlciA9PT0gJ2FzYycgPyAnYXNjJyA6ICdkZXNjJyksXHJcbiAgICAgICAgICBjYXB0aW9uOiBjLmNhcHRpb24gfHwgdm9pZCAwXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RDb2x1bW5cclxuICAgICAgfSksXHJcbiAgICAgIHRhc2tzOiB7XHJcbiAgICAgICAga2V5RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuS2V5XSxcclxuICAgICAgICBzdGFydEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlN0YXJ0XSxcclxuICAgICAgICBlbmRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5FbmRdLFxyXG4gICAgICAgIHBhcmVudElkRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUGFyZW50SWRdLFxyXG4gICAgICAgIHByb2dyZXNzRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUHJvZ3Jlc3NdLFxyXG4gICAgICAgIHRpdGxlRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuVGl0bGVdXHJcbiAgICAgIH0sXHJcbiAgICAgIGRlcGVuZGVuY2llczoge1xyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzS2V5RmllbGQsXHJcbiAgICAgICAgcHJlZGVjZXNzb3JJZEV4cHI6IGdhbnR0U2V0dGluZ3MuRGVwZW5kZW5jaWVzUHJlZGVjZXNzb3JJZEZpZWxkLFxyXG4gICAgICAgIHN1Y2Nlc3NvcklkRXhwcjogZ2FudHRTZXR0aW5ncy5EZXBlbmRlbmNpZXNTdWNjZXNzb3JJZEZpZWxkLFxyXG4gICAgICAgIHR5cGVFeHByOiBnYW50dFNldHRpbmdzLkRlcGVuZGVuY2llc1R5cGVGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZXM6IHtcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc0tleUZpZWxkLFxyXG4gICAgICAgIHRleHRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc1RleHRGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZUFzc2lnbm1lbnRzOiB7XHJcbiAgICAgICAga2V5RXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZCxcclxuICAgICAgICByZXNvdXJjZUlkRXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQsXHJcbiAgICAgICAgdGFza0lkRXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgfSkuZHhHYW50dCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gJiYgbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURhdGEoZGF0YTogSUdhbnR0Q2hhcnREYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgIGlmKCF0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNoYXJ0Lm9wdGlvbigndGFza3MuZGF0YVNvdXJjZScsIGRhdGEuVGFza3MpO1xyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ2RlcGVuZGVuY2llcy5kYXRhU291cmNlJywgZGF0YS5EZXBlbmRlbmNpZXMpO1xyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ3Jlc291cmNlcy5kYXRhU291cmNlJywgZGF0YS5SZXNvdXJjZXMpO1xyXG4gICAgdGhpcy5jaGFydC5vcHRpb24oJ3Jlc291cmNlQXNzaWdubWVudHMuZGF0YVNvdXJjZScsIGRhdGEuUmVzb3VyY2VBc3NpZ25tZW50cyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmV0Y2hEYXRhKCkudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YS5EYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYXJ0Py5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmNoYXJ0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuY29uc3QgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuY29uc3QgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG5jb25zdCBTRVNTSU9OX1NUT1JBR0VfTU9ERV9LRVkgPSAncmVwb3J0TW9kZSc7XHJcbmNvbnN0IENVUlJFTlRfVVJMX0tFWSA9ICdjdXN0b21DdXJyZW50VXJsJztcclxuXHJcbmRlY2xhcmUgY29uc3QgZHhSZXBvcnREZXNpZ25lcjogYW55O1xyXG5jb25zdCBrbyA9ICh3aW5kb3cgYXMgYW55KS5rbztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlcG9ydE9wdGlvbnMge1xyXG4gICRyZXBvcnRDb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGRlc2lnbmVyTW9kZWxVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0IGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRJZDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlcG9ydE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJHJlcG9ydENvbnRhaW5lciA9IG9wdGlvbnMuJHJlcG9ydENvbnRhaW5lcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5kZXNpZ25lck1vZGVsVXJsID0gb3B0aW9ucy5kZXNpZ25lck1vZGVsVXJsO1xyXG4gICAgdGhpcy5yZXBvcnRJZCA9IG9wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxuXHJcbiAgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBtb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgICBsZXQgYnV0dG9uID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiBtb2RlID09PSBNb2RlLlZpZXdlciA/IFNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIG1vZGUgPSBtb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCBtb2RlKTtcclxuICAgICAgICAgIHRoaXMuc3dpdGNoTW9kZShtb2RlLCBidXR0b24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNyZWF0ZVJlcG9ydERlc2lnbmVyKHRoaXMuJHJlcG9ydENvbnRhaW5lciwgdGhpcy5kZXNpZ25lck1vZGVsVXJsLCAnZHhSZXBvcnREZXNpZ25lcicsIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCksIChzKSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlLCBidXR0b24pO1xyXG4gICAgICB9KTtcclxuICAgIH0sIG1vZGUgPT09IE1vZGUuVmlld2VyKTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgY29uc3QgaXNOb3RTYXZlZFJlcG9ydCA9IGR4UmVwb3J0RGVzaWduZXIgJiYgZHhSZXBvcnREZXNpZ25lci5HZXREZXNpZ25lck1vZGVsKCkgJiYgZHhSZXBvcnREZXNpZ25lci5HZXREZXNpZ25lck1vZGVsKCkuaXNEaXJ0eTtcclxuXHJcbiAgICAgIGlmIChpc05vdFNhdmVkUmVwb3J0KSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSAnVGhlIHJlcG9ydCBkb2N1bWVudCBpcyBub3Qgc2F2ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGUgcGFnZT8nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUHJldmlldyhkZXNpZ25lcikge1xyXG4gICAgY29uc3QgcmVwb3J0UHJldmlldyA9IGRlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXc7XHJcbiAgICBjb25zdCBSZXBvcnRQcmV2aWV3U2VydmljZSA9IChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkludGVybmFsLlJlcG9ydFByZXZpZXdTZXJ2aWNlO1xyXG5cclxuICAgIHJlcG9ydFByZXZpZXcuaW5pdGlhbGl6ZShSZXBvcnRQcmV2aWV3U2VydmljZS5pbml0aWFsaXplUHJldmlldyhkZXNpZ25lci5kZXNpZ25lck1vZGVsLm1vZGVsKCkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3dpdGNoTW9kZShtb2RlOiBNb2RlLCBidXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24pIHtcclxuICAgIGlmIChtb2RlID09PSBNb2RlLlZpZXdlcikge1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVQcmV2aWV3KGR4UmVwb3J0RGVzaWduZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5kZWFjdGl2YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGUsIGJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XHJcbiAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCBtb2RlID09PSBNb2RlLlZpZXdlciA/IFNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUmVwb3J0RGVzaWduZXIoXHJcbiAgICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnksXHJcbiAgICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmcsXHJcbiAgICBnbG9iYWxOYW1lOiBzdHJpbmcsXHJcbiAgICByZXBvcnRJZFN0cjogc3RyaW5nLFxyXG4gICAgb25Jbml0SGFuZGxlcjogKHNlbmRlcjogYW55KSA9PiB2b2lkLFxyXG4gICAgaXNQcmV2aWV3TW9kZTogYm9vbGVhblxyXG4gICk6IEpRdWVyeTxIVE1MRWxlbWVudD4ge1xyXG4gICAgY29uc3QgZGVzaWduZXIgPSAkcmVwb3J0Q29udGFpbmVyXHJcbiAgICAgIC5hdHRyKCdkYXRhLWJpbmQnLCAnZHhSZXBvcnREZXNpZ25lcjogZGVzaWduZXJPcHRpb25zJylcclxuICAgICAgLmFkZENsYXNzKCdyZXBvcnQtZGVzaWduZXInKTtcclxuXHJcbiAgICBjb25zdCBkZXNpZ25lck9wdGlvbnMgPSB7XHJcbiAgICAgIHJlcG9ydFVybDogcmVwb3J0SWRTdHIsXHJcbiAgICAgIHJlcXVlc3RPcHRpb25zOiB7XHJcbiAgICAgICAgZ2V0RGVzaWduZXJNb2RlbEFjdGlvbjogZGVzaWduZXJNb2RlbFVybFxyXG4gICAgICB9LFxyXG4gICAgICBjYWxsYmFja3M6IHtcclxuICAgICAgICBCZWZvcmVSZW5kZXI6IChzKSA9PiB7XHJcbiAgICAgICAgICAod2luZG93IGFzIGFueSlbZ2xvYmFsTmFtZV0gPSBzO1xyXG5cclxuICAgICAgICAgIGlmIChpc1ByZXZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHMuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IHRydWUgO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIG9uSW5pdEhhbmRsZXIocyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBDdXN0b21pemVNZW51QWN0aW9uczogdGhpcy5DdXN0b21pemVNZW51QWN0aW9ucyxcclxuICAgICAgICBQcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zLFxyXG4gICAgICAgIFJlcG9ydE9wZW5lZDogKHMsIGUpID0+IHtcclxuICAgICAgICAgIGlmIChpc1ByZXZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVByZXZpZXcocyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5SZXBvcnRPcGVuZWQocywgZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBSZXBvcnRUYWJDbG9zZWQ6IHRoaXMuUmVwb3J0VGFiQ2xvc2VkXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAga28uYXBwbHlCaW5kaW5ncyh7IGRlc2lnbmVyT3B0aW9ucyB9LCBkZXNpZ25lclswXSk7XHJcblxyXG4gICAgcmV0dXJuIGRlc2lnbmVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBQcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnMocywgZSkge1xyXG4gICAgY29uc3Qgc2hvd0Rlc2lnbmVySXRlbSA9IGUuR2V0QnlJZCgoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5WaWV3ZXIuQWN0aW9uSWQuRGVzaWduKTtcclxuXHJcbiAgICBpZiAoc2hvd0Rlc2lnbmVySXRlbSkge1xyXG4gICAgICBzaG93RGVzaWduZXJJdGVtLnZpc2libGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgQ3VzdG9taXplTWVudUFjdGlvbnMocywgZSkge1xyXG4gICAgY29uc3QgQWN0aW9uSWQgPSAoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5BY3Rpb25zLkFjdGlvbklkO1xyXG4gICAgY29uc3QgYWN0aW9uSWRzVG9Nb3ZlSW5Ub29sYmFyOiBzdHJpbmdbXSA9IFtBY3Rpb25JZC5TYXZlXTtcclxuICAgIGNvbnN0IGFjdGlvbklkc1RvSGlkZTogc3RyaW5nW10gPSBbQWN0aW9uSWQuTmV3UmVwb3J0LCBBY3Rpb25JZC5OZXdSZXBvcnRWaWFXaXphcmQsIEFjdGlvbklkLk9wZW5SZXBvcnQsXHJcbiAgICAgIEFjdGlvbklkLlByZXZpZXcsIEFjdGlvbklkLlNhdmVBcywgQWN0aW9uSWQuRXhpdF07XHJcblxyXG4gICAgYWN0aW9uSWRzVG9Nb3ZlSW5Ub29sYmFyLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSBlLkdldEJ5SWQoaWQpO1xyXG5cclxuICAgICAgaWYgKGl0ZW0gJiYgKGl0ZW0uY29udGFpbmVyID09PSAnbWVudScpKSB7XHJcbiAgICAgICAgaXRlbS5jb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGFjdGlvbklkc1RvSGlkZS5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcclxuXHJcbiAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNhdmVBY3Rpb24gPSBlLkdldEJ5SWQoKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZC5TYXZlKTtcclxuICAgIGNvbnN0IG9yaWdDbGlja0FjdGlvbiA9IHNhdmVBY3Rpb24uY2xpY2tBY3Rpb247XHJcbiAgICBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCB0YWIgPSBzLkdldEN1cnJlbnRUYWIoKTtcclxuICAgICAgdGFiLnVybChrby51bndyYXAoc1tDVVJSRU5UX1VSTF9LRVldKSk7XHJcbiAgICAgIG9yaWdDbGlja0FjdGlvbigpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUmVwb3J0T3BlbmVkKHMsIGUpIHtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0oZS5VcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZXBvcnRUYWJDbG9zZWQocywgZSkge1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldID0gc1tDVVJSRU5UX1VSTF9LRVldIHx8IGtvLm9ic2VydmFibGUoKTtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXShudWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFNFU1NJT05fU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpYWdyYW1QYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgZGlhZ3JhbUNvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFncmFtUGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgPSAnRElBR1JBTV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaWFncmFtQ29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG4gIHByaXZhdGUgZGlhZ3JhbTogRGV2RXhwcmVzcy51aS5keERpYWdyYW07XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b247XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaWFncmFtUGFnZU9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5kaWFncmFtQ29udHJvbGxlclVybCA9IG9wdGlvbnMuZGlhZ3JhbUNvbnRyb2xsZXJVcmw7XHJcblxyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGlhZ3JhbUNvbnRyb2woKTtcclxuICAgIHRoaXMuaW5pdERpYWdyYW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcuZGlhZ3JhbS1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5kaWFncmFtLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kaWFncmFtID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpYWdyYW0gJiYgc2VuZFJlcXVlc3QoYCR7dGhpcy5kaWFncmFtQ29udHJvbGxlclVybH0/aWQ9JHt0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gLCAnZ2V0JykudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWdyYW0uaW1wb3J0KEpTT04uc3RyaW5naWZ5KGRhdGEpLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGlhZ3JhbUNvbnRyb2woKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0gPSB0aGlzLiRjb250YWluZXIuZHhEaWFncmFtKHtcclxuICAgICAgaGlzdG9yeVRvb2xiYXI6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbW1hbmRzOiBbJ3NlcGFyYXRvcicsICd1bmRvJywgJ3JlZG8nLCAnc2VwYXJhdG9yJywgeyBuYW1lOiAnc2F2ZScsIHRleHQ6ICdTYXZlJywgaWNvbjogJ3NhdmUnIH1dIGFzIGFueVxyXG4gICAgICB9LFxyXG4gICAgICBvbkN1c3RvbUNvbW1hbmQ6IChlKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChlLm5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgJ3NhdmUnOlxyXG4gICAgICAgICAgICB0aGlzLnNhdmVSZXBvcnQoZS5jb21wb25lbnQuZXhwb3J0KCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGZ1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICByZWFkT25seTogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlclxyXG4gICAgfSkuZHhEaWFncmFtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RGlhZ3JhbSgpIHtcclxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmx9P2lkPSR7dGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YCwgJ2dldCcpLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5kaWFncmFtLmltcG9ydChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5hZGRSZWZyZXNoQnV0dG9uKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCQoJy5yZXBvcnQtcmVmcmVzaC1idXR0b24nKSwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycpKSB7XHJcbiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9ICdUaGUgZG9jdW1lbnQgaXMgbm90IHNhdmVkLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhlIHBhZ2U/JztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIHRoaXMubW9kZSk7XHJcbiAgICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVSZXBvcnQoc291cmNlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsLCAncG9zdCcsIHsgaWQsIHNvdXJjZSB9LCB0cnVlKTtcclxuICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkRJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IHtNZW51SXRlbVR5cGV9IGZyb20gJy4uLy4uLy4uL0J1c2luZXNzJztcclxuaW1wb3J0IHtJQ2RtUmVwb3J0UGFyYW1zLCBJR3JpZFJlcG9ydFBhcmFtcywgSVJlcG9ydFBhcmFtc30gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCBSZWZyZXNoVGltZXIgZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgnO1xyXG5pbXBvcnQgRGFzaGJvYXJkUmVwb3J0UGFnZSBmcm9tICcuLi9EYXNoYm9hcmQvSW5kZXgnO1xyXG5pbXBvcnQgR2FudHRDaGFydCBmcm9tICcuLi9HYW5udENoYXJ0L0luZGV4JztcclxuaW1wb3J0IEdyaWRSZXBvcnRQYWdlIGZyb20gJy4uL0dyaWQvSW5kZXgnO1xyXG5pbXBvcnQgQ0RNUmVwb3J0UGFnZSBmcm9tICcuLi9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgRFhSZXBvcnRQYWdlIGZyb20gJy4uL1JlcG9ydC9JbmRleCc7XHJcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuLi9EaWFncmFtL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5lc3RlZFJlcG9ydCBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xyXG4gIFR5cGU6IE1lbnVJdGVtVHlwZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFyYW1zIGV4dGVuZHMgSVJlcG9ydFBhcmFtcyB7XHJcbiAgUmVwb3J0czogSU5lc3RlZFJlcG9ydFtdO1xyXG4gIERlbGF5U2VjOiBudW1iZXI7XHJcbiAgUmVmcmVzaFNlYzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTbGlkZXNob3dSZXBvcnRQYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVNsaWRlc2hvd1JlcG9ydFBhcmFtcztcclxuICBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNsaWRlc2hvd1JlcG9ydFBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IElTbGlkZXNob3dSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRSZXBvcnRTZXR0aW5nczogeyBba2V5IGluIE1lbnVJdGVtVHlwZV06IGFueTsgfTtcclxuICBwcml2YXRlIHJlcG9ydHM6IElSZXBvcnRDb21wb25lbnRbXSA9IFtdO1xyXG4gIHByaXZhdGUgZHhHYWxsZXJ5OiBEZXZFeHByZXNzLnVpLmR4R2FsbGVyeTtcclxuICBwcml2YXRlIHJlZnJlc2hUaW1lcjogUmVmcmVzaFRpbWVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5ncyA9IG9wdGlvbnMuZGVmYXVsdFJlcG9ydFNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgaWYgKCEhdGhpcy5yZXBvcnRzKSB7XHJcbiAgICAgIHRoaXMucmVwb3J0cy5mb3JFYWNoKChyZXBvcnQpID0+IHtcclxuICAgICAgICByZXBvcnQuZGlzcG9zZSgpO1xyXG4gICAgICB9KTtcclxuICAgICAgd2hpbGUgKHRoaXMucmVwb3J0cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnJlcG9ydHMucG9wKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXBvcnRzID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICghIXRoaXMucmVmcmVzaFRpbWVyKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlcG9ydHMgJiYgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xyXG4gICAgICByZXBvcnQucmVmcmVzaCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbnRlbnQoKSB7XHJcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcclxuICAgIGxldCBjdXJyZW50VGltZW91dCA9IG51bGw7XHJcbiAgICBjb25zdCBtYXhJbmRleCA9IHRoaXMub3B0aW9ucy5SZXBvcnRzLmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCBzZXR1cE5leHRJdGVtU2VsZWN0ID0gKCkgPT4ge1xyXG4gICAgICBjdXJyZW50VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBsZXQgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcclxuXHJcbiAgICAgICAgaWYobmV4dEluZGV4ID49IG1heEluZGV4KSB7XHJcbiAgICAgICAgICBuZXh0SW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5keEdhbGxlcnkuZ29Ub0l0ZW0obmV4dEluZGV4LCB0cnVlKTtcclxuICAgICAgfSwgdGhpcy5vcHRpb25zLkRlbGF5U2VjICogMTAwMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICR2aWV3ID0gJCgnPGRpdiAvPicpLmF0dHIoeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnQnIH0pLmFwcGVuZFRvKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICAgIGNvbnN0ICRnYWxsZXJ5ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19nYWxsZXJ5JyB9KS5keEdhbGxlcnkoe1xyXG4gICAgICBsb29wOiBmYWxzZSxcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5vcHRpb25zLlJlcG9ydHMsXHJcbiAgICAgIHNsaWRlc2hvd0RlbGF5OiAwLFxyXG4gICAgICBzaG93TmF2QnV0dG9uczogZmFsc2UsXHJcbiAgICAgIHNob3dJbmRpY2F0b3I6IHRydWUsXHJcbiAgICAgIHN0cmV0Y2hJbWFnZXM6IHRydWUsXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoKSA9PiBzZXR1cE5leHRJdGVtU2VsZWN0KCksXHJcbiAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICBjdXJyZW50SW5kZXggPSBlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSW5kZXgnKTtcclxuXHJcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChjdXJyZW50VGltZW91dCk7XHJcbiAgICAgICAgc2V0dXBOZXh0SXRlbVNlbGVjdCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBpdGVtVGVtcGxhdGU6IChyZXBvcnRQYXJhbXM6IElOZXN0ZWRSZXBvcnQsIGluZGV4LCBpdGVtRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGl0ZW1FbGVtZW50LmF0dHIoeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dhbGxlcnktaXRlbScgfSkuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRzbGlkZUVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX3NsaWRlLWNvbnRlbnQnIH0pLmhlaWdodCgnMTAwJScpO1xyXG4gICAgICAgIGxldCByZXBvcnRTbGlkZTogSVJlcG9ydENvbXBvbmVudDtcclxuXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgc3dpdGNoIChyZXBvcnRQYXJhbXMuVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5EYXNoYm9hcmQ6XHJcbiAgICAgICAgICAgICAgY29uc3QgJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEYXNoYm9hcmRSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuRGFzaGJvYXJkXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkZGFzaGJvYXJkQ29udGFpbmVyOiAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtc1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmZpbmQoJ2Rhc2hib2FyZC10aXRsZScpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmZpbmQoJy5keC1kYXNoYm9hcmQtbGF5b3V0LWNvbnRhaW5lcicpLmNzcyh7IHRvcDogMCB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkdyaWRWaWV3OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRncmlkUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19ncmlkLXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmFkZENsYXNzKCdpc3pvbGVhLXRoZW1lJykuYWRkQ2xhc3MoJ3BhbmVsLWJvZHknKTtcclxuXHJcbiAgICAgICAgICAgICAgJGdyaWRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgR3JpZFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5HcmlkVmlld10gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgZ3JpZFBvc2l0aW9uTWFya2VyOiAkZ3JpZFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIGFueSBhcyBJR3JpZFJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuQ0RNOlxyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IENETVJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5DRE1dIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICRzbGlkZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUNkbVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuUmVwb3J0OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHJlcG9ydFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEWFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5SZXBvcnRdIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRyZXBvcnRDb250YWluZXI6ICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5EaWFncmFtOlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRkaWFncmFtUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRkaWFncmFtUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERpYWdyYW1SZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuRGlhZ3JhbV0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGNvbnRhaW5lcjogJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5HYW50dENoYXJ0OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRnYW50dFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ3JpZC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5hZGRDbGFzcygnaXN6b2xlYS10aGVtZScpLmFkZENsYXNzKCdwYW5lbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgICAgICAgICRnYW50dFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBHYW50dENoYXJ0KHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuR2FudHRDaGFydF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgY2hhcnRQb3NpdGlvbk1hcmtlcjogJGdhbnR0UG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElHcmlkUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5NZW51Tm9kZTpcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuU2xpZGVzaG93OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyZXBvcnRTbGlkZSkge1xyXG4gICAgICAgICAgICByZXBvcnRTbGlkZS5pbml0KCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0cy5wdXNoKHJlcG9ydFNsaWRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MDApO1xyXG5cclxuICAgICAgICAkc2xpZGVFbGVtZW50LmFwcGVuZFRvKGl0ZW1FbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5keEdhbGxlcnkgPSAkZ2FsbGVyeS5keEdhbGxlcnkoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgJGdhbGxlcnkuYXBwZW5kVG8oJHZpZXcpO1xyXG5cclxuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbmV3IFJlZnJlc2hUaW1lcih7Y2FsbGJhY2s6ICgpID0+IHRoaXMucmVmcmVzaCgpLCBlbGFwc2VkQ2FsbGJhY2s6IChlKSA9PiB7fX0pO1xyXG4gICAgdGhpcy5yZWZyZXNoVGltZXIuc3RhcnQodGhpcy5vcHRpb25zLlJlZnJlc2hTZWMgKiAxMDAwKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9WZW5kb3IvRGV2RXh0cmVtZS9keC5hbGwuZC50c1wiIC8+XHJcblxyXG5leHBvcnQgeyBJTGljZW5jZSwgTWVudUl0ZW1UeXBlLCBMaWNlbmNlU3RhdHVzIH0gZnJvbSAnLi9CdXNpbmVzcyc7XHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUR4RGF0YVNvdXJjZU9wdGlvbnMsIElFcnJvckluZm8sIElMb2dvU2V0dGluZ3MsIFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vRGF0YSc7XHJcbmV4cG9ydCB7XHJcbiAgSGVhZGVyLCBOYXZpZ2F0aW9uTWVudSwgVXNlck1lbnUsIE1lbnVTd2l0Y2hlcixcclxuICBIZWFkZXJUaGVtZXMsIElIZWFkZXJPcHRpb25zLCBJQXBwTWVudU1vZGVsLCBJTWVudVNldHRpbmdzLCBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsXHJcbiAgSVVzZXJNZW51SXRlbSwgSVVzZXJNZW51SXRlbU1vZGVsLFxyXG59IGZyb20gJy4vSGVhZGVyJztcclxuZXhwb3J0IHsgSUhpZXJhcmNoaWNhbCwgSVJlcG9ydEJhc2UsIElBcHBNZW51SXRlbUJhc2VNb2RlbCwgZ3JpZENvbHVtblR5cGVzIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuZXhwb3J0IHtcclxuICBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUsIElHcmlkU3RhdGUsXHJcbiAgSUdyaWRDb2x1bW5TdGF0ZSwgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGVcclxufSBmcm9tICcuL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmV4cG9ydCB7IElHcmlkRGF0YSwgSVYyR3JpZENvbHVtblN0YXRlIH0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSUdyaWREYXRhJztcclxuZXhwb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi9SZXBvcnRzL0NvbHVtbk1ldGFEYXRhJztcclxuZXhwb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MnO1xyXG5cclxuaW1wb3J0IHsgc2hvdyBhcyBiYWNrZ3JvdW5kSW1hZ2VWaWV3ZXIgfSBmcm9tICcuL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcclxuaW1wb3J0IHsgTGljZW5jZVN0YXR1cywgTWVudUl0ZW1UeXBlIH0gZnJvbSAnLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCBkYXRhIGZyb20gJy4vRGF0YSc7XHJcbmltcG9ydCBGb290ZXIsIHsgRm9vdGVySW5kaWNhdG9yU3RhdHVzIH0gZnJvbSAnLi9Gb290ZXIvSW5kZXgnO1xyXG5pbXBvcnQge1xyXG4gIEhlYWRlcixcclxuICBOYXZpZ2F0aW9uTWVudSxcclxuICBVc2VyTWVudSxcclxuICBNZW51U3dpdGNoZXJcclxufSBmcm9tICcuL0hlYWRlcic7XHJcblxyXG5leHBvcnQge1xyXG4gIEZvb3RlcixcclxufTtcclxuXHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IGRlZmF1bHRUb29sYmFyIGZyb20gJy4vV2lkZ2V0cy9EZWZhdWx0VG9vbGJhcic7XHJcbmltcG9ydCBkZWZhdWx0R3JpZE9ic29sZXRlIGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUnO1xyXG5pbXBvcnQgZGVmYXVsdFRyZWVMaXN0IGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCAqIGFzIGltYWdlQ3JvcERpYWxvZyBmcm9tICcuL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nJztcclxuaW1wb3J0IHsgQWNjb3VudFNldHRpbmdzUGFnZSB9IGZyb20gJy4vUGFnZXMvQWNjb3VudFNldHRpbmdzJztcclxuaW1wb3J0ICogYXMgc3R5bGluZyBmcm9tICcuL1N0eWxpbmcvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyBwb3B1cCBmcm9tICcuL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgKiBhcyBjb25maXJtIGZyb20gJy4vV2lkZ2V0cy9Db25maXJtJztcclxuaW1wb3J0ICogYXMgbGFuZGluZyBmcm9tICcuL1dpZGdldHMvTGFuZGluZyc7XHJcbmltcG9ydCAqIGFzIGhlbHBlcnMgZnJvbSAnLi9IZWxwZXJzL0luZGV4JztcclxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9VdGlscy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIGFjY2Vzc0RlbmllZCBmcm9tICcuL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQnO1xyXG5pbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcy9HcmlkQ29sdW1uVHlwZXMnO1xyXG5pbXBvcnQgKiBhcyBDRE0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0NETS9JbmRleCc7XHJcbmltcG9ydCB7IFNlc3Npb25Ob3RpZmllciB9IGZyb20gJy4vQ29tcG9uZW50cy9TZXNzaW9uTm90aWZpZXInO1xyXG5pbXBvcnQgeyBGaWxlSW1wb3J0ZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvRmlsZUltcG9ydGVyL0luZGV4JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuXHJcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR3JpZC9JbmRleCc7XHJcbmltcG9ydCBTbGlkZXNob3dSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9TbGlkZXNob3cvSW5kZXgnO1xyXG5pbXBvcnQgRGFzaGJvYXJkUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0luZGV4JztcclxuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4JztcclxuaW1wb3J0IERpYWdyYW1SZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9EaWFncmFtL0luZGV4JztcclxuaW1wb3J0IENETVJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0NETS9JbmRleCc7XHJcbmltcG9ydCBHYW50dENoYXJ0UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR2FubnRDaGFydC9JbmRleCc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vQ29uZmlnL0luZGV4JztcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG5jb25zdCBJc3pvbGVhVUkgPSB7XHJcbiAgY29uZmlnLFxyXG5cclxuICBIZWFkZXIsXHJcbiAgRm9vdGVyLFxyXG4gIE5hdmlnYXRpb25NZW51LFxyXG4gIFVzZXJNZW51LFxyXG4gIE1lbnVTd2l0Y2hlcixcclxuXHJcbiAgZGF0YSxcclxuXHJcbiAgd2lkZ2V0czoge1xyXG4gICAgbm90aWZ5LFxyXG4gICAgZnVsbFNjcmVlbixcclxuICAgIHBvcHVwLFxyXG4gICAgY29uZmlybSxcclxuICAgIGxhbmRpbmcsXHJcbiAgICBhY2Nlc3NEZW5pZWQsXHJcbiAgICBkZWZhdWx0R3JpZE9ic29sZXRlLFxyXG4gICAgZGVmYXVsdFRyZWVMaXN0LFxyXG4gICAgZGVmYXVsdEdyaWQsXHJcbiAgICBkZWZhdWx0VG9vbGJhcixcclxuICAgIGJhY2tncm91bmRJbWFnZVZpZXdlcixcclxuICAgIGltYWdlQ3JvcERpYWxvZ1xyXG4gIH0sXHJcbiAgcGFnZXM6IHtcclxuICAgIEFjY291bnRTZXR0aW5nc1BhZ2VcclxuICB9LFxyXG4gIGNvbXBvbmVudHM6IHtcclxuICAgIENETSxcclxuICAgIFNlc3Npb25Ob3RpZmllcixcclxuICAgIEZpbGVJbXBvcnRlcixcclxuICAgIEZpbGVVcGxvYWRlcixcclxuICB9LFxyXG5cclxuICBzdHlsaW5nLFxyXG4gIGhlbHBlcnMsXHJcbiAgdXRpbHMsXHJcblxyXG4gIHJlcG9ydHM6IHtcclxuICAgIENETVJlcG9ydFBhZ2UsXHJcbiAgICBEaWFncmFtUmVwb3J0UGFnZSxcclxuICAgIEdyaWRSZXBvcnRQYWdlLFxyXG4gICAgRGFzaGJvYXJkUmVwb3J0UGFnZSxcclxuICAgIERYUmVwb3J0UGFnZSxcclxuICAgIFNsaWRlc2hvd1JlcG9ydFBhZ2UsXHJcbiAgICBHYW50dENoYXJ0UmVwb3J0UGFnZSxcclxuICAgIGdyaWRDb2x1bW5UeXBlcyxcclxuICB9LFxyXG4gIGJ1c2luZXNzOiB7XHJcbiAgICBMaWNlbmNlU3RhdHVzLFxyXG4gICAgTWVudUl0ZW1UeXBlLFxyXG4gICAgQ2RtSW1wb3J0RmlsZU1vZGUsXHJcbiAgICBGb290ZXJJbmRpY2F0b3JTdGF0dXMsXHJcbiAgICBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlXHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSXN6b2xlYVVJO1xyXG5cclxuKHdpbmRvdyBhcyBhbnkpLklzem9sZWFVSSA9IElzem9sZWFVSTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7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