@citolab/qti-components 6.9.1-beta.77 → 6.9.1-beta.78

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.
package/dist/index.js CHANGED
@@ -2904,6 +2904,7 @@ var ChoicesMixin = (superClass, selector) => {
2904
2904
  });
2905
2905
  }
2906
2906
  _setInputType(choiceElement) {
2907
+ this._internals.ariaLabel = this.maxChoices === 1 ? "radio-group" : "checkbox-group";
2907
2908
  choiceElement.internals.role = this.maxChoices === 1 ? "radio" : "checkbox";
2908
2909
  choiceElement.internals.states.add(choiceElement.internals.role);
2909
2910
  }
@@ -3351,6 +3352,10 @@ var QtiChoiceInteraction = class extends VocabularyMixin(
3351
3352
  ShuffleMixin(ChoicesMixin(Interaction, "qti-simple-choice"), "qti-simple-choice"),
3352
3353
  "qti-simple-choice"
3353
3354
  ) {
3355
+ constructor() {
3356
+ super();
3357
+ this._internals.role = "group";
3358
+ }
3354
3359
  render() {
3355
3360
  return x`
3356
3361
  <slot name="prompt"></slot><slot part="slot"></slot>
@@ -6241,6 +6246,10 @@ QtiGraphicGapMatchInteraction = __decorateClass([
6241
6246
 
6242
6247
  // src/lib/qti-components/qti-interaction/qti-graphic-order-interaction/qti-graphic-order-interaction.ts
6243
6248
  var QtiGraphicOrderInteraction = class extends ChoicesMixin(Interaction, "qti-hotspot-choice") {
6249
+ constructor() {
6250
+ super(...arguments);
6251
+ this._choiceElements = [];
6252
+ }
6244
6253
  render() {
6245
6254
  return x`
6246
6255
  <slot name="prompt"></slot>
@@ -7848,4 +7857,4 @@ lit-html/node/directives/style-map.js:
7848
7857
  * SPDX-License-Identifier: BSD-3-Clause
7849
7858
  *)
7850
7859
  */
7851
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRleHQtcmVxdWVzdC1ldmVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9jb250ZXh0L3NyYy9saWIvY3JlYXRlLWNvbnRleHQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRyb2xsZXJzL2NvbnRleHQtY29uc3VtZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL3ZhbHVlLW5vdGlmaWVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9kZWNvcmF0b3JzL3Byb3ZpZGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2RlY29yYXRvcnMvY29uc3VtZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvbGliL2VsZW1lbnQtaW50ZXJuYWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0LWxhYnMvc3NyLWRvbS1zaGltL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9jc3MtdGFnLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL3JlYWN0aXZlLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9saXQtaHRtbC50cyIsICIuLi9ub2RlX21vZHVsZXMvbGl0LWVsZW1lbnQvc3JjL2xpdC1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvZGVjb3JhdG9ycy9wcm9wZXJ0eS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3N0YXRlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvYmFzZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3F1ZXJ5LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtZWxlbWVudHMudHMiLCAiLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm1lcnMudHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0taXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdC50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS10ZXN0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcHJvbXB0L3F0aS1wcm9tcHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3V0aWxzLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlLWhlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9hc3luYy1kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmVzL3JlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvZGVjb3JhdG9ycy9saXZlLXF1ZXJ5LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9yZXBlYXQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9zdHlsZS1tYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2luZGV4LnRzIiwgIi4uL3NyYy9saWIvcXRpLWl0ZW0vcXRpLWl0ZW0ubWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktaXRlbS9xdGktaXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS1sb2FkZXIvcXRpLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFR5cGUsIENvbnRleHR9IGZyb20gJy4vY3JlYXRlLWNvbnRleHQuanMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudEV2ZW50TWFwIHtcbiAgICAvKipcbiAgICAgKiBBICdjb250ZXh0LXJlcXVlc3QnIGV2ZW50IGNhbiBiZSBlbWl0dGVkIGJ5IGFueSBlbGVtZW50IHdoaWNoIGRlc2lyZXNcbiAgICAgKiBhIGNvbnRleHQgdmFsdWUgdG8gYmUgaW5qZWN0ZWQgYnkgYW4gZXh0ZXJuYWwgcHJvdmlkZXIuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcmVxdWVzdCc6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj47XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IGEgY29udGV4dCByZXF1ZXN0ZXIgYW5kIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSBzYXRpc2Z5aW5nIHRoZSByZXF1ZXN0LlxuICogVGhpcyBjYWxsYmFjayBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJ5IGNvbnRleHQgcHJvdmlkZXJzIGFzIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dENhbGxiYWNrPFZhbHVlVHlwZT4gPSAoXG4gIHZhbHVlOiBWYWx1ZVR5cGUsXG4gIHVuc3Vic2NyaWJlPzogKCkgPT4gdm9pZFxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIENvbnRleHRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dFJlcXVlc3Q8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcbiAgcmVhZG9ubHkgY2FsbGJhY2s6IENvbnRleHRDYWxsYmFjazxDb250ZXh0VHlwZTxDPj47XG4gIHJlYWRvbmx5IHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gZXZlbnQgZmlyZWQgYnkgYSBjb250ZXh0IHJlcXVlc3RlciB0byBzaWduYWwgaXQgZGVzaXJlcyBhIHNwZWNpZmllZCBjb250ZXh0IHdpdGggdGhlIGdpdmVuIGtleS5cbiAqXG4gKiBBIHByb3ZpZGVyIHNob3VsZCBpbnNwZWN0IHRoZSBgY29udGV4dGAgcHJvcGVydHkgb2YgdGhlIGV2ZW50IHRvIGRldGVybWluZSBpZiBpdCBoYXMgYSB2YWx1ZSB0aGF0IGNhblxuICogc2F0aXNmeSB0aGUgcmVxdWVzdCwgY2FsbGluZyB0aGUgYGNhbGxiYWNrYCB3aXRoIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaWYgc28uXG4gKlxuICogSWYgdGhlIHJlcXVlc3RlZCBjb250ZXh0IGV2ZW50IGNvbnRhaW5zIGEgdHJ1dGh5IGBzdWJzY3JpYmVgIHZhbHVlLCB0aGVuIGEgcHJvdmlkZXIgY2FuIGNhbGwgdGhlIGNhbGxiYWNrXG4gKiBtdWx0aXBsZSB0aW1lcyBpZiB0aGUgdmFsdWUgaXMgY2hhbmdlZCwgaWYgdGhpcyBpcyB0aGUgY2FzZSB0aGUgcHJvdmlkZXIgc2hvdWxkIHBhc3MgYW4gYHVuc3Vic2NyaWJlYFxuICogbWV0aG9kIHRvIHRoZSBjYWxsYmFjayB3aGljaCBjb25zdW1lcnMgY2FuIGludm9rZSB0byBpbmRpY2F0ZSB0aGV5IG5vIGxvbmdlciB3aXNoIHRvIHJlY2VpdmUgdGhlc2UgdXBkYXRlcy5cbiAqXG4gKiBJZiBubyBgc3Vic2NyaWJlYCB2YWx1ZSBpcyBwcmVzZW50IGluIHRoZSBldmVudCwgdGhlbiB0aGUgcHJvdmlkZXIgY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgYSAnb25lIHRpbWUnXG4gKiByZXF1ZXN0IGZvciB0aGUgY29udGV4dCBhbmQgY2FuIHRoZXJlZm9yZSBub3QgdHJhY2sgdGhlIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFJlcXVlc3RFdmVudDxDIGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgZXh0ZW5kcyBFdmVudFxuICBpbXBsZW1lbnRzIENvbnRleHRSZXF1ZXN0PEM+XG57XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEM7XG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+O1xuICByZWFkb25seSBzdWJzY3JpYmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBrZXkgdG8gcmVxdWVzdFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgd2hlbiB0aGUgY29udGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGlzIGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gc3Vic2NyaWJlIHdoZW4sIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gc3Vic2NyaWJlIHRvIGZ1dHVyZSB1cGRhdGVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb250ZXh0OiBDLFxuICAgIGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+LFxuICAgIHN1YnNjcmliZT86IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoJ2NvbnRleHQtcmVxdWVzdCcsIHtidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZX0pO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhlIENvbnRleHQgdHlwZSBkZWZpbmVzIGEgdHlwZSBicmFuZCB0byBhc3NvY2lhdGUgYSBrZXkgdmFsdWUgd2l0aCB0aGUgY29udGV4dCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHQ8S2V5VHlwZSwgVmFsdWVUeXBlPiA9IEtleVR5cGUgJiB7X19jb250ZXh0X186IFZhbHVlVHlwZX07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIENvbnRleHQgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5PEtleVR5cGUsIFZhbHVlVHlwZT4gPSBDb250ZXh0PEtleVR5cGUsIFZhbHVlVHlwZT47XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZSB3aGljaCBjYW4gZXh0cmFjdCBhIENvbnRleHQgdmFsdWUgdHlwZSBmcm9tIGEgQ29udGV4dCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRUeXBlPEtleSBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+ID1cbiAgS2V5IGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCBpbmZlciBWYWx1ZVR5cGU+ID8gVmFsdWVUeXBlIDogbmV2ZXI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGVkIENvbnRleHQuXG4gKlxuICogQ29udGV4dHMgYXJlIGNvbXBhcmVkIHdpdGggc3RyaWN0IGVxdWFsaXR5LlxuICpcbiAqIElmIHlvdSB3YW50IHR3byBzZXBhcmF0ZSBgY3JlYXRlQ29udGV4dCgpYCBjYWxscyB0byByZWZlcmVyIHRvIHRoZSBzYW1lXG4gKiBjb250ZXh0LCB0aGVuIHVzZSBhIGtleSB0aGF0IHdpbGwgYnkgZXF1YWwgdW5kZXIgc3RyaWN0IGVxdWFsaXR5IGxpa2UgYVxuICogc3RyaW5nIGZvciBgU3ltYm9sLmZvcigpYDpcbiAqXG4gKiBgYGB0c1xuICogLy8gdHJ1ZVxuICogY3JlYXRlQ29udGV4dCgnbXktY29udGV4dCcpID09PSBjcmVhdGVDb250ZXh0KCdteS1jb250ZXh0JylcbiAqIC8vIHRydWVcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sLmZvcignbXktY29udGV4dCcpKSA9PT0gY3JlYXRlQ29udGV4dChTeW1ib2wuZm9yKCdteS1jb250ZXh0JykpXG4gKiBgYGBcbiAqXG4gKiBJZiB5b3Ugd2FudCBhIGNvbnRleHQgdG8gYmUgdW5pcXVlIHNvIHRoYXQgaXQncyBndWFyYW50ZWVkIHRvIG5vdCBjb2xsaWRlXG4gKiB3aXRoIG90aGVyIGNvbnRleHRzLCB1c2UgYSBrZXkgdGhhdCdzIHVuaXF1ZSB1bmRlciBzdHJpY3QgZXF1YWxpdHksIGxpa2VcbiAqIGEgYFN5bWJvbCgpYCBvciBvYmplY3QuOlxuICpcbiAqIGBgYFxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoe30pID09PSBjcmVhdGVDb250ZXh0KHt9KVxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sKCdteS1jb250ZXh0JykpID09PSBjcmVhdGVDb250ZXh0KFN5bWJvbCgnbXktY29udGV4dCcpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGtleSBhIGNvbnRleHQga2V5IHZhbHVlXG4gKiBAdGVtcGxhdGUgVmFsdWVUeXBlIHRoZSB0eXBlIG9mIHZhbHVlIHRoYXQgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoaXMgY29udGV4dC5cbiAqIEByZXR1cm5zIHRoZSBjb250ZXh0IGtleSB2YWx1ZSBjYXN0IHRvIGBDb250ZXh0PEssIFZhbHVlVHlwZT5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFZhbHVlVHlwZSwgSyA9IHVua25vd24+KGtleTogSykge1xuICByZXR1cm4ga2V5IGFzIENvbnRleHQ8SywgVmFsdWVUeXBlPjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29udGV4dENhbGxiYWNrLFxuICBDb250ZXh0UmVxdWVzdEV2ZW50LFxufSBmcm9tICcuLi9jb250ZXh0LXJlcXVlc3QtZXZlbnQuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zPEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+PiB7XG4gIGNvbnRleHQ6IEM7XG4gIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQ7XG4gIHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBSZWFjdGl2ZUNvbnRyb2xsZXIgd2hpY2ggYWRkcyBjb250ZXh0IGNvbnN1bWluZyBiZWhhdmlvciB0byBhIGN1c3RvbVxuICogZWxlbWVudCBieSBkaXNwYXRjaGluZyBgY29udGV4dC1yZXF1ZXN0YCBldmVudHMuXG4gKlxuICogV2hlbiB0aGUgaG9zdCBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgZG9jdW1lbnQgaXQgd2lsbCBlbWl0IGFcbiAqIGBjb250ZXh0LXJlcXVlc3RgIGV2ZW50IHdpdGggaXRzIGNvbnRleHQga2V5LiBXaGVuIHRoZSBjb250ZXh0IHJlcXVlc3RcbiAqIGlzIHNhdGlzZmllZCB0aGUgY29udHJvbGxlciB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2ssIGlmIHByZXNlbnQsIGFuZFxuICogdHJpZ2dlciBhIGhvc3QgdXBkYXRlIHNvIGl0IGNhbiByZXNwb25kIHRvIHRoZSBuZXcgdmFsdWUuXG4gKlxuICogSXQgd2lsbCBhbHNvIGNhbGwgdGhlIGRpc3Bvc2UgbWV0aG9kIGdpdmVuIGJ5IHRoZSBwcm92aWRlciB3aGVuIHRoZVxuICogaG9zdCBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHRDb25zdW1lcjxcbiAgQyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4sXG4gIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVDb250cm9sbGVySG9zdCAmIEhUTUxFbGVtZW50LFxuPiBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgY29udGV4dDogQztcbiAgcHJpdmF0ZSBjYWxsYmFjaz86ICh2YWx1ZTogQ29udGV4dFR5cGU8Qz4sIGRpc3Bvc2U/OiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICBwcml2YXRlIHN1YnNjcmliZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHJvdmlkZWQgPSBmYWxzZTtcblxuICB2YWx1ZT86IENvbnRleHRUeXBlPEM+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEhvc3RFbGVtZW50LCBvcHRpb25zOiBPcHRpb25zPEM+KTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBuZXcgQ29udGV4dENvbnN1bWVyKGhvc3QsIG9wdGlvbnMpICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHQ6IEMsXG4gICAgY2FsbGJhY2s/OiAodmFsdWU6IENvbnRleHRUeXBlPEM+LCBkaXNwb3NlPzogKCkgPT4gdm9pZCkgPT4gdm9pZCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHRPck9wdGlvbnM6IEMgfCBPcHRpb25zPEM+LFxuICAgIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQsXG4gICAgc3Vic2NyaWJlPzogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIC8vIFRoaXMgaXMgYSBwb3RlbnRpYWxseSBmcmFnaWxlIGR1Y2stdHlwZS4gSXQgbWVhbnMgYSBjb250ZXh0IG9iamVjdCBjYW4ndFxuICAgIC8vIGhhdmUgYSBwcm9wZXJ0eSBuYW1lIGNvbnRleHQgYW5kIGJlIHVzZWQgaW4gcG9zaXRpb25hbCBhcmd1bWVudCBmb3JtLlxuICAgIGlmICgoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPEM+KS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8Qz47XG4gICAgICB0aGlzLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gb3B0aW9ucy5zdWJzY3JpYmUgPz8gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRPck9wdGlvbnMgYXMgQztcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmhvc3QuYWRkQ29udHJvbGxlcih0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmU/OiAoKSA9PiB2b2lkO1xuXG4gIGhvc3RDb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaFJlcXVlc3QoKTtcbiAgfVxuXG4gIGhvc3REaXNjb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJlcXVlc3QoKSB7XG4gICAgdGhpcy5ob3N0LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ29udGV4dFJlcXVlc3RFdmVudCh0aGlzLmNvbnRleHQsIHRoaXMuX2NhbGxiYWNrLCB0aGlzLnN1YnNjcmliZSlcbiAgICApO1xuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgc3RhYmxlIGlkZW50aXR5IHRvIHByb3Blcmx5IGRlZHVwZSBpbiBDb250ZXh0Um9vdFxuICAvLyBpZiB0aGlzIGVsZW1lbnQgY29ubmVjdHMgbXVsdGlwbGUgdGltZXMuXG4gIHByaXZhdGUgX2NhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+ID0gKHZhbHVlLCB1bnN1YnNjcmliZSkgPT4ge1xuICAgIC8vIHNvbWUgcHJvdmlkZXJzIHdpbGwgcGFzcyBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiBpbmRpY2F0aW5nIHRoZXkgbWF5IHByb3ZpZGUgZnV0dXJlIHZhbHVlc1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICAvLyBpZiB0aGUgdW5zdWJzY3JpYmUgZnVuY3Rpb24gY2hhbmdlcyB0aGlzIGltcGxpZXMgd2UgaGF2ZSBjaGFuZ2VkIHByb3ZpZGVyXG4gICAgICBpZiAodGhpcy51bnN1YnNjcmliZSAhPT0gdW5zdWJzY3JpYmUpIHtcbiAgICAgICAgLy8gY2xlYW51cCB0aGUgb2xkIHByb3ZpZGVyXG4gICAgICAgIHRoaXMucHJvdmlkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgLy8gaWYgd2UgZG9uJ3Qgc3VwcG9ydCBzdWJzY3JpcHRpb24sIGltbWVkaWF0ZWx5IHVuc3Vic2NyaWJlXG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzdG9yZSB0aGUgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGNvbnRyb2xsZXJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgLy8gc2NoZWR1bGUgYW4gdXBkYXRlIGluIGNhc2UgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIGEgdGVtcGxhdGVcbiAgICB0aGlzLmhvc3QucmVxdWVzdFVwZGF0ZSgpO1xuXG4gICAgLy8gb25seSBpbnZva2UgY2FsbGJhY2sgaWYgd2UgYXJlIGVpdGhlciBleHBlY3RpbmcgdXBkYXRlcyBvciBoYXZlIG5vdCB5ZXRcbiAgICAvLyBiZWVuIHByb3ZpZGVkIGEgdmFsdWVcbiAgICBpZiAoIXRoaXMucHJvdmlkZWQgfHwgdGhpcy5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMucHJvdmlkZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayh2YWx1ZSwgdW5zdWJzY3JpYmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtDb250ZXh0Q2FsbGJhY2t9IGZyb20gJy4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcblxuLyoqXG4gKiBBIGRpc3Bvc2VyIGZ1bmN0aW9uXG4gKi9cbnR5cGUgRGlzcG9zZXIgPSAoKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgQ2FsbGJhY2tJbmZvIHtcbiAgZGlzcG9zZXI6IERpc3Bvc2VyO1xuICBjb25zdW1lckhvc3Q6IEVsZW1lbnQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgY2xhc3Mgd2hpY2ggc3RvcmVzIGEgdmFsdWUsIGFuZCB0cmlnZ2VycyByZWdpc3RlcmVkIGNhbGxiYWNrcyB3aGVuXG4gKiB0aGUgdmFsdWUgaXMgY2hhbmdlZCB2aWEgaXRzIHNldHRlci5cbiAqXG4gKiBBbiBpbXBsZW1lbnRvciBtaWdodCB1c2Ugb3RoZXIgb2JzZXJ2YWJsZSBwYXR0ZXJucyBzdWNoIGFzIE1vYlggb3IgUmVkdXggdG9cbiAqIGdldCBiZWhhdmlvciBsaWtlIHRoaXMuIEJ1dCB0aGlzIGlzIGEgcHJldHR5IG1pbmltYWwgYXBwcm9hY2ggdGhhdCB3aWxsXG4gKiBsaWtlbHkgd29yayBmb3IgYSBudW1iZXIgb2YgdXNlIGNhc2VzLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVOb3RpZmllcjxUPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IE1hcDxcbiAgICBDb250ZXh0Q2FsbGJhY2s8VD4sXG4gICAgQ2FsbGJhY2tJbmZvXG4gID4oKTtcbiAgcHJpdmF0ZSBfdmFsdWUhOiBUO1xuICBnZXQgdmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBUKSB7XG4gICAgdGhpcy5zZXRWYWx1ZSh2KTtcbiAgfVxuXG4gIHNldFZhbHVlKHY6IFQsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBjb25zdCB1cGRhdGUgPSBmb3JjZSB8fCAhT2JqZWN0LmlzKHYsIHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgaWYgKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU/OiBUKSB7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU9ic2VydmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IFtjYWxsYmFjaywge2Rpc3Bvc2VyfV0gb2YgdGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLl92YWx1ZSwgZGlzcG9zZXIpO1xuICAgIH1cbiAgfTtcblxuICBhZGRDYWxsYmFjayhcbiAgICBjYWxsYmFjazogQ29udGV4dENhbGxiYWNrPFQ+LFxuICAgIGNvbnN1bWVySG9zdDogRWxlbWVudCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmICghc3Vic2NyaWJlKSB7XG4gICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYW5kIHdlJ3JlIGRvbmVcbiAgICAgIGNhbGxiYWNrKHRoaXMudmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGNhbGxiYWNrLCB7XG4gICAgICAgIGRpc3Bvc2VyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnN1bWVySG9zdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7ZGlzcG9zZXJ9ID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChjYWxsYmFjaykhO1xuICAgIGNhbGxiYWNrKHRoaXMudmFsdWUsIGRpc3Bvc2VyKTtcbiAgfVxuXG4gIGNsZWFyQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5jbGVhcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFJlcXVlc3RFdmVudH0gZnJvbSAnLi4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcbmltcG9ydCB7VmFsdWVOb3RpZmllcn0gZnJvbSAnLi4vdmFsdWUtbm90aWZpZXIuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRFdmVudE1hcCB7XG4gICAgLyoqXG4gICAgICogQSAnY29udGV4dC1wcm92aWRlcicgZXZlbnQgY2FuIGJlIGVtaXR0ZWQgYnkgYW55IGVsZW1lbnQgd2hpY2ggaG9zdHNcbiAgICAgKiBhIGNvbnRleHQgcHJvdmlkZXIgdG8gaW5kaWNhdGUgaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcHJvdmlkZXInOiBDb250ZXh0UHJvdmlkZXJFdmVudDxDb250ZXh0PHVua25vd24sIHVua25vd24+PjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyRXZlbnQ8XG4gIEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuPiBleHRlbmRzIEV2ZW50IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgd2hpY2ggdGhpcyBwcm92aWRlciBjYW4gcHJvdmlkZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29udGV4dDogQykge1xuICAgIHN1cGVyKCdjb250ZXh0LXByb3ZpZGVyJywge2J1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlfSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnM8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgY29udGV4dDogQztcbiAgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8Qz47XG59XG5cbnR5cGUgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFBhcnRpYWw8UmVhY3RpdmVDb250cm9sbGVySG9zdD4gJiBIVE1MRWxlbWVudDtcblxuLyoqXG4gKiBBIFJlYWN0aXZlQ29udHJvbGxlciB3aGljaCBhZGRzIGNvbnRleHQgcHJvdmlkZXIgYmVoYXZpb3IgdG8gYVxuICogY3VzdG9tIGVsZW1lbnQuXG4gKlxuICogVGhpcyBjb250cm9sbGVyIHNpbXBseSBsaXN0ZW5zIHRvIHRoZSBgY29udGV4dC1yZXF1ZXN0YCBldmVudCB3aGVuXG4gKiB0aGUgaG9zdCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTSBhbmQgcmVnaXN0ZXJzIHRoZSByZWNlaXZlZCBjYWxsYmFja3NcbiAqIGFnYWluc3QgaXRzIG9ic2VydmFibGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGUgY29udHJvbGxlciBtYXkgYWxzbyBiZSBhdHRhY2hlZCB0byBhbnkgSFRNTCBlbGVtZW50IGluIHdoaWNoIGNhc2UgaXQnc1xuICogdXAgdG8gdGhlIHVzZXIgdG8gY2FsbCBob3N0Q29ubmVjdGVkKCkgd2hlbiBhdHRhY2hlZCB0byB0aGUgRE9NLiBUaGlzIGlzXG4gKiBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIGFueSBjdXN0b20gZWxlbWVudHMgaW1wbGVtZW50aW5nXG4gKiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyPFxuICAgIFQgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuICAgIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFJlYWN0aXZlRWxlbWVudEhvc3QsXG4gID5cbiAgZXh0ZW5kcyBWYWx1ZU5vdGlmaWVyPENvbnRleHRUeXBlPFQ+PlxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogVDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgb3B0aW9uczogT3B0aW9uczxUPik7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgbmV3IENvbnRleHRQcm92aWRlcihob3N0LCBvcHRpb25zKSAqL1xuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgY29udGV4dDogVCwgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8VD4pO1xuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBIb3N0RWxlbWVudCxcbiAgICBjb250ZXh0T3JPcHRpb25zOiBUIHwgT3B0aW9uczxUPixcbiAgICBpbml0aWFsVmFsdWU/OiBDb250ZXh0VHlwZTxUPlxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmNvbnRleHQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmluaXRpYWxWYWx1ZVxuICAgICAgICA6IGluaXRpYWxWYWx1ZVxuICAgICk7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICBpZiAoKGNvbnRleHRPck9wdGlvbnMgYXMgT3B0aW9uczxUPikuY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSAoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPFQ+KS5jb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0T3JPcHRpb25zIGFzIFQ7XG4gICAgfVxuICAgIHRoaXMuYXR0YWNoTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5ob3N0LmFkZENvbnRyb2xsZXI/Lih0aGlzKTtcbiAgfVxuXG4gIG9uQ29udGV4dFJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gT25seSBjYWxsIHRoZSBjYWxsYmFjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCwgd2Ugd2FudCB0byBhdm9pZCB0aGUgZWxlbWVudCB0byBzZWxmLXJlZ2lzdGVyLlxuICAgIC8vIFRoZSBjaGVjayBvbiBjb21wb3NlZFBhdGggKGFzIG9wcG9zZWQgdG8gZXYudGFyZ2V0KSBpcyB0byBjb3ZlciBjYXNlc1xuICAgIC8vIHdoZXJlIHRoZSBjb25zdW1lciBpcyBpbiB0aGUgc2hhZG93RG9tIG9mIHRoZSBwcm92aWRlciAoaW4gd2hpY2ggY2FzZSxcbiAgICAvLyBldmVudC50YXJnZXQgPT09IHRoaXMuaG9zdCBiZWNhdXNlIG9mIGV2ZW50IHJldGFyZ2V0aW5nKS5cbiAgICBjb25zdCBjb25zdW1lckhvc3QgPSBldi5jb21wb3NlZFBhdGgoKVswXSBhcyBFbGVtZW50O1xuICAgIGlmIChldi5jb250ZXh0ICE9PSB0aGlzLmNvbnRleHQgfHwgY29uc3VtZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hZGRDYWxsYmFjayhldi5jYWxsYmFjaywgY29uc3VtZXJIb3N0LCBldi5zdWJzY3JpYmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGVuIHdlIGdldCBhIHByb3ZpZGVyIHJlcXVlc3QgZXZlbnQsIHRoYXQgbWVhbnMgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnRcbiAgICogaGFzIGp1c3Qgd29rZW4gdXAuIElmIGl0J3MgYSBwcm92aWRlciBvZiBvdXIgY29udGV4dCwgdGhlbiB3ZSBtYXkgbmVlZCB0b1xuICAgKiByZS1wYXJlbnQgb3VyIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgaXMgYSBtb3JlIHNwZWNpZmljIHByb3ZpZGVyIHRoYW4gdXNcbiAgICogZm9yIGl0cyBzdWJ0cmVlLlxuICAgKi9cbiAgb25Qcm92aWRlclJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRQcm92aWRlckV2ZW50PENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+XG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIElnbm9yZSBldmVudHMgd2hlbiB0aGUgY29udGV4dCBkb2Vzbid0IG1hdGNoLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCBpdCBzaG91bGRuJ3QgcHJvdmlkZSB0byBpdHNlbGYuXG4gICAgLy8gV2UgdXNlIGNvbXBvc2VkUGF0aCAoYXMgb3Bwb3NlZCB0byBldi50YXJnZXQpIHRvIGNvdmVyIGNhc2VzXG4gICAgLy8gd2hlcmUgdGhlIGNvbnN1bWVyIGlzIGluIHRoZSBzaGFkb3dEb20gb2YgdGhlIHByb3ZpZGVyIChpbiB3aGljaCBjYXNlLFxuICAgIC8vIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5ob3N0IGJlY2F1c2Ugb2YgZXZlbnQgcmV0YXJnZXRpbmcpLlxuICAgIGNvbnN0IGNoaWxkUHJvdmlkZXJIb3N0ID0gZXYuY29tcG9zZWRQYXRoKClbMF0gYXMgRWxlbWVudDtcbiAgICBpZiAoZXYuY29udGV4dCAhPT0gdGhpcy5jb250ZXh0IHx8IGNoaWxkUHJvdmlkZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmUtcGFyZW50IGFsbCBvZiBvdXIgc3Vic2NyaXB0aW9ucyBpbiBjYXNlIHRoaXMgbmV3IGNoaWxkIHByb3ZpZGVyXG4gICAgLy8gc2hvdWxkIHRha2UgdGhlbSBvdmVyLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgZm9yIChjb25zdCBbY2FsbGJhY2ssIHtjb25zdW1lckhvc3R9XSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlIGNhc2Ugd2hlcmUgYSBvbmUgaG9zdCBlbGVtZW50XG4gICAgICAvLyBpcyBwcm92aWRpbmcgdGhlIHNhbWUgY29udGV4dCBtdWx0aXBsZSB0aW1lcy5cbiAgICAgIC8vXG4gICAgICAvLyBXaGlsZSBub3JtYWxseSBpdCdzIGEgbm8tb3AgdG8gYXR0ZW1wdCB0byByZS1wYXJlbnQgYSBzdWJzY3JpcHRpb25cbiAgICAgIC8vIHRoYXQgYWxyZWFkeSBoYXMgaXRzIHByb3BlciBwYXJlbnQsIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MgbW9yZVxuICAgICAgLy8gdGhhbiBvbmUgVmFsdWVQcm92aWRlciBmb3IgdGhlIHNhbWUgY29udGV4dCBvbiB0aGUgc2FtZSBob3N0RWxlbWVudCxcbiAgICAgIC8vIHRoZXkgd2lsbCBlYWNoIGNhbGwgdGhlIGNvbnN1bWVyLCBhbmQgc2luY2UgdGhleSB3aWxsIGVhY2ggaGF2ZSB0aGVpclxuICAgICAgLy8gb3duIGRpc3Bvc2UgZnVuY3Rpb24sIGEgd2VsbCBiZWhhdmVkIGNvbnN1bWVyIHdpbGwgbm90aWNlIHRoZSBjaGFuZ2VcbiAgICAgIC8vIGluIGRpc3Bvc2UgZnVuY3Rpb24gYW5kIGNhbGwgdGhlaXIgb2xkIG9uZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgdGhlIHN1YnNjcmlwdGlvbnMgdG8gdGhyYXNoLCBidXQgd29yc2UsIHdpdGhvdXQgdGhpc1xuICAgICAgLy8gc2V0IGNoZWNrIGhlcmUsIHdlIGNhbiBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCwgYXMgd2UgYWRkIGFuZCByZW1vdmVcbiAgICAgIC8vIHRoZSBzYW1lIHN1YnNjcmlwdGlvbnMgb250byB0aGUgZW5kIG9mIHRoZSBtYXAgb3ZlciBhbmQgb3Zlci5cbiAgICAgIGlmIChzZWVuLmhhcyhjYWxsYmFjaykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChjYWxsYmFjayk7XG4gICAgICBjb25zdW1lckhvc3QuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IENvbnRleHRSZXF1ZXN0RXZlbnQodGhpcy5jb250ZXh0LCBjYWxsYmFjaywgdHJ1ZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIHByaXZhdGUgYXR0YWNoTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXJlcXVlc3QnLCB0aGlzLm9uQ29udGV4dFJlcXVlc3QpO1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXByb3ZpZGVyJywgdGhpcy5vblByb3ZpZGVyUmVxdWVzdCk7XG4gIH1cblxuICBob3N0Q29ubmVjdGVkKCk6IHZvaWQge1xuICAgIC8vIGVtaXQgYW4gZXZlbnQgdG8gc2lnbmFsIGEgcHJvdmlkZXIgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGNvbnRleHRcbiAgICB0aGlzLmhvc3QuZGlzcGF0Y2hFdmVudChuZXcgQ29udGV4dFByb3ZpZGVyRXZlbnQodGhpcy5jb250ZXh0KSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcbmltcG9ydCB7Q29udGV4dFByb3ZpZGVyfSBmcm9tICcuLi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0UHJvdmlkZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiBtYWtpbmcgaXQgcmVzcG9uZCB0byBhbnkgYGNvbnRleHQtcmVxdWVzdGAgZXZlbnRzIGZyb20gaXRzIGNoaWxkcmVuIGNvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBpZGVudGlmaWVyIHZhbHVlIGNyZWF0ZWQgdmlhIGBjcmVhdGVDb250ZXh0YFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnQGxpdC9jb250ZXh0JztcbiAqIGltcG9ydCB7TG9nZ2VyfSBmcm9tICdteS1sb2dnaW5nLWxpYnJhcnknO1xuICogaW1wb3J0IHtsb2dnZXJDb250ZXh0fSBmcm9tICcuL2xvZ2dlci1jb250ZXh0LmpzJztcbiAqXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcHJvdmlkZSh7Y29udGV4dDogbG9nZ2VyQ29udGV4dH0pXG4gKiAgIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZTxWYWx1ZVR5cGU+KHtcbiAgY29udGV4dDogY29udGV4dCxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xufSk6IFByb3ZpZGVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICAvLyBNYXAgb2YgaW5zdGFuY2VzIHRvIGNvbnRyb2xsZXJzXG4gICAgY29uc3QgY29udHJvbGxlck1hcCA9IG5ldyBXZWFrTWFwPFxuICAgICAgUmVhY3RpdmVFbGVtZW50LFxuICAgICAgQ29udGV4dFByb3ZpZGVyPENvbnRleHQ8dW5rbm93biwgVmFsdWVUeXBlPj5cbiAgICA+KCk7XG4gICAgaWYgKHR5cGVvZiBuYW1lT3JDb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU3RhbmRhcmQgZGVjb3JhdG9ycyBicmFuY2hcbiAgICAgIG5hbWVPckNvbnRleHQuYWRkSW5pdGlhbGl6ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb250cm9sbGVyTWFwLnNldCh0aGlzLCBuZXcgQ29udGV4dFByb3ZpZGVyKHRoaXMsIHtjb250ZXh0fSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHByb3RvT3JUYXJnZXQuZ2V0LmNhbGwodGhpcyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiBwcm90b09yVGFyZ2V0LnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLnNldChlbGVtZW50LCBuZXcgQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQsIHtjb250ZXh0fSkpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgLy8gcHJveHkgYW55IGV4aXN0aW5nIHNldHRlciBmb3IgdGhpcyBwcm9wZXJ0eSBhbmQgdXNlIGl0IHRvXG4gICAgICAvLyBub3RpZnkgdGhlIGNvbnRyb2xsZXIgb2YgYW4gdXBkYXRlZCB2YWx1ZVxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHByb3RvT3JUYXJnZXQsXG4gICAgICAgIG5hbWVPckNvbnRleHRcbiAgICAgICk7XG4gICAgICBsZXQgbmV3RGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB2YWx1ZU1hcCA9IG5ldyBXZWFrTWFwPFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPigpO1xuICAgICAgICBuZXdEZXNjcmlwdG9yID0ge1xuICAgICAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVNYXAuc2V0KHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2xkU2V0dGVyID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgIG5ld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgb2xkU2V0dGVyPy5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIG5ld0Rlc2NyaXB0b3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSkgYXMgUHJvdmlkZURlY29yYXRvcjxWYWx1ZVR5cGU+O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHB1YmxpYyBpbnRlcmZhY2UgdHlwZSB0aGF0IHJlbW92ZXMgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIGZpZWxkcy5cbiAqIFRoaXMgYWxsb3dzIGFjY2VwdGluZyBvdGhlcndpc2UgY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbnR5cGUgSW50ZXJmYWNlPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXTtcbn07XG5cbnR5cGUgUHJvdmlkZURlY29yYXRvcjxDb250ZXh0VHlwZT4gPSB7XG4gIC8vIGxlZ2FjeVxuICA8XG4gICAgSyBleHRlbmRzIFByb3BlcnR5S2V5LFxuICAgIFByb3RvIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgPihcbiAgICBwcm90b09yRGVzY3JpcHRvcjogUHJvdG8sXG4gICAgbmFtZT86IEtcbiAgKTogRmllbGRNdXN0TWF0Y2hDb250ZXh0VHlwZTxQcm90bywgSywgQ29udGV4dFR5cGU+O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxcbiAgICBDIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgICBWIGV4dGVuZHMgQ29udGV4dFR5cGUsXG4gID4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogdm9pZDtcbn07XG5cbi8vIE5vdGUgVHlwZVNjcmlwdCByZXF1aXJlcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBkZWNvcmF0b3IgdG8gYmUgYHZvaWQgfCBhbnlgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBEZWNvcmF0b3JSZXR1cm4gPSB2b2lkIHwgYW55O1xuXG50eXBlIEZpZWxkTXVzdE1hdGNoQ29udGV4dFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgQ29udGV4dFR5cGU+ID1cbiAgLy8gRmlyc3Qgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYSByZXF1aXJlZCBmaWVsZFxuICBPYmogZXh0ZW5kcyBSZWNvcmQ8S2V5LCBpbmZlciBQcm92aWRpbmdUeXBlPlxuICAgID8gLy8gT2ssIGl0IGRvZXMsIGp1c3QgY2hlY2sgd2hldGhlciBpdCdzIG9rIHRvIGFzc2lnbiB0aGVcbiAgICAgIC8vIHByb3ZpZGVkIHR5cGUgdG8gdGhlIGNvbnN1bWluZyBmaWVsZFxuICAgICAgW1Byb3ZpZGluZ1R5cGVdIGV4dGVuZHMgW0NvbnRleHRUeXBlXVxuICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgIDoge1xuICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRpbmcgZmllbGQgbm90IGFzc2lnbmFibGUgdG8gY29udGV4dCc7XG4gICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgcHJvdmlkZWQ6IFByb3ZpZGluZ1R5cGU7XG4gICAgICAgIH1cbiAgICA6IC8vIE5leHQgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYW4gb3B0aW9uYWwgZmllbGRcbiAgICAgIE9iaiBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtleSwgaW5mZXIgUHJvdmlkaW5nPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgcHJvdmlkaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkaW5nIHwgdW5kZWZpbmVkXSBleHRlbmRzIFtDb250ZXh0VHlwZV1cbiAgICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAncHJvdmlkaW5nIGZpZWxkIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnRleHQnO1xuICAgICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgICBjb25zdW1pbmc6IFByb3ZpZGluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICA6IC8vIE9rLCB0aGUgZmllbGQgaXNuJ3QgcHJlc2VudCwgc28gZWl0aGVyIHNvbWVvbmUncyB1c2luZyBwcm92aWRlXG4gICAgICAgIC8vIG1hbnVhbGx5LCBpLmUuIG5vdCBhcyBhIGRlY29yYXRvciAobWF5YmUgZG9uJ3QgZG8gdGhhdCEgYnV0IGlmIHlvdSBkbyxcbiAgICAgICAgLy8geW91J3JlIG9uIHlvdXIgb3duIGZvciB5b3VyIHR5cGUgY2hlY2tpbmcsIHNvcnJ5KSwgb3IgdGhlIGZpZWxkIGlzXG4gICAgICAgIC8vIHByaXZhdGUsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3QgY2hlY2sgaXQuXG4gICAgICAgIERlY29yYXRvclJldHVybjtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHRDb25zdW1lcn0gZnJvbSAnLi4vY29udHJvbGxlcnMvY29udGV4dC1jb25zdW1lci5qcyc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0Q29uc3VtZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiB3aGljaCB3aWxsIHRyeSBhbmQgcmV0cmlldmUgYSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHZpYSB0aGUgQ29udGV4dCBBUEkuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IGlkZW50aWZpZXIgdmFsdWUgY3JlYXRlZCB2aWEgYGNyZWF0ZUNvbnRleHRgXG4gKiBAcGFyYW0gc3Vic2NyaWJlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIGFsbG93cyB0aGUgdmFsdWUgdG8gYmUgdXBkYXRlZFxuICogICBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2NvbnN1bWV9IGZyb20gJ0BsaXQvY29udGV4dCc7XG4gKiBpbXBvcnQge2xvZ2dlckNvbnRleHQsIExvZ2dlcn0gZnJvbSAnY29tbXVuaXR5LXByb3RvY29scy9sb2dnZXInO1xuICpcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBjb25zdW1lKHtjb250ZXh0OiBsb2dnZXJDb250ZXh0fSlcbiAqICAgbG9nZ2VyPzogTG9nZ2VyO1xuICpcbiAqICAgZG9UaGluZygpIHtcbiAqICAgICB0aGlzLmxvZ2dlciEubG9nKCd0aGluZyB3YXMgZG9uZScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWU8VmFsdWVUeXBlPih7XG4gIGNvbnRleHQsXG4gIHN1YnNjcmliZSxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xuICBzdWJzY3JpYmU/OiBib29sZWFuO1xufSk6IENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgbmFtZU9yQ29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5ldyBDb250ZXh0Q29uc3VtZXIodGhpcywge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgY2FsbGJhY2s6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcHJvdG9PclRhcmdldC5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXcgQ29udGV4dENvbnN1bWVyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBjYWxsYmFjazogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgIChlbGVtZW50IGFzIGFueSlbbmFtZU9yQ29udGV4dF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBDb25zdW1lRGVjb3JhdG9yPFZhbHVlVHlwZT47XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcHVibGljIGludGVyZmFjZSB0eXBlIHRoYXQgcmVtb3ZlcyBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgZmllbGRzLlxuICogVGhpcyBhbGxvd3MgYWNjZXB0aW5nIG90aGVyd2lzZSBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgdGhlIHR5cGUgKGUuZy4gZnJvbVxuICogbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHBhY2thZ2UgaW4gYG5vZGVfbW9kdWxlc2ApLlxuICovXG50eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG50eXBlIENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiA9IHtcbiAgLy8gbGVnYWN5XG4gIDxcbiAgICBLIGV4dGVuZHMgUHJvcGVydHlLZXksXG4gICAgUHJvdG8gZXh0ZW5kcyBJbnRlcmZhY2U8T21pdDxSZWFjdGl2ZUVsZW1lbnQsICdyZW5kZXJSb290Jz4+LFxuICA+KFxuICAgIHByb3RvT3JEZXNjcmlwdG9yOiBQcm90byxcbiAgICBuYW1lPzogS1xuICApOiBGaWVsZE11c3RNYXRjaFByb3ZpZGVkVHlwZTxQcm90bywgSywgVmFsdWVUeXBlPjtcblxuICAvLyBzdGFuZGFyZFxuICA8XG4gICAgQyBleHRlbmRzIEludGVyZmFjZTxPbWl0PFJlYWN0aXZlRWxlbWVudCwgJ3JlbmRlclJvb3QnPj4sXG4gICAgViBleHRlbmRzIFZhbHVlVHlwZSxcbiAgPihcbiAgICB2YWx1ZTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPixcbiAgICBjb250ZXh0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICApOiB2b2lkO1xufTtcblxuLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGRlY29yYXRvciB0byBiZSBgdm9pZCB8IGFueWBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIERlY29yYXRvclJldHVybiA9IHZvaWQgfCBhbnk7XG5cbnR5cGUgRmllbGRNdXN0TWF0Y2hQcm92aWRlZFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgUHJvdmlkZWRUeXBlPiA9XG4gIC8vIEZpcnN0IHdlIGNoZWNrIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5IGFzIGEgcmVxdWlyZWQgZmllbGRcbiAgT2JqIGV4dGVuZHMgUmVjb3JkPEtleSwgaW5mZXIgQ29uc3VtaW5nVHlwZT5cbiAgICA/IC8vIE9rLCBpdCBkb2VzLCBqdXN0IGNoZWNrIHdoZXRoZXIgaXQncyBvayB0byBhc3NpZ24gdGhlXG4gICAgICAvLyBwcm92aWRlZCB0eXBlIHRvIHRoZSBjb25zdW1pbmcgZmllbGRcbiAgICAgIFtQcm92aWRlZFR5cGVdIGV4dGVuZHMgW0NvbnN1bWluZ1R5cGVdXG4gICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgOiB7XG4gICAgICAgICAgbWVzc2FnZTogJ3Byb3ZpZGVkIHR5cGUgbm90IGFzc2lnbmFibGUgdG8gY29uc3VtaW5nIGZpZWxkJztcbiAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgIGNvbnN1bWluZzogQ29uc3VtaW5nVHlwZTtcbiAgICAgICAgfVxuICAgIDogLy8gTmV4dCB3ZSBjaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eSBhcyBhbiBvcHRpb25hbCBmaWVsZFxuICAgICAgT2JqIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8S2V5LCBpbmZlciBDb25zdW1pbmdUeXBlPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgY29uc3VtaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkZWRUeXBlXSBleHRlbmRzIFtDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkXVxuICAgICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRlZCB0eXBlIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnN1bWluZyBmaWVsZCc7XG4gICAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgICAgY29uc3VtaW5nOiBDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgIDogLy8gT2ssIHRoZSBmaWVsZCBpc24ndCBwcmVzZW50LCBzbyBlaXRoZXIgc29tZW9uZSdzIHVzaW5nIGNvbnN1bWVcbiAgICAgICAgLy8gbWFudWFsbHksIGkuZS4gbm90IGFzIGEgZGVjb3JhdG9yIChtYXliZSBkb24ndCBkbyB0aGF0ISBidXQgaWYgeW91IGRvLFxuICAgICAgICAvLyB5b3UncmUgb24geW91ciBvd24gZm9yIHlvdXIgdHlwZSBjaGVja2luZywgc29ycnkpLCBvciB0aGUgZmllbGQgaXNcbiAgICAgICAgLy8gcHJpdmF0ZSwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndCBjaGVjayBpdC5cbiAgICAgICAgRGVjb3JhdG9yUmV0dXJuO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG50eXBlIEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIFtLIGluIGtleW9mIEFSSUFNaXhpbl06IHN0cmluZztcbn07XG5cbi8qKlxuICogTWFwIG9mIEFSSUFNaXhpbiBwcm9wZXJ0aWVzIHRvIGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGFyaWFNaXhpbkF0dHJpYnV0ZXM6IEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIGFyaWFBdG9taWM6ICdhcmlhLWF0b21pYycsXG4gIGFyaWFBdXRvQ29tcGxldGU6ICdhcmlhLWF1dG9jb21wbGV0ZScsXG4gIGFyaWFCcmFpbGxlTGFiZWw6ICdhcmlhLWJyYWlsbGVsYWJlbCcsXG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uOiAnYXJpYS1icmFpbGxlcm9sZWRlc2NyaXB0aW9uJyxcbiAgYXJpYUJ1c3k6ICdhcmlhLWJ1c3knLFxuICBhcmlhQ2hlY2tlZDogJ2FyaWEtY2hlY2tlZCcsXG4gIGFyaWFDb2xDb3VudDogJ2FyaWEtY29sY291bnQnLFxuICBhcmlhQ29sSW5kZXg6ICdhcmlhLWNvbGluZGV4JyxcbiAgYXJpYUNvbFNwYW46ICdhcmlhLWNvbHNwYW4nLFxuICBhcmlhQ3VycmVudDogJ2FyaWEtY3VycmVudCcsXG4gIGFyaWFEZXNjcmlwdGlvbjogJ2FyaWEtZGVzY3JpcHRpb24nLFxuICBhcmlhRGlzYWJsZWQ6ICdhcmlhLWRpc2FibGVkJyxcbiAgYXJpYUV4cGFuZGVkOiAnYXJpYS1leHBhbmRlZCcsXG4gIGFyaWFIYXNQb3B1cDogJ2FyaWEtaGFzcG9wdXAnLFxuICBhcmlhSGlkZGVuOiAnYXJpYS1oaWRkZW4nLFxuICBhcmlhSW52YWxpZDogJ2FyaWEtaW52YWxpZCcsXG4gIGFyaWFLZXlTaG9ydGN1dHM6ICdhcmlhLWtleXNob3J0Y3V0cycsXG4gIGFyaWFMYWJlbDogJ2FyaWEtbGFiZWwnLFxuICBhcmlhTGV2ZWw6ICdhcmlhLWxldmVsJyxcbiAgYXJpYUxpdmU6ICdhcmlhLWxpdmUnLFxuICBhcmlhTW9kYWw6ICdhcmlhLW1vZGFsJyxcbiAgYXJpYU11bHRpTGluZTogJ2FyaWEtbXVsdGlsaW5lJyxcbiAgYXJpYU11bHRpU2VsZWN0YWJsZTogJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJyxcbiAgYXJpYU9yaWVudGF0aW9uOiAnYXJpYS1vcmllbnRhdGlvbicsXG4gIGFyaWFQbGFjZWhvbGRlcjogJ2FyaWEtcGxhY2Vob2xkZXInLFxuICBhcmlhUG9zSW5TZXQ6ICdhcmlhLXBvc2luc2V0JyxcbiAgYXJpYVByZXNzZWQ6ICdhcmlhLXByZXNzZWQnLFxuICBhcmlhUmVhZE9ubHk6ICdhcmlhLXJlYWRvbmx5JyxcbiAgYXJpYVJlcXVpcmVkOiAnYXJpYS1yZXF1aXJlZCcsXG4gIGFyaWFSb2xlRGVzY3JpcHRpb246ICdhcmlhLXJvbGVkZXNjcmlwdGlvbicsXG4gIGFyaWFSb3dDb3VudDogJ2FyaWEtcm93Y291bnQnLFxuICBhcmlhUm93SW5kZXg6ICdhcmlhLXJvd2luZGV4JyxcbiAgYXJpYVJvd1NwYW46ICdhcmlhLXJvd3NwYW4nLFxuICBhcmlhU2VsZWN0ZWQ6ICdhcmlhLXNlbGVjdGVkJyxcbiAgYXJpYVNldFNpemU6ICdhcmlhLXNldHNpemUnLFxuICBhcmlhU29ydDogJ2FyaWEtc29ydCcsXG4gIGFyaWFWYWx1ZU1heDogJ2FyaWEtdmFsdWVtYXgnLFxuICBhcmlhVmFsdWVNaW46ICdhcmlhLXZhbHVlbWluJyxcbiAgYXJpYVZhbHVlTm93OiAnYXJpYS12YWx1ZW5vdycsXG4gIGFyaWFWYWx1ZVRleHQ6ICdhcmlhLXZhbHVldGV4dCcsXG4gIHJvbGU6ICdyb2xlJyxcbn07XG5cbnR5cGUgRWxlbWVudEludGVybmFsc0ludGVyZmFjZSA9IEVsZW1lbnRJbnRlcm5hbHM7XG5cbi8vIFNoaW0gdGhlIGdsb2JhbCBlbGVtZW50IGludGVybmFscyBvYmplY3Rcbi8vIE1ldGhvZHMgc2hvdWxkIGJlIGZpbmUgYXMgbm9vcHMgYW5kIHByb3BlcnRpZXMgY2FuIGdlbmVyYWxseVxuLy8gYmUgd2hpbGUgb24gdGhlIHNlcnZlci5cbmV4cG9ydCBjb25zdCBFbGVtZW50SW50ZXJuYWxzU2hpbSA9IGNsYXNzIEVsZW1lbnRJbnRlcm5hbHNcbiAgaW1wbGVtZW50cyBFbGVtZW50SW50ZXJuYWxzSW50ZXJmYWNlXG57XG4gIGFyaWFBdG9taWMgPSAnJztcbiAgYXJpYUF1dG9Db21wbGV0ZSA9ICcnO1xuICBhcmlhQnJhaWxsZUxhYmVsID0gJyc7XG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFCdXN5ID0gJyc7XG4gIGFyaWFDaGVja2VkID0gJyc7XG4gIGFyaWFDb2xDb3VudCA9ICcnO1xuICBhcmlhQ29sSW5kZXggPSAnJztcbiAgYXJpYUNvbFNwYW4gPSAnJztcbiAgYXJpYUN1cnJlbnQgPSAnJztcbiAgYXJpYURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFEaXNhYmxlZCA9ICcnO1xuICBhcmlhRXhwYW5kZWQgPSAnJztcbiAgYXJpYUhhc1BvcHVwID0gJyc7XG4gIGFyaWFIaWRkZW4gPSAnJztcbiAgYXJpYUludmFsaWQgPSAnJztcbiAgYXJpYUtleVNob3J0Y3V0cyA9ICcnO1xuICBhcmlhTGFiZWwgPSAnJztcbiAgYXJpYUxldmVsID0gJyc7XG4gIGFyaWFMaXZlID0gJyc7XG4gIGFyaWFNb2RhbCA9ICcnO1xuICBhcmlhTXVsdGlMaW5lID0gJyc7XG4gIGFyaWFNdWx0aVNlbGVjdGFibGUgPSAnJztcbiAgYXJpYU9yaWVudGF0aW9uID0gJyc7XG4gIGFyaWFQbGFjZWhvbGRlciA9ICcnO1xuICBhcmlhUG9zSW5TZXQgPSAnJztcbiAgYXJpYVByZXNzZWQgPSAnJztcbiAgYXJpYVJlYWRPbmx5ID0gJyc7XG4gIGFyaWFSZXF1aXJlZCA9ICcnO1xuICBhcmlhUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFSb3dDb3VudCA9ICcnO1xuICBhcmlhUm93SW5kZXggPSAnJztcbiAgYXJpYVJvd1NwYW4gPSAnJztcbiAgYXJpYVNlbGVjdGVkID0gJyc7XG4gIGFyaWFTZXRTaXplID0gJyc7XG4gIGFyaWFTb3J0ID0gJyc7XG4gIGFyaWFWYWx1ZU1heCA9ICcnO1xuICBhcmlhVmFsdWVNaW4gPSAnJztcbiAgYXJpYVZhbHVlTm93ID0gJyc7XG4gIGFyaWFWYWx1ZVRleHQgPSAnJztcbiAgcm9sZSA9ICcnO1xuICBfX2hvc3Q6IEhUTUxFbGVtZW50O1xuICBnZXQgc2hhZG93Um9vdCgpIHtcbiAgICAvLyBHcmFiIHRoZSBzaGFkb3cgcm9vdCBpbnN0YW5jZSBmcm9tIHRoZSBFbGVtZW50IHNoaW1cbiAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc2hhZG93IHJvb3QgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIC8vIHRvIHRoZSBpbnRlcm5hbHMgaW5zdGFuY2UgZXZlbiBpZiB0aGUgbW9kZSBpcyAnY2xvc2VkJ1xuICAgIHJldHVybiAodGhpcy5fX2hvc3QgYXMgSFRNTEVsZW1lbnQgJiB7X19zaGFkb3dSb290OiBTaGFkb3dSb290fSlcbiAgICAgIC5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgY29uc3RydWN0b3IoX2hvc3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fX2hvc3QgPSBfaG9zdDtcbiAgfVxuICBjaGVja1ZhbGlkaXR5KCkge1xuICAgIC8vIFRPRE8oYXVndXN0amspIENvbnNpZGVyIGFjdHVhbGx5IGltcGxlbWVudGluZyBsb2dpYy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzM3NDBcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYEVsZW1lbnRJbnRlcm5hbHMuY2hlY2tWYWxpZGl0eSgpYCB3YXMgY2FsbGVkIG9uIHRoZSBzZXJ2ZXIuJyArXG4gICAgICAgICdUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0cnVlLidcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvcm0gPSBudWxsO1xuICBsYWJlbHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8SFRNTExhYmVsRWxlbWVudD47XG4gIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldEZvcm1WYWx1ZSgpOiB2b2lkIHt9XG4gIHNldFZhbGlkaXR5KCk6IHZvaWQge31cbiAgc3RhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIHZhbGlkaXR5ID0ge30gYXMgVmFsaWRpdHlTdGF0ZTtcbiAgd2lsbFZhbGlkYXRlID0gdHJ1ZTtcbn07XG5cbmNvbnN0IEVsZW1lbnRJbnRlcm5hbHNTaGltV2l0aFJlYWxUeXBlID1cbiAgRWxlbWVudEludGVybmFsc1NoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50SW50ZXJuYWxzO1xuZXhwb3J0IHtFbGVtZW50SW50ZXJuYWxzU2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50SW50ZXJuYWxzfTtcblxuZXhwb3J0IGNvbnN0IEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYID0gJ2h5ZHJhdGUtaW50ZXJuYWxzLSc7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQge0VsZW1lbnRJbnRlcm5hbHNTaGltfSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmV4cG9ydCB7XG4gIGFyaWFNaXhpbkF0dHJpYnV0ZXMsXG4gIEVsZW1lbnRJbnRlcm5hbHMsXG4gIEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYLFxufSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgV2Vha01hcDxcbiAgSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+LFxuICBNYXA8c3RyaW5nLCBzdHJpbmc+XG4+KCk7XG5jb25zdCBhdHRyaWJ1dGVzRm9yRWxlbWVudCA9IChcbiAgZWxlbWVudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+XG4pID0+IHtcbiAgbGV0IGF0dHJzID0gYXR0cmlidXRlcy5nZXQoZWxlbWVudCk7XG4gIGlmIChhdHRycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXR0cmlidXRlcy5zZXQoZWxlbWVudCwgKGF0dHJzID0gbmV3IE1hcCgpKSk7XG4gIH1cbiAgcmV0dXJuIGF0dHJzO1xufTtcblxuLy8gVGhlIHR5cGluZ3MgYXJvdW5kIHRoZSBleHBvcnRzIGJlbG93IGFyZSBhIGxpdHRsZSBmdW5reTpcbi8vXG4vLyAxLiBXZSB3YW50IHRoZSBgbmFtZWAgb2YgdGhlIHNoaW0gY2xhc3NlcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzIGF0IHJ1bnRpbWUsXG4vLyAgICBoZW5jZSBlLmcuIGBjbGFzcyBFbGVtZW50YC5cbi8vIDIuIFdlIGNhbid0IHNoYWRvdyB0aGUgZ2xvYmFsIHR5cGVzIHdpdGggYSBzaW1wbGUgY2xhc3MgZGVjbGFyYXRpb24sIGJlY2F1c2Vcbi8vICAgIHRoZW4gd2UgY2FuJ3QgcmVmZXJlbmNlIHRoZSBnbG9iYWwgdHlwZXMgZm9yIGNhc3RpbmcsIGhlbmNlIGUuZy5cbi8vICAgIGBjb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnRgLlxuLy8gMy4gV2Ugd2FudCB0byBleHBvcnQgdGhlIGNsYXNzZXMgdHlwZWQgYXMgdGhlIHJlYWwgb25lcywgaGVuY2UgZS5nLlxuLy8gICAgYGNvbnN0IEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID0gRWxlbWVudFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50O2AuXG4vLyA0LiBXZSB3YW50IHRoZSBleHBvcnRlZCBuYW1lcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzLCBoZW5jZSBlLmcuXG4vLyAgICBgZXhwb3J0IHtFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50fWAuXG5jb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnQge1xuICBnZXQgYXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhdHRyaWJ1dGVzRm9yRWxlbWVudCh0aGlzKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pKTtcbiAgfVxuICBwcml2YXRlIF9fc2hhZG93Um9vdE1vZGU6IG51bGwgfCBTaGFkb3dSb290TW9kZSA9IG51bGw7XG4gIHByb3RlY3RlZCBfX3NoYWRvd1Jvb3Q6IG51bGwgfCBTaGFkb3dSb290ID0gbnVsbDtcbiAgcHJvdGVjdGVkIF9faW50ZXJuYWxzOiBudWxsIHwgRWxlbWVudEludGVybmFscyA9IG51bGw7XG5cbiAgZ2V0IHNoYWRvd1Jvb3QoKSB7XG4gICAgaWYgKHRoaXMuX19zaGFkb3dSb290TW9kZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgZ2V0IGxvY2FsTmFtZSgpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZTtcbiAgfVxuICBnZXQgdGFnTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU/LnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBFbXVsYXRlIGJyb3dzZXIgYmVoYXZpb3IgdGhhdCBzaWxlbnRseSBjYXN0cyBhbGwgdmFsdWVzIHRvIHN0cmluZy4gRS5nLlxuICAgIC8vIGA0MmAgYmVjb21lcyBgXCI0MlwiYCBhbmQgYHt9YCBiZWNvbWVzIGBcIltvYmplY3QgT2JqZWN0XVwiXCJgLlxuICAgIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLnNldChuYW1lLCBTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZW1vdmVBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZGVsZXRlKG5hbWUpO1xuICB9XG4gIHRvZ2dsZUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIFN0ZXBzIHJlZmVyZW5jZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1lbGVtZW50LXRvZ2dsZWF0dHJpYnV0ZVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgLy8gU3RlcCA1XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCAhZm9yY2UpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA0XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCBmb3JjZSkge1xuICAgICAgICAvLyBTdGVwIDQuMVxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RlcCA0LjJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTdGVwIDZcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBoYXNBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLmhhcyhuYW1lKTtcbiAgfVxuICBhdHRhY2hTaGFkb3coaW5pdDogU2hhZG93Um9vdEluaXQpOiBTaGFkb3dSb290IHtcbiAgICBjb25zdCBzaGFkb3dSb290ID0ge2hvc3Q6IHRoaXN9IGFzIG9iamVjdCBhcyBTaGFkb3dSb290O1xuICAgIHRoaXMuX19zaGFkb3dSb290TW9kZSA9IGluaXQubW9kZTtcbiAgICBpZiAoaW5pdCAmJiBpbml0Lm1vZGUgPT09ICdvcGVuJykge1xuICAgICAgdGhpcy5fX3NoYWRvd1Jvb3QgPSBzaGFkb3dSb290O1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93Um9vdDtcbiAgfVxuICBhdHRhY2hJbnRlcm5hbHMoKTogRWxlbWVudEludGVybmFscyB7XG4gICAgaWYgKHRoaXMuX19pbnRlcm5hbHMgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlICdhdHRhY2hJbnRlcm5hbHMnIG9uICdIVE1MRWxlbWVudCc6IGAgK1xuICAgICAgICAgIGBFbGVtZW50SW50ZXJuYWxzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgd2FzIGFscmVhZHkgYXR0YWNoZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJuYWxzID0gbmV3IEVsZW1lbnRJbnRlcm5hbHNTaGltKHRoaXMgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5fX2ludGVybmFscyA9IGludGVybmFscztcbiAgICByZXR1cm4gaW50ZXJuYWxzIGFzIEVsZW1lbnRJbnRlcm5hbHM7XG4gIH1cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZ2V0KG5hbWUpO1xuICAgIHJldHVybiB2YWx1ZSA/PyBudWxsO1xuICB9XG59O1xuY29uc3QgRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgPSBFbGVtZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEVsZW1lbnQ7XG5leHBvcnQge0VsZW1lbnRTaGltV2l0aFJlYWxUeXBlIGFzIEVsZW1lbnR9O1xuXG5jb25zdCBIVE1MRWxlbWVudFNoaW0gPSBjbGFzcyBIVE1MRWxlbWVudCBleHRlbmRzIEVsZW1lbnRTaGltIHt9O1xuY29uc3QgSFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID1cbiAgSFRNTEVsZW1lbnRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgSFRNTEVsZW1lbnQ7XG5leHBvcnQge0hUTUxFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBIVE1MRWxlbWVudH07XG5cbmludGVyZmFjZSBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgbmV3ICgpOiBIVE1MRWxlbWVudDtcbiAgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBOYW1lZEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3JcbiAgZXh0ZW5kcyBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgX19sb2NhbE5hbWU6IHN0cmluZztcbn1cblxudHlwZSBDdXN0b21FbGVtZW50UmVnaXN0cmF0aW9uID0ge1xuICBjdG9yOiB7bmV3ICgpOiBIVE1MRWxlbWVudH07XG4gIG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW107XG59O1xuXG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltID0gY2xhc3MgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfX2RlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRSZWdpc3RyYXRpb24+KCk7XG5cbiAgZGVmaW5lKG5hbWU6IHN0cmluZywgY3RvcjogQ3VzdG9tSFRNTEVsZW1lbnRDb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0aGlzLl9fZGVmaW5pdGlvbnMuaGFzKG5hbWUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JyBhbHJlYWR5IGhhcyBcIiR7bmFtZX1cIiBkZWZpbmVkLiBgICtcbiAgICAgICAgICAgIGBUaGlzIG1heSBoYXZlIGJlZW4gY2F1c2VkIGJ5IGxpdmUgcmVsb2FkIG9yIGhvdCBtb2R1bGUgYCArXG4gICAgICAgICAgICBgcmVwbGFjZW1lbnQgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuXFxuYCArXG4gICAgICAgICAgICBgTWFrZSBzdXJlIHRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbiB3aXRoIGEgcHJvZHVjdGlvbiBidWlsZCBhcyBgICtcbiAgICAgICAgICAgIGByZXBlYXQgcmVnaXN0cmF0aW9ucyB3aWxsIHRocm93IGluIHByb2R1Y3Rpb24uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSAnZGVmaW5lJyBvbiAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JzogYCArXG4gICAgICAgICAgICBgdGhlIG5hbWUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggdGhpcyByZWdpc3RyeWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUHJvdmlkZSB0YWdOYW1lIGFuZCBsb2NhbE5hbWUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgKGN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fX2RlZmluaXRpb25zLnNldChuYW1lLCB7XG4gICAgICBjdG9yLFxuICAgICAgLy8gTm90ZSBpdCdzIGltcG9ydGFudCB3ZSByZWFkIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGluIGNhc2UgaXQgaXMgYSBnZXR0ZXJcbiAgICAgIC8vIHdpdGggc2lkZS1lZmZlY3RzLCBhcyBpcyB0aGUgY2FzZSBpbiBMaXQsIHdoZXJlIGl0IHRyaWdnZXJzIGNsYXNzXG4gICAgICAvLyBmaW5hbGl6YXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gVE9ETyhhb21hcmtzKSBUbyBiZSBzcGVjIGNvbXBsaWFudCwgd2Ugc2hvdWxkIGFsc28gY2FwdHVyZSB0aGVcbiAgICAgIC8vIHJlZ2lzdHJhdGlvbi10aW1lIGxpZmVjeWNsZSBtZXRob2RzIGxpa2UgYGNvbm5lY3RlZENhbGxiYWNrYC4gRm9yIHRoZW1cbiAgICAgIC8vIHRvIGJlIGFjdHVhbGx5IGFjY2Vzc2libGUgdG8gZS5nLiB0aGUgTGl0IFNTUiBlbGVtZW50IHJlbmRlcmVyLCB0aG91Z2gsXG4gICAgICAvLyB3ZSdkIG5lZWQgdG8gaW50cm9kdWNlIGEgbmV3IEFQSSBmb3IgYWNjZXNzaW5nIHRoZW0gKHNpbmNlIGBnZXRgIG9ubHlcbiAgICAgIC8vIHJldHVybnMgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIG9ic2VydmVkQXR0cmlidXRlczogY3Rvci5vYnNlcnZlZEF0dHJpYnV0ZXMgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMuX19kZWZpbml0aW9ucy5nZXQobmFtZSk7XG4gICAgcmV0dXJuIGRlZmluaXRpb24/LmN0b3I7XG4gIH1cbn07XG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlID1cbiAgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEN1c3RvbUVsZW1lbnRSZWdpc3RyeTtcbmV4cG9ydCB7Q3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSBhcyBDdXN0b21FbGVtZW50UmVnaXN0cnl9O1xuXG5leHBvcnQgY29uc3QgY3VzdG9tRWxlbWVudHMgPSBuZXcgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSgpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBgYWRvcHRlZFN0eWxlU2hlZXRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0czogYm9vbGVhbiA9XG4gIGdsb2JhbC5TaGFkb3dSb290ICYmXG4gIChnbG9iYWwuU2hhZHlDU1MgPT09IHVuZGVmaW5lZCB8fCBnbG9iYWwuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJlxuICAnYWRvcHRlZFN0eWxlU2hlZXRzJyBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiZcbiAgJ3JlcGxhY2UnIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4vKipcbiAqIEEgQ1NTUmVzdWx0IG9yIG5hdGl2ZSBDU1NTdHlsZVNoZWV0LlxuICpcbiAqIEluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBjb25zdHJ1Y3RpYmxlIENTUyBzdHlsZSBzaGVldHMsIENTU1N0eWxlU2hlZXRcbiAqIG9iamVjdCBjYW4gYmUgdXNlZCBmb3Igc3R5bGluZyBhbG9uZyBzaWRlIENTU1Jlc3VsdCBmcm9tIHRoZSBgY3NzYFxuICogdGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRPck5hdGl2ZSA9IENTU1Jlc3VsdCB8IENTU1N0eWxlU2hlZXQ7XG5cbmV4cG9ydCB0eXBlIENTU1Jlc3VsdEFycmF5ID0gQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmUgfCBDU1NSZXN1bHRBcnJheT47XG5cbi8qKlxuICogQSBzaW5nbGUgQ1NTUmVzdWx0LCBDU1NTdHlsZVNoZWV0LCBvciBhbiBhcnJheSBvciBuZXN0ZWQgYXJyYXlzIG9mIHRob3NlLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRHcm91cCA9IENTU1Jlc3VsdE9yTmF0aXZlIHwgQ1NTUmVzdWx0QXJyYXk7XG5cbmNvbnN0IGNvbnN0cnVjdGlvblRva2VuID0gU3ltYm9sKCk7XG5cbmNvbnN0IGNzc1RhZ0NhY2hlID0gbmV3IFdlYWtNYXA8VGVtcGxhdGVTdHJpbmdzQXJyYXksIENTU1N0eWxlU2hlZXQ+KCk7XG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgc3RyaW5nIG9mIENTUyB0ZXh0LCB0aGF0IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhIENTU1N0eWxlU2hlZXQuXG4gKlxuICogQ1NTUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNzc2AtdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxzIGFuZFxuICogYHVuc2FmZUNTUygpYC4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgQ1NTUmVzdWx0cyBhcmUgb25seSBjcmVhdGVkIHZpYSB0aGVcbiAqIGBjc3NgIHRhZyBhbmQgYHVuc2FmZUNTUygpYCwgQ1NTUmVzdWx0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNsYXNzIENTU1Jlc3VsdCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIFsnXyRjc3NSZXN1bHQkJ10gPSB0cnVlO1xuICByZWFkb25seSBjc3NUZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N0eWxlU2hlZXQ/OiBDU1NTdHlsZVNoZWV0O1xuICBwcml2YXRlIF9zdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGNzc1RleHQ6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZCxcbiAgICBzYWZlVG9rZW46IHN5bWJvbFxuICApIHtcbiAgICBpZiAoc2FmZVRva2VuICE9PSBjb25zdHJ1Y3Rpb25Ub2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNzc1RleHQgPSBjc3NUZXh0O1xuICAgIHRoaXMuX3N0cmluZ3MgPSBzdHJpbmdzO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBhIGdldHRlciBzbyB0aGF0IGl0J3MgbGF6eS4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgc3R5bGVzaGVldHNcbiAgLy8gYXJlIG5vdCBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBlbGVtZW50IGluc3RhbmNlIGlzIG1hZGUuXG4gIGdldCBzdHlsZVNoZWV0KCk6IENTU1N0eWxlU2hlZXQgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIGBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHNgIGlzIHRydWUgdGhlbiB3ZSBhc3N1bWUgQ1NTU3R5bGVTaGVldCBpc1xuICAgIC8vIGNvbnN0cnVjdGFibGUuXG4gICAgbGV0IHN0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZVNoZWV0O1xuICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLl9zdHJpbmdzO1xuICAgIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgJiYgc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjYWNoZWFibGUgPSBzdHJpbmdzICE9PSB1bmRlZmluZWQgJiYgc3RyaW5ncy5sZW5ndGggPT09IDE7XG4gICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgIHN0eWxlU2hlZXQgPSBjc3NUYWdDYWNoZS5nZXQoc3RyaW5ncyk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICh0aGlzLl9zdHlsZVNoZWV0ID0gc3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCkpLnJlcGxhY2VTeW5jKFxuICAgICAgICAgIHRoaXMuY3NzVGV4dFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgY3NzVGFnQ2FjaGUuc2V0KHN0cmluZ3MsIHN0eWxlU2hlZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVNoZWV0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jc3NUZXh0O1xuICB9XG59XG5cbnR5cGUgQ29uc3RydWN0YWJsZUNTU1Jlc3VsdCA9IENTU1Jlc3VsdCAmIHtcbiAgbmV3IChcbiAgICBjc3NUZXh0OiBzdHJpbmcsXG4gICAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCB1bmRlZmluZWQsXG4gICAgc2FmZVRva2VuOiBzeW1ib2xcbiAgKTogQ1NTUmVzdWx0O1xufTtcblxuY29uc3QgdGV4dEZyb21DU1NSZXN1bHQgPSAodmFsdWU6IENTU1Jlc3VsdEdyb3VwIHwgbnVtYmVyKSA9PiB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIGlmICgodmFsdWUgYXMgQ1NTUmVzdWx0KVsnXyRjc3NSZXN1bHQkJ10gPT09IHRydWUpIHtcbiAgICByZXR1cm4gKHZhbHVlIGFzIENTU1Jlc3VsdCkuY3NzVGV4dDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBWYWx1ZSBwYXNzZWQgdG8gJ2NzcycgZnVuY3Rpb24gbXVzdCBiZSBhICdjc3MnIGZ1bmN0aW9uIHJlc3VsdDogYCArXG4gICAgICAgIGAke3ZhbHVlfS4gVXNlICd1bnNhZmVDU1MnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQgdGFrZSBjYXJlIGAgK1xuICAgICAgICBgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogV3JhcCBhIHZhbHVlIGZvciBpbnRlcnBvbGF0aW9uIGluIGEge0BsaW5rY29kZSBjc3N9IHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgdW50cnVzdGVkIENTUyB0ZXh0IGNhbiBiZSB1c2VkIHRvIHBob25lIGhvbWVcbiAqIG9yIGV4ZmlsdHJhdGUgZGF0YSB0byBhbiBhdHRhY2tlciBjb250cm9sbGVkIHNpdGUuIFRha2UgY2FyZSB0byBvbmx5IHVzZVxuICogdGhpcyB3aXRoIHRydXN0ZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVDU1MgPSAodmFsdWU6IHVua25vd24pID0+XG4gIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIGNvbnN0cnVjdGlvblRva2VuXG4gICk7XG5cbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExpdEVsZW1lbnQnc1xuICoge0BsaW5rY29kZSBMaXRFbGVtZW50LnN0eWxlc30gcHJvcGVydHkgdG8gc2V0IGVsZW1lbnQgc3R5bGVzLlxuICpcbiAqIEZvciBzZWN1cml0eSByZWFzb25zLCBvbmx5IGxpdGVyYWwgc3RyaW5nIHZhbHVlcyBhbmQgbnVtYmVyIG1heSBiZSB1c2VkIGluXG4gKiBlbWJlZGRlZCBleHByZXNzaW9ucy4gVG8gaW5jb3Jwb3JhdGUgbm9uLWxpdGVyYWwgdmFsdWVzIHtAbGlua2NvZGUgdW5zYWZlQ1NTfVxuICogbWF5IGJlIHVzZWQgaW5zaWRlIGFuIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjc3MgPSAoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChDU1NSZXN1bHRHcm91cCB8IG51bWJlcilbXVxuKTogQ1NTUmVzdWx0ID0+IHtcbiAgY29uc3QgY3NzVGV4dCA9XG4gICAgc3RyaW5ncy5sZW5ndGggPT09IDFcbiAgICAgID8gc3RyaW5nc1swXVxuICAgICAgOiB2YWx1ZXMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHYsIGlkeCkgPT4gYWNjICsgdGV4dEZyb21DU1NSZXN1bHQodikgKyBzdHJpbmdzW2lkeCArIDFdLFxuICAgICAgICAgIHN0cmluZ3NbMF1cbiAgICAgICAgKTtcbiAgcmV0dXJuIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIGNzc1RleHQsXG4gICAgc3RyaW5ncyxcbiAgICBjb25zdHJ1Y3Rpb25Ub2tlblxuICApO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZXMgdG8gYSBgc2hhZG93Um9vdGAuIFdoZW4gU2hhZG93IERPTSBpc1xuICogYXZhaWxhYmxlIGJ1dCBgYWRvcHRlZFN0eWxlU2hlZXRzYCBpcyBub3QsIHN0eWxlcyBhcmUgYXBwZW5kZWQgdG8gdGhlXG4gKiBgc2hhZG93Um9vdGAgdG8gW21pbWljIHNwZWMgYmVoYXZpb3JdKGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29uc3RydWN0LXN0eWxlc2hlZXRzLyN1c2luZy1jb25zdHJ1Y3RlZC1zdHlsZXNoZWV0cykuXG4gKiBOb3RlLCB3aGVuIHNoaW1taW5nIGlzIHVzZWQsIGFueSBzdHlsZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IHBsYWNlZCBpbnRvXG4gKiB0aGUgc2hhZG93Um9vdCBzaG91bGQgYmUgcGxhY2VkICpiZWZvcmUqIGFueSBzaGltbWVkIGFkb3B0ZWQgc3R5bGVzLiBUaGlzXG4gKiB3aWxsIG1hdGNoIHNwZWMgYmVoYXZpb3IgdGhhdCBnaXZlcyBhZG9wdGVkIHNoZWV0cyBwcmVjZWRlbmNlIG92ZXIgc3R5bGVzIGluXG4gKiBzaGFkb3dSb290LlxuICovXG5leHBvcnQgY29uc3QgYWRvcHRTdHlsZXMgPSAoXG4gIHJlbmRlclJvb3Q6IFNoYWRvd1Jvb3QsXG4gIHN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+XG4pID0+IHtcbiAgaWYgKHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cykge1xuICAgIChyZW5kZXJSb290IGFzIFNoYWRvd1Jvb3QpLmFkb3B0ZWRTdHlsZVNoZWV0cyA9IHN0eWxlcy5tYXAoKHMpID0+XG4gICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHMgOiBzLnN0eWxlU2hlZXQhXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc3R5bGVzKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3Qgbm9uY2UgPSAoZ2xvYmFsIGFzIGFueSlbJ2xpdE5vbmNlJ107XG4gICAgICBpZiAobm9uY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICAgICAgfVxuICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAocyBhcyBDU1NSZXN1bHQpLmNzc1RleHQ7XG4gICAgICByZW5kZXJSb290LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0ID0gKHNoZWV0OiBDU1NTdHlsZVNoZWV0KSA9PiB7XG4gIGxldCBjc3NUZXh0ID0gJyc7XG4gIGZvciAoY29uc3QgcnVsZSBvZiBzaGVldC5jc3NSdWxlcykge1xuICAgIGNzc1RleHQgKz0gcnVsZS5jc3NUZXh0O1xuICB9XG4gIHJldHVybiB1bnNhZmVDU1MoY3NzVGV4dCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29tcGF0aWJsZVN0eWxlID1cbiAgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIHx8XG4gIChOT0RFX01PREUgJiYgZ2xvYmFsLkNTU1N0eWxlU2hlZXQgPT09IHVuZGVmaW5lZClcbiAgICA/IChzOiBDU1NSZXN1bHRPck5hdGl2ZSkgPT4gc1xuICAgIDogKHM6IENTU1Jlc3VsdE9yTmF0aXZlKSA9PlxuICAgICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0KHMpIDogcztcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBVc2UgdGhpcyBtb2R1bGUgaWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIGJhc2UgY2xhc3MgZXh0ZW5kaW5nXG4gKiB7QGxpbmsgUmVhY3RpdmVFbGVtZW50fS5cbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbmltcG9ydCB7XG4gIGdldENvbXBhdGlibGVTdHlsZSxcbiAgYWRvcHRTdHlsZXMsXG4gIENTU1Jlc3VsdEdyb3VwLFxuICBDU1NSZXN1bHRPck5hdGl2ZSxcbn0gZnJvbSAnLi9jc3MtdGFnLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgUmVhY3RpdmVDb250cm9sbGVyLFxuICBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LFxufSBmcm9tICcuL3JlYWN0aXZlLWNvbnRyb2xsZXIuanMnO1xuXG4vLyBJbiB0aGUgTm9kZSBidWlsZCwgdGhpcyBpbXBvcnQgd2lsbCBiZSBpbmplY3RlZCBieSBSb2xsdXA6XG4vLyBpbXBvcnQge0hUTUxFbGVtZW50LCBjdXN0b21FbGVtZW50c30gZnJvbSAnQGxpdC1sYWJzL3Nzci1kb20tc2hpbSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY3NzLXRhZy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnLi9yZWFjdGl2ZS1jb250cm9sbGVyLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBgcmVhZG9ubHlgIG1vZGlmaWVyIGZyb20gcHJvcGVydGllcyBpbiB0aGUgdW5pb24gSy5cbiAqXG4gKiBUaGlzIGlzIGEgc2FmZXIgd2F5IHRvIGNhc3QgYSB2YWx1ZSB0byBhIHR5cGUgd2l0aCBhIG11dGFibGUgdmVyc2lvbiBvZiBhXG4gKiByZWFkb25seSBmaWVsZCwgdGhhbiBjYXN0aW5nIHRvIGFuIGludGVyZmFjZSB3aXRoIHRoZSBmaWVsZCByZS1kZWNsYXJlZFxuICogYmVjYXVzZSBpdCBwcmVzZXJ2ZXMgdGhlIHR5cGUgb2YgYWxsIHRoZSBmaWVsZHMgYW5kIHdhcm5zIG9uIHR5cG9zLlxuICovXG50eXBlIE11dGFibGU8VCwgSyBleHRlbmRzIGtleW9mIFQ+ID0gT21pdDxULCBLPiAmIHtcbiAgLXJlYWRvbmx5IFtQIGluIGtleW9mIFBpY2s8VCwgSz5dOiBQIGV4dGVuZHMgSyA/IFRbUF0gOiBuZXZlcjtcbn07XG5cbi8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBBZGQgYGhhc093bmAgaGVyZSB3aGVuIHdlIHNoaXAgRVMyMDIyXG5jb25zdCB7XG4gIGlzLFxuICBkZWZpbmVQcm9wZXJ0eSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gIGdldFByb3RvdHlwZU9mLFxufSA9IE9iamVjdDtcblxuY29uc3QgTk9ERV9NT0RFID0gZmFsc2U7XG5cbi8vIExldHMgYSBtaW5pZmllciByZXBsYWNlIGdsb2JhbFRoaXMgcmVmZXJlbmNlcyB3aXRoIGEgbWluaWZpZWQgbmFtZVxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblxuaWYgKE5PREVfTU9ERSkge1xuICBnbG9iYWwuY3VzdG9tRWxlbWVudHMgPz89IGN1c3RvbUVsZW1lbnRzO1xufVxuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuY29uc3QgdHJ1c3RlZFR5cGVzID0gKGdsb2JhbCBhcyB1bmtub3duIGFzIHt0cnVzdGVkVHlwZXM/OiB7ZW1wdHlTY3JpcHQ6ICcnfX0pXG4gIC50cnVzdGVkVHlwZXM7XG5cbi8vIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBodHRwczovL2NyYnVnLmNvbS85OTMyNjhcbi8vIEN1cnJlbnRseSwgYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIFwib25cIiBpcyBjb25zaWRlcmVkIHRvIGJlIGFcbi8vIFRydXN0ZWRTY3JpcHQgc291cmNlLiBTdWNoIGJvb2xlYW4gYXR0cmlidXRlcyBtdXN0IGJlIHNldCB0byB0aGUgZXF1aXZhbGVudFxuLy8gdHJ1c3RlZCBlbXB0eVNjcmlwdCB2YWx1ZS5cbmNvbnN0IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA9IHRydXN0ZWRUeXBlc1xuICA/ICh0cnVzdGVkVHlwZXMuZW1wdHlTY3JpcHQgYXMgdW5rbm93biBhcyAnJylcbiAgOiAnJztcblxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgPyBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPSAoZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PVxuICAgIG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG5cbiAgaXNzdWVXYXJuaW5nKFxuICAgICdkZXYtbW9kZScsXG4gICAgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWBcbiAgKTtcblxuICAvLyBJc3N1ZSBwb2x5ZmlsbCBzdXBwb3J0IHdhcm5pbmcuXG4gIGlmIChnbG9iYWwuU2hhZHlET00/LmluVXNlICYmIHBvbHlmaWxsU3VwcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaXNzdWVXYXJuaW5nKFxuICAgICAgJ3BvbHlmaWxsLXN1cHBvcnQtbWlzc2luZycsXG4gICAgICBgU2hhZG93IERPTSBpcyBiZWluZyBwb2x5ZmlsbGVkIHZpYSBcXGBTaGFkeURPTVxcYCBidXQgYCArXG4gICAgICAgIGB0aGUgXFxgcG9seWZpbGwtc3VwcG9ydFxcYCBtb2R1bGUgaGFzIG5vdCBiZWVuIGxvYWRlZC5gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgUmVhY3RpdmVVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPSBVcGRhdGU7XG4gICAgZXhwb3J0IGludGVyZmFjZSBVcGRhdGUge1xuICAgICAga2luZDogJ3VwZGF0ZSc7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBEZWJ1Z0xvZ2dpbmdXaW5kb3cge1xuICAvLyBFdmVuIGluIGRldiBtb2RlLCB3ZSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0byBlbWl0IHRoZXNlIGV2ZW50cywgYXMgdGhhdCdzXG4gIC8vIGFub3RoZXIgbGV2ZWwgb2YgY29zdCwgc28gb25seSBlbWl0IHRoZW0gd2hlbiBERVZfTU9ERSBpcyB0cnVlIF9hbmRfIHdoZW5cbiAgLy8gd2luZG93LmVtaXRMaXREZWJ1Z0V2ZW50cyBpcyB0cnVlLlxuICBlbWl0TGl0RGVidWdMb2dFdmVudHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFVzZWZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIGxvZ2dpbmcgaW5zaWdodHMgaW50byB3aGF0IHRoZSBMaXQgdGVtcGxhdGUgc3lzdGVtIGlzIGRvaW5nLlxuICpcbiAqIENvbXBpbGVkIG91dCBvZiBwcm9kIG1vZGUgYnVpbGRzLlxuICovXG5jb25zdCBkZWJ1Z0xvZ0V2ZW50ID0gREVWX01PREVcbiAgPyAoZXZlbnQ6IFJlYWN0aXZlVW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8UmVhY3RpdmVVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeT4oJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIDogdW5kZWZpbmVkO1xuXG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG4vKipcbiAqIENvbnZlcnRzIHByb3BlcnR5IHZhbHVlcyB0byBhbmQgZnJvbSBhdHRyaWJ1dGUgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlIHZhbHVlIHRvIGEgcHJvcGVydHlcbiAgICogdmFsdWUuXG4gICAqL1xuICBmcm9tQXR0cmlidXRlPyh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZT86IFR5cGVIaW50KTogVHlwZTtcblxuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEl0IHJldHVybnMgdW5rbm93biBpbnN0ZWFkIG9mIHN0cmluZywgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3RydXN0ZWQtdHlwZXMgKGFuZCBzaW1pbGFyIGVmZm9ydHMpLlxuICAgKi9cbiAgdG9BdHRyaWJ1dGU/KHZhbHVlOiBUeXBlLCB0eXBlPzogVHlwZUhpbnQpOiB1bmtub3duO1xufVxuXG50eXBlIEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlID0gdW5rbm93biwgVHlwZUhpbnQgPSB1bmtub3duPiA9XG4gIHwgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlPlxuICB8ICgodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU/OiBUeXBlSGludCkgPT4gVHlwZSk7XG5cbi8qKlxuICogRGVmaW5lcyBvcHRpb25zIGZvciBhIHByb3BlcnR5IGFjY2Vzc29yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5RGVjbGFyYXRpb248VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBpbmRpY2F0ZXMgdGhlIHByb3BlcnR5IGlzIGludGVybmFsIHByaXZhdGUgc3RhdGUuIFRoZVxuICAgKiBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHNldCBieSB1c2Vycy4gV2hlbiB1c2luZyBUeXBlU2NyaXB0LCB0aGlzIHByb3BlcnR5XG4gICAqIHNob3VsZCBiZSBtYXJrZWQgYXMgYHByaXZhdGVgIG9yIGBwcm90ZWN0ZWRgLCBhbmQgaXQgaXMgYWxzbyBhIGNvbW1vblxuICAgKiBwcmFjdGljZSB0byB1c2UgYSBsZWFkaW5nIGBfYCBpbiB0aGUgbmFtZS4gVGhlIHByb3BlcnR5IGlzIG5vdCBhZGRlZCB0b1xuICAgKiBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBhbmQgd2hldGhlciB0aGUgcHJvcGVydHkgYmVjb21lcyBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUuXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgcHJvcGVydHkgaXMgbm90IGFkZGVkIHRvIGBvYnNlcnZlZEF0dHJpYnV0ZXNgLlxuICAgKiBJZiB0cnVlIG9yIGFic2VudCwgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZSBpcyBvYnNlcnZlZCAoZS5nLiBgZm9vQmFyYFxuICAgKiBiZWNvbWVzIGBmb29iYXJgKS4gSWYgYSBzdHJpbmcsIHRoZSBzdHJpbmcgdmFsdWUgaXMgb2JzZXJ2ZWQgKGUuZ1xuICAgKiBgYXR0cmlidXRlOiAnZm9vLWJhcidgKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZT86IGJvb2xlYW4gfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgaXMgdXNlZCBvbmx5IGFzIGEgaGludCBmb3IgdGhlXG4gICAqIGBjb252ZXJ0ZXJgIHRvIGRldGVybWluZSBob3cgdG8gY29udmVydCB0aGUgYXR0cmlidXRlXG4gICAqIHRvL2Zyb20gYSBwcm9wZXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBUeXBlSGludDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgdG8vZnJvbSBhIHByb3BlcnR5LiBJZiB0aGlzIHZhbHVlXG4gICAqIGlzIGEgZnVuY3Rpb24sIGl0IGlzIHVzZWQgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIHZhbHVlIGEgdGhlIHByb3BlcnR5XG4gICAqIHZhbHVlLiBJZiBpdCdzIGFuIG9iamVjdCwgaXQgY2FuIGhhdmUga2V5cyBmb3IgYGZyb21BdHRyaWJ1dGVgIGFuZFxuICAgKiBgdG9BdHRyaWJ1dGVgLiBJZiBubyBgdG9BdHRyaWJ1dGVgIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFuZFxuICAgKiBgcmVmbGVjdGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCBkaXJlY3RseSB0byB0aGVcbiAgICogYXR0cmlidXRlLiBBIGRlZmF1bHQgYGNvbnZlcnRlcmAgaXMgdXNlZCBpZiBub25lIGlzIHByb3ZpZGVkOyBpdCBzdXBwb3J0c1xuICAgKiBgQm9vbGVhbmAsIGBTdHJpbmdgLCBgTnVtYmVyYCwgYE9iamVjdGAsIGFuZCBgQXJyYXlgLiBOb3RlLFxuICAgKiB3aGVuIGEgcHJvcGVydHkgY2hhbmdlcyBhbmQgdGhlIGNvbnZlcnRlciBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgYXR0cmlidXRlLFxuICAgKiB0aGUgcHJvcGVydHkgaXMgbmV2ZXIgdXBkYXRlZCBhZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGUgYXR0cmlidXRlIGNoYW5naW5nLFxuICAgKiBhbmQgdmljZSB2ZXJzYS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnZlcnRlcj86IEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlLCBUeXBlSGludD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIHJlZmxlY3QgdG8gYW4gYXR0cmlidXRlLlxuICAgKiBJZiBgdHJ1ZWAsIHdoZW4gdGhlIHByb3BlcnR5IGlzIHNldCwgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgdXNpbmcgdGhlXG4gICAqIGF0dHJpYnV0ZSBuYW1lIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIGBhdHRyaWJ1dGVgXG4gICAqIHByb3BlcnR5IG9wdGlvbiBhbmQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBjb252ZXJ0ZWQgdXNpbmcgdGhlIHJ1bGVzXG4gICAqIGZyb20gdGhlIGBjb252ZXJ0ZXJgIHByb3BlcnR5IG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmxlY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgaW5kaWNhdGVzIGlmIGEgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgY2hhbmdlZCB3aGVuXG4gICAqIGl0IGlzIHNldC4gVGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHRoZSBgbmV3VmFsdWVgIGFuZCBgb2xkVmFsdWVgIGFuZFxuICAgKiByZXR1cm4gYHRydWVgIGlmIGFuIHVwZGF0ZSBzaG91bGQgYmUgcmVxdWVzdGVkLlxuICAgKi9cbiAgaGFzQ2hhbmdlZD8odmFsdWU6IFR5cGUsIG9sZFZhbHVlOiBUeXBlKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHByb3BlcnR5LiBCeVxuICAgKiBkZWZhdWx0LCBhbiBhY2Nlc3NvciB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBwcm9wZXJ0eSB0aGF0IHJlcXVlc3RzIGFuXG4gICAqIHVwZGF0ZSB3aGVuIHNldC4gSWYgdGhpcyBmbGFnIGlzIGB0cnVlYCwgbm8gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkLCBhbmRcbiAgICogaXQgd2lsbCBiZSB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGxcbiAgICogYHRoaXMucmVxdWVzdFVwZGF0ZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlKWAgdG8gcmVxdWVzdCBhbiB1cGRhdGUgd2hlblxuICAgKiB0aGUgcHJvcGVydHkgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG5vQWNjZXNzb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JhcHBpbmcgYWNjZXNzb3JzLiBUaGlzIGlzIHNldCBieSBgQHByb3BlcnR5YFxuICAgKiB0byBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICB3cmFwcGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXAgb2YgcHJvcGVydGllcyB0byBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuIEZvciBlYWNoIHByb3BlcnR5IGFuXG4gKiBhY2Nlc3NvciBpcyBtYWRlLCBhbmQgdGhlIHByb3BlcnR5IGlzIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlEZWNsYXJhdGlvbnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURlY2xhcmF0aW9uO1xufVxuXG50eXBlIFByb3BlcnR5RGVjbGFyYXRpb25NYXAgPSBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+O1xuXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIFByb3BlcnR5S2V5PjtcblxuLyoqXG4gKiBBIE1hcCBvZiBwcm9wZXJ0eSBrZXlzIHRvIHZhbHVlcy5cbiAqXG4gKiBUYWtlcyBhbiBvcHRpb25hbCB0eXBlIHBhcmFtZXRlciBULCB3aGljaCB3aGVuIHNwZWNpZmllZCBhcyBhIG5vbi1hbnksXG4gKiBub24tdW5rbm93biB0eXBlLCB3aWxsIG1ha2UgdGhlIE1hcCBtb3JlIHN0cm9uZ2x5LXR5cGVkLCBhc3NvY2lhdGluZyB0aGUgbWFwXG4gKiBrZXlzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZSB0eXBlIG9uIFQuXG4gKlxuICogVXNlIGBQcm9wZXJ0eVZhbHVlczx0aGlzPmAgd2hlbiBvdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC51cGRhdGUoKSBhbmRcbiAqIG90aGVyIGxpZmVjeWNsZSBtZXRob2RzIGluIG9yZGVyIHRvIGdldCBzdHJvbmdlciB0eXBlLWNoZWNraW5nIG9uIGtleXNcbiAqIGFuZCB2YWx1ZXMuXG4gKi9cbi8vIFRoaXMgdHlwZSBpcyBjb25kaXRpb25hbCBzbyB0aGF0IGlmIHRoZSBwYXJhbWV0ZXIgVCBpcyBub3Qgc3BlY2lmaWVkLCBvclxuLy8gaXMgYGFueWAsIHRoZSB0eXBlIHdpbGwgaW5jbHVkZSBgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPmAuIFNpbmNlIFQgaXMgbm90XG4vLyBnaXZlbiBpbiB0aGUgdXNlcyBvZiBQcm9wZXJ0eVZhbHVlcyBpbiB0aGlzIGZpbGUsIGFsbCB1c2VzIGhlcmUgZmFsbGJhY2sgdG9cbi8vIG1lYW5pbmcgYE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj5gLCBidXQgaWYgYSBkZXZlbG9wZXIgdXNlc1xuLy8gYFByb3BlcnR5VmFsdWVzPHRoaXM+YCAob3IgYW55IG90aGVyIHZhbHVlIGZvciBUKSB0aGV5IHdpbGwgZ2V0IGFcbi8vIHN0cm9uZ2x5LXR5cGVkIE1hcCB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFByb3BlcnR5VmFsdWVzPFQgPSBhbnk+ID0gVCBleHRlbmRzIG9iamVjdFxuICA/IFByb3BlcnR5VmFsdWVNYXA8VD5cbiAgOiBNYXA8UHJvcGVydHlLZXksIHVua25vd24+O1xuXG4vKipcbiAqIERvIG5vdCB1c2UsIGluc3RlYWQgcHJlZmVyIHtAbGlua2NvZGUgUHJvcGVydHlWYWx1ZXN9LlxuICovXG4vLyBUaGlzIHR5cGUgbXVzdCBiZSBleHBvcnRlZCBzdWNoIHRoYXQgSmF2YVNjcmlwdCBnZW5lcmF0ZWQgYnkgdGhlIEdvb2dsZVxuLy8gQ2xvc3VyZSBDb21waWxlciBjYW4gaW1wb3J0IGEgdHlwZSByZWZlcmVuY2UuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5VmFsdWVNYXA8VD4gZXh0ZW5kcyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+IHtcbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogVFtLXSB8IHVuZGVmaW5lZDtcbiAgc2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIHZhbHVlOiBUW0tdKTogdGhpcztcbiAgaGFzPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbiAgZGVsZXRlPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIgPSB7XG4gIHRvQXR0cmlidXRlKHZhbHVlOiB1bmtub3duLCB0eXBlPzogdW5rbm93bik6IHVua25vd24ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID8gZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIDogbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9iamVjdDpcbiAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgcGFzcyB0aGlzIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWxsb3cgcmVtb3Zpbmcvbm8gY2hhbmdlIGJlaGF2aW9yLlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID09IG51bGwgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bikge1xuICAgIGxldCBmcm9tVmFsdWU6IHVua25vd24gPSB2YWx1ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgZnJvbVZhbHVlID0gdmFsdWUgIT09IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICBjYXNlIEFycmF5OlxuICAgICAgICAvLyBEbyAqbm90KiBnZW5lcmF0ZSBleGNlcHRpb24gd2hlbiBpbnZhbGlkIEpTT04gaXMgc2V0IGFzIGVsZW1lbnRzXG4gICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNvbXBsYWluIG9uIGJlaW5nIG1pcy1jb25maWd1cmVkLlxuICAgICAgICAvLyBUT0RPKHNvcnZlbGwpOiBEbyBnZW5lcmF0ZSBleGNlcHRpb24gaW4gKmRldiBtb2RlKi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBc3NlcnQgdG8gYWRoZXJlIHRvIEJhemVsJ3MgXCJtdXN0IHR5cGUgYXNzZXJ0IEpTT04gcGFyc2VcIiBydWxlLlxuICAgICAgICAgIGZyb21WYWx1ZSA9IEpTT04ucGFyc2UodmFsdWUhKSBhcyB1bmtub3duO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZnJvbVZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21WYWx1ZTtcbiAgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzQ2hhbmdlZCB7XG4gICh2YWx1ZTogdW5rbm93biwgb2xkOiB1bmtub3duKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBkaWZmZXJlbnQgZnJvbSBgb2xkVmFsdWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsOiBIYXNDaGFuZ2VkID0gKHZhbHVlOiB1bmtub3duLCBvbGQ6IHVua25vd24pOiBib29sZWFuID0+XG4gICFpcyh2YWx1ZSwgb2xkKTtcblxuY29uc3QgZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb246IFByb3BlcnR5RGVjbGFyYXRpb24gPSB7XG4gIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxuICBjb252ZXJ0ZXI6IGRlZmF1bHRDb252ZXJ0ZXIsXG4gIHJlZmxlY3Q6IGZhbHNlLFxuICBoYXNDaGFuZ2VkOiBub3RFcXVhbCxcbn07XG5cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRldiBtb2RlIHdhcm5pbmcgY2F0ZWdvcmllcy5cbiAqL1xuZXhwb3J0IHR5cGUgV2FybmluZ0tpbmQgPVxuICB8ICdjaGFuZ2UtaW4tdXBkYXRlJ1xuICB8ICdtaWdyYXRpb24nXG4gIHwgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJztcblxuZXhwb3J0IHR5cGUgSW5pdGlhbGl6ZXIgPSAoZWxlbWVudDogUmVhY3RpdmVFbGVtZW50KSA9PiB2b2lkO1xuXG4vLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFN5bWJvbENvbnN0cnVjdG9yIHtcbiAgICByZWFkb25seSBtZXRhZGF0YTogdW5pcXVlIHN5bWJvbDtcbiAgfVxufVxuXG4vLyBFbnN1cmUgbWV0YWRhdGEgaXMgZW5hYmxlZC4gVHlwZVNjcmlwdCBkb2VzIG5vdCBwb2x5ZmlsbFxuLy8gU3ltYm9sLm1ldGFkYXRhLCBzbyB3ZSBtdXN0IGVuc3VyZSB0aGF0IGl0IGV4aXN0cy5cbihTeW1ib2wgYXMge21ldGFkYXRhOiBzeW1ib2x9KS5tZXRhZGF0YSA/Pz0gU3ltYm9sKCdtZXRhZGF0YScpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoaXMgaXMgcHVibGljIGdsb2JhbCBBUEksIGRvIG5vdCBjaGFuZ2UhXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12YXJcbiAgdmFyIGxpdFByb3BlcnR5TWV0YWRhdGE6IFdlYWtNYXA8XG4gICAgb2JqZWN0LFxuICAgIE1hcDxQcm9wZXJ0eUtleSwgUHJvcGVydHlEZWNsYXJhdGlvbj5cbiAgPjtcbn1cblxuLy8gTWFwIGZyb20gYSBjbGFzcydzIG1ldGFkYXRhIG9iamVjdCB0byBwcm9wZXJ0eSBvcHRpb25zXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCB1c2UgbnVsbGlzaC1jb2FsZXNjaW5nIGFzc2lnbm1lbnQgc28gdGhhdCB3ZSBvbmx5IHVzZSBvbmVcbi8vIG1hcCBldmVuIGlmIHdlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS5cbmdsb2JhbC5saXRQcm9wZXJ0eU1ldGFkYXRhID8/PSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+XG4+KCk7XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHdoaWNoIG1hbmFnZXMgZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiBXaGVuXG4gKiBwcm9wZXJ0aWVzIGNoYW5nZSwgdGhlIGB1cGRhdGVgIG1ldGhvZCBpcyBhc3luY2hyb25vdXNseSBjYWxsZWQuIFRoaXMgbWV0aG9kXG4gKiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgc3ViY2xhc3NlcyB0byByZW5kZXIgdXBkYXRlcyBhcyBkZXNpcmVkLlxuICogQG5vSW5oZXJpdERvY1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVhY3RpdmVFbGVtZW50XG4gIC8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGBleHRlbmRzYCBjbGF1c2Ugd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoXG4gIC8vIGAoZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCA/PyBIVE1MRWxlbWVudClgLlxuICAvL1xuICAvLyBUaGlzIHdheSwgd2Ugd2lsbCBmaXJzdCBwcmVmZXIgYW55IGdsb2JhbCBgSFRNTEVsZW1lbnRgIHBvbHlmaWxsIHRoYXQgdGhlXG4gIC8vIHVzZXIgaGFzIGFzc2lnbmVkLCBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGBIVE1MRWxlbWVudGAgc2hpbSB3aGljaCBoYXNcbiAgLy8gYmVlbiBpbXBvcnRlZCAoc2VlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUgYWJvdXQgaG93IHRoaXMgaW1wb3J0IGlzXG4gIC8vIGdlbmVyYXRlZCBieSBSb2xsdXApLiBOb3RlIHRoYXQgdGhlIGBIVE1MRWxlbWVudGAgdmFyaWFibGUgaGFzIGJlZW5cbiAgLy8gc2hhZG93ZWQgYnkgdGhpcyBpbXBvcnQsIHNvIGl0IG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGdsb2JhbC5cbiAgZXh0ZW5kcyBIVE1MRWxlbWVudFxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlckhvc3RcbntcbiAgLy8gTm90ZTogdGhlc2UgYXJlIHBhdGNoZWQgaW4gb25seSBpbiBERVZfTU9ERS5cbiAgLyoqXG4gICAqIFJlYWQgb3Igc2V0IGFsbCB0aGUgZW5hYmxlZCB3YXJuaW5nIGNhdGVnb3JpZXMgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIGluIGRldmVsb3BtZW50IGJ1aWxkcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGRldi1tb2RlXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlZFdhcm5pbmdzPzogV2FybmluZ0tpbmRbXTtcblxuICAvKipcbiAgICogRW5hYmxlIHRoZSBnaXZlbiB3YXJuaW5nIGNhdGVnb3J5IGZvciB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBpbiBkZXZlbG9wbWVudCBidWlsZHMsIHNvIGl0IHNob3VsZCBiZSBhY2Nlc3NlZFxuICAgKiB3aXRoIGEgZ3VhcmQgbGlrZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRW5hYmxlIGZvciBhbGwgUmVhY3RpdmVFbGVtZW50IHN1YmNsYXNzZXNcbiAgICogUmVhY3RpdmVFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIEVuYWJsZSBmb3Igb25seSBNeUVsZW1lbnQgYW5kIHN1YmNsYXNzZXNcbiAgICogTXlFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgZGV2LW1vZGVcbiAgICovXG4gIHN0YXRpYyBlbmFibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0aGUgZ2l2ZW4gd2FybmluZyBjYXRlZ29yeSBmb3IgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzLCBzbyBpdCBzaG91bGQgYmUgYWNjZXNzZWRcbiAgICogd2l0aCBhIGd1YXJkIGxpa2U6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERpc2FibGUgZm9yIGFsbCBSZWFjdGl2ZUVsZW1lbnQgc3ViY2xhc3Nlc1xuICAgKiBSZWFjdGl2ZUVsZW1lbnQuZGlzYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIERpc2FibGUgZm9yIG9ubHkgTXlFbGVtZW50IGFuZCBzdWJjbGFzc2VzXG4gICAqIE15RWxlbWVudC5kaXNhYmxlV2FybmluZz8uKCdtaWdyYXRpb24nKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBkZXYtbW9kZVxuICAgKi9cbiAgc3RhdGljIGRpc2FibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbml0aWFsaXplciBmdW5jdGlvbiB0byB0aGUgY2xhc3MgdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGluc3RhbmNlXG4gICAqIGNvbnN0cnVjdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBydW5zIGFnYWluc3QgYSBgUmVhY3RpdmVFbGVtZW50YFxuICAgKiBzdWJjbGFzcywgc3VjaCBhcyBhIGRlY29yYXRvciwgdGhhdCBuZWVkcyB0byBkbyB3b3JrIGZvciBlYWNoXG4gICAqIGluc3RhbmNlLCBzdWNoIGFzIHNldHRpbmcgdXAgYSBgUmVhY3RpdmVDb250cm9sbGVyYC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29uc3QgbXlEZWNvcmF0b3IgPSAodGFyZ2V0OiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LCBrZXk6IHN0cmluZykgPT4ge1xuICAgKiAgIHRhcmdldC5hZGRJbml0aWFsaXplcigoaW5zdGFuY2U6IFJlYWN0aXZlRWxlbWVudCkgPT4ge1xuICAgKiAgICAgLy8gVGhpcyBpcyBydW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgKiAgICAgbmV3IE15Q29udHJvbGxlcihpbnN0YW5jZSk7XG4gICAqICAgfSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIERlY29yYXRpbmcgYSBmaWVsZCB3aWxsIHRoZW4gY2F1c2UgZWFjaCBpbnN0YW5jZSB0byBydW4gYW4gaW5pdGlhbGl6ZXJcbiAgICogdGhhdCBhZGRzIGEgY29udHJvbGxlcjpcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgQG15RGVjb3JhdG9yIGZvbztcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogSW5pdGlhbGl6ZXJzIGFyZSBzdG9yZWQgcGVyLWNvbnN0cnVjdG9yLiBBZGRpbmcgYW4gaW5pdGlhbGl6ZXIgdG8gYVxuICAgKiBzdWJjbGFzcyBkb2VzIG5vdCBhZGQgaXQgdG8gYSBzdXBlcmNsYXNzLiBTaW5jZSBpbml0aWFsaXplcnMgYXJlIHJ1biBpblxuICAgKiBjb25zdHJ1Y3RvcnMsIGluaXRpYWxpemVycyB3aWxsIHJ1biBpbiBvcmRlciBvZiB0aGUgY2xhc3MgaGllcmFyY2h5LFxuICAgKiBzdGFydGluZyB3aXRoIHN1cGVyY2xhc3NlcyBhbmQgcHJvZ3Jlc3NpbmcgdG8gdGhlIGluc3RhbmNlJ3MgY2xhc3MuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAodGhpcy5faW5pdGlhbGl6ZXJzID8/PSBbXSkucHVzaChpbml0aWFsaXplcik7XG4gIH1cblxuICBzdGF0aWMgX2luaXRpYWxpemVycz86IEluaXRpYWxpemVyW107XG5cbiAgLypcbiAgICogRHVlIHRvIGNsb3N1cmUgY29tcGlsZXIgRVM2IGNvbXBpbGF0aW9uIGJ1Z3MsIEBub2NvbGxhcHNlIGlzIHJlcXVpcmVkIG9uXG4gICAqIGFsbCBzdGF0aWMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB3aXRoIGluaXRpYWxpemVycy4gIFJlZmVyZW5jZTpcbiAgICogLSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzE3NzZcbiAgICovXG5cbiAgLyoqXG4gICAqIE1hcHMgYXR0cmlidXRlIG5hbWVzIHRvIHByb3BlcnRpZXM7IGZvciBleGFtcGxlIGBmb29iYXJgIGF0dHJpYnV0ZSB0b1xuICAgKiBgZm9vQmFyYCBwcm9wZXJ0eS4gQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGVcbiAgICogY2xhc3MuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXA6IEF0dHJpYnV0ZU1hcDtcblxuICAvKipcbiAgICogTWFya3MgY2xhc3MgYXMgaGF2aW5nIGJlZW4gZmluYWxpemVkLCB3aGljaCBpbmNsdWRlcyBjcmVhdGluZyBwcm9wZXJ0aWVzXG4gICAqIGZyb20gYHN0YXRpYyBwcm9wZXJ0aWVzYCwgYnV0IGRvZXMgKm5vdCogaW5jbHVkZSBhbGwgcHJvcGVydGllcyBjcmVhdGVkXG4gICAqIGZyb20gZGVjb3JhdG9ycy5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVkOiB0cnVlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBNZW1vaXplZCBsaXN0IG9mIGFsbCBlbGVtZW50IHByb3BlcnRpZXMsIGluY2x1ZGluZyBhbnkgc3VwZXJjbGFzc1xuICAgKiBwcm9wZXJ0aWVzLiBDcmVhdGVkIGxhemlseSBvbiB1c2VyIHN1YmNsYXNzZXMgd2hlbiBmaW5hbGl6aW5nIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBlbGVtZW50UHJvcGVydGllczogUHJvcGVydHlEZWNsYXJhdGlvbk1hcDtcblxuICAvKipcbiAgICogVXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCBtYXBzIHByb3BlcnR5IG5hbWVzIHRvIGBQcm9wZXJ0eURlY2xhcmF0aW9uYFxuICAgKiBvYmplY3RzIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgcmVhY3RpdmUgcHJvcGVydGllcy4gV2hlblxuICAgKiBhIHJlYWN0aXZlIHByb3BlcnR5IGlzIHNldCB0aGUgZWxlbWVudCB3aWxsIHVwZGF0ZSBhbmQgcmVuZGVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHByb3BlcnRpZXMgYXJlIHB1YmxpYyBmaWVsZHMsIGFuZCBhcyBzdWNoLCB0aGV5IHNob3VsZCBiZVxuICAgKiBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLCBlaXRoZXIgdmlhIGF0dHJpYnV0ZSBvclxuICAgKiB0aGUgcHJvcGVydHkgaXRzZWxmLlxuICAgKlxuICAgKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICAgKiBwcm90ZWN0ZWQgZmllbGRzIGFuZCBzaG91bGQgdXNlIHRoZSBgc3RhdGU6IHRydWVgIG9wdGlvbi4gUHJvcGVydGllc1xuICAgKiBtYXJrZWQgYXMgYHN0YXRlYCBkbyBub3QgcmVmbGVjdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBIb3dldmVyLCBzb21ldGltZXMgZWxlbWVudCBjb2RlIGRvZXMgbmVlZCB0byBzZXQgYSBwdWJsaWMgcHJvcGVydHkuIFRoaXNcbiAgICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gICAqIHNob3VsZCBiZSBmaXJlZCBpbmZvcm1pbmcgdGhlIHVzZXI7IGZvciBleGFtcGxlLCBhIGNoZWNrYm94IHNldHMgaXRzXG4gICAqIGBjaGVja2VkYCBwcm9wZXJ0eSB3aGVuIGNsaWNrZWQgYW5kIGZpcmVzIGEgYGNoYW5nZWRgIGV2ZW50LiBNdXRhdGluZ1xuICAgKiBwdWJsaWMgcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3JcbiAgICogYXJyYXkpIHByb3BlcnRpZXMuIEluIG90aGVyIGNhc2VzIHdoZW4gYW4gZWxlbWVudCBuZWVkcyB0byBtYW5hZ2Ugc3RhdGUsIGFcbiAgICogcHJpdmF0ZSBwcm9wZXJ0eSBzZXQgd2l0aCB0aGUgYHN0YXRlOiB0cnVlYCBvcHRpb24gc2hvdWxkIGJlIHVzZWQuIFdoZW5cbiAgICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAgICogZmFjaWxpdGF0ZSBjb21wbGV4IGludGVyYWN0aW9ucy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9ucztcblxuICAvKipcbiAgICogTWVtb2l6ZWQgbGlzdCBvZiBhbGwgZWxlbWVudCBzdHlsZXMuXG4gICAqIENyZWF0ZWQgbGF6aWx5IG9uIHVzZXIgc3ViY2xhc3NlcyB3aGVuIGZpbmFsaXppbmcgdGhlIGNsYXNzLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAqL1xuICBzdGF0aWMgZWxlbWVudFN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+ID0gW107XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHN0eWxlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudC4gVGhlIHN0eWxlcyBzaG91bGQgYmUgZGVmaW5lZFxuICAgKiB1c2luZyB0aGUge0BsaW5rY29kZSBjc3N9IHRhZyBmdW5jdGlvbiwgdmlhIGNvbnN0cnVjdGlibGUgc3R5bGVzaGVldHMsIG9yXG4gICAqIGltcG9ydGVkIGZyb20gbmF0aXZlIENTUyBtb2R1bGUgc2NyaXB0cy5cbiAgICpcbiAgICogTm90ZSBvbiBDb250ZW50IFNlY3VyaXR5IFBvbGljeTpcbiAgICpcbiAgICogRWxlbWVudCBzdHlsZXMgYXJlIGltcGxlbWVudGVkIHdpdGggYDxzdHlsZT5gIHRhZ3Mgd2hlbiB0aGUgYnJvd3NlciBkb2Vzbid0XG4gICAqIHN1cHBvcnQgYWRvcHRlZCBTdHlsZVNoZWV0cy4gVG8gdXNlIHN1Y2ggYDxzdHlsZT5gIHRhZ3Mgd2l0aCB0aGUgc3R5bGUtc3JjXG4gICAqIENTUCBkaXJlY3RpdmUsIHRoZSBzdHlsZS1zcmMgdmFsdWUgbXVzdCBlaXRoZXIgaW5jbHVkZSAndW5zYWZlLWlubGluZScgb3JcbiAgICogYG5vbmNlLTxiYXNlNjQtdmFsdWU+YCB3aXRoIGA8YmFzZTY0LXZhbHVlPmAgcmVwbGFjZWQgYmUgYSBzZXJ2ZXItZ2VuZXJhdGVkXG4gICAqIG5vbmNlLlxuICAgKlxuICAgKiBUbyBwcm92aWRlIGEgbm9uY2UgdG8gdXNlIG9uIGdlbmVyYXRlZCBgPHN0eWxlPmAgZWxlbWVudHMsIHNldFxuICAgKiBgd2luZG93LmxpdE5vbmNlYCB0byBhIHNlcnZlci1nZW5lcmF0ZWQgbm9uY2UgaW4geW91ciBwYWdlJ3MgSFRNTCwgYmVmb3JlXG4gICAqIGxvYWRpbmcgYXBwbGljYXRpb24gY29kZTpcbiAgICpcbiAgICogYGBgaHRtbFxuICAgKiA8c2NyaXB0PlxuICAgKiAgIC8vIEdlbmVyYXRlZCBhbmQgdW5pcXVlIHBlciByZXF1ZXN0OlxuICAgKiAgIHdpbmRvdy5saXROb25jZSA9ICdhMWIyYzNkNCc7XG4gICAqIDwvc2NyaXB0PlxuICAgKiBgYGBcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlcz86IENTU1Jlc3VsdEdyb3VwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvcGVydGllcy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGF0dHJpYnV0ZXNcbiAgICovXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIC8vIEVuc3VyZSB3ZSd2ZSBjcmVhdGVkIGFsbCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIC8vIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGlzIG9ubHkgdW5kZWZpbmVkIGFmdGVyIGZpbmFsaXplKCkgaW5cbiAgICAvLyBSZWFjdGl2ZUVsZW1lbnQgaXRzZWxmLiBSZWFjdGl2ZUVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzIGlzIG9ubHlcbiAgICAvLyBhY2Nlc3NlZCB3aXRoIFJlYWN0aXZlRWxlbWVudCBhcyB0aGUgcmVjZWl2ZXIgd2hlbiBhIHN1YmNsYXNzIG9yIG1peGluXG4gICAgLy8gY2FsbHMgc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwICYmIFsuLi50aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5rZXlzKCldXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX19pbnN0YW5jZVByb3BlcnRpZXM/OiBQcm9wZXJ0eVZhbHVlcyA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHByb3BlcnR5IGFjY2Vzc29yIG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZSBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAgICogYW5kIHN0b3JlcyBhIHtAbGlua2NvZGUgUHJvcGVydHlEZWNsYXJhdGlvbn0gZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZVxuICAgKiBnaXZlbiBvcHRpb25zLiBUaGUgcHJvcGVydHkgc2V0dGVyIGNhbGxzIHRoZSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYFxuICAgKiBwcm9wZXJ0eSBvcHRpb24gb3IgdXNlcyBhIHN0cmljdCBpZGVudGl0eSBjaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3RcbiAgICogdG8gcmVxdWVzdCBhbiB1cGRhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBwcm9wZXJ0aWVzOyBob3dldmVyLFxuICAgKiB3aGVuIGRvaW5nIHNvLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlci5jcmVhdGVQcm9wZXJ0eWAgdG8gZW5zdXJlXG4gICAqIHRoZSBwcm9wZXJ0eSBpcyBzZXR1cCBjb3JyZWN0bHkuIFRoaXMgbWV0aG9kIGNhbGxzXG4gICAqIGBnZXRQcm9wZXJ0eURlc2NyaXB0b3JgIGludGVybmFsbHkgdG8gZ2V0IGEgZGVzY3JpcHRvciB0byBpbnN0YWxsLlxuICAgKiBUbyBjdXN0b21pemUgd2hhdCBwcm9wZXJ0aWVzIGRvIHdoZW4gdGhleSBhcmUgZ2V0IG9yIHNldCwgb3ZlcnJpZGVcbiAgICogYGdldFByb3BlcnR5RGVzY3JpcHRvcmAuIFRvIGN1c3RvbWl6ZSB0aGUgb3B0aW9ucyBmb3IgYSBwcm9wZXJ0eSxcbiAgICogaW1wbGVtZW50IGBjcmVhdGVQcm9wZXJ0eWAgbGlrZSB0aGlzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBzdGF0aWMgY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucykge1xuICAgKiAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtteU9wdGlvbjogdHJ1ZX0pO1xuICAgKiAgIHN1cGVyLmNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGUgcHJvcGVydHksIGZvcmNlIHRoZSBhdHRyaWJ1dGUgdG8gZmFsc2UuXG4gICAgaWYgKG9wdGlvbnMuc3RhdGUpIHtcbiAgICAgIChvcHRpb25zIGFzIE11dGFibGU8UHJvcGVydHlEZWNsYXJhdGlvbiwgJ2F0dHJpYnV0ZSc+KS5hdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldChuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMubm9BY2Nlc3Nvcikge1xuICAgICAgY29uc3Qga2V5ID0gREVWX01PREVcbiAgICAgICAgPyAvLyBVc2UgU3ltYm9sLmZvciBpbiBkZXYgbW9kZSB0byBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbiBzdGF0ZVxuICAgICAgICAgIC8vIHdoZW4gZG9pbmcgSE1SLlxuICAgICAgICAgIFN5bWJvbC5mb3IoYCR7U3RyaW5nKG5hbWUpfSAoQHByb3BlcnR5KCkgY2FjaGUpYClcbiAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGJlIGRlZmluZWQgb24gdGhlIGdpdmVuIG5hbWVkIHByb3BlcnR5LlxuICAgKiBJZiBubyBkZXNjcmlwdG9yIGlzIHJldHVybmVkLCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmVjb21lIGFuIGFjY2Vzc29yLlxuICAgKiBGb3IgZXhhbXBsZSxcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpIHtcbiAgICogICAgIGNvbnN0IGRlZmF1bHREZXNjcmlwdG9yID1cbiAgICogICAgICAgICBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKTtcbiAgICogICAgIGNvbnN0IHNldHRlciA9IGRlZmF1bHREZXNjcmlwdG9yLnNldDtcbiAgICogICAgIHJldHVybiB7XG4gICAqICAgICAgIGdldDogZGVmYXVsdERlc2NyaXB0b3IuZ2V0LFxuICAgKiAgICAgICBzZXQodmFsdWUpIHtcbiAgICogICAgICAgICBzZXR0ZXIuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAqICAgICAgICAgLy8gY3VzdG9tIGFjdGlvbi5cbiAgICogICAgICAgfSxcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHtnZXQsIHNldH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5wcm90b3R5cGUsIG5hbWUpID8/IHtcbiAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNba2V5IGFzIGtleW9mIHR5cGVvZiB0aGlzXTtcbiAgICAgIH0sXG4gICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiB1bmtub3duKSB7XG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW2tleV0gPSB2O1xuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChERVZfTU9ERSAmJiBnZXQgPT0gbnVsbCkge1xuICAgICAgaWYgKCd2YWx1ZScgaW4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge30pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICBgYnV0IGl0J3MgYWN0dWFsbHkgZGVjbGFyZWQgYXMgYSB2YWx1ZSBvbiB0aGUgcHJvdG90eXBlLiBgICtcbiAgICAgICAgICAgIGBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIHVzaW5nIEBwcm9wZXJ0eSBvciBAc3RhdGUgb24gYSBtZXRob2QuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAncmVhY3RpdmUtcHJvcGVydHktd2l0aG91dC1nZXR0ZXInLFxuICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9IHdhcyBkZWNsYXJlZCBhcyBhIHJlYWN0aXZlIHByb3BlcnR5IGAgK1xuICAgICAgICAgIGBidXQgaXQgZG9lcyBub3QgaGF2ZSBhIGdldHRlci4gVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIGEgYCArXG4gICAgICAgICAgYGZ1dHVyZSB2ZXJzaW9uIG9mIExpdC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgICBzZXQhLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAqIFRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBhIGBQcm9wZXJ0eURlY2xhcmF0aW9uYCB2aWEgdGhlIGBwcm9wZXJ0aWVzYFxuICAgKiBvYmplY3Qgb3IgdGhlIGBAcHJvcGVydHlgIGRlY29yYXRvciBhbmQgYXJlIHJlZ2lzdGVyZWQgaW5cbiAgICogYGNyZWF0ZVByb3BlcnR5KC4uLilgLlxuICAgKlxuICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBcImZpbmFsXCIgYW5kIG5vdCBvdmVycmlkZGVuLiBUb1xuICAgKiBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gcHJvcGVydHksIG92ZXJyaWRlXG4gICAqIHtAbGlua2NvZGUgY3JlYXRlUHJvcGVydHl9LlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAZmluYWxcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnMobmFtZTogUHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQobmFtZSkgPz8gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb247XG4gIH1cblxuICAvLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbiAgZGVjbGFyZSBzdGF0aWMgW1N5bWJvbC5tZXRhZGF0YV06IG9iamVjdCAmIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHN0YXRpYyBvd24gcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgdXNlZCBpbiBib29ra2VlcGluZ1xuICAgKiBmb3IgZWxlbWVudCBwcm9wZXJ0aWVzLCBpbml0aWFsaXplcnMsIGV0Yy5cbiAgICpcbiAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSBjb2RlIHRoYXQgbmVlZHMgdG8gZW5zdXJlIHRoZXNlXG4gICAqIHByb3BlcnRpZXMgZXhpc3QgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN1cGVyY2xhc3MgaXMgZmluYWxpemVkIHNvIHRoYXQgaW5oZXJpdGVkXG4gICAqIHByb3BlcnR5IG1ldGFkYXRhIGNhbiBiZSBjb3BpZWQgZG93bi5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fcHJlcGFyZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgdGhpcykpXG4gICAgKSB7XG4gICAgICAvLyBBbHJlYWR5IHByZXBhcmVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbmFsaXplIGFueSBzdXBlcmNsYXNzZXNcbiAgICBjb25zdCBzdXBlckN0b3IgPSBnZXRQcm90b3R5cGVPZih0aGlzKSBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIG93biBzZXQgb2YgaW5pdGlhbGl6ZXJzIGZvciB0aGlzIGNsYXNzIGlmIGFueSBleGlzdCBvbiB0aGVcbiAgICAvLyBzdXBlcmNsYXNzIGFuZCBjb3B5IHRoZW0gZG93bi4gTm90ZSwgZm9yIGEgc21hbGwgcGVyZiBib29zdCwgYXZvaWRcbiAgICAvLyBjcmVhdGluZyBpbml0aWFsaXplcnMgdW5sZXNzIG5lZWRlZC5cbiAgICBpZiAoc3VwZXJDdG9yLl9pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gWy4uLnN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzXTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50UHJvcGVydGllcyBmcm9tIHRoZSBzdXBlcmNsYXNzXG4gICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG5ldyBNYXAoc3VwZXJDdG9yLmVsZW1lbnRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyBzZXR0aW5nIHVwIHRoZSBjbGFzcyBzbyB0aGF0IGl0J3MgcmVhZHkgdG8gYmUgcmVnaXN0ZXJlZFxuICAgKiBhcyBhIGN1c3RvbSBlbGVtZW50IGFuZCBpbnN0YW50aWF0ZWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIuXG4gICAqIElmIHlvdSBvdmVycmlkZSB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlciwgeW91IG11c3QgZWl0aGVyIGNhbGxcbiAgICogc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHRvIHRyaWdnZXIgZmluYWxpemF0aW9uLCBvciBjYWxsIGZpbmFsaXplKClcbiAgICogeW91cnNlbGYuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsaXplKCkge1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIHRoaXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHN0YXRpYyBwcm9wZXJ0aWVzIGJsb2NrOlxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgcHJvcEtleXMgPSBbXG4gICAgICAgIC4uLmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLFxuICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcHMpLFxuICAgICAgXSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgcHJvcHM+O1xuICAgICAgZm9yIChjb25zdCBwIG9mIHByb3BLZXlzKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHkocCwgcHJvcHNbcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gc3RhbmRhcmQgZGVjb3JhdG9yIG1ldGFkYXRhOlxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpc1tTeW1ib2wubWV0YWRhdGFdO1xuICAgIGlmIChtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHAsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUtdG8tcHJvcGVydHkgbWFwXG4gICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgdGhpcy5lbGVtZW50UHJvcGVydGllcykge1xuICAgICAgY29uc3QgYXR0ciA9IHRoaXMuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocCwgb3B0aW9ucyk7XG4gICAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChhdHRyLCBwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTtcblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZVByb3BlcnR5JykpIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICduby1vdmVycmlkZS1jcmVhdGUtcHJvcGVydHknLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5jcmVhdGVQcm9wZXJ0eSgpIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFByb3BlcnR5RGVzY3JpcHRvcicpKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAnbm8tb3ZlcnJpZGUtZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3InLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB1c2VkIHdoZW4gY2FsbGluZyBgYXR0YWNoU2hhZG93YC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gY3VzdG9taXplXG4gICAqIHRoZSBvcHRpb25zIGZvciB0aGUgc2hhZG93Um9vdDsgZm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNsb3NlZFxuICAgKiBzaGFkb3dSb290OiBge21vZGU6ICdjbG9zZWQnfWAuXG4gICAqXG4gICAqIE5vdGUsIHRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgaW4gYGNyZWF0ZVJlbmRlclJvb3RgLiBJZiB0aGlzIG1ldGhvZFxuICAgKiBpcyBjdXN0b21pemVkLCBvcHRpb25zIHNob3VsZCBiZSByZXNwZWN0ZWQgaWYgcG9zc2libGUuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7bW9kZTogJ29wZW4nfTtcblxuICAvKipcbiAgICogVGFrZXMgdGhlIHN0eWxlcyB0aGUgdXNlciBzdXBwbGllZCB2aWEgdGhlIGBzdGF0aWMgc3R5bGVzYCBwcm9wZXJ0eSBhbmRcbiAgICogcmV0dXJucyB0aGUgYXJyYXkgb2Ygc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbnRlZ3JhdGUgaW50byBhIHN0eWxlIG1hbmFnZW1lbnQgc3lzdGVtLlxuICAgKlxuICAgKiBTdHlsZXMgYXJlIGRlZHVwbGljYXRlZCBwcmVzZXJ2aW5nIHRoZSBfbGFzdF8gaW5zdGFuY2UgaW4gdGhlIGxpc3QuIFRoaXNcbiAgICogaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gYXZvaWQgZHVwbGljYXRlZCBzdHlsZXMgdGhhdCBjYW4gb2NjdXJcbiAgICogZXNwZWNpYWxseSB3aGVuIGNvbXBvc2luZyB2aWEgc3ViY2xhc3NpbmcuIFRoZSBsYXN0IGl0ZW0gaXMga2VwdCB0byB0cnlcbiAgICogdG8gcHJlc2VydmUgdGhlIGNhc2NhZGUgb3JkZXIgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MgbW9zdCBpbXBvcnRhbnRcbiAgICogdGhhdCBsYXN0IGFkZGVkIHN0eWxlcyBvdmVycmlkZSBwcmV2aW91cyBzdHlsZXMuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVTdHlsZXMoXG4gICAgc3R5bGVzPzogQ1NTUmVzdWx0R3JvdXBcbiAgKTogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+IHtcbiAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuICAgICAgLy8gRGVkdXBlIHRoZSBmbGF0dGVuZWQgYXJyYXkgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgbGFzdCBpdGVtcy5cbiAgICAgIC8vIENhc3RpbmcgdG8gQXJyYXk8dW5rbm93bj4gd29ya3MgYXJvdW5kIFRTIGVycm9yIHRoYXRcbiAgICAgIC8vIGFwcGVhcnMgdG8gY29tZSBmcm9tIHRyeWluZyB0byBmbGF0dGVuIGEgdHlwZSBDU1NSZXN1bHRBcnJheS5cbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKHN0eWxlcyBhcyBBcnJheTx1bmtub3duPikuZmxhdChJbmZpbml0eSkucmV2ZXJzZSgpKTtcbiAgICAgIC8vIFRoZW4gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgYnkgYWRkaW5nIHRoZSBzZXQgaXRlbXMgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXQpIHtcbiAgICAgICAgZWxlbWVudFN0eWxlcy51bnNoaWZ0KGdldENvbXBhdGlibGVTdHlsZShzIGFzIENTU1Jlc3VsdE9yTmF0aXZlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxlbWVudFN0eWxlcy5wdXNoKGdldENvbXBhdGlibGVTdHlsZShzdHlsZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRTdHlsZXM7XG4gIH1cblxuICAvKipcbiAgICogTm9kZSBvciBTaGFkb3dSb290IGludG8gd2hpY2ggZWxlbWVudCBET00gc2hvdWxkIGJlIHJlbmRlcmVkLiBEZWZhdWx0c1xuICAgKiB0byBhbiBvcGVuIHNoYWRvd1Jvb3QuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlclJvb3QhOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgYG5hbWVgLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZTtcbiAgICByZXR1cm4gYXR0cmlidXRlID09PSBmYWxzZVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ3N0cmluZydcbiAgICAgID8gYXR0cmlidXRlXG4gICAgICA6IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJ1xuICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSB0byBhbiB1bnJlc29sdmVkIFByb21pc2Ugc28gd2UgY2FuIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBoYXNcbiAgLy8gY29ubmVjdGVkIGJlZm9yZSBmaXJzdCB1cGRhdGUuXG4gIHByaXZhdGUgX191cGRhdGVQcm9taXNlITogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgdXBkYXRlIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgYHJlcXVlc3RVcGRhdGUoKWAuXG4gICAqIFNob3VsZCBvbmx5IGJlIHJlYWQuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBpc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogSXMgc2V0IHRvIGB0cnVlYCBhZnRlciB0aGUgZmlyc3QgdXBkYXRlLiBUaGUgZWxlbWVudCBjb2RlIGNhbm5vdCBhc3N1bWVcbiAgICogdGhhdCBgcmVuZGVyUm9vdGAgZXhpc3RzIGJlZm9yZSB0aGUgZWxlbWVudCBgaGFzVXBkYXRlZGAuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBoYXNVcGRhdGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcCB3aXRoIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0XG4gICAqIHVwZGF0ZSBjeWNsZSB3aXRoIHByZXZpb3VzIHZhbHVlcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJGNoYW5nZWRQcm9wZXJ0aWVzITogUHJvcGVydHlWYWx1ZXM7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIHdoZW4gdXBkYXRlZC5cbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydGllcz86IFNldDxQcm9wZXJ0eUtleT47XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgY3VycmVudGx5IHJlZmxlY3RpbmcgcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydHk6IFByb3BlcnR5S2V5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBjb250cm9sbGVycy5cbiAgICovXG4gIHByaXZhdGUgX19jb250cm9sbGVycz86IFNldDxSZWFjdGl2ZUNvbnRyb2xsZXI+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fX2luaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBvbmx5IG92ZXJyaWRlIHBvaW50IGZvciBjdXN0b21pemluZyB3b3JrIGRvbmUgd2hlbiBlbGVtZW50c1xuICAgKiBhcmUgY29uc3RydWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9faW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KFxuICAgICAgKHJlcykgPT4gKHRoaXMuZW5hYmxlVXBkYXRpbmcgPSByZXMpXG4gICAgKTtcbiAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gVGhpcyBlbnF1ZXVlcyBhIG1pY3JvdGFzayB0aGF0IHVzdCBydW4gYmVmb3JlIHRoZSBmaXJzdCB1cGRhdGUsIHNvIGl0XG4gICAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlcXVlc3RVcGRhdGUoKVxuICAgIHRoaXMuX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCk7XG4gICAgLy8gZW5zdXJlcyBmaXJzdCB1cGRhdGUgd2lsbCBiZSBjYXVnaHQgYnkgYW4gZWFybHkgYWNjZXNzIG9mXG4gICAgLy8gYHVwZGF0ZUNvbXBsZXRlYFxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLl9pbml0aWFsaXplcnM/LmZvckVhY2goKGkpID0+XG4gICAgICBpKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZWxlbWVudCdzIHJlYWN0aXZlXG4gICAqIHVwZGF0ZSBjeWNsZS4gVGhlIGVsZW1lbnQgYXV0b21hdGljYWxseSBjYWxscyBpbnRvIGFueSByZWdpc3RlcmVkXG4gICAqIGNvbnRyb2xsZXJzIGR1cmluZyBpdHMgbGlmZWN5Y2xlIGNhbGxiYWNrcy5cbiAgICpcbiAgICogSWYgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHdoZW4gYGFkZENvbnRyb2xsZXIoKWAgaXMgY2FsbGVkLCB0aGVcbiAgICogY29udHJvbGxlcidzIGBob3N0Q29ubmVjdGVkKClgIGNhbGxiYWNrIHdpbGwgYmUgaW1tZWRpYXRlbHkgY2FsbGVkLlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgKHRoaXMuX19jb250cm9sbGVycyA/Pz0gbmV3IFNldCgpKS5hZGQoY29udHJvbGxlcik7XG4gICAgLy8gSWYgYSBjb250cm9sbGVyIGlzIGFkZGVkIGFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGNvbm5lY3RlZCxcbiAgICAvLyBjYWxsIGhvc3RDb25uZWN0ZWQuIE5vdGUsIHJlLXVzaW5nIGV4aXN0ZW5jZSBvZiBgcmVuZGVyUm9vdGAgaGVyZVxuICAgIC8vICh3aGljaCBpcyBzZXQgaW4gY29ubmVjdGVkQ2FsbGJhY2spIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFcbiAgICAvLyBmaXJzdCBjb25uZWN0ZWQgc3RhdGUuXG4gICAgaWYgKHRoaXMucmVuZGVyUm9vdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuaG9zdENvbm5lY3RlZD8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCBmcm9tIHRoZSBlbGVtZW50LlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIHJlbW92ZUNvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5kZWxldGUoY29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogRml4ZXMgYW55IHByb3BlcnRpZXMgc2V0IG9uIHRoZSBpbnN0YW5jZSBiZWZvcmUgdXBncmFkZSB0aW1lLlxuICAgKiBPdGhlcndpc2UgdGhlc2Ugd291bGQgc2hhZG93IHRoZSBhY2Nlc3NvciBhbmQgYnJlYWsgdGhlc2UgcHJvcGVydGllcy5cbiAgICogVGhlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBpbiBhIE1hcCB3aGljaCBpcyBwbGF5ZWQgYmFjayBhZnRlciB0aGVcbiAgICogY29uc3RydWN0b3IgcnVucy4gTm90ZSwgb24gdmVyeSBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpICg8PTkpIG9yIENocm9tZVxuICAgKiAoPD00MSksIHByb3BlcnRpZXMgY3JlYXRlZCBmb3IgbmF0aXZlIHBsYXRmb3JtIHByb3BlcnRpZXMgbGlrZSAoYGlkYCBvclxuICAgKiBgbmFtZWApIG1heSBub3QgaGF2ZSBkZWZhdWx0IHZhbHVlcyBzZXQgaW4gdGhlIGVsZW1lbnQgY29uc3RydWN0b3IuIE9uXG4gICAqIHRoZXNlIGJyb3dzZXJzIG5hdGl2ZSBwcm9wZXJ0aWVzIGFwcGVhciBvbiBpbnN0YW5jZXMgYW5kIHRoZXJlZm9yZSB0aGVpclxuICAgKiBkZWZhdWx0IHZhbHVlIHdpbGwgb3ZlcndyaXRlIGFueSBlbGVtZW50IGRlZmF1bHQgKGUuZy4gaWYgdGhlIGVsZW1lbnQgc2V0c1xuICAgKiB0aGlzLmlkID0gJ2lkJyBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSAnaWQnIHdpbGwgYmVjb21lICcnIHNpbmNlIHRoaXMgaXNcbiAgICogdGhlIG5hdGl2ZSBwbGF0Zm9ybSBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KCk7XG4gICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KVxuICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgIGZvciAoY29uc3QgcCBvZiBlbGVtZW50UHJvcGVydGllcy5rZXlzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxrZXlvZiB0aGlzPikge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgaW5zdGFuY2VQcm9wZXJ0aWVzLnNldChwLCB0aGlzW3BdKTtcbiAgICAgICAgZGVsZXRlIHRoaXNbcF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZVByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSBpbnN0YW5jZVByb3BlcnRpZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vZGUgaW50byB3aGljaCB0aGUgZWxlbWVudCBzaG91bGQgcmVuZGVyIGFuZCBieSBkZWZhdWx0XG4gICAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYW4gb3BlbiBzaGFkb3dSb290LiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHdoZXJlIHRoZVxuICAgKiBlbGVtZW50J3MgRE9NIGlzIHJlbmRlcmVkLiBGb3IgZXhhbXBsZSwgdG8gcmVuZGVyIGludG8gdGhlIGVsZW1lbnQnc1xuICAgKiBjaGlsZE5vZGVzLCByZXR1cm4gYHRoaXNgLlxuICAgKlxuICAgKiBAcmV0dXJuIFJldHVybnMgYSBub2RlIGludG8gd2hpY2ggdG8gcmVuZGVyLlxuICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPVxuICAgICAgdGhpcy5zaGFkb3dSb290ID8/XG4gICAgICB0aGlzLmF0dGFjaFNoYWRvdyhcbiAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuc2hhZG93Um9vdE9wdGlvbnNcbiAgICAgICk7XG4gICAgYWRvcHRTdHlsZXMoXG4gICAgICByZW5kZXJSb290LFxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZWxlbWVudFN0eWxlc1xuICAgICk7XG4gICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgY29ubmVjdGlvbiwgY3JlYXRlcyB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QsIHNldHMgdXBcbiAgICogZWxlbWVudCBzdHlsaW5nLCBhbmQgZW5hYmxlcyB1cGRhdGluZy5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGNvbnRyb2xsZXJzIGBob3N0Q29ubmVjdGVkYFxuICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB0aGlzLmVuYWJsZVVwZGF0aW5nKHRydWUpO1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0Q29ubmVjdGVkPy4oKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmluYWwgYW5kIG5vdCBvdmVycmlkZGVuLiBJdCBpc1xuICAgKiBvdmVycmlkZGVuIG9uIHRoZSBlbGVtZW50IGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSBmaXJzdFxuICAgKiB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5hYmxlVXBkYXRpbmcoX3JlcXVlc3RlZFVwZGF0ZTogYm9vbGVhbikge31cblxuICAvKipcbiAgICogQWxsb3dzIGZvciBgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgaW4gZXh0ZW5zaW9ucyB3aGlsZVxuICAgKiByZXNlcnZpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIG1ha2luZyBub24tYnJlYWtpbmcgZmVhdHVyZSBhZGRpdGlvbnNcbiAgICogd2hlbiBkaXNjb25uZWN0aW5nIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3REaXNjb25uZWN0ZWQ/LigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgcHJvcGVydHkgdmFsdWVzIHdoZW4gYXR0cmlidXRlcyBjaGFuZ2UuXG4gICAqXG4gICAqIFNwZWNpZmljYWxseSwgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBzZXQuXG4gICAqIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2suIElmIHRoaXMgbWV0aG9kIGlzXG4gICAqIG92ZXJyaWRkZW4sIGBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgX29sZCwgdmFsdWUpYCBtdXN0IGJlXG4gICAqIGNhbGxlZC5cbiAgICpcbiAgICogU2VlIFt1c2luZyB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvV2ViX0NvbXBvbmVudHMvVXNpbmdfY3VzdG9tX2VsZW1lbnRzI3VzaW5nX3RoZV9saWZlY3ljbGVfY2FsbGJhY2tzKVxuICAgKiBvbiBNRE4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLlxuICAgKiBAY2F0ZWdvcnkgYXR0cmlidXRlc1xuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsXG4gICkge1xuICAgIHRoaXMuXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX19wcm9wZXJ0eVRvQXR0cmlidXRlKG5hbWU6IFByb3BlcnR5S2V5LCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IGVsZW1Qcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9uTWFwID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5lbGVtZW50UHJvcGVydGllcztcbiAgICBjb25zdCBvcHRpb25zID0gZWxlbVByb3BlcnRpZXMuZ2V0KG5hbWUpITtcbiAgICBjb25zdCBhdHRyID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucmVmbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgY29udmVydGVyID1cbiAgICAgICAgKG9wdGlvbnMuY29udmVydGVyIGFzIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIpPy50b0F0dHJpYnV0ZSAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgPyAob3B0aW9ucy5jb252ZXJ0ZXIgYXMgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcilcbiAgICAgICAgICA6IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICBjb25zdCBhdHRyVmFsdWUgPSBjb252ZXJ0ZXIudG9BdHRyaWJ1dGUhKHZhbHVlLCBvcHRpb25zLnR5cGUpO1xuICAgICAgaWYgKFxuICAgICAgICBERVZfTU9ERSAmJlxuICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KS5lbmFibGVkV2FybmluZ3MhLmluY2x1ZGVzKFxuICAgICAgICAgICdtaWdyYXRpb24nXG4gICAgICAgICkgJiZcbiAgICAgICAgYXR0clZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJ3VuZGVmaW5lZC1hdHRyaWJ1dGUtdmFsdWUnLFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlIHZhbHVlIGZvciB0aGUgJHtuYW1lIGFzIHN0cmluZ30gcHJvcGVydHkgaXMgYCArXG4gICAgICAgICAgICBgdW5kZWZpbmVkIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0uIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBgICtcbiAgICAgICAgICAgIGByZW1vdmVkLCBidXQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgXFxgUmVhY3RpdmVFbGVtZW50XFxgLCBgICtcbiAgICAgICAgICAgIGB0aGUgYXR0cmlidXRlIHdvdWxkIG5vdCBoYXZlIGNoYW5nZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVHJhY2sgaWYgdGhlIHByb3BlcnR5IGlzIGJlaW5nIHJlZmxlY3RlZCB0byBhdm9pZFxuICAgICAgLy8gc2V0dGluZyB0aGUgcHJvcGVydHkgYWdhaW4gdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLiBOb3RlOlxuICAgICAgLy8gMS4gdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY2FsbGJhY2sgaXMgc3luY2hyb25vdXMuXG4gICAgICAvLyAyLiB3aWxsIGJlaGF2ZSBpbmNvcnJlY3RseSBpZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBpbiB0aGUgcmVhY3Rpb25cbiAgICAgIC8vIHN0YWNrIGF0IHRpbWUgb2YgY2FsbGluZy4gSG93ZXZlciwgc2luY2Ugd2UgcHJvY2VzcyBhdHRyaWJ1dGVzXG4gICAgICAvLyBpbiBgdXBkYXRlYCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUgKG9yIGFuIGV4dHJlbWUgY29ybmVyIGNhc2VcbiAgICAgIC8vIHRoYXQgd2UnZCBsaWtlIHRvIGRpc2NvdmVyKS5cbiAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG5hbWU7XG4gICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyVmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIC8vIE5vdGUsIGhpbnQgdGhpcyBhcyBhbiBgQXR0cmlidXRlTWFwYCBzbyBjbG9zdXJlIGNsZWFybHkgdW5kZXJzdGFuZHNcbiAgICAvLyB0aGUgdHlwZTsgaXQgaGFzIGlzc3VlcyB3aXRoIHRyYWNraW5nIHR5cGVzIHRocm91Z2ggc3RhdGljc1xuICAgIGNvbnN0IHByb3BOYW1lID0gKGN0b3IuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGFzIEF0dHJpYnV0ZU1hcCkuZ2V0KG5hbWUpO1xuICAgIC8vIFVzZSB0cmFja2luZyBpbmZvIHRvIGF2b2lkIHJlZmxlY3RpbmcgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICAvLyBpZiBpdCB3YXMganVzdCBzZXQgYmVjYXVzZSB0aGUgYXR0cmlidXRlIGNoYW5nZWQuXG4gICAgaWYgKHByb3BOYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gcHJvcE5hbWUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhwcm9wTmFtZSk7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPVxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5jb252ZXJ0ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHtmcm9tQXR0cmlidXRlOiBvcHRpb25zLmNvbnZlcnRlcn1cbiAgICAgICAgICA6IG9wdGlvbnMuY29udmVydGVyPy5mcm9tQXR0cmlidXRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gcHJvcE5hbWU7XG4gICAgICB0aGlzW3Byb3BOYW1lIGFzIGtleW9mIHRoaXNdID0gY29udmVydGVyLmZyb21BdHRyaWJ1dGUhKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3B0aW9ucy50eXBlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICApIGFzIGFueTtcbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbiB1cGRhdGUgd2hpY2ggaXMgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcbiAgICogd2hlbiBhbiBlbGVtZW50IHNob3VsZCB1cGRhdGUgYmFzZWQgb24gc29tZSBzdGF0ZSBub3QgdHJpZ2dlcmVkIGJ5IHNldHRpbmdcbiAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlLCBwYXNzIG5vIGFyZ3VtZW50cy4gSXQgc2hvdWxkIGFsc28gYmVcbiAgICogY2FsbGVkIHdoZW4gbWFudWFsbHkgaW1wbGVtZW50aW5nIGEgcHJvcGVydHkgc2V0dGVyLiBJbiB0aGlzIGNhc2UsIHBhc3MgdGhlXG4gICAqIHByb3BlcnR5IGBuYW1lYCBhbmQgYG9sZFZhbHVlYCB0byBlbnN1cmUgdGhhdCBhbnkgY29uZmlndXJlZCBwcm9wZXJ0eVxuICAgKiBvcHRpb25zIGFyZSBob25vcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHJlcXVlc3RpbmcgcHJvcGVydHlcbiAgICogQHBhcmFtIG9sZFZhbHVlIG9sZCB2YWx1ZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAqIEBwYXJhbSBvcHRpb25zIHByb3BlcnR5IG9wdGlvbnMgdG8gdXNlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzbHlcbiAgICogICAgIGNvbmZpZ3VyZWQgb3B0aW9uc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwcm9wZXJ0eSBrZXksIHBlcmZvcm0gcHJvcGVydHkgdXBkYXRlIHN0ZXBzLlxuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChERVZfTU9ERSAmJiAobmFtZSBhcyB1bmtub3duKSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICBgYCxcbiAgICAgICAgICBgVGhlIHJlcXVlc3RVcGRhdGUoKSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGFuIEV2ZW50IGFzIHRoZSBwcm9wZXJ0eSBuYW1lLiBUaGlzIGlzIHByb2JhYmx5IGEgbWlzdGFrZSBjYXVzZWQgYnkgYmluZGluZyB0aGlzLnJlcXVlc3RVcGRhdGUgYXMgYW4gZXZlbnQgbGlzdGVuZXIuIEluc3RlYWQgYmluZCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzOiAoKSA9PiB0aGlzLnJlcXVlc3RVcGRhdGUoKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPz89IChcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgICApLmdldFByb3BlcnR5T3B0aW9ucyhuYW1lKTtcbiAgICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBvcHRpb25zLmhhc0NoYW5nZWQgPz8gbm90RXF1YWw7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNbbmFtZSBhcyBrZXlvZiB0aGlzXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFib3J0IHRoZSByZXF1ZXN0IGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY2hhbmdlZC5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pc1VwZGF0ZVBlbmRpbmcgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IHRoaXMuX19lbnF1ZXVlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRjaGFuZ2VQcm9wZXJ0eShcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZTogdW5rbm93bixcbiAgICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICkge1xuICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBDcmVhdGUgYSBiZW5jaG1hcmsgb2YgTWFwLmhhcygpICsgTWFwLnNldChcbiAgICAvLyB2cyBqdXN0IE1hcC5zZXQoKVxuICAgIGlmICghdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLnNldChuYW1lLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIC8vIEFkZCB0byByZWZsZWN0aW5nIHByb3BlcnRpZXMgc2V0LlxuICAgIC8vIE5vdGUsIGl0J3MgaW1wb3J0YW50IHRoYXQgZXZlcnkgY2hhbmdlIGhhcyBhIGNoYW5jZSB0byBhZGQgdGhlXG4gICAgLy8gcHJvcGVydHkgdG8gYF9fcmVmbGVjdGluZ1Byb3BlcnRpZXNgLiBUaGlzIGVuc3VyZXMgc2V0dGluZ1xuICAgIC8vIGF0dHJpYnV0ZSArIHByb3BlcnR5IHJlZmxlY3RzIGNvcnJlY3RseS5cbiAgICBpZiAob3B0aW9ucy5yZWZsZWN0ID09PSB0cnVlICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IG5hbWUpIHtcbiAgICAgICh0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgPz89IG5ldyBTZXQ8UHJvcGVydHlLZXk+KCkpLmFkZChuYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSB1cGRhdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9fZW5xdWV1ZVVwZGF0ZSgpIHtcbiAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBhbnkgcHJldmlvdXMgdXBkYXRlIGhhcyByZXNvbHZlZCBiZWZvcmUgdXBkYXRpbmcuXG4gICAgICAvLyBUaGlzIGBhd2FpdGAgYWxzbyBlbnN1cmVzIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBhcmUgYmF0Y2hlZC5cbiAgICAgIGF3YWl0IHRoaXMuX191cGRhdGVQcm9taXNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFJlZmlyZSBhbnkgcHJldmlvdXMgZXJyb3JzIGFzeW5jIHNvIHRoZXkgZG8gbm90IGRpc3J1cHQgdGhlIHVwZGF0ZVxuICAgICAgLy8gY3ljbGUuIEVycm9ycyBhcmUgcmVmaXJlZCBzbyBkZXZlbG9wZXJzIGhhdmUgYSBjaGFuY2UgdG8gb2JzZXJ2ZVxuICAgICAgLy8gdGhlbSwgYW5kIHRoaXMgY2FuIGJlIGRvbmUgYnkgaW1wbGVtZW50aW5nXG4gICAgICAvLyBgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uYC5cbiAgICAgIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgLy8gSWYgYHNjaGVkdWxlVXBkYXRlYCByZXR1cm5zIGEgUHJvbWlzZSwgd2UgYXdhaXQgaXQuIFRoaXMgaXMgZG9uZSB0b1xuICAgIC8vIGVuYWJsZSBjb29yZGluYXRpbmcgdXBkYXRlcyB3aXRoIGEgc2NoZWR1bGVyLiBOb3RlLCB0aGUgcmVzdWx0IGlzXG4gICAgLy8gY2hlY2tlZCB0byBhdm9pZCBkZWxheWluZyBhbiBhZGRpdGlvbmFsIG1pY3JvdGFzayB1bmxlc3Mgd2UgbmVlZCB0by5cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzVXBkYXRlUGVuZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZXMgYW4gZWxlbWVudCB1cGRhdGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZVxuICAgKiB0aW1pbmcgb2YgdXBkYXRlcyBieSByZXR1cm5pbmcgYSBQcm9taXNlLiBUaGUgdXBkYXRlIHdpbGwgYXdhaXQgdGhlXG4gICAqIHJldHVybmVkIFByb21pc2UsIGFuZCB5b3Ugc2hvdWxkIHJlc29sdmUgdGhlIFByb21pc2UgdG8gYWxsb3cgdGhlIHVwZGF0ZVxuICAgKiB0byBwcm9jZWVkLiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCBgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKWBcbiAgICogbXVzdCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgdG8gc2NoZWR1bGUgdXBkYXRlcyB0byBvY2N1ciBqdXN0IGJlZm9yZSB0aGUgbmV4dCBmcmFtZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogb3ZlcnJpZGUgcHJvdGVjdGVkIGFzeW5jIHNjaGVkdWxlVXBkYXRlKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgKiAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAqICAgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHwgUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gICAgaWYgKFxuICAgICAgREVWX01PREUgJiZcbiAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMoXG4gICAgICAgICdhc3luYy1wZXJmb3JtLXVwZGF0ZSdcbiAgICAgICkgJiZcbiAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHVua25vd24gYXMgUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCk/LnRoZW4gPT09XG4gICAgICAgICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gcmV0dXJuZWQgYSBQcm9taXNlIGZyb20gcGVyZm9ybVVwZGF0ZSgpLiBgICtcbiAgICAgICAgICBgVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYCArXG4gICAgICAgICAgYHZlcnNpb24gb2YgUmVhY3RpdmVFbGVtZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gZWxlbWVudCB1cGRhdGUuIE5vdGUsIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHRoZVxuICAgKiB1cGRhdGUsIGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgKlxuICAgKiBDYWxsIGBwZXJmb3JtVXBkYXRlKClgIHRvIGltbWVkaWF0ZWx5IHByb2Nlc3MgYSBwZW5kaW5nIHVwZGF0ZS4gVGhpcyBzaG91bGRcbiAgICogZ2VuZXJhbGx5IG5vdCBiZSBuZWVkZWQsIGJ1dCBpdCBjYW4gYmUgZG9uZSBpbiByYXJlIGNhc2VzIHdoZW4geW91IG5lZWQgdG9cbiAgICogdXBkYXRlIHN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcGVyZm9ybVVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBBYm9ydCBhbnkgdXBkYXRlIGlmIG9uZSBpcyBub3QgcGVuZGluZyB3aGVuIHRoaXMgaXMgY2FsbGVkLlxuICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGVyZm9ybVVwZGF0ZWAgaXMgY2FsbGVkIGVhcmx5IHRvIFwiZmx1c2hcIlxuICAgIC8vIHRoZSB1cGRhdGUuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRlUGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Z0xvZ0V2ZW50Py4oe2tpbmQ6ICd1cGRhdGUnfSk7XG4gICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIC8vIENyZWF0ZSByZW5kZXJSb290IGJlZm9yZSBmaXJzdCB1cGRhdGUuIFRoaXMgb2NjdXJzIGluIGBjb25uZWN0ZWRDYWxsYmFja2BcbiAgICAgIC8vIGJ1dCBpcyBkb25lIGhlcmUgdG8gc3VwcG9ydCBvdXQgb2YgdHJlZSBjYWxscyB0byBgZW5hYmxlVXBkYXRpbmdgL2BwZXJmb3JtVXBkYXRlYC5cbiAgICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgIC8vIFByb2R1Y2Ugd2FybmluZyBpZiBhbnkgcmVhY3RpdmUgcHJvcGVydGllcyBvbiB0aGUgcHJvdG90eXBlIGFyZVxuICAgICAgICAvLyBzaGFkb3dlZCBieSBjbGFzcyBmaWVsZHMuIEluc3RhbmNlIGZpZWxkcyBzZXQgYmVmb3JlIHVwZ3JhZGUgYXJlXG4gICAgICAgIC8vIGRlbGV0ZWQgYnkgdGhpcyBwb2ludCwgc28gYW55IG93biBwcm9wZXJ0eSBpcyBjYXVzZWQgYnkgY2xhc3MgZmllbGRcbiAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzaGFkb3dlZFByb3BlcnRpZXMgPSBbLi4uY3Rvci5lbGVtZW50UHJvcGVydGllcy5rZXlzKCldLmZpbHRlcihcbiAgICAgICAgICAocCkgPT4gdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSAmJiBwIGluIGdldFByb3RvdHlwZU9mKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzaGFkb3dlZFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHdpbGwgbm90IGAgK1xuICAgICAgICAgICAgICBgdHJpZ2dlciB1cGRhdGVzIGFzIGV4cGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgc2V0IHVzaW5nIGNsYXNzIGAgK1xuICAgICAgICAgICAgICBgZmllbGRzOiAke3NoYWRvd2VkUHJvcGVydGllcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgICAgIGBOYXRpdmUgY2xhc3MgZmllbGRzIGFuZCBzb21lIGNvbXBpbGVkIG91dHB1dCB3aWxsIG92ZXJ3cml0ZSBgICtcbiAgICAgICAgICAgICAgYGFjY2Vzc29ycyB1c2VkIGZvciBkZXRlY3RpbmcgY2hhbmdlcy4gU2VlIGAgK1xuICAgICAgICAgICAgICBgaHR0cHM6Ly9saXQuZGV2L21zZy9jbGFzcy1maWVsZC1zaGFkb3dpbmcgYCArXG4gICAgICAgICAgICAgIGBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWl4aW4gaW5zdGFuY2UgcHJvcGVydGllcyBvbmNlLCBpZiB0aGV5IGV4aXN0LlxuICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHNob3VsZCB3ZSB1c2UgdGhlIHN0b3JlZCB2YWx1ZT8gQ291bGQgYSBuZXcgdmFsdWVcbiAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBzaW5jZSB3ZSBzdG9yZWQgdGhlIG93biBwcm9wZXJ0eSB2YWx1ZT9cbiAgICAgICAgZm9yIChjb25zdCBbcCwgdmFsdWVdIG9mIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICB0aGlzW3AgYXMga2V5b2YgdGhpc10gPSB2YWx1ZSBhcyB0aGlzW2tleW9mIHRoaXNdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgdmFsdWUgcmVmbGVjdGlvbiBhbmQgcG9wdWxhdGUgdGhlIGluaXRpYWxcbiAgICAgIC8vIGNoYW5nZWRQcm9wZXJ0aWVzIG1hcCwgYnV0IG9ubHkgZm9yIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbFxuICAgICAgLy8gZGVjb3JhdG9ycyBvbiBhY2Nlc3NvcnMsIHdoaWNoIHdpbGwgbm90IGhhdmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlXG4gICAgICAvLyBjaGFuZ2VkUHJvcGVydGllcyBtYXAuIFdlIGNhbid0IGtub3cgaWYgdGhlc2UgYWNjZXNzb3JzIGhhZFxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBzbyB3ZSBqdXN0IHNldCB0aGVtIGFueXdheSAtIGEgZGlmZmVyZW5jZSBmcm9tXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMgYW5kIHN0YW5kYXJkIGRlY29yYXRvcnMgb25cbiAgICAgIC8vIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gRm9yIGNvbnRleHQgd2h5IGV4cGVyaW1lbnRhbERlY29yYXRvcnMgd2l0aCBhdXRvIGFjY2Vzc29ycyBhcmUgaGFuZGxlZFxuICAgICAgLy8gc3BlY2lmaWNhbGx5IGFsc28gc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvcHVsbC80MTgzI2lzc3VlY29tbWVudC0xNzExOTU5NjM1XG4gICAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpXG4gICAgICAgIC5lbGVtZW50UHJvcGVydGllcztcbiAgICAgIGlmIChlbGVtZW50UHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBlbGVtZW50UHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG9wdGlvbnMud3JhcHBlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgIXRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5oYXMocCkgJiZcbiAgICAgICAgICAgIHRoaXNbcCBhcyBrZXlvZiB0aGlzXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkocCwgdGhpc1twIGFzIGtleW9mIHRoaXNdLCBvcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZWRQcm9wZXJ0aWVzID0gdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzO1xuICAgIHRyeSB7XG4gICAgICBzaG91bGRVcGRhdGUgPSB0aGlzLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgIHRoaXMud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlPy4oKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFByZXZlbnQgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCBmcm9tIHJ1bm5pbmcgd2hlbiB0aGVyZSdzIGFuXG4gICAgICAvLyB1cGRhdGUgZXhjZXB0aW9uLlxuICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAvLyBFbnN1cmUgZWxlbWVudCBjYW4gYWNjZXB0IGFkZGl0aW9uYWwgdXBkYXRlcyBhZnRlciBhbiBleGNlcHRpb24uXG4gICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIFRoZSB1cGRhdGUgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgcGVuZGluZyBhbmQgZnVydGhlciB1cGRhdGVzIGFyZSBub3cgYWxsb3dlZC5cbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLl8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCBiZWZvcmUgYHVwZGF0ZSgpYCB0byBjb21wdXRlIHZhbHVlcyBuZWVkZWQgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIEltcGxlbWVudCBgd2lsbFVwZGF0ZWAgdG8gY29tcHV0ZSBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gb3RoZXJcbiAgICogcHJvcGVydGllcyBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAqICAgLy8gb25seSBuZWVkIHRvIGNoZWNrIGNoYW5nZWQgcHJvcGVydGllcyBmb3IgYW4gZXhwZW5zaXZlIGNvbXB1dGF0aW9uLlxuICAgKiAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2ZpcnN0TmFtZScpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGFzdE5hbWUnKSkge1xuICAgKiAgICAgdGhpcy5zaGEgPSBjb21wdXRlU0hBKGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHJlbmRlcigpIHtcbiAgICogICByZXR1cm4gaHRtbGBTSEE6ICR7dGhpcy5zaGF9YDtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB3aWxsVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHt9XG5cbiAgLy8gTm90ZSwgdGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcG9seWZpbGwtc3VwcG9ydC5cbiAgLy8gQGludGVybmFsXG4gIF8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlZD8uKCkpO1xuICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLmhhc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgIERFVl9NT0RFICYmXG4gICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJlxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyhcbiAgICAgICAgJ2NoYW5nZS1pbi11cGRhdGUnXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gc2NoZWR1bGVkIGFuIHVwZGF0ZSBgICtcbiAgICAgICAgICBgKGdlbmVyYWxseSBiZWNhdXNlIGEgcHJvcGVydHkgd2FzIHNldCkgYCArXG4gICAgICAgICAgYGFmdGVyIGFuIHVwZGF0ZSBjb21wbGV0ZWQsIGNhdXNpbmcgYSBuZXcgdXBkYXRlIHRvIGJlIHNjaGVkdWxlZC4gYCArXG4gICAgICAgICAgYFRoaXMgaXMgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgbmV4dCB1cGRhdGUgYCArXG4gICAgICAgICAgYGNhbiBvbmx5IGJlIHNjaGVkdWxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyB1cGRhdGUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fbWFya1VwZGF0ZWQoKSB7XG4gICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcuXG4gICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb21wbGV0ZWQgdGhlXG4gICAqIHVwZGF0ZSB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuIFRoZSBQcm9taXNlIHJlc3VsdCBpcyBgZmFsc2VgIGlmXG4gICAqIGEgcHJvcGVydHkgd2FzIHNldCBpbnNpZGUgYHVwZGF0ZWQoKWAuIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBhblxuICAgKiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICpcbiAgICogVG8gYXdhaXQgYWRkaXRpb25hbCBhc3luY2hyb25vdXMgd29yaywgb3ZlcnJpZGUgdGhlIGBnZXRVcGRhdGVDb21wbGV0ZWBcbiAgICogbWV0aG9kLiBGb3IgZXhhbXBsZSwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBhd2FpdCBhIHJlbmRlcmVkIGVsZW1lbnRcbiAgICogYmVmb3JlIGZ1bGZpbGxpbmcgdGhpcyBQcm9taXNlLiBUbyBkbyB0aGlzLCBmaXJzdCBhd2FpdFxuICAgKiBgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKWAsIHRoZW4gYW55IHN1YnNlcXVlbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIGdldCB1cGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHBvaW50IGZvciB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBwcm9taXNlLlxuICAgKlxuICAgKiBJdCBpcyBub3Qgc2FmZSB0byBvdmVycmlkZSB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBnZXR0ZXIgZGlyZWN0bHkgZHVlIHRvIGFcbiAgICogbGltaXRhdGlvbiBpbiBUeXBlU2NyaXB0IHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGFcbiAgICogc3VwZXJjbGFzcyBnZXR0ZXIgKGUuZy4gYHN1cGVyLnVwZGF0ZUNvbXBsZXRlLnRoZW4oLi4uKWApIHdoZW4gdGhlIHRhcmdldFxuICAgKiBsYW5ndWFnZSBpcyBFUzUgKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzM4KS5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW5zdGVhZC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgKiAgIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICogICAgIGF3YWl0IHRoaXMuX215Q2hpbGQudXBkYXRlQ29tcGxldGU7XG4gICAqICAgICByZXR1cm4gcmVzdWx0O1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXBkYXRlIGNvbXBsZXRlZFxuICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVwZGF0ZUNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBgdXBkYXRlKClgIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCByZXF1ZXN0c1xuICAgKiBhbiB1cGRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGB0cnVlYCwgYnV0IHRoaXMgY2FuIGJlXG4gICAqIGN1c3RvbWl6ZWQgdG8gY29udHJvbCB3aGVuIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHNob3VsZFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXMuXG4gICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHJlbmRlciBhbmQga2VlcCB1cGRhdGVkIGVsZW1lbnQgRE9NLlxuICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiBhbm90aGVyIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7XG4gICAgLy8gVGhlIGZvckVhY2goKSBleHByZXNzaW9uIHdpbGwgb25seSBydW4gd2hlbiB3aGVuIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgaXNcbiAgICAvLyBkZWZpbmVkLCBhbmQgaXQgcmV0dXJucyB1bmRlZmluZWQsIHNldHRpbmcgX19yZWZsZWN0aW5nUHJvcGVydGllcyB0b1xuICAgIC8vIHVuZGVmaW5lZFxuICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyAmJj0gdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzLmZvckVhY2goKHApID0+XG4gICAgICB0aGlzLl9fcHJvcGVydHlUb0F0dHJpYnV0ZShwLCB0aGlzW3AgYXMga2V5b2YgdGhpc10pXG4gICAgKSBhcyB1bmRlZmluZWQ7XG4gICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuZXZlciB0aGUgZWxlbWVudCBpcyB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybVxuICAgKiBwb3N0LXVwZGF0aW5nIHRhc2tzIHZpYSBET00gQVBJcywgZm9yIGV4YW1wbGUsIGZvY3VzaW5nIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICAgKiBhZ2FpbiBhZnRlciB0aGlzIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHt9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBmaXJzdCB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybSBvbmUgdGltZVxuICAgKiB3b3JrIG9uIHRoZSBlbGVtZW50IGFmdGVyIHVwZGF0ZS5cbiAgICpcbiAgICogYGBgdHNcbiAgICogZmlyc3RVcGRhdGVkKCkge1xuICAgKiAgIHRoaXMucmVuZGVyUm9vdC5nZXRFbGVtZW50QnlJZCgnbXktdGV4dC1hcmVhJykuZm9jdXMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAqIGFnYWluIGFmdGVyIHRoaXMgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7fVxufVxuLy8gQXNzaWduZWQgaGVyZSB0byB3b3JrIGFyb3VuZCBhIGpzY29tcGlsZXIgYnVnIHdpdGggc3RhdGljIGZpZWxkc1xuLy8gd2hlbiBjb21waWxpbmcgdG8gRVM1LlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMTc3XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbGVtZW50UHJvcGVydGllcycsIFJlYWN0aXZlRWxlbWVudClcbl0gPSBuZXcgTWFwKCk7XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBSZWFjdGl2ZUVsZW1lbnQpXG5dID0gbmV3IE1hcCgpO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5wb2x5ZmlsbFN1cHBvcnQ/Lih7UmVhY3RpdmVFbGVtZW50fSk7XG5cbi8vIERldiBtb2RlIHdhcm5pbmdzLi4uXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRGVmYXVsdCB3YXJuaW5nIHNldC5cbiAgUmVhY3RpdmVFbGVtZW50LmVuYWJsZWRXYXJuaW5ncyA9IFtcbiAgICAnY2hhbmdlLWluLXVwZGF0ZScsXG4gICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgXTtcbiAgY29uc3QgZW5zdXJlT3duV2FybmluZ3MgPSBmdW5jdGlvbiAoY3RvcjogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkge1xuICAgIGlmIChcbiAgICAgICFjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VuYWJsZWRXYXJuaW5ncycsIGN0b3IpKVxuICAgICkge1xuICAgICAgY3Rvci5lbmFibGVkV2FybmluZ3MgPSBjdG9yLmVuYWJsZWRXYXJuaW5ncyEuc2xpY2UoKTtcbiAgICB9XG4gIH07XG4gIFJlYWN0aXZlRWxlbWVudC5lbmFibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMod2FybmluZykpIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5wdXNoKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbiAgUmVhY3RpdmVFbGVtZW50LmRpc2FibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgY29uc3QgaSA9IHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5pbmRleE9mKHdhcm5pbmcpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIFJlYWN0aXZlRWxlbWVudCB1c2FnZS5cbihnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCcyLjAuNCcpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJTVBPUlRBTlQ6IHRoZXNlIGltcG9ydHMgbXVzdCBiZSB0eXBlLW9ubHlcbmltcG9ydCB0eXBlIHtEaXJlY3RpdmUsIERpcmVjdGl2ZVJlc3VsdCwgUGFydEluZm99IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmltcG9ydCB0eXBlIHtUcnVzdGVkSFRNTCwgVHJ1c3RlZFR5cGVzV2luZG93fSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYic7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyA9IHRydWU7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgTGl0VW5zdGFibGUge1xuICAvKipcbiAgICogV2hlbiBMaXQgaXMgcnVubmluZyBpbiBkZXYgbW9kZSBhbmQgYHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHNgIGlzIHRydWUsXG4gICAqIHdlIHdpbGwgZW1pdCAnbGl0LWRlYnVnJyBldmVudHMgdG8gd2luZG93LCB3aXRoIGxpdmUgZGV0YWlscyBhYm91dCB0aGUgdXBkYXRlIGFuZCByZW5kZXJcbiAgICogbGlmZWN5Y2xlLiBUaGVzZSBjYW4gYmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYnVnIHRvb2xpbmcgYW5kIHZpc3VhbGl6YXRpb25zLlxuICAgKlxuICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBydW5uaW5nIHdpdGggd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsXG4gICAqIG1ha2luZyBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgdmVyeSBjaGVhcCAobGlrZSBhIG5vLW9wIHJlbmRlcikgbXVjaCBzbG93ZXIsXG4gICAqIGJlY2F1c2Ugd2UgbXVzdCBjb3B5IGRhdGEgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgRGVidWdMb2cge1xuICAgIGV4cG9ydCB0eXBlIEVudHJ5ID1cbiAgICAgIHwgVGVtcGxhdGVQcmVwXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkQW5kVXBkYXRlZFxuICAgICAgfCBUZW1wbGF0ZVVwZGF0aW5nXG4gICAgICB8IEJlZ2luUmVuZGVyXG4gICAgICB8IEVuZFJlbmRlclxuICAgICAgfCBDb21taXRQYXJ0RW50cnlcbiAgICAgIHwgU2V0UGFydFZhbHVlO1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVQcmVwIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBwcmVwJztcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICAgIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICAgICAgY2xvbmFibGVUZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudDtcbiAgICAgIHBhcnRzOiBUZW1wbGF0ZVBhcnRbXTtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBCZWdpblJlbmRlciB7XG4gICAgICBraW5kOiAnYmVnaW4gcmVuZGVyJztcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB2YWx1ZTogdW5rbm93bjtcbiAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBFbmRSZW5kZXIge1xuICAgICAga2luZDogJ2VuZCByZW5kZXInO1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgcGFydDogQ2hpbGRQYXJ0O1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5zdGFudGlhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVJbnN0YW50aWF0ZWRBbmRVcGRhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVVcGRhdGluZyB7XG4gICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPjtcbiAgICAgIHZhbHVlczogdW5rbm93bltdO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFBhcnRWYWx1ZSB7XG4gICAgICBraW5kOiAnc2V0IHBhcnQnO1xuICAgICAgcGFydDogUGFydDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgdmFsdWVJbmRleDogbnVtYmVyO1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgICB0ZW1wbGF0ZUluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIENvbW1pdFBhcnRFbnRyeSA9XG4gICAgICB8IENvbW1pdE5vdGhpbmdUb0NoaWxkRW50cnlcbiAgICAgIHwgQ29tbWl0VGV4dFxuICAgICAgfCBDb21taXROb2RlXG4gICAgICB8IENvbW1pdEF0dHJpYnV0ZVxuICAgICAgfCBDb21taXRQcm9wZXJ0eVxuICAgICAgfCBDb21taXRCb29sZWFuQXR0cmlidXRlXG4gICAgICB8IENvbW1pdEV2ZW50TGlzdGVuZXJcbiAgICAgIHwgQ29tbWl0VG9FbGVtZW50QmluZGluZztcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Tm90aGluZ1RvQ2hpbGRFbnRyeSB7XG4gICAgICBraW5kOiAnY29tbWl0IG5vdGhpbmcgdG8gY2hpbGQnO1xuICAgICAgc3RhcnQ6IENoaWxkTm9kZTtcbiAgICAgIGVuZDogQ2hpbGROb2RlIHwgbnVsbDtcbiAgICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUgfCB1bmRlZmluZWQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0VGV4dCB7XG4gICAgICBraW5kOiAnY29tbWl0IHRleHQnO1xuICAgICAgbm9kZTogVGV4dDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdE5vZGUge1xuICAgICAga2luZDogJ2NvbW1pdCBub2RlJztcbiAgICAgIHN0YXJ0OiBOb2RlO1xuICAgICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgICAgIHZhbHVlOiBOb2RlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdEF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0UHJvcGVydHkge1xuICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Qm9vbGVhbkF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJztcbiAgICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudExpc3RlbmVyIHtcbiAgICAgIGtpbmQ6ICdjb21taXQgZXZlbnQgbGlzdGVuZXInO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb2xkTGlzdGVuZXI6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSByZW1vdmluZyB0aGUgb2xkIGV2ZW50IGxpc3RlbmVyIChlLmcuIGJlY2F1c2Ugc2V0dGluZ3MgY2hhbmdlZCwgb3IgdmFsdWUgaXMgbm90aGluZylcbiAgICAgIHJlbW92ZUxpc3RlbmVyOiBib29sZWFuO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSBhZGRpbmcgYSBuZXcgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYmVjYXVzZSBmaXJzdCByZW5kZXIsIG9yIHNldHRpbmdzIGNoYW5nZWQpXG4gICAgICBhZGRMaXN0ZW5lcjogYm9vbGVhbjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdFRvRWxlbWVudEJpbmRpbmcge1xuICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIERlYnVnTG9nZ2luZ1dpbmRvdyB7XG4gIC8vIEV2ZW4gaW4gZGV2IG1vZGUsIHdlIGdlbmVyYWxseSBkb24ndCB3YW50IHRvIGVtaXQgdGhlc2UgZXZlbnRzLCBhcyB0aGF0J3NcbiAgLy8gYW5vdGhlciBsZXZlbCBvZiBjb3N0LCBzbyBvbmx5IGVtaXQgdGhlbSB3aGVuIERFVl9NT0RFIGlzIHRydWUgX2FuZF8gd2hlblxuICAvLyB3aW5kb3cuZW1pdExpdERlYnVnRXZlbnRzIGlzIHRydWUuXG4gIGVtaXRMaXREZWJ1Z0xvZ0V2ZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICA/IChldmVudDogTGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8TGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnk+KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICA6IHVuZGVmaW5lZDtcbi8vIFVzZWQgZm9yIGNvbm5lY3RpbmcgYmVnaW5SZW5kZXIgYW5kIGVuZFJlbmRlciBldmVudHMgd2hlbiB0aGVyZSBhcmUgbmVzdGVkXG4vLyByZW5kZXJzIHdoZW4gZXJyb3JzIGFyZSB0aHJvd24gcHJldmVudGluZyBhbiBlbmRSZW5kZXIgZXZlbnQgZnJvbSBiZWluZ1xuLy8gY2FsbGVkLlxubGV0IGRlYnVnTG9nUmVuZGVySWQgPSAwO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBjb2RlXG4gICAgICA/IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICA6ICcnO1xuICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcblxuICBpc3N1ZVdhcm5pbmcoXG4gICAgJ2Rldi1tb2RlJyxcbiAgICBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYFxuICApO1xufVxuXG5jb25zdCB3cmFwID1cbiAgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggJiZcbiAgZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJlxuICBnbG9iYWwuU2hhZHlET00/Lm5vUGF0Y2ggPT09IHRydWVcbiAgICA/IChnbG9iYWwuU2hhZHlET00hLndyYXAgYXMgPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBUKVxuICAgIDogPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBub2RlO1xuXG5jb25zdCB0cnVzdGVkVHlwZXMgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgVHJ1c3RlZFR5cGVzV2luZG93KS50cnVzdGVkVHlwZXM7XG5cbi8qKlxuICogT3VyIFRydXN0ZWRUeXBlUG9saWN5IGZvciBIVE1MIHdoaWNoIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBodG1sIHRlbXBsYXRlXG4gKiB0YWcgZnVuY3Rpb24uXG4gKlxuICogVGhhdCBIVE1MIGlzIGEgZGV2ZWxvcGVyLWF1dGhvcmVkIGNvbnN0YW50LCBhbmQgaXMgcGFyc2VkIHdpdGggaW5uZXJIVE1MXG4gKiBiZWZvcmUgYW55IHVudHJ1c3RlZCBleHByZXNzaW9ucyBoYXZlIGJlZW4gbWl4ZWQgaW4uIFRoZXJlZm9yIGl0IGlzXG4gKiBjb25zaWRlcmVkIHNhZmUgYnkgY29uc3RydWN0aW9uLlxuICovXG5jb25zdCBwb2xpY3kgPSB0cnVzdGVkVHlwZXNcbiAgPyB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdsaXQtaHRtbCcsIHtcbiAgICAgIGNyZWF0ZUhUTUw6IChzKSA9PiBzLFxuICAgIH0pXG4gIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFVzZWQgdG8gc2FuaXRpemUgYW55IHZhbHVlIGJlZm9yZSBpdCBpcyB3cml0dGVuIGludG8gdGhlIERPTS4gVGhpcyBjYW4gYmVcbiAqIHVzZWQgdG8gaW1wbGVtZW50IGEgc2VjdXJpdHkgcG9saWN5IG9mIGFsbG93ZWQgYW5kIGRpc2FsbG93ZWQgdmFsdWVzIGluXG4gKiBvcmRlciB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLlxuICpcbiAqIE9uZSB3YXkgb2YgdXNpbmcgdGhpcyBjYWxsYmFjayB3b3VsZCBiZSB0byBjaGVjayBhdHRyaWJ1dGVzIGFuZCBwcm9wZXJ0aWVzXG4gKiBhZ2FpbnN0IGEgbGlzdCBvZiBoaWdoIHJpc2sgZmllbGRzLCBhbmQgcmVxdWlyZSB0aGF0IHZhbHVlcyB3cml0dGVuIHRvIHN1Y2hcbiAqIGZpZWxkcyBiZSBpbnN0YW5jZXMgb2YgYSBjbGFzcyB3aGljaCBpcyBzYWZlIGJ5IGNvbnN0cnVjdGlvbi4gQ2xvc3VyZSdzIFNhZmVcbiAqIEhUTUwgVHlwZXMgaXMgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlIChcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc2FmZS1odG1sLXR5cGVzL2Jsb2IvbWFzdGVyL2RvYy9zYWZlaHRtbC10eXBlcy5tZCkuXG4gKiBUaGUgVHJ1c3RlZFR5cGVzIHBvbHlmaWxsIGluIEFQSS1vbmx5IG1vZGUgY291bGQgYWxzbyBiZSB1c2VkIGFzIGEgYmFzaXNcbiAqIGZvciB0aGlzIHRlY2huaXF1ZSAoaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvdHJ1c3RlZC10eXBlcykuXG4gKlxuICogQHBhcmFtIG5vZGUgVGhlIEhUTUwgbm9kZSAodXN1YWxseSBlaXRoZXIgYSAjdGV4dCBub2RlIG9yIGFuIEVsZW1lbnQpIHRoYXRcbiAqICAgICBpcyBiZWluZyB3cml0dGVuIHRvLiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGFuIGV4ZW1wbGFyIG5vZGUsIHRoZSB3cml0ZVxuICogICAgIG1heSB0YWtlIHBsYWNlIGFnYWluc3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBvZiBub2RlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG9yIHByb3BlcnR5IChmb3IgZXhhbXBsZSwgJ2hyZWYnKS5cbiAqIEBwYXJhbSB0eXBlIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3cml0ZSB0aGF0J3MgYWJvdXQgdG8gYmUgcGVyZm9ybWVkIHdpbGxcbiAqICAgICBiZSB0byBhIHByb3BlcnR5IG9yIGEgbm9kZS5cbiAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHdpbGwgc2FuaXRpemUgdGhpcyBjbGFzcyBvZiB3cml0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhbml0aXplckZhY3RvcnkgPSAoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWU6IHN0cmluZyxcbiAgdHlwZTogJ3Byb3BlcnR5JyB8ICdhdHRyaWJ1dGUnXG4pID0+IFZhbHVlU2FuaXRpemVyO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggY2FuIHNhbml0aXplIHZhbHVlcyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNwZWNpZmljIGtpbmRcbiAqIG9mIERPTSBzaW5rLlxuICpcbiAqIFNlZSBTYW5pdGl6ZXJGYWN0b3J5LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2FuaXRpemUuIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBwYXNzZWQgaW50b1xuICogICAgIHRoZSBsaXQtaHRtbCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyB0aGlzIGNvdWxkIGJlIG9mIGFueSB0eXBlLlxuICogQHJldHVybiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIERPTS4gVXN1YWxseSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgdmFsdWUsXG4gKiAgICAgdW5sZXNzIHNhbml0aXphdGlvbiBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFZhbHVlU2FuaXRpemVyID0gKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5jb25zdCBpZGVudGl0eUZ1bmN0aW9uOiBWYWx1ZVNhbml0aXplciA9ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWU7XG5jb25zdCBub29wU2FuaXRpemVyOiBTYW5pdGl6ZXJGYWN0b3J5ID0gKFxuICBfbm9kZTogTm9kZSxcbiAgX25hbWU6IHN0cmluZyxcbiAgX3R5cGU6ICdwcm9wZXJ0eScgfCAnYXR0cmlidXRlJ1xuKSA9PiBpZGVudGl0eUZ1bmN0aW9uO1xuXG4vKiogU2V0cyB0aGUgZ2xvYmFsIHNhbml0aXplciBmYWN0b3J5LiAqL1xuY29uc3Qgc2V0U2FuaXRpemVyID0gKG5ld1Nhbml0aXplcjogU2FuaXRpemVyRmFjdG9yeSkgPT4ge1xuICBpZiAoIUVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF0dGVtcHRlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgbGl0LWh0bWwgc2VjdXJpdHkgcG9saWN5LmAgK1xuICAgICAgICBgIHNldFNhbml0aXplRE9NVmFsdWVGYWN0b3J5IHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLmBcbiAgICApO1xuICB9XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5ld1Nhbml0aXplcjtcbn07XG5cbi8qKlxuICogT25seSB1c2VkIGluIGludGVybmFsIHRlc3RzLCBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICovXG5jb25zdCBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPSAoKSA9PiB7XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5vb3BTYW5pdGl6ZXI7XG59O1xuXG5jb25zdCBjcmVhdGVTYW5pdGl6ZXI6IFNhbml0aXplckZhY3RvcnkgPSAobm9kZSwgbmFtZSwgdHlwZSkgPT4ge1xuICByZXR1cm4gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKG5vZGUsIG5hbWUsIHR5cGUpO1xufTtcblxuLy8gQWRkZWQgdG8gYW4gYXR0cmlidXRlIG5hbWUgdG8gbWFyayB0aGUgYXR0cmlidXRlIGFzIGJvdW5kIHNvIHdlIGNhbiBmaW5kXG4vLyBpdCBlYXNpbHkuXG5jb25zdCBib3VuZEF0dHJpYnV0ZVN1ZmZpeCA9ICckbGl0JCc7XG5cbi8vIFRoaXMgbWFya2VyIGlzIHVzZWQgaW4gbWFueSBzeW50YWN0aWMgcG9zaXRpb25zIGluIEhUTUwsIHNvIGl0IG11c3QgYmVcbi8vIGEgdmFsaWQgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZS4gV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIG5hbWVzICh5ZXQpXG4vLyBidXQgdGhpcyBhdCBsZWFzdCBlbnN1cmVzIHRoYXQgdGhlIHBhcnNlIHRyZWUgaXMgY2xvc2VyIHRvIHRoZSB0ZW1wbGF0ZVxuLy8gaW50ZW50aW9uLlxuY29uc3QgbWFya2VyID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYDtcblxuLy8gU3RyaW5nIHVzZWQgdG8gdGVsbCBpZiBhIGNvbW1lbnQgaXMgYSBtYXJrZXIgY29tbWVudFxuY29uc3QgbWFya2VyTWF0Y2ggPSAnPycgKyBtYXJrZXI7XG5cbi8vIFRleHQgdXNlZCB0byBpbnNlcnQgYSBjb21tZW50IG1hcmtlciBub2RlLiBXZSB1c2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvblxuLy8gc3ludGF4IGJlY2F1c2UgaXQncyBzbGlnaHRseSBzbWFsbGVyLCBidXQgcGFyc2VzIGFzIGEgY29tbWVudCBub2RlLlxuY29uc3Qgbm9kZU1hcmtlciA9IGA8JHttYXJrZXJNYXRjaH0+YDtcblxuY29uc3QgZCA9XG4gIE5PREVfTU9ERSAmJiBnbG9iYWwuZG9jdW1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gKHtcbiAgICAgICAgY3JlYXRlVHJlZVdhbGtlcigpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgRG9jdW1lbnQpXG4gICAgOiBkb2N1bWVudDtcblxuLy8gQ3JlYXRlcyBhIGR5bmFtaWMgbWFya2VyLiBXZSBuZXZlciBoYXZlIHRvIHNlYXJjaCBmb3IgdGhlc2UgaW4gdGhlIERPTS5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGQuY3JlYXRlQ29tbWVudCgnJyk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCB8IGJpZ2ludDtcbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlID0+XG4gIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc0l0ZXJhYmxlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSXRlcmFibGU8dW5rbm93bj4gPT5cbiAgaXNBcnJheSh2YWx1ZSkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgU1BBQ0VfQ0hBUiA9IGBbIFxcdFxcblxcZlxccl1gO1xuY29uc3QgQVRUUl9WQUxVRV9DSEFSID0gYFteIFxcdFxcblxcZlxcclwiJ1xcYDw+PV1gO1xuY29uc3QgTkFNRV9DSEFSID0gYFteXFxcXHNcIic+PS9dYDtcblxuLy8gVGhlc2UgcmVnZXhlcyByZXByZXNlbnQgdGhlIGZpdmUgcGFyc2luZyBzdGF0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0IGluIHRoZVxuLy8gVGVtcGxhdGUncyBIVE1MIHNjYW5uZXIuIFRoZXkgbWF0Y2ggdGhlICplbmQqIG9mIHRoZSBzdGF0ZSB0aGV5J3JlIG5hbWVkXG4vLyBhZnRlci5cbi8vIERlcGVuZGluZyBvbiB0aGUgbWF0Y2gsIHdlIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUuIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsXG4vLyB3ZSBzdGF5IGluIHRoZSBzYW1lIHN0YXRlLlxuLy8gTm90ZSB0aGF0IHRoZSByZWdleGVzIGFyZSBzdGF0ZWZ1bC4gV2UgdXRpbGl6ZSBsYXN0SW5kZXggYW5kIHN5bmMgaXRcbi8vIGFjcm9zcyB0aGUgbXVsdGlwbGUgcmVnZXhlcyB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZml2ZSByZWdleGVzIGJlbG93XG4vLyB3ZSBhbHNvIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHJlZ2V4IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVuZCB0YWdzIGZvciByYXdcbi8vIHRleHQgZWxlbWVudHMuXG5cbi8qKlxuICogRW5kIG9mIHRleHQgaXM6IGA8YCBmb2xsb3dlZCBieTpcbiAqICAgKGNvbW1lbnQgc3RhcnQpIG9yICh0YWcpIG9yIChkeW5hbWljIHRhZyBiaW5kaW5nKVxuICovXG5jb25zdCB0ZXh0RW5kUmVnZXggPSAvPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2c7XG5jb25zdCBDT01NRU5UX1NUQVJUID0gMTtcbmNvbnN0IFRBR19OQU1FID0gMjtcbmNvbnN0IERZTkFNSUNfVEFHX05BTUUgPSAzO1xuXG5jb25zdCBjb21tZW50RW5kUmVnZXggPSAvLS0+L2c7XG4vKipcbiAqIENvbW1lbnRzIG5vdCBzdGFydGVkIHdpdGggPCEtLSwgbGlrZSA8L3ssIGNhbiBiZSBlbmRlZCBieSBhIHNpbmdsZSBgPmBcbiAqL1xuY29uc3QgY29tbWVudDJFbmRSZWdleCA9IC8+L2c7XG5cbi8qKlxuICogVGhlIHRhZ0VuZCByZWdleCBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIFwiaW5zaWRlIGFuIG9wZW5pbmdcIiB0YWcgc3ludGF4XG4gKiBwb3NpdGlvbi4gSXQgZWl0aGVyIG1hdGNoZXMgYSBgPmAsIGFuIGF0dHJpYnV0ZS1saWtlIHNlcXVlbmNlLCBvciB0aGUgZW5kXG4gKiBvZiB0aGUgc3RyaW5nIGFmdGVyIGEgc3BhY2UgKGF0dHJpYnV0ZS1uYW1lIHBvc2l0aW9uIGVuZGluZykuXG4gKlxuICogU2VlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50cy1hdHRyaWJ1dGVzXG4gKlxuICogXCIgXFx0XFxuXFxmXFxyXCIgYXJlIEhUTUwgc3BhY2UgY2hhcmFjdGVyczpcbiAqIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKlxuICogU28gYW4gYXR0cmlidXRlIGlzOlxuICogICogVGhlIG5hbWU6IGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIChcIiksICgnKSwgXCI+XCIsXG4gKiAgICBcIj1cIiwgb3IgXCIvXCIuIE5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIEhUTUwgc3BlYyB3aGljaCBhbHNvIGV4Y2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycy5cbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieSBcIj1cIlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5OlxuICogICAgKiBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBzcGFjZSwgKCcpLCAoXCIpLCBcIjxcIiwgXCI+XCIsIFwiPVwiLCAoYCksIG9yXG4gKiAgICAqIChcIikgdGhlbiBhbnkgbm9uLShcIiksIG9yXG4gKiAgICAqICgnKSB0aGVuIGFueSBub24tKCcpXG4gKi9cbmNvbnN0IHRhZ0VuZFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgYD58JHtTUEFDRV9DSEFSfSg/Oigke05BTUVfQ0hBUn0rKSgke1NQQUNFX0NIQVJ9Kj0ke1NQQUNFX0NIQVJ9Kig/OiR7QVRUUl9WQUxVRV9DSEFSfXwoXCJ8Jyl8KSl8JClgLFxuICAnZydcbik7XG5jb25zdCBFTlRJUkVfTUFUQ0ggPSAwO1xuY29uc3QgQVRUUklCVVRFX05BTUUgPSAxO1xuY29uc3QgU1BBQ0VTX0FORF9FUVVBTFMgPSAyO1xuY29uc3QgUVVPVEVfQ0hBUiA9IDM7XG5cbmNvbnN0IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gLycvZztcbmNvbnN0IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gL1wiL2c7XG4vKipcbiAqIE1hdGNoZXMgdGhlIHJhdyB0ZXh0IGVsZW1lbnRzLlxuICpcbiAqIENvbW1lbnRzIGFyZSBub3QgcGFyc2VkIHdpdGhpbiByYXcgdGV4dCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlaXJcbiAqIHRleHQgY29udGVudCBmb3IgbWFya2VyIHN0cmluZ3MuXG4gKi9cbmNvbnN0IHJhd1RleHRFbGVtZW50ID0gL14oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGUpJC9pO1xuXG4vKiogVGVtcGxhdGVSZXN1bHQgdHlwZXMgKi9cbmNvbnN0IEhUTUxfUkVTVUxUID0gMTtcbmNvbnN0IFNWR19SRVNVTFQgPSAyO1xuY29uc3QgTUFUSE1MX1JFU1VMVCA9IDM7XG5cbnR5cGUgUmVzdWx0VHlwZSA9IHR5cGVvZiBIVE1MX1JFU1VMVCB8IHR5cGVvZiBTVkdfUkVTVUxUIHwgdHlwZW9mIE1BVEhNTF9SRVNVTFQ7XG5cbi8vIFRlbXBsYXRlUGFydCB0eXBlc1xuLy8gSU1QT1JUQU5UOiB0aGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gUGFydFR5cGVcbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gMTtcbmNvbnN0IENISUxEX1BBUlQgPSAyO1xuY29uc3QgUFJPUEVSVFlfUEFSVCA9IDM7XG5jb25zdCBCT09MRUFOX0FUVFJJQlVURV9QQVJUID0gNDtcbmNvbnN0IEVWRU5UX1BBUlQgPSA1O1xuY29uc3QgRUxFTUVOVF9QQVJUID0gNjtcbmNvbnN0IENPTU1FTlRfUEFSVCA9IDc7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSB0YWcgZnVuY3Rpb25zLCB7QGxpbmtjb2RlIGh0bWx9IGFuZFxuICoge0BsaW5rY29kZSBzdmd9IHdoZW4gaXQgaGFzbid0IGJlZW4gY29tcGlsZWQgYnkgQGxpdC1sYWJzL2NvbXBpbGVyLlxuICpcbiAqIEEgYFRlbXBsYXRlUmVzdWx0YCBvYmplY3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRlbXBsYXRlXG4gKiBleHByZXNzaW9uIHJlcXVpcmVkIHRvIHJlbmRlciBpdDogdGhlIHRlbXBsYXRlIHN0cmluZ3MsIGV4cHJlc3Npb24gdmFsdWVzLFxuICogYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGh0bWwgb3Igc3ZnKS5cbiAqXG4gKiBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdHMgZG8gbm90IGNyZWF0ZSBhbnkgRE9NIG9uIHRoZWlyIG93bi4gVG8gY3JlYXRlIG9yXG4gKiB1cGRhdGUgRE9NIHlvdSBuZWVkIHRvIHJlbmRlciB0aGUgYFRlbXBsYXRlUmVzdWx0YC4gU2VlXG4gKiBbUmVuZGVyaW5nXShodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb25lbnRzL3JlbmRlcmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICovXG5leHBvcnQgdHlwZSBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IFQ7XG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICB2YWx1ZXM6IHVua25vd25bXTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIHRlbXBsYXRlIHJlc3VsdCB0aGF0IG1heSBiZSBlaXRoZXIgdW5jb21waWxlZCBvciBjb21waWxlZC5cbiAqXG4gKiBJbiB0aGUgZnV0dXJlLCBUZW1wbGF0ZVJlc3VsdCB3aWxsIGJlIHRoaXMgdHlwZS4gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseVxuICogbm90ZSB0aGF0IGEgdGVtcGxhdGUgcmVzdWx0IGlzIHBvdGVudGlhbGx5IGNvbXBpbGVkLCB5b3UgY2FuIHJlZmVyZW5jZSB0aGlzXG4gKiB0eXBlIGFuZCBpdCB3aWxsIGNvbnRpbnVlIHRvIGJlaGF2ZSB0aGUgc2FtZSB0aHJvdWdoIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbiAqIG9mIExpdC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjb2RlIHRoYXQgd2FudHMgdG8gcHJlcGFyZSBmb3IgdGhlIG5leHRcbiAqIG1ham9yIHZlcnNpb24gb2YgTGl0LlxuICovXG5leHBvcnQgdHlwZSBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9XG4gIHwgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+XG4gIHwgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdDtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHRlbXBsYXRlIHRhZyBmdW5jdGlvbnMsIHtAbGlua2NvZGUgaHRtbH0gYW5kXG4gKiB7QGxpbmtjb2RlIHN2Z30uXG4gKlxuICogQSBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdCBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgdGVtcGxhdGVcbiAqIGV4cHJlc3Npb24gcmVxdWlyZWQgdG8gcmVuZGVyIGl0OiB0aGUgdGVtcGxhdGUgc3RyaW5ncywgZXhwcmVzc2lvbiB2YWx1ZXMsXG4gKiBhbmQgdHlwZSBvZiB0ZW1wbGF0ZSAoaHRtbCBvciBzdmcpLlxuICpcbiAqIGBUZW1wbGF0ZVJlc3VsdGAgb2JqZWN0cyBkbyBub3QgY3JlYXRlIGFueSBET00gb24gdGhlaXIgb3duLiBUbyBjcmVhdGUgb3JcbiAqIHVwZGF0ZSBET00geW91IG5lZWQgdG8gcmVuZGVyIHRoZSBgVGVtcGxhdGVSZXN1bHRgLiBTZWVcbiAqIFtSZW5kZXJpbmddKGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvbmVudHMvcmVuZGVyaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBJbiBMaXQgNCwgdGhpcyB0eXBlIHdpbGwgYmUgYW4gYWxpYXMgb2ZcbiAqIE1heWJlQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCwgc28gdGhhdCBjb2RlIHdpbGwgZ2V0IHR5cGUgZXJyb3JzIGlmIGl0IGFzc3VtZXNcbiAqIHRoYXQgTGl0IHRlbXBsYXRlcyBhcmUgbm90IGNvbXBpbGVkLiBXaGVuIGRlbGliZXJhdGVseSB3b3JraW5nIHdpdGggb25seVxuICogb25lLCB1c2UgZWl0aGVyIHtAbGlua2NvZGUgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdH0gb3JcbiAqIHtAbGlua2NvZGUgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0fSBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVJlc3VsdDxUIGV4dGVuZHMgUmVzdWx0VHlwZSA9IFJlc3VsdFR5cGU+ID1cbiAgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+O1xuXG5leHBvcnQgdHlwZSBIVE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgSFRNTF9SRVNVTFQ+O1xuXG5leHBvcnQgdHlwZSBTVkdUZW1wbGF0ZVJlc3VsdCA9IFRlbXBsYXRlUmVzdWx0PHR5cGVvZiBTVkdfUkVTVUxUPjtcblxuZXhwb3J0IHR5cGUgTWF0aE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgTUFUSE1MX1JFU1VMVD47XG5cbi8qKlxuICogQSBUZW1wbGF0ZVJlc3VsdCB0aGF0IGhhcyBiZWVuIGNvbXBpbGVkIGJ5IEBsaXQtbGFicy9jb21waWxlciwgc2tpcHBpbmcgdGhlXG4gKiBwcmVwYXJlIHN0ZXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCB7XG4gIC8vIFRoaXMgaXMgYSBmYWN0b3J5IGluIG9yZGVyIHRvIG1ha2UgdGVtcGxhdGUgaW5pdGlhbGl6YXRpb24gbGF6eVxuICAvLyBhbmQgYWxsb3cgU2hhZHlSZW5kZXJPcHRpb25zIHNjb3BlIHRvIGJlIHBhc3NlZCBpbi5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IENvbXBpbGVkVGVtcGxhdGU7XG4gIHZhbHVlczogdW5rbm93bltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkVGVtcGxhdGUgZXh0ZW5kcyBPbWl0PFRlbXBsYXRlLCAnZWwnPiB7XG4gIC8vIGVsIGlzIG92ZXJyaWRkZW4gdG8gYmUgb3B0aW9uYWwuIFdlIGluaXRpYWxpemUgaXQgb24gZmlyc3QgcmVuZGVyXG4gIGVsPzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvLyBUaGUgcHJlcGFyZWQgSFRNTCBzdHJpbmcgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBmcm9tLlxuICAvLyBUaGUgdHlwZSBpcyBhIFRlbXBsYXRlU3RyaW5nc0FycmF5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSBjYW1lIGZyb21cbiAgLy8gc291cmNlIGNvZGUsIHByZXZlbnRpbmcgYSBKU09OIGluamVjdGlvbiBhdHRhY2suXG4gIGg6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFRlbXBsYXRlUmVzdWx0IHdpdGhcbiAqIHRoZSBnaXZlbiByZXN1bHQgdHlwZS5cbiAqL1xuY29uc3QgdGFnID1cbiAgPFQgZXh0ZW5kcyBSZXN1bHRUeXBlPih0eXBlOiBUKSA9PlxuICAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogdW5rbm93bltdKTogVGVtcGxhdGVSZXN1bHQ8VD4gPT4ge1xuICAgIC8vIFdhcm4gYWdhaW5zdCB0ZW1wbGF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlc1xuICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiByZW5kZXIgc28gdGhhdCB0aGUgd2FybmluZyBpcyBjbG9zZXIgdG8gdGhlXG4gICAgLy8gdGVtcGxhdGUgZGVmaW5pdGlvbi5cbiAgICBpZiAoREVWX01PREUgJiYgc3RyaW5ncy5zb21lKChzKSA9PiBzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdTb21lIHRlbXBsYXRlIHN0cmluZ3MgYXJlIHVuZGVmaW5lZC5cXG4nICtcbiAgICAgICAgICAnVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgaWxsZWdhbCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSW1wb3J0IHN0YXRpYy1odG1sLmpzIHJlc3VsdHMgaW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIGczIGRvZXNuJ3RcbiAgICAgIC8vIGhhbmRsZS4gSW5zdGVhZCB3ZSBrbm93IHRoYXQgc3RhdGljIHZhbHVlcyBtdXN0IGhhdmUgdGhlIGZpZWxkXG4gICAgICAvLyBgXyRsaXRTdGF0aWMkYC5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWVzLnNvbWUoKHZhbCkgPT4gKHZhbCBhcyB7XyRsaXRTdGF0aWMkOiB1bmtub3dufSk/LlsnXyRsaXRTdGF0aWMkJ10pXG4gICAgICApIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGBTdGF0aWMgdmFsdWVzICdsaXRlcmFsJyBvciAndW5zYWZlU3RhdGljJyBjYW5ub3QgYmUgdXNlZCBhcyB2YWx1ZXMgdG8gbm9uLXN0YXRpYyB0ZW1wbGF0ZXMuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0aGUgc3RhdGljICdodG1sJyB0YWcgZnVuY3Rpb24uIFNlZSBodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI3N0YXRpYy1leHByZXNzaW9uc2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICBbJ18kbGl0VHlwZSQnXTogdHlwZSxcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXMsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBIVE1MIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaGVhZGVyID0gKHRpdGxlOiBzdHJpbmcpID0+IGh0bWxgPGgxPiR7dGl0bGV9PC9oMT5gO1xuICogYGBgXG4gKlxuICogVGhlIGBodG1sYCB0YWcgcmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBET00gdG8gcmVuZGVyIGFzIGEgdmFsdWUuIEl0IGlzXG4gKiBsYXp5LCBtZWFuaW5nIG5vIHdvcmsgaXMgZG9uZSB1bnRpbCB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFdoZW4gcmVuZGVyaW5nLFxuICogaWYgYSB0ZW1wbGF0ZSBjb21lcyBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYXMgYSBwcmV2aW91c2x5IHJlbmRlcmVkIHJlc3VsdCxcbiAqIGl0J3MgZWZmaWNpZW50bHkgdXBkYXRlZCBpbnN0ZWFkIG9mIHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IHRhZyhIVE1MX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gU1ZHIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVjdCA9IHN2Z2A8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIj48L3JlY3Q+YDtcbiAqXG4gKiBjb25zdCBteUltYWdlID0gaHRtbGBcbiAqICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICogICAgICR7cmVjdH1cbiAqICAgPC9zdmc+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgc3ZnYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBTVkcgZnJhZ21lbnRzLCBvciBlbGVtZW50c1xuICogdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhbiBgPHN2Zz5gIEhUTUwgZWxlbWVudC4gQSBjb21tb24gZXJyb3IgaXNcbiAqIHBsYWNpbmcgYW4gYDxzdmc+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYHN2Z2AgdGFnXG4gKiBmdW5jdGlvbi4gVGhlIGA8c3ZnPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhXG4gKiB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBTVkcgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgU1ZHIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZWxlbWVudCdzXG4gKiBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhbiBgPHN2Zz5gIEhUTUxcbiAqIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdmcgPSB0YWcoU1ZHX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgTWF0aE1MIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgbnVtID0gbWF0aG1sYDxtbj4xPC9tbj5gO1xuICpcbiAqIGNvbnN0IGVxID0gaHRtbGBcbiAqICAgPG1hdGg+XG4gKiAgICAgJHtudW19XG4gKiAgIDwvbWF0aD5gO1xuICogYGBgXG4gKlxuICogVGhlIGBtYXRobWxgICp0YWcgZnVuY3Rpb24qIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIE1hdGhNTCBmcmFnbWVudHMsIG9yXG4gKiBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGNvbnRhaW5lZCAqKmluc2lkZSoqIGEgYDxtYXRoPmAgSFRNTCBlbGVtZW50LiBBIGNvbW1vblxuICogZXJyb3IgaXMgcGxhY2luZyBhIGA8bWF0aD5gICplbGVtZW50KiBpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSBgbWF0aG1sYFxuICogdGFnIGZ1bmN0aW9uLiBUaGUgYDxtYXRoPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkXG4gKiB3aXRoaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBNYXRoTUwgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgTWF0aE1MIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGVcbiAqIGVsZW1lbnQncyBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhIGA8bWF0aD5gXG4gKiBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXRobWwgPSB0YWcoTUFUSE1MX1JFU1VMVCk7XG5cbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgdGhhdCBhIHZhbHVlIHdhcyBoYW5kbGVkIGJ5IGEgZGlyZWN0aXZlIGFuZFxuICogc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG4gKi9cbmV4cG9ydCBjb25zdCBub0NoYW5nZSA9IFN5bWJvbC5mb3IoJ2xpdC1ub0NoYW5nZScpO1xuXG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIGEgQ2hpbGRQYXJ0IHRvIGZ1bGx5IGNsZWFyIGl0cyBjb250ZW50LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBidXR0b24gPSBodG1sYCR7XG4gKiAgdXNlci5pc0FkbWluXG4gKiAgICA/IGh0bWxgPGJ1dHRvbj5ERUxFVEU8L2J1dHRvbj5gXG4gKiAgICA6IG5vdGhpbmdcbiAqIH1gO1xuICogYGBgXG4gKlxuICogUHJlZmVyIHVzaW5nIGBub3RoaW5nYCBvdmVyIG90aGVyIGZhbHN5IHZhbHVlcyBhcyBpdCBwcm92aWRlcyBhIGNvbnNpc3RlbnRcbiAqIGJlaGF2aW9yIGJldHdlZW4gdmFyaW91cyBleHByZXNzaW9uIGJpbmRpbmcgY29udGV4dHMuXG4gKlxuICogSW4gY2hpbGQgZXhwcmVzc2lvbnMsIGB1bmRlZmluZWRgLCBgbnVsbGAsIGAnJ2AsIGFuZCBgbm90aGluZ2AgYWxsIGJlaGF2ZSB0aGVcbiAqIHNhbWUgYW5kIHJlbmRlciBubyBub2Rlcy4gSW4gYXR0cmlidXRlIGV4cHJlc3Npb25zLCBgbm90aGluZ2AgX3JlbW92ZXNfIHRoZVxuICogYXR0cmlidXRlLCB3aGlsZSBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHdpbGwgcmVuZGVyIGFuIGVtcHR5IHN0cmluZy4gSW5cbiAqIHByb3BlcnR5IGV4cHJlc3Npb25zIGBub3RoaW5nYCBiZWNvbWVzIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IFN5bWJvbC5mb3IoJ2xpdC1ub3RoaW5nJyk7XG5cbi8qKlxuICogVGhlIGNhY2hlIG9mIHByZXBhcmVkIHRlbXBsYXRlcywga2V5ZWQgYnkgdGhlIHRhZ2dlZCBUZW1wbGF0ZVN0cmluZ3NBcnJheVxuICogYW5kIF9ub3RfIGFjY291bnRpbmcgZm9yIHRoZSBzcGVjaWZpYyB0ZW1wbGF0ZSB0YWcgdXNlZC4gVGhpcyBtZWFucyB0aGF0XG4gKiB0ZW1wbGF0ZSB0YWdzIGNhbm5vdCBiZSBkeW5hbWljIC0gdGhleSBtdXN0IHN0YXRpY2FsbHkgYmUgb25lIG9mIGh0bWwsIHN2ZyxcbiAqIG9yIGF0dHIuIFRoaXMgcmVzdHJpY3Rpb24gc2ltcGxpZmllcyB0aGUgY2FjaGUgbG9va3VwLCB3aGljaCBpcyBvbiB0aGUgaG90XG4gKiBwYXRoIGZvciByZW5kZXJpbmcuXG4gKi9cbmNvbnN0IHRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxUZW1wbGF0ZVN0cmluZ3NBcnJheSwgVGVtcGxhdGU+KCk7XG5cbi8qKlxuICogT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgbGl0LWh0bWwgcmVuZGVyaW5nLiBOb3RlIHRoYXRcbiAqIHdoaWxlIGByZW5kZXJgIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgYGNvbnRhaW5lcmAgKGFuZFxuICogYHJlbmRlckJlZm9yZWAgcmVmZXJlbmNlIG5vZGUpIHRvIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgY29udGVudCxcbiAqIG9ubHkgdGhlIG9wdGlvbnMgcGFzc2VkIGluIGR1cmluZyB0aGUgZmlyc3QgcmVuZGVyIGFyZSByZXNwZWN0ZWQgZHVyaW5nXG4gKiB0aGUgbGlmZXRpbWUgb2YgcmVuZGVycyB0byB0aGF0IHVuaXF1ZSBgY29udGFpbmVyYCArIGByZW5kZXJCZWZvcmVgXG4gKiBjb21iaW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0byB1c2UgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBJdCdzIG9mdGVuXG4gICAqIHVzZWZ1bCB0byBzZXQgdGhpcyB0byB0aGUgaG9zdCBjb21wb25lbnQgcmVuZGVyaW5nIGEgdGVtcGxhdGUuXG4gICAqL1xuICBob3N0Pzogb2JqZWN0O1xuICAvKipcbiAgICogQSBET00gbm9kZSBiZWZvcmUgd2hpY2ggdG8gcmVuZGVyIGNvbnRlbnQgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHJlbmRlckJlZm9yZT86IENoaWxkTm9kZSB8IG51bGw7XG4gIC8qKlxuICAgKiBOb2RlIHVzZWQgZm9yIGNsb25pbmcgdGhlIHRlbXBsYXRlIChgaW1wb3J0Tm9kZWAgd2lsbCBiZSBjYWxsZWQgb24gdGhpc1xuICAgKiBub2RlKS4gVGhpcyBjb250cm9scyB0aGUgYG93bmVyRG9jdW1lbnRgIG9mIHRoZSByZW5kZXJlZCBET00sIGFsb25nIHdpdGhcbiAgICogYW55IGluaGVyaXRlZCBjb250ZXh0LiBEZWZhdWx0cyB0byB0aGUgZ2xvYmFsIGBkb2N1bWVudGAuXG4gICAqL1xuICBjcmVhdGlvblNjb3BlPzoge2ltcG9ydE5vZGUobm9kZTogTm9kZSwgZGVlcD86IGJvb2xlYW4pOiBOb2RlfTtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGNvbm5lY3RlZCBzdGF0ZSBmb3IgdGhlIHRvcC1sZXZlbCBwYXJ0IGJlaW5nIHJlbmRlcmVkLiBJZiBub1xuICAgKiBgaXNDb25uZWN0ZWRgIG9wdGlvbiBpcyBzZXQsIGBBc3luY0RpcmVjdGl2ZWBzIHdpbGwgYmUgY29ubmVjdGVkIGJ5XG4gICAqIGRlZmF1bHQuIFNldCB0byBgZmFsc2VgIGlmIHRoZSBpbml0aWFsIHJlbmRlciBvY2N1cnMgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZVxuICAgKiBhbmQgYEFzeW5jRGlyZWN0aXZlYHMgc2hvdWxkIHNlZSBgaXNDb25uZWN0ZWQgPT09IGZhbHNlYCBmb3IgdGhlaXIgaW5pdGlhbFxuICAgKiByZW5kZXIuIFRoZSBgcGFydC5zZXRDb25uZWN0ZWQoKWAgbWV0aG9kIG11c3QgYmUgdXNlZCBzdWJzZXF1ZW50IHRvIGluaXRpYWxcbiAgICogcmVuZGVyIHRvIGNoYW5nZSB0aGUgY29ubmVjdGVkIHN0YXRlIG9mIHRoZSBwYXJ0LlxuICAgKi9cbiAgaXNDb25uZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCB3YWxrZXIgPSBkLmNyZWF0ZVRyZWVXYWxrZXIoXG4gIGQsXG4gIDEyOSAvKiBOb2RlRmlsdGVyLlNIT1dfe0VMRU1FTlR8Q09NTUVOVH0gKi9cbik7XG5cbmxldCBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWw6IFNhbml0aXplckZhY3RvcnkgPSBub29wU2FuaXRpemVyO1xuXG4vL1xuLy8gQ2xhc3NlcyBvbmx5IGJlbG93IGhlcmUsIGNvbnN0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvbmx5IGFib3ZlIGhlcmUuLi5cbi8vXG4vLyBLZWVwaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhbmQgY2xhc3NlcyB0b2dldGhlciBpbXByb3ZlcyBtaW5pZmljYXRpb24uXG4vLyBJbnRlcmZhY2VzIGFuZCB0eXBlIGFsaWFzZXMgY2FuIGJlIGludGVybGVhdmVkIGZyZWVseS5cbi8vXG5cbi8vIFR5cGUgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIGEgYF9kaXJlY3RpdmVgIG9yIGBfZGlyZWN0aXZlc1tdYCBmaWVsZCwgdXNlZCBieVxuLy8gYHJlc29sdmVEaXJlY3RpdmVgXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVBhcmVudCB7XG4gIF8kcGFyZW50PzogRGlyZWN0aXZlUGFyZW50O1xuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcbiAgX19kaXJlY3RpdmVzPzogQXJyYXk8RGlyZWN0aXZlIHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcoXG4gIHRzYTogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIHN0cmluZ0Zyb21UU0E6IHN0cmluZ1xuKTogVHJ1c3RlZEhUTUwge1xuICAvLyBBIHNlY3VyaXR5IGNoZWNrIHRvIHByZXZlbnQgc3Bvb2Zpbmcgb2YgTGl0IHRlbXBsYXRlIHJlc3VsdHMuXG4gIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyB3aXRoIEFycmF5LmlzVGVtcGxhdGVPYmplY3QsXG4gIC8vIHRob3VnaCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhhdCBjaGVjayBpbnNpZGUgb2YgdGhlIGh0bWwgYW5kIHN2Z1xuICAvLyBmdW5jdGlvbnMsIGJlY2F1c2UgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGRvbid0IGNvbWUgaW4gYXNcbiAgLy8gVGVtcGxhdGVTdHJpbmdBcnJheSBvYmplY3RzLlxuICBpZiAoIWlzQXJyYXkodHNhKSB8fCAhdHNhLmhhc093blByb3BlcnR5KCdyYXcnKSkge1xuICAgIGxldCBtZXNzYWdlID0gJ2ludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSc7XG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICBtZXNzYWdlID0gYFxuICAgICAgICAgIEludGVybmFsIEVycm9yOiBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGJlIGFuIGFycmF5XG4gICAgICAgICAgd2l0aCBhICdyYXcnIGZpZWxkLiBGYWtpbmcgYSB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5IGJ5XG4gICAgICAgICAgY2FsbGluZyBodG1sIG9yIHN2ZyBsaWtlIGFuIG9yZGluYXJ5IGZ1bmN0aW9uIGlzIGVmZmVjdGl2ZWx5XG4gICAgICAgICAgdGhlIHNhbWUgYXMgY2FsbGluZyB1bnNhZmVIdG1sIGFuZCBjYW4gbGVhZCB0byBtYWpvciBzZWN1cml0eVxuICAgICAgICAgIGlzc3VlcywgZS5nLiBvcGVuaW5nIHlvdXIgY29kZSB1cCB0byBYU1MgYXR0YWNrcy5cbiAgICAgICAgICBJZiB5b3UncmUgdXNpbmcgdGhlIGh0bWwgb3Igc3ZnIHRhZ2dlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgbm9ybWFsbHlcbiAgICAgICAgICBhbmQgc3RpbGwgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGEgYnVnIGF0XG4gICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWdfcmVwb3J0Lm1kXG4gICAgICAgICAgYW5kIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBidWlsZCB0b29saW5nLCBpZiBhbnkuXG4gICAgICAgIGBcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAucmVwbGFjZSgvXFxuICovZywgJ1xcbicpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIHBvbGljeSAhPT0gdW5kZWZpbmVkXG4gICAgPyBwb2xpY3kuY3JlYXRlSFRNTChzdHJpbmdGcm9tVFNBKVxuICAgIDogKHN0cmluZ0Zyb21UU0EgYXMgdW5rbm93biBhcyBUcnVzdGVkSFRNTCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyBmb3IgdGhlIGdpdmVuIFRlbXBsYXRlU3RyaW5nc0FycmF5IGFuZCByZXN1bHQgdHlwZVxuICogKEhUTUwgb3IgU1ZHKSwgYWxvbmcgd2l0aCB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluXG4gKiB0ZW1wbGF0ZSBvcmRlci4gVGhlIEhUTUwgY29udGFpbnMgY29tbWVudCBtYXJrZXJzIGRlbm90aW5nIHRoZSBgQ2hpbGRQYXJ0YHNcbiAqIGFuZCBzdWZmaXhlcyBvbiBib3VuZCBhdHRyaWJ1dGVzIGRlbm90aW5nIHRoZSBgQXR0cmlidXRlUGFydHNgLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXlcbiAqIEBwYXJhbSB0eXBlIEhUTUwgb3IgU1ZHXG4gKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmcgYFtodG1sLCBhdHRyTmFtZXNdYCAoYXJyYXkgcmV0dXJuZWQgZm9yIHRlcnNlbmVzcyxcbiAqICAgICB0byBhdm9pZCBvYmplY3QgZmllbGRzIHNpbmNlIHRoaXMgY29kZSBpcyBzaGFyZWQgd2l0aCBub24tbWluaWZpZWQgU1NSXG4gKiAgICAgY29kZSlcbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVIdG1sID0gKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgdHlwZTogUmVzdWx0VHlwZVxuKTogW1RydXN0ZWRIVE1MLCBBcnJheTxzdHJpbmc+XSA9PiB7XG4gIC8vIEluc2VydCBtYWtlcnMgaW50byB0aGUgdGVtcGxhdGUgSFRNTCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mXG4gIC8vIGJpbmRpbmdzLiBUaGUgZm9sbG93aW5nIGNvZGUgc2NhbnMgdGhlIHRlbXBsYXRlIHN0cmluZ3MgdG8gZGV0ZXJtaW5lIHRoZVxuICAvLyBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGJpbmRpbmdzLiBUaGV5IGNhbiBiZSBpbiB0ZXh0IHBvc2l0aW9uLCB3aGVyZVxuICAvLyB3ZSBpbnNlcnQgYW4gSFRNTCBjb21tZW50LCBhdHRyaWJ1dGUgdmFsdWUgcG9zaXRpb24sIHdoZXJlIHdlIGluc2VydCBhXG4gIC8vIHNlbnRpbmVsIHN0cmluZyBhbmQgcmUtd3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBvciBpbnNpZGUgYSB0YWcgd2hlcmVcbiAgLy8gd2UgaW5zZXJ0IHRoZSBzZW50aW5lbCBzdHJpbmcuXG4gIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gIC8vIFN0b3JlcyB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluIHRoZSBvcmRlciBvZiB0aGVpclxuICAvLyBwYXJ0cy4gRWxlbWVudFBhcnRzIGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGlzIGFycmF5IGFzIHVuZGVmaW5lZFxuICAvLyByYXRoZXIgdGhhbiBhIHN0cmluZywgdG8gZGlzYW1iaWd1YXRlIGZyb20gYXR0cmlidXRlIGJpbmRpbmdzLlxuICBjb25zdCBhdHRyTmFtZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgbGV0IGh0bWwgPVxuICAgIHR5cGUgPT09IFNWR19SRVNVTFQgPyAnPHN2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8bWF0aD4nIDogJyc7XG5cbiAgLy8gV2hlbiB3ZSdyZSBpbnNpZGUgYSByYXcgdGV4dCB0YWcgKG5vdCBpdCdzIHRleHQgY29udGVudCksIHRoZSByZWdleFxuICAvLyB3aWxsIHN0aWxsIGJlIHRhZ1JlZ2V4IHNvIHdlIGNhbiBmaW5kIGF0dHJpYnV0ZXMsIGJ1dCB3aWxsIHN3aXRjaCB0b1xuICAvLyB0aGlzIHJlZ2V4IHdoZW4gdGhlIHRhZyBlbmRzLlxuICBsZXQgcmF3VGV4dEVuZFJlZ2V4OiBSZWdFeHAgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgcmVwcmVzZW50ZWQgYXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZVxuICAvLyByZWdleGVzXG4gIGxldCByZWdleCA9IHRleHRFbmRSZWdleDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHMgPSBzdHJpbmdzW2ldO1xuICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBuYW1lLiBXaGVuIHRoaXMgaXNcbiAgICAvLyBwb3NpdGl2ZSBhdCBlbmQgb2YgYSBzdHJpbmcsIGl0IG1lYW5zIHdlJ3JlIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIC8vIHBvc2l0aW9uIGFuZCBuZWVkIHRvIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgIC8vIFdlIGFsc28gdXNlIGEgc3BlY2lhbCB2YWx1ZSBvZiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgLy8gdGhlIGVuZCBvZiBhIHN0cmluZyBpbiBhdHRyaWJ1dGUgbmFtZSBwb3NpdGlvbi5cbiAgICBsZXQgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgIGxldCBhdHRyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaCE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG5cbiAgICAvLyBUaGUgY29uZGl0aW9ucyBpbiB0aGlzIGxvb3AgaGFuZGxlIHRoZSBjdXJyZW50IHBhcnNlIHN0YXRlLCBhbmQgdGhlXG4gICAgLy8gYXNzaWdubWVudHMgdG8gdGhlIGByZWdleGAgdmFyaWFibGUgYXJlIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucy5cbiAgICB3aGlsZSAobGFzdEluZGV4IDwgcy5sZW5ndGgpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aGVyZSB3ZSBwcmV2aW91c2x5IGxlZnQgb2ZmXG4gICAgICByZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsYXN0SW5kZXggPSByZWdleC5sYXN0SW5kZXg7XG4gICAgICBpZiAocmVnZXggPT09IHRleHRFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gPT09ICchLS0nKSB7XG4gICAgICAgICAgcmVnZXggPSBjb21tZW50RW5kUmVnZXg7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdlIHN0YXJ0ZWQgYSB3ZWlyZCBjb21tZW50LCBsaWtlIDwve1xuICAgICAgICAgIHJlZ2V4ID0gY29tbWVudDJFbmRSZWdleDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFtUQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KG1hdGNoW1RBR19OQU1FXSkpIHtcbiAgICAgICAgICAgIC8vIFJlY29yZCBpZiB3ZSBlbmNvdW50ZXIgYSByYXctdGV4dCBlbGVtZW50LiBXZSdsbCBzd2l0Y2ggdG9cbiAgICAgICAgICAgIC8vIHRoaXMgcmVnZXggYXQgdGhlIGVuZCBvZiB0aGUgdGFnLlxuICAgICAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gbmV3IFJlZ0V4cChgPC8ke21hdGNoW1RBR19OQU1FXX1gLCAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoW0RZTkFNSUNfVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0JpbmRpbmdzIGluIHRhZyBuYW1lcyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBzdGF0aWMgdGVtcGxhdGVzIGluc3RlYWQuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ID09PSB0YWdFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbRU5USVJFX01BVENIXSA9PT0gJz4nKSB7XG4gICAgICAgICAgLy8gRW5kIG9mIGEgdGFnLiBJZiB3ZSBoYWQgc3RhcnRlZCBhIHJhdy10ZXh0IGVsZW1lbnQsIHVzZSB0aGF0XG4gICAgICAgICAgLy8gcmVnZXhcbiAgICAgICAgICByZWdleCA9IHJhd1RleHRFbmRSZWdleCA/PyB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgLy8gV2UgbWF5IGJlIGVuZGluZyBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUsIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAgIC8vIGNsZWFyIGFueSBwZW5kaW5nIGF0dHJOYW1lRW5kSW5kZXhcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQVRUUklCVVRFX05BTUVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBdHRyaWJ1dGUgbmFtZSBwb3NpdGlvblxuICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gcmVnZXgubGFzdEluZGV4IC0gbWF0Y2hbU1BBQ0VTX0FORF9FUVVBTFNdLmxlbmd0aDtcbiAgICAgICAgICBhdHRyTmFtZSA9IG1hdGNoW0FUVFJJQlVURV9OQU1FXTtcbiAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICBtYXRjaFtRVU9URV9DSEFSXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gdGFnRW5kUmVnZXhcbiAgICAgICAgICAgICAgOiBtYXRjaFtRVU9URV9DSEFSXSA9PT0gJ1wiJ1xuICAgICAgICAgICAgICAgID8gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXhcbiAgICAgICAgICAgICAgICA6IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4XG4gICAgICApIHtcbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggPT09IGNvbW1lbnRFbmRSZWdleCB8fCByZWdleCA9PT0gY29tbWVudDJFbmRSZWdleCkge1xuICAgICAgICByZWdleCA9IHRleHRFbmRSZWdleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBvbmUgb2YgdGhlIGZpdmUgc3RhdGUgcmVnZXhlcywgc28gaXQgbXVzdCBiZSB0aGUgZHluYW1pY2FsbHlcbiAgICAgICAgLy8gY3JlYXRlZCByYXcgdGV4dCByZWdleCBhbmQgd2UncmUgYXQgdGhlIGNsb3NlIG9mIHRoYXQgZWxlbWVudC5cbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGF0dHJOYW1lRW5kSW5kZXgsIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAgICAgLy8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIGFzc2VydCB0aGF0IHdlJ3JlIGluIGEgdmFsaWQgYXR0cmlidXRlXG4gICAgICAvLyBwb3NpdGlvbiAtIGVpdGhlciBpbiBhIHRhZywgb3IgYSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgcmVnZXggPT09IHRhZ0VuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4LFxuICAgICAgICAndW5leHBlY3RlZCBwYXJzZSBzdGF0ZSBCJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIGZvdXIgY2FzZXM6XG4gICAgLy8gIDEuIFdlJ3JlIGluIHRleHQgcG9zaXRpb24sIGFuZCBub3QgaW4gYSByYXcgdGV4dCBlbGVtZW50XG4gICAgLy8gICAgIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KTogaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIuXG4gICAgLy8gIDIuIFdlIGhhdmUgYSBub24tbmVnYXRpdmUgYXR0ck5hbWVFbmRJbmRleCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvXG4gICAgLy8gICAgIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZCBhIGJvdW5kIGF0dHJpYnV0ZSBzdWZmaXguXG4gICAgLy8gIDMuIFdlJ3JlIGF0IHRoZSBub24tZmlyc3QgYmluZGluZyBpbiBhIG11bHRpLWJpbmRpbmcgYXR0cmlidXRlLCB1c2UgYVxuICAgIC8vICAgICBwbGFpbiBtYXJrZXIuXG4gICAgLy8gIDQuIFdlJ3JlIHNvbWV3aGVyZSBlbHNlIGluc2lkZSB0aGUgdGFnLiBJZiB3ZSdyZSBpbiBhdHRyaWJ1dGUgbmFtZVxuICAgIC8vICAgICBwb3NpdGlvbiAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIpLCBhZGQgYSBzZXF1ZW50aWFsIHN1ZmZpeCB0b1xuICAgIC8vICAgICBnZW5lcmF0ZSBhIHVuaXF1ZSBhdHRyaWJ1dGUgbmFtZS5cblxuICAgIC8vIERldGVjdCBhIGJpbmRpbmcgbmV4dCB0byBzZWxmLWNsb3NpbmcgdGFnIGVuZCBhbmQgaW5zZXJ0IGEgc3BhY2UgdG9cbiAgICAvLyBzZXBhcmF0ZSB0aGUgbWFya2VyIGZyb20gdGhlIHRhZyBlbmQ6XG4gICAgY29uc3QgZW5kID1cbiAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCAmJiBzdHJpbmdzW2kgKyAxXS5zdGFydHNXaXRoKCcvPicpID8gJyAnIDogJyc7XG4gICAgaHRtbCArPVxuICAgICAgcmVnZXggPT09IHRleHRFbmRSZWdleFxuICAgICAgICA/IHMgKyBub2RlTWFya2VyXG4gICAgICAgIDogYXR0ck5hbWVFbmRJbmRleCA+PSAwXG4gICAgICAgICAgPyAoYXR0ck5hbWVzLnB1c2goYXR0ck5hbWUhKSxcbiAgICAgICAgICAgIHMuc2xpY2UoMCwgYXR0ck5hbWVFbmRJbmRleCkgK1xuICAgICAgICAgICAgICBib3VuZEF0dHJpYnV0ZVN1ZmZpeCArXG4gICAgICAgICAgICAgIHMuc2xpY2UoYXR0ck5hbWVFbmRJbmRleCkpICtcbiAgICAgICAgICAgIG1hcmtlciArXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICA6IHMgKyBtYXJrZXIgKyAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIgPyBpIDogZW5kKTtcbiAgfVxuXG4gIGNvbnN0IGh0bWxSZXN1bHQ6IHN0cmluZyB8IFRydXN0ZWRIVE1MID1cbiAgICBodG1sICtcbiAgICAoc3RyaW5nc1tsXSB8fCAnPD8+JykgK1xuICAgICh0eXBlID09PSBTVkdfUkVTVUxUID8gJzwvc3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzwvbWF0aD4nIDogJycpO1xuXG4gIC8vIFJldHVybmVkIGFzIGFuIGFycmF5IGZvciB0ZXJzZW5lc3NcbiAgcmV0dXJuIFt0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyhzdHJpbmdzLCBodG1sUmVzdWx0KSwgYXR0ck5hbWVzXTtcbn07XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCB0eXBlIHtUZW1wbGF0ZX07XG5jbGFzcyBUZW1wbGF0ZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZWwhOiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIHBhcnRzOiBBcnJheTxUZW1wbGF0ZVBhcnQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB7c3RyaW5ncywgWydfJGxpdFR5cGUkJ106IHR5cGV9OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gICAgb3B0aW9ucz86IFJlbmRlck9wdGlvbnNcbiAgKSB7XG4gICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBhdHRyTmFtZUluZGV4ID0gMDtcbiAgICBjb25zdCBwYXJ0Q291bnQgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzO1xuXG4gICAgLy8gQ3JlYXRlIHRlbXBsYXRlIGVsZW1lbnRcbiAgICBjb25zdCBbaHRtbCwgYXR0ck5hbWVzXSA9IGdldFRlbXBsYXRlSHRtbChzdHJpbmdzLCB0eXBlKTtcbiAgICB0aGlzLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChodG1sLCBvcHRpb25zKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSB0aGlzLmVsLmNvbnRlbnQ7XG5cbiAgICAvLyBSZS1wYXJlbnQgU1ZHIG9yIE1hdGhNTCBub2RlcyBpbnRvIHRlbXBsYXRlIHJvb3RcbiAgICBpZiAodHlwZSA9PT0gU1ZHX1JFU1VMVCB8fCB0eXBlID09PSBNQVRITUxfUkVTVUxUKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQhO1xuICAgICAgd3JhcHBlci5yZXBsYWNlV2l0aCguLi53cmFwcGVyLmNoaWxkTm9kZXMpO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhlIHRlbXBsYXRlIHRvIGZpbmQgYmluZGluZyBtYXJrZXJzIGFuZCBjcmVhdGUgVGVtcGxhdGVQYXJ0c1xuICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgIGNvbnN0IHRhZyA9IChub2RlIGFzIEVsZW1lbnQpLmxvY2FsTmFtZTtcbiAgICAgICAgICAvLyBXYXJuIGlmIGB0ZXh0YXJlYWAgaW5jbHVkZXMgYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3cgaWYgYHRlbXBsYXRlYFxuICAgICAgICAgIC8vIGRvZXMgc2luY2UgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQuIFdlIGRvIHRoaXMgYnkgY2hlY2tpbmdcbiAgICAgICAgICAvLyBpbm5lckhUTUwgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIG1hcmtlci4gVGhpcyBjYXRjaGVzXG4gICAgICAgICAgLy8gY2FzZXMgbGlrZSBiaW5kaW5ncyBpbiB0ZXh0YXJlYSB0aGVyZSBtYXJrZXJzIHR1cm4gaW50byB0ZXh0IG5vZGVzLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC9eKD86dGV4dGFyZWF8dGVtcGxhdGUpJC9pIS50ZXN0KHRhZykgJiZcbiAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmlubmVySFRNTC5pbmNsdWRlcyhtYXJrZXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtID1cbiAgICAgICAgICAgICAgYEV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBcXGAke3RhZ31cXGAgYCArXG4gICAgICAgICAgICAgIGBlbGVtZW50cy4gU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvZXhwcmVzc2lvbi1pbi0ke3RhZ30gZm9yIG1vcmUgYCArXG4gICAgICAgICAgICAgIGBpbmZvcm1hdGlvbi5gO1xuICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobSk7XG4gICAgICAgICAgICB9IGVsc2UgaXNzdWVXYXJuaW5nKCcnLCBtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGZvciBhdHRlbXB0ZWQgZHluYW1pYyB0YWcgbmFtZXMsIHdlIGRvbid0XG4gICAgICAgIC8vIGluY3JlbWVudCB0aGUgYmluZGluZ0luZGV4LCBhbmQgaXQnbGwgYmUgb2ZmIGJ5IDEgaW4gdGhlIGVsZW1lbnRcbiAgICAgICAgLy8gYW5kIG9mZiBieSB0d28gYWZ0ZXIgaXQuXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoYm91bmRBdHRyaWJ1dGVTdWZmaXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxOYW1lID0gYXR0ck5hbWVzW2F0dHJOYW1lSW5kZXgrK107XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKG5hbWUpITtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGljcyA9IHZhbHVlLnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgIGNvbnN0IG0gPSAvKFsuP0BdKT8oLiopLy5leGVjKHJlYWxOYW1lKSE7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEFUVFJJQlVURV9QQVJULFxuICAgICAgICAgICAgICAgIGluZGV4OiBub2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgbmFtZTogbVsyXSxcbiAgICAgICAgICAgICAgICBzdHJpbmdzOiBzdGF0aWNzLFxuICAgICAgICAgICAgICAgIGN0b3I6XG4gICAgICAgICAgICAgICAgICBtWzFdID09PSAnLidcbiAgICAgICAgICAgICAgICAgICAgPyBQcm9wZXJ0eVBhcnRcbiAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnPydcbiAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gRXZlbnRQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IEF0dHJpYnV0ZVBhcnQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChtYXJrZXIpKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEVMRU1FTlRfUEFSVCxcbiAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogYmVuY2htYXJrIHRoZSByZWdleCBhZ2FpbnN0IHRlc3RpbmcgZm9yIGVhY2hcbiAgICAgICAgLy8gb2YgdGhlIDMgcmF3IHRleHQgZWxlbWVudCBuYW1lcy5cbiAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3QoKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSkpIHtcbiAgICAgICAgICAvLyBGb3IgcmF3IHRleHQgZWxlbWVudHMgd2UgbmVlZCB0byBzcGxpdCB0aGUgdGV4dCBjb250ZW50IG9uXG4gICAgICAgICAgLy8gbWFya2VycywgY3JlYXRlIGEgVGV4dCBub2RlIGZvciBlYWNoIHNlZ21lbnQsIGFuZCBjcmVhdGVcbiAgICAgICAgICAvLyBhIFRlbXBsYXRlUGFydCBmb3IgZWFjaCBtYXJrZXIuXG4gICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50IS5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkge1xuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkudGV4dENvbnRlbnQgPSB0cnVzdGVkVHlwZXNcbiAgICAgICAgICAgICAgPyAodHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0IGFzIHVua25vd24gYXMgJycpXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIGVhY2ggbGl0ZXJhbCBzZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBub2RlcyBhcmUgYWxzbyB1c2VkIGFzIHRoZSBtYXJrZXJzIGZvciBub2RlIHBhcnRzXG4gICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgZW1wdHkgdGV4dCBub2RlcyBhcyBtYXJrZXJzIGJlY2F1c2UgdGhleSdyZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXplZCB3aGVuIGNsb25pbmcgaW4gSUUgKGNvdWxkIHNpbXBsaWZ5IHdoZW5cbiAgICAgICAgICAgIC8vIElFIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmFwcGVuZChzdHJpbmdzW2ldLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgICAgIC8vIFdhbGsgcGFzdCB0aGUgbWFya2VyIG5vZGUgd2UganVzdCBhZGRlZFxuICAgICAgICAgICAgICB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgICAgcGFydHMucHVzaCh7dHlwZTogQ0hJTERfUEFSVCwgaW5kZXg6ICsrbm9kZUluZGV4fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RlIGJlY2F1c2UgdGhpcyBtYXJrZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIHdhbGtlcidzIGN1cnJlbnRcbiAgICAgICAgICAgIC8vIG5vZGUsIGl0IHdpbGwgYmUgd2Fsa2VkIHRvIGluIHRoZSBvdXRlciBsb29wIChhbmQgaWdub3JlZCksIHNvXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBub2RlSW5kZXggaGVyZVxuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkuYXBwZW5kKHN0cmluZ3NbbGFzdEluZGV4XSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhO1xuICAgICAgICBpZiAoZGF0YSA9PT0gbWFya2VyTWF0Y2gpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDSElMRF9QQVJULCBpbmRleDogbm9kZUluZGV4fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSAtMTtcbiAgICAgICAgICB3aGlsZSAoKGkgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhLmluZGV4T2YobWFya2VyLCBpICsgMSkpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gQ29tbWVudCBub2RlIGhhcyBhIGJpbmRpbmcgbWFya2VyIGluc2lkZSwgbWFrZSBhbiBpbmFjdGl2ZSBwYXJ0XG4gICAgICAgICAgICAvLyBUaGUgYmluZGluZyB3b24ndCB3b3JrLCBidXQgc3Vic2VxdWVudCBiaW5kaW5ncyB3aWxsXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDT01NRU5UX1BBUlQsIGluZGV4OiBub2RlSW5kZXh9KTtcbiAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIGkgKz0gbWFya2VyLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlSW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgb24gYSB0YWcsIHRoZW4gd2hlbiB0aGUgdGFnIGlzXG4gICAgICAvLyBwYXJzZWQgaW50byBhbiBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgZ2V0cyBkZS1kdXBsaWNhdGVkLiBXZSBjYW4gZGV0ZWN0XG4gICAgICAvLyB0aGlzIG1pc21hdGNoIGlmIHdlIGhhdmVuJ3QgcHJlY2lzZWx5IGNvbnN1bWVkIGV2ZXJ5IGF0dHJpYnV0ZSBuYW1lXG4gICAgICAvLyB3aGVuIHByZXBhcmluZyB0aGUgdGVtcGxhdGUuIFRoaXMgd29ya3MgYmVjYXVzZSBgYXR0ck5hbWVzYCBpcyBidWlsdFxuICAgICAgLy8gZnJvbSB0aGUgdGVtcGxhdGUgc3RyaW5nIGFuZCBgYXR0ck5hbWVJbmRleGAgY29tZXMgZnJvbSBwcm9jZXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0aW5nIERPTS5cbiAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoICE9PSBhdHRyTmFtZUluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRGV0ZWN0ZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBiaW5kaW5ncy4gVGhpcyBvY2N1cnMgaWYgeW91ciB0ZW1wbGF0ZSBgICtcbiAgICAgICAgICAgIGBoYXMgZHVwbGljYXRlIGF0dHJpYnV0ZXMgb24gYW4gZWxlbWVudCB0YWcuIEZvciBleGFtcGxlIGAgK1xuICAgICAgICAgICAgYFwiPGlucHV0ID9kaXNhYmxlZD1cXCR7dHJ1ZX0gP2Rpc2FibGVkPVxcJHtmYWxzZX0+XCIgY29udGFpbnMgYSBgICtcbiAgICAgICAgICAgIGBkdXBsaWNhdGUgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZS4gVGhlIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBgICtcbiAgICAgICAgICAgIGB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiBcXG5gICtcbiAgICAgICAgICAgICdgJyArXG4gICAgICAgICAgICBzdHJpbmdzLmpvaW4oJyR7Li4ufScpICtcbiAgICAgICAgICAgICdgJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGNvdWxkIHNldCB3YWxrZXIuY3VycmVudE5vZGUgdG8gYW5vdGhlciBub2RlIGhlcmUgdG8gcHJldmVudCBhIG1lbW9yeVxuICAgIC8vIGxlYWssIGJ1dCBldmVyeSB0aW1lIHdlIHByZXBhcmUgYSB0ZW1wbGF0ZSwgd2UgaW1tZWRpYXRlbHkgcmVuZGVyIGl0XG4gICAgLy8gYW5kIHJlLXVzZSB0aGUgd2Fsa2VyIGluIG5ldyBUZW1wbGF0ZUluc3RhbmNlLl9jbG9uZSgpLlxuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAndGVtcGxhdGUgcHJlcCcsXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLFxuICAgICAgICBjbG9uYWJsZVRlbXBsYXRlOiB0aGlzLmVsLFxuICAgICAgICBwYXJ0czogdGhpcy5wYXJ0cyxcbiAgICAgICAgc3RyaW5ncyxcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGRlbiB2aWEgYGxpdEh0bWxQb2x5ZmlsbFN1cHBvcnRgIHRvIHByb3ZpZGUgcGxhdGZvcm0gc3VwcG9ydC5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWw6IFRydXN0ZWRIVE1MLCBfb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpIHtcbiAgICBjb25zdCBlbCA9IGQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICBlbC5pbm5lckhUTUwgPSBodG1sIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgIHJldHVybiBlbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2Nvbm5lY3RhYmxlIHtcbiAgXyRwYXJlbnQ/OiBEaXNjb25uZWN0YWJsZTtcbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPjtcbiAgLy8gUmF0aGVyIHRoYW4gaG9sZCBjb25uZWN0aW9uIHN0YXRlIG9uIGluc3RhbmNlcywgRGlzY29ubmVjdGFibGVzIHJlY3Vyc2l2ZWx5XG4gIC8vIGZldGNoIHRoZSBjb25uZWN0aW9uIHN0YXRlIGZyb20gdGhlIFJvb3RQYXJ0IHRoZXkgYXJlIGNvbm5lY3RlZCBpbiB2aWFcbiAgLy8gZ2V0dGVycyB1cCB0aGUgRGlzY29ubmVjdGFibGUgdHJlZSB2aWEgXyRwYXJlbnQgcmVmZXJlbmNlcy4gVGhpcyBwdXNoZXMgdGhlXG4gIC8vIGNvc3Qgb2YgdHJhY2tpbmcgdGhlIGlzQ29ubmVjdGVkIHN0YXRlIHRvIGBBc3luY0RpcmVjdGl2ZXNgLCBhbmQgYXZvaWRzXG4gIC8vIG5lZWRpbmcgdG8gcGFzcyBhbGwgRGlzY29ubmVjdGFibGVzIChwYXJ0cywgdGVtcGxhdGUgaW5zdGFuY2VzLCBhbmRcbiAgLy8gZGlyZWN0aXZlcykgdGhlaXIgY29ubmVjdGlvbiBzdGF0ZSBlYWNoIHRpbWUgaXQgY2hhbmdlcywgd2hpY2ggd291bGQgYmVcbiAgLy8gY29zdGx5IGZvciB0cmVlcyB0aGF0IGhhdmUgbm8gQXN5bmNEaXJlY3RpdmVzLlxuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKFxuICBwYXJ0OiBDaGlsZFBhcnQgfCBBdHRyaWJ1dGVQYXJ0IHwgRWxlbWVudFBhcnQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBwYXJlbnQ6IERpcmVjdGl2ZVBhcmVudCA9IHBhcnQsXG4gIGF0dHJpYnV0ZUluZGV4PzogbnVtYmVyXG4pOiB1bmtub3duIHtcbiAgLy8gQmFpbCBlYXJseSBpZiB0aGUgdmFsdWUgaXMgZXhwbGljaXRseSBub0NoYW5nZS4gTm90ZSwgdGhpcyBtZWFucyBhbnlcbiAgLy8gbmVzdGVkIGRpcmVjdGl2ZSBpcyBzdGlsbCBhdHRhY2hlZCBhbmQgaXMgbm90IHJ1bi5cbiAgaWYgKHZhbHVlID09PSBub0NoYW5nZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBsZXQgY3VycmVudERpcmVjdGl2ZSA9XG4gICAgYXR0cmlidXRlSW5kZXggIT09IHVuZGVmaW5lZFxuICAgICAgPyAocGFyZW50IGFzIEF0dHJpYnV0ZVBhcnQpLl9fZGlyZWN0aXZlcz8uW2F0dHJpYnV0ZUluZGV4XVxuICAgICAgOiAocGFyZW50IGFzIENoaWxkUGFydCB8IEVsZW1lbnRQYXJ0IHwgRGlyZWN0aXZlKS5fX2RpcmVjdGl2ZTtcbiAgY29uc3QgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID0gaXNQcmltaXRpdmUodmFsdWUpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAodmFsdWUgYXMgRGlyZWN0aXZlUmVzdWx0KVsnXyRsaXREaXJlY3RpdmUkJ107XG4gIGlmIChjdXJyZW50RGlyZWN0aXZlPy5jb25zdHJ1Y3RvciAhPT0gbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKSB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjdXJyZW50RGlyZWN0aXZlPy5bJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8uKGZhbHNlKTtcbiAgICBpZiAobmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSBuZXcgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKHBhcnQgYXMgUGFydEluZm8pO1xuICAgICAgY3VycmVudERpcmVjdGl2ZS5fJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAoKHBhcmVudCBhcyBBdHRyaWJ1dGVQYXJ0KS5fX2RpcmVjdGl2ZXMgPz89IFtdKVthdHRyaWJ1dGVJbmRleF0gPVxuICAgICAgICBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocGFyZW50IGFzIENoaWxkUGFydCB8IERpcmVjdGl2ZSkuX19kaXJlY3RpdmUgPSBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudERpcmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKFxuICAgICAgcGFydCxcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUuXyRyZXNvbHZlKHBhcnQsICh2YWx1ZSBhcyBEaXJlY3RpdmVSZXN1bHQpLnZhbHVlcyksXG4gICAgICBjdXJyZW50RGlyZWN0aXZlLFxuICAgICAgYXR0cmlidXRlSW5kZXhcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUge1RlbXBsYXRlSW5zdGFuY2V9O1xuLyoqXG4gKiBBbiB1cGRhdGVhYmxlIGluc3RhbmNlIG9mIGEgVGVtcGxhdGUuIEhvbGRzIHJlZmVyZW5jZXMgdG8gdGhlIFBhcnRzIHVzZWQgdG9cbiAqIHVwZGF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2UuXG4gKi9cbmNsYXNzIFRlbXBsYXRlSW5zdGFuY2UgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIF8kdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBfJHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPiA9IFtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IENoaWxkUGFydDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBUZW1wbGF0ZSwgcGFyZW50OiBDaGlsZFBhcnQpIHtcbiAgICB0aGlzLl8kdGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IENoaWxkUGFydCBwYXJlbnROb2RlIGdldHRlclxuICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5wYXJlbnROb2RlO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGUgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiBhXG4gIC8vIERvY3VtZW50RnJhZ21lbnQgYW5kIHdlIGRvbid0IHdhbnQgdG8gaG9sZCBvbnRvIGl0IHdpdGggYW4gaW5zdGFuY2UgZmllbGQuXG4gIF9jbG9uZShvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWw6IHtjb250ZW50fSxcbiAgICAgIHBhcnRzOiBwYXJ0cyxcbiAgICB9ID0gdGhpcy5fJHRlbXBsYXRlO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gKG9wdGlvbnM/LmNyZWF0aW9uU2NvcGUgPz8gZCkuaW1wb3J0Tm9kZShjb250ZW50LCB0cnVlKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBmcmFnbWVudDtcblxuICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBwYXJ0SW5kZXggPSAwO1xuICAgIGxldCB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1swXTtcblxuICAgIHdoaWxlICh0ZW1wbGF0ZVBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG5vZGVJbmRleCA9PT0gdGVtcGxhdGVQYXJ0LmluZGV4KSB7XG4gICAgICAgIGxldCBwYXJ0OiBQYXJ0IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IENISUxEX1BBUlQpIHtcbiAgICAgICAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIG5vZGUgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICBub2RlLm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBBVFRSSUJVVEVfUEFSVCkge1xuICAgICAgICAgIHBhcnQgPSBuZXcgdGVtcGxhdGVQYXJ0LmN0b3IoXG4gICAgICAgICAgICBub2RlIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgdGVtcGxhdGVQYXJ0Lm5hbWUsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhcnQuc3RyaW5ncyxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gRUxFTUVOVF9QQVJUKSB7XG4gICAgICAgICAgcGFydCA9IG5ldyBFbGVtZW50UGFydChub2RlIGFzIEhUTUxFbGVtZW50LCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgdGVtcGxhdGVQYXJ0ID0gcGFydHNbKytwYXJ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGVJbmRleCAhPT0gdGVtcGxhdGVQYXJ0Py5pbmRleCkge1xuICAgICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgICAgICBub2RlSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIGN1cnJlbnROb2RlIGF3YXkgZnJvbSB0aGUgY2xvbmVkIHRyZWUgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IGhvbGQgb250byB0aGUgdHJlZSBldmVuIGlmIHRoZSB0cmVlIGlzIGRldGFjaGVkIGFuZCBzaG91bGQgYmVcbiAgICAvLyBmcmVlZC5cbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBkO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIF91cGRhdGUodmFsdWVzOiBBcnJheTx1bmtub3duPikge1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgdGhpcy5fJHBhcnRzKSB7XG4gICAgICBpZiAocGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdzZXQgcGFydCcsXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlc1tpXSxcbiAgICAgICAgICAgIHZhbHVlSW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB0ZW1wbGF0ZUluc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuc3RyaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuXyRzZXRWYWx1ZSh2YWx1ZXMsIHBhcnQgYXMgQXR0cmlidXRlUGFydCwgaSk7XG4gICAgICAgICAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgdGhlIHBhcnQgY29uc3VtZXMgaXMgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDFcbiAgICAgICAgICAvLyBzaW5jZSB2YWx1ZXMgYXJlIGluIGJldHdlZW4gdGVtcGxhdGUgc3BhbnMuIFdlIGluY3JlbWVudCBpIGJ5IDFcbiAgICAgICAgICAvLyBsYXRlciBpbiB0aGUgbG9vcCwgc28gaW5jcmVtZW50IGl0IGJ5IHBhcnQuc3RyaW5ncy5sZW5ndGggLSAyIGhlcmVcbiAgICAgICAgICBpICs9IChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnQpLnN0cmluZ3MhLmxlbmd0aCAtIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydC5fJHNldFZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gIH1cbn1cblxuLypcbiAqIFBhcnRzXG4gKi9cbnR5cGUgQXR0cmlidXRlVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY3RvcjogdHlwZW9mIEF0dHJpYnV0ZVBhcnQ7XG4gIHJlYWRvbmx5IHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbn07XG50eXBlIENoaWxkVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbn07XG50eXBlIEVsZW1lbnRUZW1wbGF0ZVBhcnQgPSB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBFTEVNRU5UX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59O1xudHlwZSBDb21tZW50VGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ09NTUVOVF9QQVJUO1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIFRlbXBsYXRlUGFydCByZXByZXNlbnRzIGEgZHluYW1pYyBwYXJ0IGluIGEgdGVtcGxhdGUsIGJlZm9yZSB0aGUgdGVtcGxhdGVcbiAqIGlzIGluc3RhbnRpYXRlZC4gV2hlbiBhIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCBQYXJ0cyBhcmUgY3JlYXRlZCBmcm9tXG4gKiBUZW1wbGF0ZVBhcnRzLlxuICovXG50eXBlIFRlbXBsYXRlUGFydCA9XG4gIHwgQ2hpbGRUZW1wbGF0ZVBhcnRcbiAgfCBBdHRyaWJ1dGVUZW1wbGF0ZVBhcnRcbiAgfCBFbGVtZW50VGVtcGxhdGVQYXJ0XG4gIHwgQ29tbWVudFRlbXBsYXRlUGFydDtcblxuZXhwb3J0IHR5cGUgUGFydCA9XG4gIHwgQ2hpbGRQYXJ0XG4gIHwgQXR0cmlidXRlUGFydFxuICB8IFByb3BlcnR5UGFydFxuICB8IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gIHwgRWxlbWVudFBhcnRcbiAgfCBFdmVudFBhcnQ7XG5cbmV4cG9ydCB0eXBlIHtDaGlsZFBhcnR9O1xuY2xhc3MgQ2hpbGRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5rbm93biA9IG5vdGhpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRzdGFydE5vZGU6IENoaWxkTm9kZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGVuZE5vZGU6IENoaWxkTm9kZSB8IG51bGw7XG4gIHByaXZhdGUgX3RleHRTYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIENvbm5lY3Rpb24gc3RhdGUgZm9yIFJvb3RQYXJ0cyBvbmx5IChpLmUuIENoaWxkUGFydCB3aXRob3V0IF8kcGFyZW50XG4gICAqIHJldHVybmVkIGZyb20gdG9wLWxldmVsIGByZW5kZXJgKS4gVGhpcyBmaWVsZCBpcyB1bnVzZWQgb3RoZXJ3aXNlLiBUaGVcbiAgICogaW50ZW50aW9uIHdvdWxkIGJlIGNsZWFyZXIgaWYgd2UgbWFkZSBgUm9vdFBhcnRgIGEgc3ViY2xhc3Mgb2YgYENoaWxkUGFydGBcbiAgICogd2l0aCB0aGlzIGZpZWxkIChhbmQgYSBkaWZmZXJlbnQgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIpLCBidXQgdGhlIHN1YmNsYXNzXG4gICAqIGNhdXNlZCBhIHBlcmYgcmVncmVzc2lvbiwgcG9zc2libHkgZHVlIHRvIG1ha2luZyBjYWxsIHNpdGVzIHBvbHltb3JwaGljLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9faXNDb25uZWN0ZWQ6IGJvb2xlYW47XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAvLyBDaGlsZFBhcnRzIHRoYXQgYXJlIG5vdCBhdCB0aGUgcm9vdCBzaG91bGQgYWx3YXlzIGJlIGNyZWF0ZWQgd2l0aCBhXG4gICAgLy8gcGFyZW50OyBvbmx5IFJvb3RDaGlsZE5vZGUncyB3b24ndCwgc28gdGhleSByZXR1cm4gdGhlIGxvY2FsIGlzQ29ubmVjdGVkXG4gICAgLy8gc3RhdGVcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudD8uXyRpc0Nvbm5lY3RlZCA/PyB0aGlzLl9faXNDb25uZWN0ZWQ7XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyB3aWxsIGJlIHBhdGNoZWQgb250byBDaGlsZFBhcnRzIHdoZW4gcmVxdWlyZWQgYnlcbiAgLy8gQXN5bmNEaXJlY3RpdmVcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/KFxuICAgIGlzQ29ubmVjdGVkOiBib29sZWFuLFxuICAgIHJlbW92ZUZyb21QYXJlbnQ/OiBib29sZWFuLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKTogdm9pZDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzPyhwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlKTogdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGFydE5vZGU6IENoaWxkTm9kZSxcbiAgICBlbmROb2RlOiBDaGlsZE5vZGUgfCBudWxsLFxuICAgIHBhcmVudDogVGVtcGxhdGVJbnN0YW5jZSB8IENoaWxkUGFydCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuXyRzdGFydE5vZGUgPSBzdGFydE5vZGU7XG4gICAgdGhpcy5fJGVuZE5vZGUgPSBlbmROb2RlO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBOb3RlIF9faXNDb25uZWN0ZWQgaXMgb25seSBldmVyIGFjY2Vzc2VkIG9uIFJvb3RQYXJ0cyAoaS5lLiB3aGVuIHRoZXJlIGlzXG4gICAgLy8gbm8gXyRwYXJlbnQpOyB0aGUgdmFsdWUgb24gYSBub24tcm9vdC1wYXJ0IGlzIFwiZG9uJ3QgY2FyZVwiLCBidXQgY2hlY2tpbmdcbiAgICAvLyBmb3IgcGFyZW50IHdvdWxkIGJlIG1vcmUgY29kZVxuICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IG9wdGlvbnM/LmlzQ29ubmVjdGVkID8/IHRydWU7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgLy8gRXhwbGljaXRseSBpbml0aWFsaXplIGZvciBjb25zaXN0ZW50IGNsYXNzIHNoYXBlLlxuICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmVudCBub2RlIGludG8gd2hpY2ggdGhlIHBhcnQgcmVuZGVycyBpdHMgY29udGVudC5cbiAgICpcbiAgICogQSBDaGlsZFBhcnQncyBjb250ZW50IGNvbnNpc3RzIG9mIGEgcmFuZ2Ugb2YgYWRqYWNlbnQgY2hpbGQgbm9kZXMgb2ZcbiAgICogYC5wYXJlbnROb2RlYCwgcG9zc2libHkgYm9yZGVyZWQgYnkgJ21hcmtlciBub2RlcycgKGAuc3RhcnROb2RlYCBhbmRcbiAgICogYC5lbmROb2RlYCkuXG4gICAqXG4gICAqIC0gSWYgYm90aCBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAgYXJlIG5vbi1udWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgKiBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgYmV0d2VlbiBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAsIGV4Y2x1c2l2ZWx5LlxuICAgKlxuICAgKiAtIElmIGAuc3RhcnROb2RlYCBpcyBub24tbnVsbCBidXQgYC5lbmROb2RlYCBpcyBudWxsLCB0aGVuIHRoZSBwYXJ0J3NcbiAgICogY29udGVudCBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgZm9sbG93aW5nIGAuc3RhcnROb2RlYCwgdXAgdG8gYW5kXG4gICAqIGluY2x1ZGluZyB0aGUgbGFzdCBjaGlsZCBvZiBgLnBhcmVudE5vZGVgLiBJZiBgLmVuZE5vZGVgIGlzIG5vbi1udWxsLCB0aGVuXG4gICAqIGAuc3RhcnROb2RlYCB3aWxsIGFsd2F5cyBiZSBub24tbnVsbC5cbiAgICpcbiAgICogLSBJZiBib3RoIGAuZW5kTm9kZWAgYW5kIGAuc3RhcnROb2RlYCBhcmUgbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICogY29uc2lzdHMgb2YgYWxsIGNoaWxkIG5vZGVzIG9mIGAucGFyZW50Tm9kZWAuXG4gICAqL1xuICBnZXQgcGFyZW50Tm9kZSgpOiBOb2RlIHtcbiAgICBsZXQgcGFyZW50Tm9kZTogTm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZSE7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fJHBhcmVudDtcbiAgICBpZiAoXG4gICAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyZW50Tm9kZT8ubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlQgKi9cbiAgICApIHtcbiAgICAgIC8vIElmIHRoZSBwYXJlbnROb2RlIGlzIGEgRG9jdW1lbnRGcmFnbWVudCwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIERPTSBpc1xuICAgICAgLy8gc3RpbGwgaW4gdGhlIGNsb25lZCBmcmFnbWVudCBkdXJpbmcgaW5pdGlhbCByZW5kZXI7IGlmIHNvLCBnZXQgdGhlIHJlYWxcbiAgICAgIC8vIHBhcmVudE5vZGUgdGhlIHBhcnQgd2lsbCBiZSBjb21taXR0ZWQgaW50byBieSBhc2tpbmcgdGhlIHBhcmVudC5cbiAgICAgIHBhcmVudE5vZGUgPSAocGFyZW50IGFzIENoaWxkUGFydCB8IFRlbXBsYXRlSW5zdGFuY2UpLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgbGVhZGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgKiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGdldCBzdGFydE5vZGUoKTogTm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl8kc3RhcnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgdHJhaWxpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICogaW5mb3JtYXRpb24uXG4gICAqL1xuICBnZXQgZW5kTm9kZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuXyRlbmROb2RlO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93biwgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzKTogdm9pZCB7XG4gICAgaWYgKERFVl9NT0RFICYmIHRoaXMucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhpcyBcXGBDaGlsZFBhcnRcXGAgaGFzIG5vIFxcYHBhcmVudE5vZGVcXGAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYWNjZXB0IGEgdmFsdWUuIFRoaXMgbGlrZWx5IG1lYW5zIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHBhcnQgd2FzIG1hbmlwdWxhdGVkIGluIGFuIHVuc3VwcG9ydGVkIHdheSBvdXRzaWRlIG9mIExpdCdzIGNvbnRyb2wgc3VjaCB0aGF0IHRoZSBwYXJ0J3MgbWFya2VyIG5vZGVzIHdlcmUgZWplY3RlZCBmcm9tIERPTS4gRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGVsZW1lbnQncyBcXGBpbm5lckhUTUxcXGAgb3IgXFxgdGV4dENvbnRlbnRcXGAgY2FuIGRvIHRoaXMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIE5vbi1yZW5kZXJpbmcgY2hpbGQgdmFsdWVzLiBJdCdzIGltcG9ydGFudCB0aGF0IHRoZXNlIGRvIG5vdCByZW5kZXJcbiAgICAgIC8vIGVtcHR5IHRleHQgbm9kZXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggcHJldmVudGluZyBkZWZhdWx0IDxzbG90PlxuICAgICAgLy8gZmFsbGJhY2sgY29udGVudC5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nKSB7XG4gICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm90aGluZyB0byBjaGlsZCcsXG4gICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgICAgICBlbmQ6IHRoaXMuXyRlbmROb2RlLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB9IGVsc2UgaWYgKCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdClbJ18kbGl0VHlwZSQnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jb21taXRUZW1wbGF0ZVJlc3VsdCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdCk7XG4gICAgfSBlbHNlIGlmICgodmFsdWUgYXMgTm9kZSkubm9kZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMub3B0aW9ucz8uaG9zdCA9PT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0VGV4dChcbiAgICAgICAgICBgW3Byb2JhYmxlIG1pc3Rha2U6IHJlbmRlcmVkIGEgdGVtcGxhdGUncyBob3N0IGluIGl0c2VsZiBgICtcbiAgICAgICAgICAgIGAoY29tbW9ubHkgY2F1c2VkIGJ5IHdyaXRpbmcgXFwke3RoaXN9IGluIGEgdGVtcGxhdGVdYFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEF0dGVtcHRlZCB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGhvc3RgLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGBpbnNpZGUgaXRzZWxmLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgYSBtaXN0YWtlLCBhbmQgaW4gZGV2IG1vZGUgYCxcbiAgICAgICAgICBgd2UgcmVuZGVyIHNvbWUgd2FybmluZyB0ZXh0LiBJbiBwcm9kdWN0aW9uIGhvd2V2ZXIsIHdlJ2xsIGAsXG4gICAgICAgICAgYHJlbmRlciBpdCwgd2hpY2ggd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhbiBlcnJvciwgYW5kIHNvbWV0aW1lcyBgLFxuICAgICAgICAgIGBpbiB0aGUgZWxlbWVudCBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgRE9NLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29tbWl0Tm9kZSh2YWx1ZSBhcyBOb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9jb21taXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrLCB3aWxsIHJlbmRlciB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICB0aGlzLl9jb21taXRUZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnQ8VCBleHRlbmRzIE5vZGU+KG5vZGU6IFQpIHtcbiAgICByZXR1cm4gd3JhcCh3cmFwKHRoaXMuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhKS5pbnNlcnRCZWZvcmUoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5fJGVuZE5vZGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0Tm9kZSh2YWx1ZTogTm9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgIGlmIChcbiAgICAgICAgRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTICYmXG4gICAgICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplclxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGVOYW1lID0gdGhpcy5fJHN0YXJ0Tm9kZS5wYXJlbnROb2RlPy5ub2RlTmFtZTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnIHx8IHBhcmVudE5vZGVOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICAgIGxldCBtZXNzYWdlID0gJ0ZvcmJpZGRlbic7XG4gICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHN0eWxlIG5vZGVzLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIHN0eWxlIGluamVjdGlvbiBhdHRhY2tzIGNhbiBgICtcbiAgICAgICAgICAgICAgICBgZXhmaWx0cmF0ZSBkYXRhIGFuZCBzcG9vZiBVSXMuIGAgK1xuICAgICAgICAgICAgICAgIGBDb25zaWRlciBpbnN0ZWFkIHVzaW5nIGNzc1xcYC4uLlxcYCBsaXRlcmFscyBgICtcbiAgICAgICAgICAgICAgICBgdG8gY29tcG9zZSBzdHlsZXMsIGFuZCBkbyBkeW5hbWljIHN0eWxpbmcgd2l0aCBgICtcbiAgICAgICAgICAgICAgICBgY3NzIGN1c3RvbSBwcm9wZXJ0aWVzLCA6OnBhcnRzLCA8c2xvdD5zLCBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGJ5IG11dGF0aW5nIHRoZSBET00gcmF0aGVyIHRoYW4gc3R5bGVzaGVldHMuYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzY3JpcHQgbm9kZXMuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzaywgYXMgaXQgY291bGQgYWxsb3cgYXJiaXRyYXJ5IGAgK1xuICAgICAgICAgICAgICAgIGBjb2RlIGV4ZWN1dGlvbi5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ2NvbW1pdCBub2RlJyxcbiAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB0aGlzLl9pbnNlcnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbW1pdFRleHQodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgY29tbWl0dGVkIHZhbHVlIGlzIGEgcHJpbWl0aXZlIGl0IG1lYW5zIHdlIGNhbGxlZCBfY29tbWl0VGV4dCBvblxuICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIsIGFuZCB3ZSBrbm93IHRoYXQgdGhpcy5fJHN0YXJ0Tm9kZS5uZXh0U2libGluZyBpcyBhXG4gICAgLy8gVGV4dCBub2RlLiBXZSBjYW4gbm93IGp1c3QgcmVwbGFjZSB0aGUgdGV4dCBjb250ZW50ICguZGF0YSkgb2YgdGhlIG5vZGUuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nICYmXG4gICAgICBpc1ByaW1pdGl2ZSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpXG4gICAgKSB7XG4gICAgICBjb25zdCBub2RlID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0O1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fdGV4dFNhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcihub2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKG5vZGUgYXMgVGV4dCkuZGF0YSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgICB0aGlzLl9jb21taXROb2RlKHRleHROb2RlKTtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIHRleHQgY29udGVudCwgZm9yIHNlY3VyaXR5IHB1cnBvc2VzIGl0IG1hdHRlcnMgYSBsb3RcbiAgICAgICAgLy8gd2hhdCB0aGUgcGFyZW50IGlzLiBGb3IgZXhhbXBsZSwgPHN0eWxlPiBhbmQgPHNjcmlwdD4gbmVlZCB0byBiZVxuICAgICAgICAvLyBoYW5kbGVkIHdpdGggY2FyZSwgd2hpbGUgPHNwYW4+IGRvZXMgbm90LiBTbyBmaXJzdCB3ZSBuZWVkIHRvIHB1dCBhXG4gICAgICAgIC8vIHRleHQgbm9kZSBpbnRvIHRoZSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gc2FuaXRpemUgaXRzIGNvbnRlbnQuXG4gICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKHRleHROb2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICBub2RlOiB0ZXh0Tm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB0ZXh0Tm9kZS5kYXRhID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29tbWl0Tm9kZShkLmNyZWF0ZVRleHROb2RlKHZhbHVlIGFzIHN0cmluZykpO1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgbm9kZTogd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0VGVtcGxhdGVSZXN1bHQoXG4gICAgcmVzdWx0OiBUZW1wbGF0ZVJlc3VsdCB8IENvbXBpbGVkVGVtcGxhdGVSZXN1bHRcbiAgKTogdm9pZCB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjb25zdCB7dmFsdWVzLCBbJ18kbGl0VHlwZSQnXTogdHlwZX0gPSByZXN1bHQ7XG4gICAgLy8gSWYgJGxpdFR5cGUkIGlzIGEgbnVtYmVyLCByZXN1bHQgaXMgYSBwbGFpbiBUZW1wbGF0ZVJlc3VsdCBhbmQgd2UgZ2V0XG4gICAgLy8gdGhlIHRlbXBsYXRlIGZyb20gdGhlIHRlbXBsYXRlIGNhY2hlLiBJZiBub3QsIHJlc3VsdCBpcyBhXG4gICAgLy8gQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCBhbmQgXyRsaXRUeXBlJCBpcyBhIENvbXBpbGVkVGVtcGxhdGUgYW5kIHdlIG5lZWRcbiAgICAvLyB0byBjcmVhdGUgdGhlIDx0ZW1wbGF0ZT4gZWxlbWVudCB0aGUgZmlyc3QgdGltZSB3ZSBzZWUgaXQuXG4gICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZSA9XG4gICAgICB0eXBlb2YgdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aGlzLl8kZ2V0VGVtcGxhdGUocmVzdWx0IGFzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdClcbiAgICAgICAgOiAodHlwZS5lbCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAodHlwZS5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHR5cGUuaCwgdHlwZS5oWzBdKSxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICB0eXBlKTtcblxuICAgIGlmICgodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIFRlbXBsYXRlSW5zdGFuY2UpPy5fJHRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgVGVtcGxhdGVJbnN0YW5jZSxcbiAgICAgICAgICBwYXJ0czogKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRlbXBsYXRlSW5zdGFuY2UodGVtcGxhdGUgYXMgVGVtcGxhdGUsIHRoaXMpO1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBpbnN0YW5jZS5fY2xvbmUodGhpcy5vcHRpb25zKTtcbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCcsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFydHM6IGluc3RhbmNlLl8kcGFydHMsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgfSk7XG4gICAgICBpbnN0YW5jZS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHBhcnRzOiBpbnN0YW5jZS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5fY29tbWl0Tm9kZShmcmFnbWVudCk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH1cblxuICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAvKiogQGludGVybmFsICovXG4gIF8kZ2V0VGVtcGxhdGUocmVzdWx0OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpIHtcbiAgICBsZXQgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNhY2hlLmdldChyZXN1bHQuc3RyaW5ncyk7XG4gICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlQ2FjaGUuc2V0KHJlc3VsdC5zdHJpbmdzLCAodGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVzdWx0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIF9jb21taXRJdGVyYWJsZSh2YWx1ZTogSXRlcmFibGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyBGb3IgYW4gSXRlcmFibGUsIHdlIGNyZWF0ZSBhIG5ldyBJbnN0YW5jZVBhcnQgcGVyIGl0ZW0sIHRoZW4gc2V0IGl0c1xuICAgIC8vIHZhbHVlIHRvIHRoZSBpdGVtLiBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBvdmVyaGVhZCBmb3IgZXZlcnkgaXRlbSBpblxuICAgIC8vIGFuIEl0ZXJhYmxlLCBidXQgaXQgbGV0cyB1cyByZWN1cnNlIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgdXBkYXRlIEFycmF5c1xuICAgIC8vIG9mIFRlbXBsYXRlUmVzdWx0cyB0aGF0IHdpbGwgYmUgY29tbW9ubHkgcmV0dXJuZWQgZnJvbSBleHByZXNzaW9ucyBsaWtlOlxuICAgIC8vIGFycmF5Lm1hcCgoaSkgPT4gaHRtbGAke2l9YCksIGJ5IHJldXNpbmcgZXhpc3RpbmcgVGVtcGxhdGVJbnN0YW5jZXMuXG5cbiAgICAvLyBJZiB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlbiB0aGUgcHJldmlvdXMgcmVuZGVyIHdhcyBvZiBhblxuICAgIC8vIGl0ZXJhYmxlIGFuZCB2YWx1ZSB3aWxsIGNvbnRhaW4gdGhlIENoaWxkUGFydHMgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIElmIHZhbHVlIGlzIG5vdCBhbiBhcnJheSwgY2xlYXIgdGhpcyBwYXJ0IGFuZCBtYWtlIGEgbmV3XG4gICAgLy8gYXJyYXkgZm9yIENoaWxkUGFydHMuXG4gICAgaWYgKCFpc0FycmF5KHRoaXMuXyRjb21taXR0ZWRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IFtdO1xuICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gTGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zIHdlIHN0YW1wZWQgc28gd2UgY2FuIGNsZWFyIGxlZnRvdmVyXG4gICAgLy8gaXRlbXMgZnJvbSBhIHByZXZpb3VzIHJlbmRlclxuICAgIGNvbnN0IGl0ZW1QYXJ0cyA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBDaGlsZFBhcnRbXTtcbiAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICBsZXQgaXRlbVBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgaWYgKHBhcnRJbmRleCA9PT0gaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAvLyBJZiBubyBleGlzdGluZyBwYXJ0LCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiB0ZXN0IHBlcmYgaW1wYWN0IG9mIGFsd2F5cyBjcmVhdGluZyB0d28gcGFydHNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiBzaGFyaW5nIHBhcnRzIGJldHdlZW4gbm9kZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzEyNjZcbiAgICAgICAgaXRlbVBhcnRzLnB1c2goXG4gICAgICAgICAgKGl0ZW1QYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIHRoaXMuX2luc2VydChjcmVhdGVNYXJrZXIoKSksXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICkpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXVzZSBhbiBleGlzdGluZyBwYXJ0XG4gICAgICAgIGl0ZW1QYXJ0ID0gaXRlbVBhcnRzW3BhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBpdGVtUGFydC5fJHNldFZhbHVlKGl0ZW0pO1xuICAgICAgcGFydEluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRJbmRleCA8IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8vIGl0ZW1QYXJ0cyBhbHdheXMgaGF2ZSBlbmQgbm9kZXNcbiAgICAgIHRoaXMuXyRjbGVhcihcbiAgICAgICAgaXRlbVBhcnQgJiYgd3JhcChpdGVtUGFydC5fJGVuZE5vZGUhKS5uZXh0U2libGluZyxcbiAgICAgICAgcGFydEluZGV4XG4gICAgICApO1xuICAgICAgLy8gVHJ1bmNhdGUgdGhlIHBhcnRzIGFycmF5IHNvIF92YWx1ZSByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgaXRlbVBhcnRzLmxlbmd0aCA9IHBhcnRJbmRleDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbm9kZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFBhcnQgZnJvbSB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgbm9kZSB0byBjbGVhciBmcm9tLCBmb3IgY2xlYXJpbmcgYSBzdWJzZXQgb2YgdGhlIHBhcnQnc1xuICAgKiAgICAgRE9NICh1c2VkIHdoZW4gdHJ1bmNhdGluZyBpdGVyYWJsZXMpXG4gICAqIEBwYXJhbSBmcm9tICBXaGVuIGBzdGFydGAgaXMgc3BlY2lmaWVkLCB0aGUgaW5kZXggd2l0aGluIHRoZSBpdGVyYWJsZSBmcm9tXG4gICAqICAgICB3aGljaCBDaGlsZFBhcnRzIGFyZSBiZWluZyByZW1vdmVkLCB1c2VkIGZvciBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXMgaW5cbiAgICogICAgIHRob3NlIFBhcnRzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF8kY2xlYXIoXG4gICAgc3RhcnQ6IENoaWxkTm9kZSB8IG51bGwgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oZmFsc2UsIHRydWUsIGZyb20pO1xuICAgIHdoaWxlIChzdGFydCAmJiBzdGFydCAhPT0gdGhpcy5fJGVuZE5vZGUpIHtcbiAgICAgIGNvbnN0IG4gPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgICAod3JhcChzdGFydCEpIGFzIEVsZW1lbnQpLnJlbW92ZSgpO1xuICAgICAgc3RhcnQgPSBuO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgUm9vdFBhcnQncyBgaXNDb25uZWN0ZWRgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2RcbiAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGBSb290UGFydGBzICh0aGUgYENoaWxkUGFydGAgcmV0dXJuZWQgZnJvbSBhXG4gICAqIHRvcC1sZXZlbCBgcmVuZGVyKClgIGNhbGwpLiBJdCBoYXMgbm8gZWZmZWN0IG9uIG5vbi1yb290IENoaWxkUGFydHMuXG4gICAqIEBwYXJhbSBpc0Nvbm5lY3RlZCBXaGV0aGVyIHRvIHNldFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHNldENvbm5lY3RlZChpc0Nvbm5lY3RlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl8kcGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkO1xuICAgICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oaXNDb25uZWN0ZWQpO1xuICAgIH0gZWxzZSBpZiAoREVWX01PREUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3BhcnQuc2V0Q29ubmVjdGVkKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgJyArXG4gICAgICAgICAgJ1Jvb3RQYXJ0IHJldHVybmVkIGZyb20gcmVuZGVyKCkuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHRvcC1sZXZlbCBgQ2hpbGRQYXJ0YCByZXR1cm5lZCBmcm9tIGByZW5kZXJgIHRoYXQgbWFuYWdlcyB0aGUgY29ubmVjdGVkXG4gKiBzdGF0ZSBvZiBgQXN5bmNEaXJlY3RpdmVgcyBjcmVhdGVkIHRocm91Z2hvdXQgdGhlIHRyZWUgYmVsb3cgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFBhcnQgZXh0ZW5kcyBDaGlsZFBhcnQge1xuICAvKipcbiAgICogU2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBmb3IgYEFzeW5jRGlyZWN0aXZlYHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHJvb3RcbiAgICogQ2hpbGRQYXJ0LlxuICAgKlxuICAgKiBsaXQtaHRtbCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IG1vbml0b3IgdGhlIGNvbm5lY3RlZG5lc3Mgb2YgRE9NIHJlbmRlcmVkO1xuICAgKiBhcyBzdWNoLCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBgcmVuZGVyYCB0byBlbnN1cmUgdGhhdFxuICAgKiBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYXJ0IG9iamVjdCBpcyBwb3RlbnRpYWxseVxuICAgKiBkaXNjYXJkZWQsIHRvIGVuc3VyZSB0aGF0IGBBc3luY0RpcmVjdGl2ZWBzIGhhdmUgYSBjaGFuY2UgdG8gZGlzcG9zZSBvZlxuICAgKiBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQuIElmIGEgYFJvb3RQYXJ0YCB0aGF0IHdhcyBwcmV2aW91c2x5XG4gICAqIGRpc2Nvbm5lY3RlZCBpcyBzdWJzZXF1ZW50bHkgcmUtY29ubmVjdGVkIChhbmQgaXRzIGBBc3luY0RpcmVjdGl2ZWBzIHNob3VsZFxuICAgKiByZS1jb25uZWN0KSwgYHNldENvbm5lY3RlZCh0cnVlKWAgc2hvdWxkIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGlzQ29ubmVjdGVkIFdoZXRoZXIgZGlyZWN0aXZlcyB3aXRoaW4gdGhpcyB0cmVlIHNob3VsZCBiZSBjb25uZWN0ZWRcbiAgICogb3Igbm90XG4gICAqL1xuICBzZXRDb25uZWN0ZWQoaXNDb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSB7QXR0cmlidXRlUGFydH07XG5jbGFzcyBBdHRyaWJ1dGVQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlOlxuICAgIHwgdHlwZW9mIEFUVFJJQlVURV9QQVJUXG4gICAgfCB0eXBlb2YgUFJPUEVSVFlfUEFSVFxuICAgIHwgdHlwZW9mIEJPT0xFQU5fQVRUUklCVVRFX1BBUlRcbiAgICB8IHR5cGVvZiBFVkVOVF9QQVJUID0gQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgYXR0cmlidXRlIHBhcnQgcmVwcmVzZW50cyBhbiBpbnRlcnBvbGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZVxuICAgKiBzdGF0aWMgc3RyaW5ncyBvZiB0aGUgaW50ZXJwb2xhdGlvbi4gRm9yIHNpbmdsZS12YWx1ZSwgY29tcGxldGUgYmluZGluZ3MsXG4gICAqIHRoaXMgaXMgdW5kZWZpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5ncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGNvbW1pdHRlZFZhbHVlOiB1bmtub3duIHwgQXJyYXk8dW5rbm93bj4gPSBub3RoaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIF9fZGlyZWN0aXZlcz86IEFycmF5PERpcmVjdGl2ZSB8IHVuZGVmaW5lZD47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlO1xuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIF9zYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuXG4gIGdldCB0YWdOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFnTmFtZTtcbiAgfVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMiB8fCBzdHJpbmdzWzBdICE9PSAnJyB8fCBzdHJpbmdzWzFdICE9PSAnJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3IEFycmF5KHN0cmluZ3MubGVuZ3RoIC0gMSkuZmlsbChuZXcgU3RyaW5nKCkpO1xuICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICB9XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgdGhpcy5fc2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhcnQgYnkgcmVzb2x2aW5nIHRoZSB2YWx1ZSBmcm9tIHBvc3NpYmx5IG11bHRpcGxlXG4gICAqIHZhbHVlcyBhbmQgc3RhdGljIHN0cmluZ3MgYW5kIGNvbW1pdHRpbmcgaXQgdG8gdGhlIERPTS5cbiAgICogSWYgdGhpcyBwYXJ0IGlzIHNpbmdsZS12YWx1ZWQsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIHVuZGVmaW5lZCwgYW5kIHRoZVxuICAgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSB2YWx1ZSBhcmd1bWVudC4gSWYgdGhpcyBwYXJ0IGlzXG4gICAqIG11bHRpLXZhbHVlLCBgdGhpcy5fc3RyaW5nc2Agd2lsbCBiZSBkZWZpbmVkLCBhbmQgdGhlIG1ldGhvZCBpcyBjYWxsZWRcbiAgICogd2l0aCB0aGUgdmFsdWUgYXJyYXkgb2YgdGhlIHBhcnQncyBvd25pbmcgVGVtcGxhdGVJbnN0YW5jZSwgYW5kIGFuIG9mZnNldFxuICAgKiBpbnRvIHRoZSB2YWx1ZSBhcnJheSBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHJlYWQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyB3YXkgdG8gZWxpbWluYXRlIHNob3J0LWxpdmVkIGFycmF5IHNsaWNlc1xuICAgKiBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdmFsdWVzLCBhbmQgYWxsb3cgYSBmYXN0LXBhdGggZm9yIHNpbmdsZS12YWx1ZWRcbiAgICogcGFydHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcGFydCB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciBtdWx0aS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIHZhbHVlSW5kZXggdGhlIGluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgdmFsdWVzIGZyb20uIGB1bmRlZmluZWRgIGZvclxuICAgKiAgIHNpbmdsZS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIG5vQ29tbWl0IGNhdXNlcyB0aGUgcGFydCB0byBub3QgY29tbWl0IGl0cyB2YWx1ZSB0byB0aGUgRE9NLiBVc2VkXG4gICAqICAgaW4gaHlkcmF0aW9uIHRvIHByaW1lIGF0dHJpYnV0ZSBwYXJ0cyB3aXRoIHRoZWlyIGZpcnN0LXJlbmRlcmVkIHZhbHVlLFxuICAgKiAgIGJ1dCBub3Qgc2V0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiBTU1IgdG8gbm8tb3AgdGhlIERPTSBvcGVyYXRpb24gYW5kXG4gICAqICAgY2FwdHVyZSB0aGUgdmFsdWUgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRzZXRWYWx1ZShcbiAgICB2YWx1ZTogdW5rbm93biB8IEFycmF5PHVua25vd24+LFxuICAgIGRpcmVjdGl2ZVBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gdGhpcyxcbiAgICB2YWx1ZUluZGV4PzogbnVtYmVyLFxuICAgIG5vQ29tbWl0PzogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBzdHJpbmdzID0gdGhpcy5zdHJpbmdzO1xuXG4gICAgLy8gV2hldGhlciBhbnkgb2YgdGhlIHZhbHVlcyBoYXMgY2hhbmdlZCwgZm9yIGRpcnR5LWNoZWNraW5nXG4gICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuXG4gICAgaWYgKHN0cmluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2luZ2xlLXZhbHVlIGJpbmRpbmcgY2FzZVxuICAgICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQsIDApO1xuICAgICAgY2hhbmdlID1cbiAgICAgICAgIWlzUHJpbWl0aXZlKHZhbHVlKSB8fFxuICAgICAgICAodmFsdWUgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAmJiB2YWx1ZSAhPT0gbm9DaGFuZ2UpO1xuICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJwb2xhdGlvbiBjYXNlXG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZSBhcyBBcnJheTx1bmtub3duPjtcbiAgICAgIHZhbHVlID0gc3RyaW5nc1swXTtcblxuICAgICAgbGV0IGksIHY7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdiA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWVzW3ZhbHVlSW5kZXghICsgaV0sIGRpcmVjdGl2ZVBhcmVudCwgaSk7XG5cbiAgICAgICAgaWYgKHYgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHVzZXItcHJvdmlkZWQgdmFsdWUgaXMgYG5vQ2hhbmdlYCwgdXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgIHYgPSAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEFycmF5PHVua25vd24+KVtpXTtcbiAgICAgICAgfVxuICAgICAgICBjaGFuZ2UgfHw9XG4gICAgICAgICAgIWlzUHJpbWl0aXZlKHYpIHx8IHYgIT09ICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldO1xuICAgICAgICBpZiAodiA9PT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlID0gbm90aGluZztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlICs9ICh2ID8/ICcnKSArIHN0cmluZ3NbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGFsd2F5cyByZWNvcmQgZWFjaCB2YWx1ZSwgZXZlbiBpZiBvbmUgaXMgYG5vdGhpbmdgLCBmb3IgZnV0dXJlXG4gICAgICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldID0gdjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZSAmJiAhbm9Db21taXQpIHtcbiAgICAgIHRoaXMuX2NvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZykge1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgICAnYXR0cmlidXRlJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZXIodmFsdWUgPz8gJycpO1xuICAgICAgfVxuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZScsXG4gICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgKHZhbHVlID8/ICcnKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtQcm9wZXJ0eVBhcnR9O1xuY2xhc3MgUHJvcGVydHlQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHR5cGUgPSBQUk9QRVJUWV9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb3ZlcnJpZGUgX2NvbW1pdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgaWYgKHRoaXMuX3Nhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICdwcm9wZXJ0eSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlKTtcbiAgICB9XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgIGtpbmQ6ICdjb21taXQgcHJvcGVydHknLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHRoaXMuZWxlbWVudCBhcyBhbnkpW3RoaXMubmFtZV0gPSB2YWx1ZSA9PT0gbm90aGluZyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtCb29sZWFuQXR0cmlidXRlUGFydH07XG5jbGFzcyBCb29sZWFuQXR0cmlidXRlUGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICBvdmVycmlkZSByZWFkb25seSB0eXBlID0gQk9PTEVBTl9BVFRSSUJVVEVfUEFSVDtcblxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJyxcbiAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHZhbHVlOiAhISh2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZyksXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICh3cmFwKHRoaXMuZWxlbWVudCkgYXMgRWxlbWVudCkudG9nZ2xlQXR0cmlidXRlKFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgISF2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZ1xuICAgICk7XG4gIH1cbn1cblxudHlwZSBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgPSBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0ICZcbiAgUGFydGlhbDxBZGRFdmVudExpc3RlbmVyT3B0aW9ucz47XG5cbi8qKlxuICogQW4gQXR0cmlidXRlUGFydCB0aGF0IG1hbmFnZXMgYW4gZXZlbnQgbGlzdGVuZXIgdmlhIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyLlxuICpcbiAqIFRoaXMgcGFydCB3b3JrcyBieSBhZGRpbmcgaXRzZWxmIGFzIHRoZSBldmVudCBsaXN0ZW5lciBvbiBhbiBlbGVtZW50LCB0aGVuXG4gKiBkZWxlZ2F0aW5nIHRvIHRoZSB2YWx1ZSBwYXNzZWQgdG8gaXQuIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvXG4gKiBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lciBpZiB0aGUgbGlzdGVuZXIgY2hhbmdlcyBmcmVxdWVudGx5LCBzdWNoIGFzIHdoZW4gYW5cbiAqIGlubGluZSBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgbGlzdGVuZXIuXG4gKlxuICogQmVjYXVzZSBldmVudCBvcHRpb25zIGFyZSBwYXNzZWQgd2hlbiBhZGRpbmcgbGlzdGVuZXJzLCB3ZSBtdXN0IHRha2UgY2FzZVxuICogdG8gYWRkIGFuZCByZW1vdmUgdGhlIHBhcnQgYXMgYSBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBvcHRpb25zIGNoYW5nZS5cbiAqL1xuZXhwb3J0IHR5cGUge0V2ZW50UGFydH07XG5jbGFzcyBFdmVudFBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgdHlwZSA9IEVWRU5UX1BBUlQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKTtcblxuICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQSBcXGA8JHtlbGVtZW50LmxvY2FsTmFtZX0+XFxgIGhhcyBhIFxcYEAke25hbWV9PS4uLlxcYCBsaXN0ZW5lciB3aXRoIGAgK1xuICAgICAgICAgICdpbnZhbGlkIGNvbnRlbnQuIEV2ZW50IGxpc3RlbmVycyBpbiB0ZW1wbGF0ZXMgbXVzdCBoYXZlIGV4YWN0bHkgJyArXG4gICAgICAgICAgJ29uZSBleHByZXNzaW9uIGFuZCBubyBzdXJyb3VuZGluZyB0ZXh0LidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlbnRQYXJ0IGRvZXMgbm90IHVzZSB0aGUgYmFzZSBfJHNldFZhbHVlL19yZXNvbHZlVmFsdWUgaW1wbGVtZW50YXRpb25cbiAgLy8gc2luY2UgdGhlIGRpcnR5IGNoZWNraW5nIGlzIG1vcmUgY29tcGxleFxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF8kc2V0VmFsdWUoXG4gICAgbmV3TGlzdGVuZXI6IHVua25vd24sXG4gICAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzXG4gICkge1xuICAgIG5ld0xpc3RlbmVyID1cbiAgICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgbmV3TGlzdGVuZXIsIGRpcmVjdGl2ZVBhcmVudCwgMCkgPz8gbm90aGluZztcbiAgICBpZiAobmV3TGlzdGVuZXIgPT09IG5vQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9sZExpc3RlbmVyID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuXG4gICAgLy8gSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3RoaW5nIG9yIGFueSBvcHRpb25zIGNoYW5nZSB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVcbiAgICAvLyBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkUmVtb3ZlTGlzdGVuZXIgPVxuICAgICAgKG5ld0xpc3RlbmVyID09PSBub3RoaW5nICYmIG9sZExpc3RlbmVyICE9PSBub3RoaW5nKSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZTtcblxuICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IG5vdGhpbmcgYW5kIHdlIHJlbW92ZWQgdGhlIGxpc3RlbmVyLCB3ZSBoYXZlXG4gICAgLy8gdG8gYWRkIHRoZSBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkQWRkTGlzdGVuZXIgPVxuICAgICAgbmV3TGlzdGVuZXIgIT09IG5vdGhpbmcgJiZcbiAgICAgIChvbGRMaXN0ZW5lciA9PT0gbm90aGluZyB8fCBzaG91bGRSZW1vdmVMaXN0ZW5lcik7XG5cbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ2NvbW1pdCBldmVudCBsaXN0ZW5lcicsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB2YWx1ZTogbmV3TGlzdGVuZXIsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IHNob3VsZFJlbW92ZUxpc3RlbmVyLFxuICAgICAgICBhZGRMaXN0ZW5lcjogc2hvdWxkQWRkTGlzdGVuZXIsXG4gICAgICAgIG9sZExpc3RlbmVyLFxuICAgICAgfSk7XG4gICAgaWYgKHNob3VsZFJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLFxuICAgICAgICBvbGRMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcikge1xuICAgICAgLy8gQmV3YXJlOiBJRTExIGFuZCBDaHJvbWUgNDEgZG9uJ3QgbGlrZSB1c2luZyB0aGUgbGlzdGVuZXIgYXMgdGhlXG4gICAgICAvLyBvcHRpb25zIG9iamVjdC4gRmlndXJlIG91dCBob3cgdG8gZGVhbCB3LyB0aGlzIGluIElFMTEgLSBtYXliZVxuICAgICAgLy8gcGF0Y2ggYWRkRXZlbnRMaXN0ZW5lcj9cbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3TGlzdGVuZXI7XG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmNhbGwodGhpcy5vcHRpb25zPy5ob3N0ID8/IHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEV2ZW50TGlzdGVuZXJPYmplY3QpLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUge0VsZW1lbnRQYXJ0fTtcbmNsYXNzIEVsZW1lbnRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gRUxFTUVOVF9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG5cbiAgLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBldmVyeSBQYXJ0IGhhcyBhIF8kY29tbWl0dGVkVmFsdWVcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5kZWZpbmVkO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQhOiBEaXNjb25uZWN0YWJsZTtcblxuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IHRvIGVsZW1lbnQgYmluZGluZycsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzIG1hbmdsZWQgaW4gdGhlXG4gKiBjbGllbnQgc2lkZSBjb2RlLCB3ZSBleHBvcnQgYSBfJExIIG9iamVjdCBjb250YWluaW5nIHRob3NlIG1lbWJlcnMgKG9yXG4gKiBoZWxwZXIgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgZmllbGRzIG9mIHRob3NlIG1lbWJlcnMpLCBhbmQgdGhlblxuICogcmUtZXhwb3J0IHRoZW0gZm9yIHVzZSBpbiBsaXQtc3NyLiBUaGlzIGtlZXBzIGxpdC1zc3IgYWdub3N0aWMgdG8gd2hldGhlciB0aGVcbiAqIGNsaWVudC1zaWRlIGNvZGUgaXMgYmVpbmcgdXNlZCBpbiBgZGV2YCBtb2RlIG9yIGBwcm9kYCBtb2RlLlxuICpcbiAqIFRoaXMgaGFzIGEgdW5pcXVlIG5hbWUsIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHByaXZhdGUgZXhwb3J0cyBpblxuICogbGl0LWVsZW1lbnQsIHdoaWNoIHJlLWV4cG9ydHMgYWxsIG9mIGxpdC1odG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfJExIID0ge1xuICAvLyBVc2VkIGluIGxpdC1zc3JcbiAgX2JvdW5kQXR0cmlidXRlU3VmZml4OiBib3VuZEF0dHJpYnV0ZVN1ZmZpeCxcbiAgX21hcmtlcjogbWFya2VyLFxuICBfbWFya2VyTWF0Y2g6IG1hcmtlck1hdGNoLFxuICBfSFRNTF9SRVNVTFQ6IEhUTUxfUkVTVUxULFxuICBfZ2V0VGVtcGxhdGVIdG1sOiBnZXRUZW1wbGF0ZUh0bWwsXG4gIC8vIFVzZWQgaW4gdGVzdHMgYW5kIHByaXZhdGUtc3NyLXN1cHBvcnRcbiAgX1RlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2UsXG4gIF9pc0l0ZXJhYmxlOiBpc0l0ZXJhYmxlLFxuICBfcmVzb2x2ZURpcmVjdGl2ZTogcmVzb2x2ZURpcmVjdGl2ZSxcbiAgX0NoaWxkUGFydDogQ2hpbGRQYXJ0LFxuICBfQXR0cmlidXRlUGFydDogQXR0cmlidXRlUGFydCxcbiAgX0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0OiBCb29sZWFuQXR0cmlidXRlUGFydCxcbiAgX0V2ZW50UGFydDogRXZlbnRQYXJ0LFxuICBfUHJvcGVydHlQYXJ0OiBQcm9wZXJ0eVBhcnQsXG4gIF9FbGVtZW50UGFydDogRWxlbWVudFBhcnQsXG59O1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oVGVtcGxhdGUsIENoaWxkUGFydCk7XG5cbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgbGl0LWh0bWwgdXNhZ2UuXG4oZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzMuMi4xJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gYCArXG4gICAgICBgTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB2YWx1ZSwgdXN1YWxseSBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0LCB0byB0aGUgY29udGFpbmVyLlxuICpcbiAqIFRoaXMgZXhhbXBsZSByZW5kZXJzIHRoZSB0ZXh0IFwiSGVsbG8sIFpvZSFcIiBpbnNpZGUgYSBwYXJhZ3JhcGggdGFnLCBhcHBlbmRpbmdcbiAqIGl0IHRvIHRoZSBjb250YWluZXIgYGRvY3VtZW50LmJvZHlgLlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2h0bWwsIHJlbmRlcn0gZnJvbSAnbGl0JztcbiAqXG4gKiBjb25zdCBuYW1lID0gXCJab2VcIjtcbiAqIHJlbmRlcihodG1sYDxwPkhlbGxvLCAke25hbWV9ITwvcD5gLCBkb2N1bWVudC5ib2R5KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBBbnkgW3JlbmRlcmFibGVcbiAqICAgdmFsdWVdKGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jY2hpbGQtZXhwcmVzc2lvbnMpLFxuICogICB0eXBpY2FsbHkgYSB7QGxpbmtjb2RlIFRlbXBsYXRlUmVzdWx0fSBjcmVhdGVkIGJ5IGV2YWx1YXRpbmcgYSB0ZW1wbGF0ZSB0YWdcbiAqICAgbGlrZSB7QGxpbmtjb2RlIGh0bWx9IG9yIHtAbGlua2NvZGUgc3ZnfS5cbiAqIEBwYXJhbSBjb250YWluZXIgQSBET00gY29udGFpbmVyIHRvIHJlbmRlciB0by4gVGhlIGZpcnN0IHJlbmRlciB3aWxsIGFwcGVuZFxuICogICB0aGUgcmVuZGVyZWQgdmFsdWUgdG8gdGhlIGNvbnRhaW5lciwgYW5kIHN1YnNlcXVlbnQgcmVuZGVycyB3aWxsXG4gKiAgIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgdmFsdWUgaWYgdGhlIHNhbWUgcmVzdWx0IHR5cGUgd2FzXG4gKiAgIHByZXZpb3VzbHkgcmVuZGVyZWQgdGhlcmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWUge0BsaW5rY29kZSBSZW5kZXJPcHRpb25zfSBmb3Igb3B0aW9ucyBkb2N1bWVudGF0aW9uLlxuICogQHNlZVxuICoge0BsaW5rIGh0dHBzOi8vbGl0LmRldi9kb2NzL2xpYnJhcmllcy9zdGFuZGFsb25lLXRlbXBsYXRlcy8jcmVuZGVyaW5nLWxpdC1odG1sLXRlbXBsYXRlc3wgUmVuZGVyaW5nIExpdCBIVE1MIFRlbXBsYXRlc31cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LFxuICBvcHRpb25zPzogUmVuZGVyT3B0aW9uc1xuKTogUm9vdFBhcnQgPT4ge1xuICBpZiAoREVWX01PREUgJiYgY29udGFpbmVyID09IG51bGwpIHtcbiAgICAvLyBHaXZlIGEgY2xlYXJlciBlcnJvciBtZXNzYWdlIHRoYW5cbiAgICAvLyAgICAgVW5jYXVnaHQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIG51bGwgKHJlYWRpbmdcbiAgICAvLyAgICAgJ18kbGl0UGFydCQnKVxuICAgIC8vIHdoaWNoIHJlYWRzIGxpa2UgYW4gaW50ZXJuYWwgTGl0IGVycm9yLlxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBjb250YWluZXIgdG8gcmVuZGVyIGludG8gbWF5IG5vdCBiZSAke2NvbnRhaW5lcn1gKTtcbiAgfVxuICBjb25zdCByZW5kZXJJZCA9IERFVl9NT0RFID8gZGVidWdMb2dSZW5kZXJJZCsrIDogMDtcbiAgY29uc3QgcGFydE93bmVyTm9kZSA9IG9wdGlvbnM/LnJlbmRlckJlZm9yZSA/PyBjb250YWluZXI7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGxldCBwYXJ0OiBDaGlsZFBhcnQgPSAocGFydE93bmVyTm9kZSBhcyBhbnkpWydfJGxpdFBhcnQkJ107XG4gIGRlYnVnTG9nRXZlbnQgJiZcbiAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgIGtpbmQ6ICdiZWdpbiByZW5kZXInLFxuICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgdmFsdWUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcHRpb25zLFxuICAgICAgcGFydCxcbiAgICB9KTtcbiAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGVuZE5vZGUgPSBvcHRpb25zPy5yZW5kZXJCZWZvcmUgPz8gbnVsbDtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHBhcnRPd25lck5vZGUgYXMgYW55KVsnXyRsaXRQYXJ0JCddID0gcGFydCA9IG5ldyBDaGlsZFBhcnQoXG4gICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCBlbmROb2RlKSxcbiAgICAgIGVuZE5vZGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBvcHRpb25zID8/IHt9XG4gICAgKTtcbiAgfVxuICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWUpO1xuICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgZGVidWdMb2dFdmVudCh7XG4gICAgICBraW5kOiAnZW5kIHJlbmRlcicsXG4gICAgICBpZDogcmVuZGVySWQsXG4gICAgICB2YWx1ZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9wdGlvbnMsXG4gICAgICBwYXJ0LFxuICAgIH0pO1xuICByZXR1cm4gcGFydCBhcyBSb290UGFydDtcbn07XG5cbmlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgcmVuZGVyLnNldFNhbml0aXplciA9IHNldFNhbml0aXplcjtcbiAgcmVuZGVyLmNyZWF0ZVNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcjtcbiAgaWYgKERFVl9NT0RFKSB7XG4gICAgcmVuZGVyLl90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZSA9XG4gICAgICBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFpbiBMaXRFbGVtZW50IG1vZHVsZSwgd2hpY2ggZGVmaW5lcyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50fSBiYXNlXG4gKiBjbGFzcyBhbmQgcmVsYXRlZCBBUElzLlxuICpcbiAqIExpdEVsZW1lbnQgY29tcG9uZW50cyBjYW4gZGVmaW5lIGEgdGVtcGxhdGUgYW5kIGEgc2V0IG9mIG9ic2VydmVkXG4gKiBwcm9wZXJ0aWVzLiBDaGFuZ2luZyBhbiBvYnNlcnZlZCBwcm9wZXJ0eSB0cmlnZ2VycyBhIHJlLXJlbmRlciBvZiB0aGVcbiAqIGVsZW1lbnQuXG4gKlxuICogSW1wb3J0IHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYW5kIHtAbGlua2NvZGUgaHRtbH0gZnJvbSB0aGlzIG1vZHVsZSB0b1xuICogY3JlYXRlIGEgY29tcG9uZW50OlxuICpcbiAqICBgYGBqc1xuICogaW1wb3J0IHtMaXRFbGVtZW50LCBodG1sfSBmcm9tICdsaXQtZWxlbWVudCc7XG4gKlxuICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gKlxuICogICAvLyBEZWNsYXJlIG9ic2VydmVkIHByb3BlcnRpZXNcbiAqICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICBhZGplY3RpdmU6IHt9XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICB0aGlzLmFkamVjdGl2ZSA9ICdhd2Vzb21lJztcbiAqICAgfVxuICpcbiAqICAgLy8gRGVmaW5lIHRoZSBlbGVtZW50J3MgdGVtcGxhdGVcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYDxwPnlvdXIgJHthZGplY3RpdmV9IHRlbXBsYXRlIGhlcmU8L3A+YDtcbiAqICAgfVxuICogfVxuICpcbiAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnbXktZWxlbWVudCcsIE15RWxlbWVudCk7XG4gKiBgYGBcbiAqXG4gKiBgTGl0RWxlbWVudGAgZXh0ZW5kcyB7QGxpbmtjb2RlIFJlYWN0aXZlRWxlbWVudH0gYW5kIGFkZHMgbGl0LWh0bWxcbiAqIHRlbXBsYXRpbmcuIFRoZSBgUmVhY3RpdmVFbGVtZW50YCBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdXNlcnMgdGhhdCB3YW50IHRvXG4gKiBidWlsZCB0aGVpciBvd24gY3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlIGxpdC1odG1sLlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5pbXBvcnQge1Byb3BlcnR5VmFsdWVzLCBSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge3JlbmRlciwgUmVuZGVyT3B0aW9ucywgbm9DaGFuZ2UsIFJvb3RQYXJ0fSBmcm9tICdsaXQtaHRtbCc7XG5leHBvcnQgKiBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnbGl0LWh0bWwnO1xuXG5pbXBvcnQge0xpdFVuc3RhYmxlfSBmcm9tICdsaXQtaHRtbCc7XG5pbXBvcnQge1JlYWN0aXZlVW5zdGFibGV9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5cbi8qKlxuICogQ29udGFpbnMgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdW5zdGFibGUgZGVidWcgQVBJLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaW4gdGhpcyBBUEkgaXMgbm90IHN0YWJsZSBhbmQgbWF5IGNoYW5nZSBvciBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsXG4gKiBldmVuIG9uIHBhdGNoIHJlbGVhc2VzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPVxuICAgICAgfCBMaXRVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeVxuICAgICAgfCBSZWFjdGl2ZVVuc3RhYmxlLkRlYnVnTG9nLkVudHJ5O1xuICB9XG59XG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuaWYgKERFVl9NT0RFKSB7XG4gIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gIC8vIGFyZSBsb2FkZWQuXG4gIGNvbnN0IGlzc3VlZFdhcm5pbmdzOiBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPiA9XG4gICAgKGdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHRoYXQgbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMsIGFuZFxuICogcmVuZGVycyBhIGxpdC1odG1sIHRlbXBsYXRlLlxuICpcbiAqIFRvIGRlZmluZSBhIGNvbXBvbmVudCwgc3ViY2xhc3MgYExpdEVsZW1lbnRgIGFuZCBpbXBsZW1lbnQgYVxuICogYHJlbmRlcmAgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlLiBEZWZpbmUgcHJvcGVydGllc1xuICogdXNpbmcgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudC5wcm9wZXJ0aWVzIHByb3BlcnRpZXN9IHByb3BlcnR5IG9yIHRoZVxuICoge0BsaW5rY29kZSBwcm9wZXJ0eX0gZGVjb3JhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgTGl0RWxlbWVudCBleHRlbmRzIFJlYWN0aXZlRWxlbWVudCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIHN0YXRpYyBbJ18kbGl0RWxlbWVudCQnXSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck9wdGlvbnM6IFJlbmRlck9wdGlvbnMgPSB7aG9zdDogdGhpc307XG5cbiAgcHJpdmF0ZSBfX2NoaWxkUGFydDogUm9vdFBhcnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVSZW5kZXJSb290KCkge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gV2hlbiBhZG9wdGVkU3R5bGVTaGVldHMgYXJlIHNoaW1tZWQsIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlXG4gICAgLy8gc2hhZG93Um9vdCBieSBjcmVhdGVSZW5kZXJSb290LiBBZGp1c3QgdGhlIHJlbmRlckJlZm9yZSBub2RlIHNvIHRoYXRcbiAgICAvLyBhbnkgc3R5bGVzIGluIExpdCBjb250ZW50IHJlbmRlciBiZWZvcmUgYWRvcHRlZFN0eWxlU2hlZXRzLiBUaGlzIGlzXG4gICAgLy8gaW1wb3J0YW50IHNvIHRoYXQgYWRvcHRlZFN0eWxlU2hlZXRzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICAgIC8vIHRoZSBzaGFkb3dSb290LlxuICAgIHRoaXMucmVuZGVyT3B0aW9ucy5yZW5kZXJCZWZvcmUgPz89IHJlbmRlclJvb3QhLmZpcnN0Q2hpbGQgYXMgQ2hpbGROb2RlO1xuICAgIHJldHVybiByZW5kZXJSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzXG4gICAqIGFuZCBjYWxscyBgcmVuZGVyYCB0byByZW5kZXIgRE9NIHZpYSBsaXQtaHRtbC4gU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZVxuICAgKiB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXIgYW5vdGhlciB1cGRhdGUuXG4gICAqIEBwYXJhbSBjaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHtcbiAgICAvLyBTZXR0aW5nIHByb3BlcnRpZXMgaW4gYHJlbmRlcmAgc2hvdWxkIG5vdCB0cmlnZ2VyIGFuIHVwZGF0ZS4gU2luY2VcbiAgICAvLyB1cGRhdGVzIGFyZSBhbGxvd2VkIGFmdGVyIHN1cGVyLnVwZGF0ZSwgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgcmVuZGVyYFxuICAgIC8vIGJlZm9yZSB0aGF0LlxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZW5kZXIoKTtcbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLmlzQ29ubmVjdGVkID0gdGhpcy5pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgc3VwZXIudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gcmVuZGVyKHZhbHVlLCB0aGlzLnJlbmRlclJvb3QsIHRoaXMucmVuZGVyT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWRkZWQgdG8gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBJbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgeW91IHNob3VsZCBzZXR1cCB0YXNrcyB0aGF0IHNob3VsZCBvbmx5IG9jY3VyIHdoZW5cbiAgICogdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBkb2N1bWVudC4gVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlIGlzXG4gICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMgdG8gbm9kZXMgZXh0ZXJuYWwgdG8gdGhlIGVsZW1lbnQsIGxpa2UgYSBrZXlkb3duXG4gICAqIGV2ZW50IGhhbmRsZXIgYWRkZWQgdG8gdGhlIHdpbmRvdy5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAqICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICogICBhZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFR5cGljYWxseSwgYW55dGhpbmcgZG9uZSBpbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGJlIHVuZG9uZSB3aGVuIHRoZVxuICAgKiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCwgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAqL1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRoZSBtYWluIHNpZ25hbCB0byB0aGUgZWxlbWVudCB0aGF0IGl0IG1heSBubyBsb25nZXIgYmVcbiAgICogdXNlZC4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBlbnN1cmUgdGhhdCBub3RoaW5nIGlzIGhvbGRpbmcgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgKHN1Y2ggYXMgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIHRvIG5vZGVzIGV4dGVybmFsXG4gICAqIHRvIHRoZSBlbGVtZW50KSwgc28gdGhhdCBpdCBpcyBmcmVlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICogICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgKiAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEFuIGVsZW1lbnQgbWF5IGJlIHJlLWNvbm5lY3RlZCBhZnRlciBiZWluZyBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICovXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uIGVhY2ggdXBkYXRlIHRvIHBlcmZvcm0gcmVuZGVyaW5nIHRhc2tzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuXG4gICAqIGFueSB2YWx1ZSByZW5kZXJhYmxlIGJ5IGxpdC1odG1sJ3MgYENoaWxkUGFydGAgLSB0eXBpY2FsbHkgYVxuICAgKiBgVGVtcGxhdGVSZXN1bHRgLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiB0aGUgZWxlbWVudCB0byB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXIoKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIHRoaXMgY2xhc3MgaXMgbWFya2VkIGFzIGBmaW5hbGl6ZWRgIGFzIGFuIG9wdGltaXphdGlvbiBlbnN1cmluZ1xuICogaXQgd2lsbCBub3QgbmVlZGxlc3NseSB0cnkgdG8gYGZpbmFsaXplYC5cbiAqXG4gKiBOb3RlIHRoaXMgcHJvcGVydHkgbmFtZSBpcyBhIHN0cmluZyB0byBwcmV2ZW50IGJyZWFraW5nIENsb3N1cmUgSlMgQ29tcGlsZXJcbiAqIG9wdGltaXphdGlvbnMuIFNlZSBAbGl0L3JlYWN0aXZlLWVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbihMaXRFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBMaXRFbGVtZW50KVxuXSA9IHRydWU7XG5cbi8vIEluc3RhbGwgaHlkcmF0aW9uIGlmIGF2YWlsYWJsZVxuZ2xvYmFsVGhpcy5saXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbFRoaXMubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgOiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5wb2x5ZmlsbFN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyAgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEUgb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtaHRtbCwgc2luY2UgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEUgPSB7XG4gIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eTogKFxuICAgIGVsOiBMaXRFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbFxuICApID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAoZWwgYXMgYW55KS5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgXyRjaGFuZ2VkUHJvcGVydGllczogKGVsOiBMaXRFbGVtZW50KSA9PiAoZWwgYXMgYW55KS5fJGNoYW5nZWRQcm9wZXJ0aWVzLFxufTtcblxuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBMaXRFbGVtZW50IHVzYWdlLlxuKGdsb2JhbFRoaXMubGl0RWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgnNC4xLjEnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKlxuICogSU1QT1JUQU5UOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRzaWNrbGUgYW5kIHRoZSBDbG9zdXJlIEpTIGNvbXBpbGVyLCBhbGxcbiAqIHByb3BlcnR5IGRlY29yYXRvcnMgKGJ1dCBub3QgY2xhc3MgZGVjb3JhdG9ycykgaW4gdGhpcyBmaWxlIHRoYXQgaGF2ZVxuICogYW4gQEV4cG9ydERlY29yYXRlZEl0ZW1zIGFubm90YXRpb24gbXVzdCBiZSBkZWZpbmVkIGFzIGEgcmVndWxhciBmdW5jdGlvbixcbiAqIG5vdCBhbiBhcnJvdyBmdW5jdGlvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7Q29uc3RydWN0b3J9IGZyb20gJy4vYmFzZS5qcyc7XG5cbi8qKlxuICogQWxsb3cgZm9yIGN1c3RvbSBlbGVtZW50IGNsYXNzZXMgd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9yc1xuICovXG50eXBlIEN1c3RvbUVsZW1lbnRDbGFzcyA9IE9taXQ8dHlwZW9mIEhUTUxFbGVtZW50LCAnbmV3Jz47XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoY2xzOiBDdXN0b21FbGVtZW50Q2xhc3MpOiB2b2lkO1xuXG4gIC8vIHN0YW5kYXJkXG4gIChcbiAgICB0YXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyxcbiAgICBjb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQ8Q29uc3RydWN0b3I8SFRNTEVsZW1lbnQ+PlxuICApOiB2b2lkO1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGRlZmluZXMgdGhlIGRlY29yYXRlZCBjbGFzcyBhcyBhIGN1c3RvbSBlbGVtZW50LlxuICpcbiAqIGBgYGpzXG4gKiBAY3VzdG9tRWxlbWVudCgnbXktZWxlbWVudCcpXG4gKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYGA7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICogQHBhcmFtIHRhZ05hbWUgVGhlIHRhZyBuYW1lIG9mIHRoZSBjdXN0b20gZWxlbWVudCB0byBkZWZpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21FbGVtZW50ID1cbiAgKHRhZ05hbWU6IHN0cmluZyk6IEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPT5cbiAgKFxuICAgIGNsYXNzT3JUYXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyB8IENvbnN0cnVjdG9yPEhUTUxFbGVtZW50PixcbiAgICBjb250ZXh0PzogQ2xhc3NEZWNvcmF0b3JDb250ZXh0PENvbnN0cnVjdG9yPEhUTUxFbGVtZW50Pj5cbiAgKSA9PiB7XG4gICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcigoKSA9PiB7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qXG4gKiBJTVBPUlRBTlQ6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggdHNpY2tsZSBhbmQgdGhlIENsb3N1cmUgSlMgY29tcGlsZXIsIGFsbFxuICogcHJvcGVydHkgZGVjb3JhdG9ycyAoYnV0IG5vdCBjbGFzcyBkZWNvcmF0b3JzKSBpbiB0aGlzIGZpbGUgdGhhdCBoYXZlXG4gKiBhbiBARXhwb3J0RGVjb3JhdGVkSXRlbXMgYW5ub3RhdGlvbiBtdXN0IGJlIGRlZmluZWQgYXMgYSByZWd1bGFyIGZ1bmN0aW9uLFxuICogbm90IGFuIGFycm93IGZ1bmN0aW9uLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBSZWFjdGl2ZUVsZW1lbnQsXG4gIGRlZmF1bHRDb252ZXJ0ZXIsXG4gIG5vdEVxdWFsLFxufSBmcm9tICcuLi9yZWFjdGl2ZS1lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHtJbnRlcmZhY2V9IGZyb20gJy4vYmFzZS5qcyc7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcblxubGV0IGlzc3VlV2FybmluZzogKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB2b2lkO1xuXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgLy8gYXJlIGxvYWRlZC5cbiAgY29uc3QgaXNzdWVkV2FybmluZ3M6IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+ID1cbiAgICAoZ2xvYmFsVGhpcy5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYDtcbiAgICBpZiAoIWlzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSkge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgaXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gT3ZlcmxvYWRzIGZvciBwcm9wZXJ0eSBkZWNvcmF0b3Igc28gdGhhdCBUeXBlU2NyaXB0IGNhbiBpbmZlciB0aGUgY29ycmVjdFxuLy8gcmV0dXJuIHR5cGUgd2hlbiBhIGRlY29yYXRvciBpcyB1c2VkIGFzIGFuIGFjY2Vzc29yIGRlY29yYXRvciBvciBhIHNldHRlclxuLy8gZGVjb3JhdG9yLlxuZXhwb3J0IHR5cGUgUHJvcGVydHlEZWNvcmF0b3IgPSB7XG4gIC8vIGFjY2Vzc29yIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG5cbiAgLy8gc2V0dGVyIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiAodmFsdWU6IFYpID0+IHZvaWQsXG4gICAgY29udGV4dDogQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6ICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcblxuICAvLyBsZWdhY3kgZGVjb3JhdG9yIHNpZ25hdHVyZVxuICAoXG4gICAgcHJvdG9PckRlc2NyaXB0b3I6IE9iamVjdCxcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55O1xufTtcblxuY29uc3QgbGVnYWN5UHJvcGVydHkgPSAoXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gfCB1bmRlZmluZWQsXG4gIHByb3RvOiBPYmplY3QsXG4gIG5hbWU6IFByb3BlcnR5S2V5XG4pID0+IHtcbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgKHByb3RvLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWUsXG4gICAgaGFzT3duUHJvcGVydHkgPyB7Li4ub3B0aW9ucywgd3JhcHBlZDogdHJ1ZX0gOiBvcHRpb25zXG4gICk7XG4gIC8vIEZvciBhY2Nlc3NvcnMgKHdoaWNoIGhhdmUgYSBkZXNjcmlwdG9yIG9uIHRoZSBwcm90b3R5cGUpIHdlIG5lZWQgdG9cbiAgLy8gcmV0dXJuIGEgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIFR5cGVTY3JpcHQgb3ZlcndyaXRlcyB0aGUgZGVzY3JpcHRvciB3ZVxuICAvLyBkZWZpbmUgaW4gY3JlYXRlUHJvcGVydHkoKSB3aXRoIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yLiBXZSBkb24ndCBkbyB0aGlzXG4gIC8vIGZvciBmaWVsZHMsIHdoaWNoIGRvbid0IGhhdmUgYSBkZXNjcmlwdG9yLCBiZWNhdXNlIHRoaXMgY291bGQgb3ZlcndyaXRlXG4gIC8vIGRlc2NyaXB0b3IgZGVmaW5lZCBieSBvdGhlciBkZWNvcmF0b3JzLlxuICByZXR1cm4gaGFzT3duUHJvcGVydHlcbiAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpXG4gICAgOiB1bmRlZmluZWQ7XG59O1xuXG4vLyBUaGlzIGlzIGR1cGxpY2F0ZWQgZnJvbSBhIHNpbWlsYXIgdmFyaWFibGUgaW4gcmVhY3RpdmUtZWxlbWVudC50cywgYnV0XG4vLyBhY3R1YWxseSBtYWtlcyBzZW5zZSB0byBoYXZlIHRoaXMgZGVmYXVsdCBkZWZpbmVkIHdpdGggdGhlIGRlY29yYXRvciwgc29cbi8vIHRoYXQgZGlmZmVyZW50IGRlY29yYXRvcnMgY291bGQgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdHMuXG5jb25zdCBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbjogUHJvcGVydHlEZWNsYXJhdGlvbiA9IHtcbiAgYXR0cmlidXRlOiB0cnVlLFxuICB0eXBlOiBTdHJpbmcsXG4gIGNvbnZlcnRlcjogZGVmYXVsdENvbnZlcnRlcixcbiAgcmVmbGVjdDogZmFsc2UsXG4gIGhhc0NoYW5nZWQ6IG5vdEVxdWFsLFxufTtcblxuLy8gVGVtcG9yYXJ5IHR5cGUsIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbnR5cGUgU3RhbmRhcmRQcm9wZXJ0eUNvbnRleHQ8QywgVj4gPSAoXG4gIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgfCBDbGFzc1NldHRlckRlY29yYXRvckNvbnRleHQ8QywgVj5cbikgJiB7bWV0YWRhdGE6IG9iamVjdH07XG5cbi8qKlxuICogV3JhcHMgYSBjbGFzcyBhY2Nlc3NvciBvciBzZXR0ZXIgc28gdGhhdCBgcmVxdWVzdFVwZGF0ZSgpYCBpcyBjYWxsZWQgd2l0aCB0aGVcbiAqIHByb3BlcnR5IG5hbWUgYW5kIG9sZCB2YWx1ZSB3aGVuIHRoZSBhY2Nlc3NvciBpcyBzZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFuZGFyZFByb3BlcnR5ID0gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+IHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gIGNvbnRleHQ6IFN0YW5kYXJkUHJvcGVydHlDb250ZXh0PEMsIFY+XG4pOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yUmVzdWx0PEMsIFY+IHwgKCh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZCkgPT4ge1xuICBjb25zdCB7a2luZCwgbWV0YWRhdGF9ID0gY29udGV4dDtcblxuICBpZiAoREVWX01PREUgJiYgbWV0YWRhdGEgPT0gbnVsbCkge1xuICAgIGlzc3VlV2FybmluZyhcbiAgICAgICdtaXNzaW5nLWNsYXNzLW1ldGFkYXRhJyxcbiAgICAgIGBUaGUgY2xhc3MgJHt0YXJnZXR9IGlzIG1pc3NpbmcgZGVjb3JhdG9yIG1ldGFkYXRhLiBUaGlzIGAgK1xuICAgICAgICBgY291bGQgbWVhbiB0aGF0IHlvdSdyZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgZGVjb3JhdG9ycyBgICtcbiAgICAgICAgYGJ1dCBkb2Vzbid0IHN1cHBvcnQgZGVjb3JhdG9yIG1ldGFkYXRhLCBzdWNoIGFzIFR5cGVTY3JpcHQgNS4xLiBgICtcbiAgICAgICAgYFBsZWFzZSB1cGRhdGUgeW91ciBjb21waWxlci5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3JlIHRoZSBwcm9wZXJ0eSBvcHRpb25zXG4gIGxldCBwcm9wZXJ0aWVzID0gZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLmdldChtZXRhZGF0YSk7XG4gIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuc2V0KG1ldGFkYXRhLCAocHJvcGVydGllcyA9IG5ldyBNYXAoKSkpO1xuICB9XG4gIHByb3BlcnRpZXMuc2V0KGNvbnRleHQubmFtZSwgb3B0aW9ucyk7XG5cbiAgaWYgKGtpbmQgPT09ICdhY2Nlc3NvcicpIHtcbiAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGNhbm5vdCBkeW5hbWljYWxseSBtb2RpZnkgdGhlIGNsYXNzLCBzbyB3ZSBjYW4ndFxuICAgIC8vIHJlcGxhY2UgYSBmaWVsZCB3aXRoIGFjY2Vzc29ycy4gVGhlIHVzZXIgbXVzdCB1c2UgdGhlIG5ldyBgYWNjZXNzb3JgXG4gICAgLy8ga2V5d29yZCBpbnN0ZWFkLlxuICAgIGNvbnN0IHtuYW1lfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHY6IFYpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSAoXG4gICAgICAgICAgdGFyZ2V0IGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgICAgKS5nZXQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgQyk7XG4gICAgICAgICh0YXJnZXQgYXMgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPikuc2V0LmNhbGwoXG4gICAgICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEMsXG4gICAgICAgICAgdlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGluaXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiBWKTogViB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkobmFtZSwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3NldHRlcicpIHtcbiAgICBjb25zdCB7bmFtZX0gPSBjb250ZXh0O1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzW25hbWUgYXMga2V5b2YgUmVhY3RpdmVFbGVtZW50XTtcbiAgICAgICh0YXJnZXQgYXMgKHZhbHVlOiBWKSA9PiB2b2lkKS5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgfSBhcyB1bmtub3duIGFzICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRlY29yYXRvciBsb2NhdGlvbjogJHtraW5kfWApO1xufTtcblxuLyoqXG4gKiBBIGNsYXNzIGZpZWxkIG9yIGFjY2Vzc29yIGRlY29yYXRvciB3aGljaCBjcmVhdGVzIGEgcmVhY3RpdmUgcHJvcGVydHkgdGhhdFxuICogcmVmbGVjdHMgYSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZS4gV2hlbiBhIGRlY29yYXRlZCBwcm9wZXJ0eSBpcyBzZXRcbiAqIHRoZSBlbGVtZW50IHdpbGwgdXBkYXRlIGFuZCByZW5kZXIuIEEge0BsaW5rY29kZSBQcm9wZXJ0eURlY2xhcmF0aW9ufSBtYXlcbiAqIG9wdGlvbmFsbHkgYmUgc3VwcGxpZWQgdG8gY29uZmlndXJlIHByb3BlcnR5IGZlYXR1cmVzLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHB1YmxpYyBmaWVsZHMuIEFzIHB1YmxpYyBmaWVsZHMsXG4gKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLFxuICogZWl0aGVyIHZpYSBhdHRyaWJ1dGUgb3IgdGhlIHByb3BlcnR5IGl0c2VsZi5cbiAqXG4gKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICogcHJvdGVjdGVkIGZpZWxkcyBhbmQgc2hvdWxkIHVzZSB0aGUge0BsaW5rY29kZSBzdGF0ZX0gZGVjb3JhdG9yLlxuICpcbiAqIEhvd2V2ZXIsIHNvbWV0aW1lcyBlbGVtZW50IGNvZGUgZG9lcyBuZWVkIHRvIHNldCBhIHB1YmxpYyBwcm9wZXJ0eS4gVGhpc1xuICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gKiBzaG91bGQgYmUgZmlyZWQgaW5mb3JtaW5nIHRoZSB1c2VyOyBmb3IgZXhhbXBsZSwgYSBjaGVja2JveCBzZXRzIGl0c1xuICogYGNoZWNrZWRgIHByb3BlcnR5IHdoZW4gY2xpY2tlZCBhbmQgZmlyZXMgYSBgY2hhbmdlZGAgZXZlbnQuIE11dGF0aW5nIHB1YmxpY1xuICogcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3IgYXJyYXkpXG4gKiBwcm9wZXJ0aWVzLiBJbiBvdGhlciBjYXNlcyB3aGVuIGFuIGVsZW1lbnQgbmVlZHMgdG8gbWFuYWdlIHN0YXRlLCBhIHByaXZhdGVcbiAqIHByb3BlcnR5IGRlY29yYXRlZCB2aWEgdGhlIHtAbGlua2NvZGUgc3RhdGV9IGRlY29yYXRvciBzaG91bGQgYmUgdXNlZC4gV2hlblxuICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAqIGZhY2lsaXRhdGUgY29tcGxleCBpbnRlcmFjdGlvbnMuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAqICAgY2xpY2tlZCA9IGZhbHNlO1xuICogfVxuICogYGBgXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yXG4gKiBARXhwb3J0RGVjb3JhdGVkSXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgcHJvdG9PclRhcmdldDpcbiAgICAgIHwgb2JqZWN0XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgIHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gICAgbmFtZU9yQ29udGV4dDpcbiAgICAgIHwgUHJvcGVydHlLZXlcbiAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgICAgIHwgQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55ID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgID8gc3RhbmRhcmRQcm9wZXJ0eTxDLCBWPihcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzXG4gICAgICAgICAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPlxuICAgICAgICAgICAgICB8ICgodmFsdWU6IFYpID0+IHZvaWQpLFxuICAgICAgICAgICAgbmFtZU9yQ29udGV4dCBhcyBTdGFuZGFyZFByb3BlcnR5Q29udGV4dDxDLCBWPlxuICAgICAgICAgIClcbiAgICAgICAgOiBsZWdhY3lQcm9wZXJ0eShcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzIE9iamVjdCxcbiAgICAgICAgICAgIG5hbWVPckNvbnRleHQgYXMgUHJvcGVydHlLZXlcbiAgICAgICAgICApXG4gICAgKSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHtwcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVEZWNsYXJhdGlvbjxUeXBlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGluZGljYXRlcyBpZiBhIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGNoYW5nZWQgd2hlblxuICAgKiBpdCBpcyBzZXQuIFRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSB0aGUgYG5ld1ZhbHVlYCBhbmQgYG9sZFZhbHVlYCBhbmRcbiAgICogcmV0dXJuIGB0cnVlYCBpZiBhbiB1cGRhdGUgc2hvdWxkIGJlIHJlcXVlc3RlZC5cbiAgICovXG4gIGhhc0NoYW5nZWQ/KHZhbHVlOiBUeXBlLCBvbGRWYWx1ZTogVHlwZSk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0YXRlRGVjbGFyYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJuYWxQcm9wZXJ0eURlY2xhcmF0aW9uPFR5cGUgPSB1bmtub3duPiA9XG4gIFN0YXRlRGVjbGFyYXRpb248VHlwZT47XG5cbi8qKlxuICogRGVjbGFyZXMgYSBwcml2YXRlIG9yIHByb3RlY3RlZCByZWFjdGl2ZSBwcm9wZXJ0eSB0aGF0IHN0aWxsIHRyaWdnZXJzXG4gKiB1cGRhdGVzIHRvIHRoZSBlbGVtZW50IHdoZW4gaXQgY2hhbmdlcy4gSXQgZG9lcyBub3QgcmVmbGVjdCBmcm9tIHRoZVxuICogY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUuXG4gKlxuICogUHJvcGVydGllcyBkZWNsYXJlZCB0aGlzIHdheSBtdXN0IG5vdCBiZSB1c2VkIGZyb20gSFRNTCBvciBIVE1MIHRlbXBsYXRpbmdcbiAqIHN5c3RlbXMsIHRoZXkncmUgc29sZWx5IGZvciBwcm9wZXJ0aWVzIGludGVybmFsIHRvIHRoZSBlbGVtZW50LiBUaGVzZVxuICogcHJvcGVydGllcyBtYXkgYmUgcmVuYW1lZCBieSBvcHRpbWl6YXRpb24gdG9vbHMgbGlrZSBjbG9zdXJlIGNvbXBpbGVyLlxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGUob3B0aW9ucz86IFN0YXRlRGVjbGFyYXRpb24pIHtcbiAgcmV0dXJuIHByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIC8vIEFkZCBib3RoIGBzdGF0ZWAgYW5kIGBhdHRyaWJ1dGVgIGJlY2F1c2Ugd2UgZm91bmQgYSB0aGlyZCBwYXJ0eVxuICAgIC8vIGNvbnRyb2xsZXIgdGhhdCBpcyBrZXlpbmcgb2ZmIG9mIFByb3BlcnR5T3B0aW9ucy5zdGF0ZSB0byBkZXRlcm1pbmVcbiAgICAvLyB3aGV0aGVyIGEgZmllbGQgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IG9yIG5vdC5cbiAgICBzdGF0ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGU6IGZhbHNlLFxuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwdWJsaWMgaW50ZXJmYWNlIHR5cGUgdGhhdCByZW1vdmVzIHByaXZhdGUgYW5kIHByb3RlY3RlZCBmaWVsZHMuXG4gKiBUaGlzIGFsbG93cyBhY2NlcHRpbmcgb3RoZXJ3aXNlIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbmV4cG9ydCB0eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUPiA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQ7XG59O1xuXG4vKipcbiAqIFdyYXBzIHVwIGEgZmV3IGJlc3QgcHJhY3RpY2VzIHdoZW4gcmV0dXJuaW5nIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIGFcbiAqIGRlY29yYXRvci5cbiAqXG4gKiBNYXJrcyB0aGUgZGVmaW5lZCBwcm9wZXJ0eSBhcyBjb25maWd1cmFibGUsIGFuZCBlbnVtZXJhYmxlLCBhbmQgaGFuZGxlc1xuICogdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIGJ1c3RlZCBSZWZsZWN0LmRlY29yYXRlIHpvbWJpZWZpbGwgKGUuZy4gaW4gQW5ndWxhclxuICogYXBwcykuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkZXNjID0gKFxuICBvYmo6IG9iamVjdCxcbiAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPixcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4pID0+IHtcbiAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBrZWVwIHRoZW0gY29uZmlndXJhYmxlIGFuZCBlbnVtZXJhYmxlLlxuICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIGlmIChcbiAgICAvLyBXZSBjaGVjayBmb3IgUmVmbGVjdC5kZWNvcmF0ZSBlYWNoIHRpbWUsIGluIGNhc2UgdGhlIHpvbWJpZWZpbGxcbiAgICAvLyBpcyBhcHBsaWVkIHZpYSBsYXp5IGxvYWRpbmcgc29tZSBBbmd1bGFyIGNvZGUuXG4gICAgKFJlZmxlY3QgYXMgdHlwZW9mIFJlZmxlY3QgJiB7ZGVjb3JhdGU/OiB1bmtub3dufSkuZGVjb3JhdGUgJiZcbiAgICB0eXBlb2YgbmFtZSAhPT0gJ29iamVjdCdcbiAgKSB7XG4gICAgLy8gSWYgd2UncmUgY2FsbGVkIGFzIGEgbGVnYWN5IGRlY29yYXRvciwgYW5kIFJlZmxlY3QuZGVjb3JhdGUgaXMgcHJlc2VudFxuICAgIC8vIHRoZW4gd2UgaGF2ZSBubyBndWFyYW50ZWVzIHRoYXQgdGhlIHJldHVybmVkIGRlc2NyaXB0b3Igd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgb24gdGhlIGNsYXNzLCBzbyB3ZSBtdXN0IGFwcGx5IGl0IGRpcmVjdGx5IG91cnNlbHZlcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBkZXNjcmlwdG9yO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cbmltcG9ydCB0eXBlIHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJy4uL3JlYWN0aXZlLWVsZW1lbnQuanMnO1xuaW1wb3J0IHtkZXNjLCB0eXBlIEludGVyZmFjZX0gZnJvbSAnLi9iYXNlLmpzJztcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPVxuICAgIChnbG9iYWxUaGlzLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCkpO1xuXG4gIC8vIElzc3VlIGEgd2FybmluZywgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LlxuICBpc3N1ZVdhcm5pbmcgPSAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHtcbiAgICB3YXJuaW5nICs9IGNvZGVcbiAgICAgID8gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgIDogJyc7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RGVjb3JhdG9yID0ge1xuICAvLyBsZWdhY3lcbiAgKFxuICAgIHByb3RvOiBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PixcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSB0byBiZSBgdm9pZHxhbnlgXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogdm9pZCB8IGFueTtcblxuICAvLyBzdGFuZGFyZFxuICA8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHZhbHVlOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG59O1xuXG4vKipcbiAqIEEgcHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgY29udmVydHMgYSBjbGFzcyBwcm9wZXJ0eSBpbnRvIGEgZ2V0dGVyIHRoYXRcbiAqIGV4ZWN1dGVzIGEgcXVlcnlTZWxlY3RvciBvbiB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QuXG4gKlxuICogQHBhcmFtIHNlbGVjdG9yIEEgRE9NU3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgc2VsZWN0b3JzIHRvIG1hdGNoLlxuICogQHBhcmFtIGNhY2hlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIHBlcmZvcm1zIHRoZSBET00gcXVlcnkgb25seVxuICogICAgIG9uY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L3F1ZXJ5U2VsZWN0b3JcbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgTXlFbGVtZW50IHtcbiAqICAgQHF1ZXJ5KCcjZmlyc3QnKVxuICogICBmaXJzdDogSFRNTERpdkVsZW1lbnQ7XG4gKlxuICogICByZW5kZXIoKSB7XG4gKiAgICAgcmV0dXJuIGh0bWxgXG4gKiAgICAgICA8ZGl2IGlkPVwiZmlyc3RcIj48L2Rpdj5cbiAqICAgICAgIDxkaXYgaWQ9XCJzZWNvbmRcIj48L2Rpdj5cbiAqICAgICBgO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5KHNlbGVjdG9yOiBzdHJpbmcsIGNhY2hlPzogYm9vbGVhbik6IFF1ZXJ5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICg8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgbmFtZU9yQ29udGV4dDogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPixcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGNvbnN0IGRvUXVlcnkgPSAoZWw6IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+KTogViA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSAoZWwucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgPz8gbnVsbCkgYXMgVjtcbiAgICAgIGlmIChERVZfTU9ERSAmJiByZXN1bHQgPT09IG51bGwgJiYgY2FjaGUgJiYgIWVsLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IG5hbWVPckNvbnRleHQubmFtZVxuICAgICAgICAgICAgOiBuYW1lT3JDb250ZXh0O1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYEBxdWVyeSdkIGZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gd2l0aCB0aGUgJ2NhY2hlJyBgICtcbiAgICAgICAgICAgIGBmbGFnIHNldCBmb3Igc2VsZWN0b3IgJyR7c2VsZWN0b3J9JyBoYXMgYmVlbiBhY2Nlc3NlZCBiZWZvcmUgYCArXG4gICAgICAgICAgICBgdGhlIGZpcnN0IHVwZGF0ZSBhbmQgcmV0dXJuZWQgbnVsbC4gVGhpcyBpcyBleHBlY3RlZCBpZiB0aGUgYCArXG4gICAgICAgICAgICBgcmVuZGVyUm9vdCB0cmVlIGhhcyBub3QgYmVlbiBwcm92aWRlZCBiZWZvcmVoYW5kIChlLmcuIHZpYSBgICtcbiAgICAgICAgICAgIGBEZWNsYXJhdGl2ZSBTaGFkb3cgRE9NKS4gVGhlcmVmb3JlIHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBjYWNoZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogaWYgd2Ugd2FudCB0byBhbGxvdyB1c2VycyB0byBhc3NlcnQgdGhhdCB0aGUgcXVlcnkgd2lsbCBuZXZlclxuICAgICAgLy8gcmV0dXJuIG51bGwsIHdlIG5lZWQgYSBuZXcgb3B0aW9uIGFuZCB0byB0aHJvdyBoZXJlIGlmIHRoZSByZXN1bHRcbiAgICAgIC8vIGlzIG51bGwuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAvLyBBY2Nlc3NvcnMgdG8gd3JhcCBmcm9tIGVpdGhlcjpcbiAgICAgIC8vICAgMS4gVGhlIGRlY29yYXRvciB0YXJnZXQsIGluIHRoZSBjYXNlIG9mIHN0YW5kYXJkIGRlY29yYXRvcnNcbiAgICAgIC8vICAgMi4gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IsIGluIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzXG4gICAgICAvLyAgICAgIG9uIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gICAzLiBGdW5jdGlvbnMgdGhhdCBhY2Nlc3Mgb3VyIG93biBjYWNoZS1rZXkgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlLFxuICAgICAgLy8gICAgICBpbiB0aGUgY2FzZSBvZiBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMuXG4gICAgICBjb25zdCB7Z2V0LCBzZXR9ID1cbiAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBwcm90b09yVGFyZ2V0XG4gICAgICAgICAgOiBkZXNjcmlwdG9yID8/XG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBrZXkgPSBERVZfTU9ERVxuICAgICAgICAgICAgICAgID8gU3ltYm9sKGAke1N0cmluZyhuYW1lT3JDb250ZXh0KX0gKEBxdWVyeSgpIGNhY2hlKWApXG4gICAgICAgICAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgICAgICAgICAgdHlwZSBXaXRoQ2FjaGUgPSBSZWFjdGl2ZUVsZW1lbnQgJiB7XG4gICAgICAgICAgICAgICAgW2tleTogc3ltYm9sXTogRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzIGFzIFdpdGhDYWNoZSlba2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldCh2KSB7XG4gICAgICAgICAgICAgICAgICAodGhpcyBhcyBXaXRoQ2FjaGUpW2tleV0gPSB2O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgcmV0dXJuIGRlc2MocHJvdG9PclRhcmdldCwgbmFtZU9yQ29udGV4dCwge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KTogViB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogViA9IGdldCEuY2FsbCh0aGlzKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvUXVlcnkodGhpcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsIHx8IHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICBzZXQhLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIG9iamVjdCB3b3JrcyBhcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGJvdGggc3RhbmRhcmQgYW5kXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycy5cbiAgICAgIHJldHVybiBkZXNjKHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIHtcbiAgICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBkb1F1ZXJ5KHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9KSBhcyBRdWVyeURlY29yYXRvcjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUge1JlYWN0aXZlRWxlbWVudH0gZnJvbSAnLi4vcmVhY3RpdmUtZWxlbWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7UXVlcnlBc3NpZ25lZE5vZGVzT3B0aW9uc30gZnJvbSAnLi9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qcyc7XG5pbXBvcnQge2Rlc2MsIHR5cGUgSW50ZXJmYWNlfSBmcm9tICcuL2Jhc2UuanMnO1xuXG5leHBvcnQgdHlwZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoXG4gICAgcHJvdG86IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgICAvLyBOb3RlIFR5cGVTY3JpcHQgcmVxdWlyZXMgdGhlIHJldHVybiB0eXBlIHRvIGJlIGB2b2lkfGFueWBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiB2b2lkIHwgYW55O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclJlc3VsdDxDLCBWPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgcXVlcnlBc3NpZ25lZEVsZW1lbnRzfSBkZWNvcmF0b3IuIEV4dGVuZHMgdGhlXG4gKiBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvXG4gKiBbSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MU2xvdEVsZW1lbnQvYXNzaWduZWRFbGVtZW50cykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3NpZ25lZEVsZW1lbnRzT3B0aW9uc1xuICBleHRlbmRzIFF1ZXJ5QXNzaWduZWROb2Rlc09wdGlvbnMge1xuICAvKipcbiAgICogQ1NTIHNlbGVjdG9yIHVzZWQgdG8gZmlsdGVyIHRoZSBlbGVtZW50cyByZXR1cm5lZC4gRm9yIGV4YW1wbGUsIGEgc2VsZWN0b3JcbiAgICogb2YgYFwiLml0ZW1cImAgd2lsbCBvbmx5IGluY2x1ZGUgZWxlbWVudHMgd2l0aCB0aGUgYGl0ZW1gIGNsYXNzLlxuICAgKi9cbiAgc2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjb252ZXJ0cyBhIGNsYXNzIHByb3BlcnR5IGludG8gYSBnZXR0ZXIgdGhhdFxuICogcmV0dXJucyB0aGUgYGFzc2lnbmVkRWxlbWVudHNgIG9mIHRoZSBnaXZlbiBgc2xvdGAuIFByb3ZpZGVzIGEgZGVjbGFyYXRpdmVcbiAqIHdheSB0byB1c2VcbiAqIFtgSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTFNsb3RFbGVtZW50L2Fzc2lnbmVkRWxlbWVudHMpLlxuICpcbiAqIENhbiBiZSBwYXNzZWQgYW4gb3B0aW9uYWwge0BsaW5rY29kZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNPcHRpb25zfSBvYmplY3QuXG4gKlxuICogRXhhbXBsZSB1c2FnZTpcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2xvdDogJ2xpc3QnIH0pXG4gKiAgIGxpc3RJdGVtcyE6IEFycmF5PEhUTUxFbGVtZW50PjtcbiAqICAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cygpXG4gKiAgIHVubmFtZWRTbG90RWxzITogQXJyYXk8SFRNTEVsZW1lbnQ+O1xuICpcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYFxuICogICAgICAgPHNsb3QgbmFtZT1cImxpc3RcIj48L3Nsb3Q+XG4gKiAgICAgICA8c2xvdD48L3Nsb3Q+XG4gKiAgICAgYDtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogTm90ZSwgdGhlIHR5cGUgb2YgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW5ub3RhdGVkIGFzIGBBcnJheTxIVE1MRWxlbWVudD5gLlxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5QXNzaWduZWRFbGVtZW50cyhcbiAgb3B0aW9ucz86IFF1ZXJ5QXNzaWduZWRFbGVtZW50c09wdGlvbnNcbik6IFF1ZXJ5QXNzaWduZWRFbGVtZW50c0RlY29yYXRvciB7XG4gIHJldHVybiAoPFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgb2JqOiBvYmplY3QsXG4gICAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPlxuICApID0+IHtcbiAgICBjb25zdCB7c2xvdCwgc2VsZWN0b3J9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBzbG90U2VsZWN0b3IgPSBgc2xvdCR7c2xvdCA/IGBbbmFtZT0ke3Nsb3R9XWAgOiAnOm5vdChbbmFtZV0pJ31gO1xuICAgIHJldHVybiBkZXNjKG9iaiwgbmFtZSwge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCk6IFYge1xuICAgICAgICBjb25zdCBzbG90RWwgPVxuICAgICAgICAgIHRoaXMucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MU2xvdEVsZW1lbnQ+KHNsb3RTZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2xvdEVsPy5hc3NpZ25lZEVsZW1lbnRzKG9wdGlvbnMpID8/IFtdO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNlbGVjdG9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gZWxlbWVudHNcbiAgICAgICAgICAgIDogZWxlbWVudHMuZmlsdGVyKChub2RlKSA9PiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpKVxuICAgICAgICApIGFzIFY7XG4gICAgICB9LFxuICAgIH0pO1xuICB9KSBhcyBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3I7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgV2F0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xuICB3YWl0VW50aWxGaXJzdFVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVucyB3aGVuIG9ic2VydmVkIHByb3BlcnRpZXMgY2hhbmdlLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLiBUbyB3YWl0IGZvciBhblxuICogdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBAd2F0Y2goJ3Byb3BOYW1lJylcbiAqIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gKiAgIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2gocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IFdhdGNoT3B0aW9ucykge1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPFdhdGNoT3B0aW9ucz4gPSB7XG4gICAgd2FpdFVudGlsRmlyc3RVcGRhdGU6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50Pihwcm90bzogRWxlbUNsYXNzLCBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPikgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBjb25zdCB7IHVwZGF0ZSB9ID0gcHJvdG87XG4gICAgY29uc3Qgd2F0Y2hlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZSkgPyBwcm9wZXJ0eU5hbWUgOiBbcHJvcGVydHlOYW1lXTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBwcm90by51cGRhdGUgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzLCBjaGFuZ2VkUHJvcHM6IE1hcDxrZXlvZiBFbGVtQ2xhc3MsIEVsZW1DbGFzc1trZXlvZiBFbGVtQ2xhc3NdPikge1xuICAgICAgd2F0Y2hlZFByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5IGFzIGtleW9mIEVsZW1DbGFzcztcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlZFByb3BzLmdldChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZE9wdGlvbnMud2FpdFVudGlsRmlyc3RVcGRhdGUgfHwgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGNoYW5nZWRQcm9wcyk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db250ZXh0IHtcbiAgaHJlZj86IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlYWRvbmx5QXJyYXk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4+O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHRWYXJpYWJsZXMgPSBbXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnY29tcGxldGlvblN0YXR1cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnc3RyaW5nJyxcbiAgICB2YWx1ZTogJ3Vua25vd24nLFxuICAgIHR5cGU6ICdvdXRjb21lJ1xuICB9LFxuICB7XG4gICAgaWRlbnRpZmllcjogJ251bUF0dGVtcHRzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgfVxuXSBhcyBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEl0ZW1Db250ZXh0PihTeW1ib2woJ2l0ZW0nKSk7XG4iLCAiaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscywgT3V0Y29tZUNoYW5nZWREZXRhaWxzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSwgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgdHlwZSB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjayc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dFZhcmlhYmxlcyB9IGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCBRdGlSZWdpc3RlclZhcmlhYmxlIGZyb20gJy4uL2ludGVybmFsL2V2ZW50cy9xdGktcmVnaXN0ZXItdmFyaWFibGUnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnIHwgbnVsbCA9IG51bGw7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gIH07XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seTogYm9vbGVhbjtcbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gIEBwcm92aWRlKHsgY29udGV4dDogaXRlbUNvbnRleHQgfSlcbiAgcHJpdmF0ZSBfY29udGV4dDogSXRlbUNvbnRleHQgPSB7XG4gICAgaWRlbnRpZmllcjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICB2YXJpYWJsZXM6IGl0ZW1Db250ZXh0VmFyaWFibGVzXG4gIH07XG5cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAoe1xuICAgICAgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICB0eXBlOiB2LnR5cGUsXG4gICAgICAvLyBhZGQgZXh0ZXJuYWxzY29yZWQsIGEgZml4ZWQgcHJvcCB0byB0aGUgdGVzdCwgc28gdGhlIHRlc3Rjb250ZXh0IGNhbiByZWFkIGFuZCBkZWNpZGUgaG93IHRvIHNjb3JlIHRoaXMgaXRlbVxuICAgICAgLi4uKHYudHlwZSA9PT0gJ291dGNvbWUnICYmIHYuaWRlbnRpZmllciA9PT0gJ1NDT1JFJ1xuICAgICAgICA/IHsgZXh0ZXJuYWxTY29yZWQ6ICh2IGFzIE91dGNvbWVWYXJpYWJsZSkuZXh0ZXJuYWxTY29yZWQgfVxuICAgICAgICA6IHt9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnZhbHVlID0gdmFyaWFibGUudmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi52YWx1ZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIChlOiBRdGlSZWdpc3RlclZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJjb25zdCB4bWwgPSBTdHJpbmcucmF3O1xuXG4vKiAgIDwhLS0gY29udmVydCBDREFUQSB0byBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cInRleHQoKVtjb250YWlucyguLCAnQ0RBVEEnKV1cIj5cbiAgPHhzbDpjb21tZW50PlxuICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgPC94c2w6Y29tbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuKi9cblxuLypcbiAgPCEtLSByZW1vdmUgeG1sIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiY29tbWVudCgpXCIgLz5cbiAgKi9cblxuY29uc3QgeG1sVG9IVE1MID0geG1sYDx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI+XG48eHNsOm91dHB1dCBtZXRob2Q9XCJodG1sXCIgdmVyc2lvbj1cIjUuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBpbmRlbnQ9XCJ5ZXNcIiAvPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiQCp8bm9kZSgpXCI+XG4gICAgPHhzbDpjb3B5PlxuICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiQCp8bm9kZSgpXCIvPlxuICAgIDwveHNsOmNvcHk+XG4gIDwveHNsOnRlbXBsYXRlPlxuXG4gIDwhLS0gcmVtb3ZlIGV4aXN0aW5nIG5hbWVzcGFjZXMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCIqXCI+XG4gICAgPCEtLSByZW1vdmUgZWxlbWVudCBwcmVmaXggLS0+XG4gICAgPHhzbDplbGVtZW50IG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgPCEtLSBwcm9jZXNzIGF0dHJpYnV0ZXMgLS0+XG4gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD1cIkAqXCI+XG4gICAgICAgIDwhLS0gcmVtb3ZlIGF0dHJpYnV0ZSBwcmVmaXggLS0+XG4gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgICAgICAgPC94c2w6YXR0cmlidXRlPlxuICAgICAgPC94c2w6Zm9yLWVhY2g+XG4gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPlxuICA8L3hzbDplbGVtZW50PlxuPC94c2w6dGVtcGxhdGU+XG48L3hzbDpzdHlsZXNoZWV0PmA7XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBlbGVtZW50cyB3aXRoIGEgc3BlY2lmaWMgdGFnIG5hbWUgYnkgYWRkaW5nIGFuIGV4dGVuc2lvbiBzdWZmaXhcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCh0YWdOYW1lKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHt0YWdOYW1lfS0ke2V4dGVuc2lvbn1gO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgfSk7XG59XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBhbnkgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgcGF0dGVybiAoZS5nLiwgXCJleHRlbmQ6c3VmZml4XCIpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCBjbGFzc05hbWVQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgY2xhc3NMaXN0LmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGAke2NsYXNzTmFtZVBhdHRlcm59OmApKSB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lLnNsaWNlKGAke2NsYXNzTmFtZVBhdHRlcm59OmAubGVuZ3RoKTtcbiAgICAgICAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7ZWxlbWVudC5ub2RlTmFtZX0tJHtzdWZmaXh9YDtcbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZWxlbWVudCB3aXRoIGEgbmV3IHRhZyBuYW1lIGFuZCBjb3B5IGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSkge1xuICBjb25zdCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWdOYW1lKTtcbiAgLy8gQ29weSBhdHRyaWJ1dGVzXG4gIGZvciAoY29uc3QgYXR0ciBvZiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICB9XG4gIC8vIENvcHkgY2hpbGQgbm9kZXNcbiAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgaXRlbXM6IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdID0gW107XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tcmVmJykuZm9yRWFjaChlbCA9PiB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGVsLmdldEF0dHJpYnV0ZSgnY2F0ZWdvcnknKTtcbiAgICBpdGVtcy5wdXNoKHsgaWRlbnRpZmllciwgaHJlZiwgY2F0ZWdvcnkgfSk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbmxldCBjdXJyZW50UmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRYTUwodXJsLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSkge1xuICBpZiAoY2FuY2VsUHJldmlvdXNSZXF1ZXN0ICYmIGN1cnJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgY3VycmVudFJlcXVlc3QuYWJvcnQoKTsgLy8gQWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdCBpZiB0aGVyZSBpcyBvbmVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxYTUxEb2N1bWVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjdXJyZW50UmVxdWVzdCA9IHhocjsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdFxuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG5cbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgcmVzb2x2ZSh4aHIucmVzcG9uc2VYTUwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgIH07XG5cbiAgICB4aHIuc2VuZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MKHhtbERvY3VtZW50OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCB4bWxGcmFnbWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sRG9jdW1lbnQsICd0ZXh0L3htbCcpO1xuICByZXR1cm4geG1sRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0hUTUwoeG1sRnJhZ21lbnQ6IERvY3VtZW50KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7XG4gIGNvbnN0IHhzbHREb2N1bWVudCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sVG9IVE1MLCAndGV4dC94bWwnKTtcbiAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsdERvY3VtZW50KTtcbiAgY29uc3QgaXRlbUhUTUxGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbEZyYWdtZW50LCBkb2N1bWVudCk7XG4gIHJldHVybiBpdGVtSFRNTEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQsIGxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgaWYgKCFsb2NhdGlvbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9jYXRpb24gKz0gJy8nO1xuICB9XG5cbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NyY10sW2hyZWZdLFtwcmltYXJ5LXBhdGhdJykuZm9yRWFjaChlbFdpdGhTcmMgPT4ge1xuICAgIGxldCBhdHRyOiAnc3JjJyB8ICdocmVmJyB8ICdwcmltYXJ5LXBhdGgnIHwgJycgPSAnJztcblxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgYXR0ciA9ICdzcmMnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBhdHRyID0gJ2hyZWYnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJykpIHtcbiAgICAgIGF0dHIgPSAncHJpbWFyeS1wYXRoJztcbiAgICB9XG4gICAgY29uc3QgYXR0clZhbHVlID0gZWxXaXRoU3JjLmdldEF0dHJpYnV0ZShhdHRyKT8udHJpbSgpO1xuXG4gICAgaWYgKCFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgY29uc3QgbmV3U3JjVmFsdWUgPSBsb2NhdGlvbiArIGVuY29kZVVSSShhdHRyVmFsdWUpO1xuICAgICAgZWxXaXRoU3JjLnNldEF0dHJpYnV0ZShhdHRyLCBuZXdTcmNWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBjZGF0YUVsZW1lbnRzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWN1c3RvbS1vcGVyYXRvcltjbGFzcz1cImpzLm9yZ1wiXSA+IHF0aS1iYXNlLXZhbHVlJyk7XG4gIGNkYXRhRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjb21tZW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgZWxlbWVudC5yZXBsYWNlQ2hpbGQoY29tbWVudFRleHQsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICAvLyByZW1vdmUgcXRpLXN0eWxlc2hlZXQgdGFnXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdHlsZXNoZWV0JykuZm9yRWFjaChzdHlsZXNoZWV0ID0+IHN0eWxlc2hlZXQucmVtb3ZlKCkpO1xufVxuIiwgIi8qKlxuICogQnJvd3NlciBiYXNlZCBRVEktWE1MIHRvIEhUTUwgdHJhbnNmb3JtZXIuXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHF0aVRyYW5zZm9ybWVyID0gcXRpVHJhbnNmb3JtSXRlbSgpO1xuICogYXdhaXQgcXRpVHJhbnNmb3JtZXIubG9hZCgncGF0aC90by94bWwvZmlsZS54bWwnKTtcbiAqIHF0aVRyYW5zZm9ybWVyLnBhdGgoJy9hc3Nlc3NtZW50SXRlbS9pdGVtQm9keScpO1xuICogY29uc3QgaHRtbCA9IHF0aVRyYW5zZm9ybWVyLmh0bWwoKTtcbiAqIGNvbnN0IHhtbCA9IHF0aVRyYW5zZm9ybWVyLnhtbCgpO1xuICogY29uc3QgaHRtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLmh0bWxkb2MoKTtcbiAqIGNvbnN0IHhtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLnhtbGRvYygpO1xuICpcbiAqIHF0aVRyYW5zZm9ybUl0ZW0oKS5wYXJzZShzdG9yeVhNTCkuaHRtbCgpXG4gKi9cblxuaW1wb3J0IHtcbiAgY29udmVydENEQVRBdG9Db21tZW50LFxuICBleHRlbmRFbGVtZW50TmFtZSxcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MsXG4gIGxvYWRYTUwsXG4gIHBhcnNlWE1MLFxuICBzZXRMb2NhdGlvbixcbiAgc3RyaXBTdHlsZVNoZWV0cyxcbiAgdG9IVE1MXG59IGZyb20gJy4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbmV4cG9ydCB0eXBlIHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gIGxvYWQ6ICh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0PzogYm9vbGVhbikgPT4gUHJvbWlzZTx0cmFuc2Zvcm1JdGVtQXBpPjtcbiAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBjaUhvb2tzOiAodXJpOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnROYW1lOiAoZWxlbWVudE5hbWU6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW0/OiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGN1c3RvbUludGVyYWN0aW9uOiAoYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQ6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHN0cmlwU3R5bGVTaGVldHM6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGh0bWw6ICgpID0+IHN0cmluZztcbiAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gIGh0bWxEb2M6ICgpID0+IERvY3VtZW50RnJhZ21lbnQ7XG4gIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtSXRlbSA9ICgpID0+IHtcbiAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcblxuICBjb25zdCBhcGk6IHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gICAgYXN5bmMgbG9hZCh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHR5cGVvZiBhcGk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxvYWRYTUwodXJpLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAvLyBzZXQgdGhlIGJhc2UgcGF0aCBmb3IgaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMsXG4gICAgICAgICAgLy8geW91IHByb2JhYmx5IHdhbnQgdG8gc2V0IHRoZSBiYXNlIHBhdGggdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxzZSB5b3UgY2FuIHVzZSB0aGUgcGF0aCBtZXRob2QgdG8gc2V0IGl0XG4gICAgICAgICAgYXBpLnBhdGgodXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSkpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBzZXRMb2NhdGlvbih4bWxGcmFnbWVudCwgbG9jYXRpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKTogdHlwZW9mIGFwaSB7XG4gICAgICBmbih4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGNpSG9va3ModXJpOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2hvb2snLCAnbW9kdWxlJ107XG4gICAgICBjb25zdCBkb2N1bWVudFBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgY29uc3Qgc3JjQXR0cmlidXRlcyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlICsgJ10nKTtcbiAgICAgICAgc3JjQXR0cmlidXRlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSE7XG4gICAgICAgICAgaWYgKCFzcmNWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFzcmNWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgIC8vIEp1c3QgcGFzdGUgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNyYyBsb2NhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnRyb290UGF0aFxuICAgICAgICAgICAgLy8gb2xkIHBjaXMgY2FuIGhhdmUgYSAuanMsIG5ldyBwY2kncyBkb24ndFxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2Jhc2UtdXJsJywgdXJpKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoICsgJy8nICsgZW5jb2RlVVJJKHNyY1ZhbHVlICsgKHNyY1ZhbHVlLmVuZHNXaXRoKCcuanMnKSA/ICcnIDogJy5qcycpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnROYW1lOiAodGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQsIHRhZ05hbWUsIGV4dGVuc2lvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbTogc3RyaW5nID0gJ2V4dGVuZCcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50LCBwYXJhbSk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY3VzdG9tSW50ZXJhY3Rpb24oYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbiA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKTtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0ID0gcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXJlZicsIGJhc2VSZWYpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtaXRlbScsIGJhc2VSZWYgKyBiYXNlSXRlbSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnJlbW92ZUNoaWxkKHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHN0cmlwU3R5bGVTaGVldHMoKTogdHlwZW9mIGFwaSB7XG4gICAgICBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBodG1sKCkge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgfSxcbiAgICB4bWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIGh0bWxEb2MoKSB7XG4gICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIHhtbERvYygpOiBYTUxEb2N1bWVudCB7XG4gICAgICByZXR1cm4geG1sRnJhZ21lbnQ7IC8vIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwaTtcbn07XG4iLCAiaW1wb3J0IHsgbG9hZFhNTCwgcGFyc2VYTUwgfSBmcm9tIFwiLi9xdGktdHJhbnNmb3JtZXJzXCI7XG5cbmV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1NYW5pZmVzdCA9ICgpOiB7XG4gICAgbG9hZDogKHVyaTogc3RyaW5nKSA9PiBQcm9taXNlPHR5cGVvZiBhcGk+O1xuICAgIGFzc2Vzc21lbnRUZXN0OiAoKSA9PiB7IGhyZWY6IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH07XG4gIH0gPT4ge1xuICAgIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG4gIFxuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgfSxcbiAgICAgIGFzc2Vzc21lbnRUZXN0KCkge1xuICAgICAgICBjb25zdCBlbCA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Jlc291cmNlW3R5cGU9XCJpbXNxdGlfdGVzdF94bWx2M3AwXCJdJyk7XG4gICAgICAgIHJldHVybiB7IGhyZWY6IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpLCBpZGVudGlmaWVyOiBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiLCAiXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSBhbmQgdHJhbnNmb3JtIFFUSSB0ZXN0cy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UgYW5kIHRyYW5zZm9ybSBRVEkgdGVzdHMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcXRpVHJhbnNmb3JtZXIgPSBxdGlUcmFuc2Zvcm1UZXN0KCk7XG4gKiBhd2FpdCBxdGlUcmFuc2Zvcm1lci5sb2FkKCdodHRwczovL2V4YW1wbGUuY29tL3Rlc3QueG1sJyk7XG4gKiBjb25zdCBpdGVtcyA9IHF0aVRyYW5zZm9ybWVyLml0ZW1zKCk7XG4gKiBjb25zdCBodG1sID0gcXRpVHJhbnNmb3JtZXIuaHRtbCgpO1xuICogY29uc3QgeG1sID0gcXRpVHJhbnNmb3JtZXIueG1sKCk7XG4gKi9cblxuaW1wb3J0IHsgaXRlbXNGcm9tVGVzdCwgbG9hZFhNTCwgcGFyc2VYTUwsIHRvSFRNTCB9IGZyb20gXCIuL3F0aS10cmFuc2Zvcm1lcnNcIjtcblxuZXhwb3J0IHR5cGUgdHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICBsb2FkOiAodXJpOiBzdHJpbmcpID0+IFByb21pc2U8dHJhbnNmb3JtVGVzdEFwaT47XG4gICAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtVGVzdEFwaTtcbiAgICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1UZXN0QXBpO1xuICAgIGl0ZW1zOiAoKSA9PiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXTtcbiAgICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgaHRtbERvYzogKCkgPT4gRG9jdW1lbnRGcmFnbWVudDtcbiAgICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xuICB9XG4gIFxuICBleHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtVGVzdCA9ICgpOiB0cmFuc2Zvcm1UZXN0QXBpID0+IHtcbiAgICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuICBcbiAgICBjb25zdCBhcGk6dHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0cmFuc2Zvcm1UZXN0QXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcbiAgICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHhtbEZyYWdtZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG4gICAgICBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQpO1xuICAgICAgfSxcbiAgICAgIGh0bWwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgICAgfSxcbiAgICAgIHhtbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgaHRtbERvYygpIHtcbiAgICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgeG1sRG9jKCk6IFhNTERvY3VtZW50IHtcbiAgICAgICAgcmV0dXJuIHhtbEZyYWdtZW50O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHF0aVRyYW5zZm9ybUl0ZW0gfSBmcm9tICcuLi8uLi9xdGktdHJhbnNmb3JtZXJzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHJlZmVyZW5jaW5nIGFuIGFzc2Vzc21lbnQgc3RpbXVsdXMuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXIgPSAnJztcblxuICAvKipcbiAgICogVGhlIGhyZWYgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWYgPSAnJztcblxuICAvKipcbiAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIGlmIHRoZSAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcgZXZlbnQgaXMgbm90IHByZXZlbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgY29uc3QgaXNQcmV2ZW50ZWQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzUHJldmVudGVkKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG5cbiAgICAgIGNvbnN0IHN0aW11bHVzUmVmID0gaXRlbS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zdGltdWx1cy1pZHJlZj0ke3RoaXMuaWRlbnRpZmllcn1dYCk7XG4gICAgICBpZiAoc3RpbXVsdXNSZWYpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFN0aW11bHVzIHdpdGggZGF0YS1zdGltdWx1cy1pZHJlZiAke3RoaXMuaWRlbnRpZmllcn0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBzdGltdWx1c1JlZiAtIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGltdWx1cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLmh0bWxEb2MoKSk7XG4gICAgaWYgKHN0aW11bHVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHN0aW11bHVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdGltdWx1cy1ib2R5LCBxdGktc3R5bGVzaGVldCcpO1xuICAgICAgc3RpbXVsdXNSZWYuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzdGltdWx1c1JlZi5hcHBlbmQoLi4uZWxlbWVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnOiBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWY7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGludGVyZmFjZSBDaG9pY2VJbnRlcmZhY2Uge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICByZWFkb25seTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0ZXIgdG8gaGFuZGxlIGJvb2xlYW4gYXR0cmlidXRlcyBmb3IgQVJJQSBwcm9wZXJ0aWVzLFxuICogZW5zdXJpbmcgdGhleSBhcmUgc2V0IGFzICd0cnVlJyBvciAnZmFsc2UnIHN0cmluZ3MuXG4gKi9cbmNvbnN0IGFyaWFCb29sZWFuQ29udmVydGVyOiBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyPGJvb2xlYW4sIGJvb2xlYW4+ID0ge1xuICB0b0F0dHJpYnV0ZTogKHZhbHVlOiBib29sZWFuKSA9PiAodmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKSxcbiAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2YWx1ZSA9PT0gJ3RydWUnXG59O1xuXG4vKipcbiAqIEEgbWl4aW4gdGhhdCBhZGRzIGNob2ljZSBmdW5jdGlvbmFsaXR5IHRvIGEgTGl0RWxlbWVudC1iYXNlZCBjbGFzcy5cbiAqIEl0IGRpc3BhdGNoZXMgZXZlbnRzIHdpdGggYSBjdXN0b20gYHR5cGVgIGFuZCBoYW5kbGVzIHNlbGVjdGlvbiBsb2dpYy5cbiAqXG4gKiBAcGFyYW0gQmFzZSAtIFRoZSBiYXNlIGNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGNob2ljZSwgdXNlZCBpbiBldmVudCBuYW1lcy5cbiAqIEByZXR1cm5zIEEgbmV3IGNsYXNzIGV4dGVuZGluZyB0aGUgYmFzZSBjbGFzcyB3aXRoIGNob2ljZSBmdW5jdGlvbmFsaXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZUVsZW1lbnRNaXhpbkludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgdGFiSW5kZXg6IG51bWJlcjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xuICBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIEFjdGl2ZUVsZW1lbnRNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KEJhc2U6IFQsIHR5cGU6IHN0cmluZykge1xuICBhYnN0cmFjdCBjbGFzcyBRdGlDaG9pY2UgZXh0ZW5kcyBCYXNlIHtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgaWRlbnRpZmllciA9ICcnO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICd0YWJpbmRleCcgfSlcbiAgICBwdWJsaWMgdGFiSW5kZXggPSAwO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1kaXNhYmxlZCcsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZTogJ2FyaWEtcmVhZG9ubHknLFxuICAgICAgY29udmVydGVyOiBhcmlhQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgcHVibGljIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBoYW5kbGVEaXNhYmxlZENoYW5nZShfb2xkVmFsdWU6IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgICB0aGlzLnRhYkluZGV4ID0gZGlzYWJsZWQgPyAtMSA6IDA7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgICAgdGhpcy5pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudChgcmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9vbktleVVwKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGB1bnJlZ2lzdGVyLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuYWx0S2V5KSByZXR1cm47XG5cbiAgICAgIGlmIChldmVudC5jb2RlID09PSAnU3BhY2UnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25DbGljaygpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIHRoaXMuX2FjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWN0aXZhdGUoKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nIH0+KGBhY3RpdmF0ZS0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gUXRpQ2hvaWNlIGFzIENvbnN0cnVjdG9yPEFjdGl2ZUVsZW1lbnRNaXhpbkludGVyZmFjZT4gJiBUO1xufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktaXRlbS1ib2R5LnN0eWxlcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgcXRpLWl0ZW0tYm9keSBub2RlIGNvbnRhaW5zIHRoZSB0ZXh0LCBncmFwaGljcywgbWVkaWEgb2JqZWN0cyBhbmQgaW50ZXJhY3Rpb25zIHRoYXQgZGVzY3JpYmUgdGhlIGl0ZW0ncyBjb250ZW50IGFuZCBpbmZvcm1hdGlvbiBhYm91dCBob3cgaXQgaXMgc3RydWN0dXJlZC5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guc3BocG82bHU2enFpXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBzbG90IC0gaXRlbSBib2R5IGNvbnRlbnQuXG4gKiBAc2xvdCBxdGktcnVicmljLWJsb2NrIC0gdGhlIHF0aSBydWJyaWMgYmxvY2sgaXMgcGxhY2VkIGFib3ZlIHRoZSBpdGVtXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWl0ZW0tYm9keScpXG5leHBvcnQgY2xhc3MgUXRpSXRlbUJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJxdGktcnVicmljLWJsb2NrXCI+PC9zbG90PjxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pdGVtLWJvZHknOiBRdGlJdGVtQm9keTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbkBjdXN0b21FbGVtZW50KCdxdGktcHJvbXB0JylcbmV4cG9ydCBjbGFzcyBRdGlQcm9tcHQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgLy8gaWYgcHJvbXB0cyBhcmUgaW4gaW50ZXJhY3Rpb25zIHRoZXkgc2hvdWxkIGhhdmUgYSBzbG90LCBzbyB0aGUgcHJvbXB0IGhhcyB0byBnbyB0aGVyZVxuICAgIC8vIGlmIHByb21wdCBpcyBpbiB0aGUgYm9keSwgdGhlbiBqdXN0IGRpc3BsYXkgdGhlIHByb21wdCB0aGVyZS5cbiAgICAvLyBBIGJldHRlciBjaGVjayB3b3VsZCBiZSB0aGUgbGF0dGVyLCBidXQgbm90IGNhbid0IGdldCB0aHJvdWdoIHRoZSBzaGFkb3dyb290IHRvIGZpbmQgdGhlIHNsb3RcbiAgICBjb25zdCBpbkludGVyYWN0aW9uID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUuZW5kc1dpdGgoJ0lOVEVSQUNUSU9OJyk7XG4gICAgaWYgKGluSW50ZXJhY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3Byb21wdCcpO1xuICAgIH1cbiAgICAvLyBjb25zdCBwcm9tcHRTbG90ID0gdGhpcy5wYXJlbnRFbGVtZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIltuYW1lPSdwcm9tcHQnXVwiKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcHJvbXB0JzogUXRpUHJvbXB0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXN0eWxlc2hlZXQnKVxuZXhwb3J0IGNsYXNzIFF0aVN0eWxlc2hlZXQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdHlsZUVsZW1lbnQ6IEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICBpZiAobGluayAhPT0gbnVsbCkge1xuICAgICAgLy8gRmV0Y2ggdGhlIHN0eWxlc2hlZXQgY29udGVudFxuICAgICAgZmV0Y2gobGluaylcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UudGV4dCgpKVxuICAgICAgICAudGhlbihjc3NDb250ZW50ID0+IHtcbiAgICAgICAgICAvLyBNaW5pZnkgdGhlIENTUyBjb250ZW50IGJ5IHJlbW92aW5nIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzXG4gICAgICAgICAgY29uc3QgbWluaWZpZWRDc3MgPSB0aGlzLm1pbmlmeUNzcyhjc3NDb250ZW50KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIEBzY29wZSBzdXJyb3VuZGluZyB0aGUgbWluaWZpZWQgQ1NTXG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBgQHNjb3BlIHske21pbmlmaWVkQ3NzfX1gO1xuXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250ZW50ICE9PSBudWxsICYmIHRoaXMudGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykge1xuICAgICAgLy8gTWluaWZ5IHRoZSBpbmxpbmUgQ1NTIGNvbnRlbnRcbiAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3ModGhpcy50ZXh0Q29udGVudCk7XG5cbiAgICAgIC8vIERpcmVjdGx5IGNyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIHRoZSBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIGlubGluZSBzdHlsZXNcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1pbmlmeUNzcyhjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cywgd2hpdGVzcGFjZSwgYW5kIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgIHJldHVybiBjc3NDb250ZW50XG4gICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpIC8vIENvbGxhcHNlIHdoaXRlc3BhY2VcbiAgICAgIC5yZXBsYWNlKC9cXHMqKFt7fTo7XSlcXHMqL2csICckMScpIC8vIFJlbW92ZSBzcGFjZXMgYXJvdW5kIHt9LCA6LCA7XG4gICAgICAudHJpbSgpOyAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXN0eWxlc2hlZXQnOiBRdGlTdHlsZXNoZWV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktdmFyaWFibGVkZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZhbHVlcyh2YXJpYWJsZTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+KSB7XG4gICAgY29uc3QgaHRtbFZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZGVmYXVsdC12YWx1ZSA+IHF0aS12YWx1ZScpKTtcblxuICAgIGlmIChodG1sVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IGh0bWxWYWx1ZXMubWFwKG4gPT4gbi5pbm5lckhUTUwudHJpbSgpKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlcy5sZW5ndGggPiAxIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1swXTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdmFyaWFibGVkZWNsYXJhdGlvbic6IFF0aVZhcmlhYmxlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogJ2h1bWFuJyB8ICdleHRlcm5hbE1hY2hpbmUnIHwgbnVsbCA9IG51bGw7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIGdldCBpbnRlcnBvbGF0aW9uVGFibGUoKTogTWFwPG51bWJlciwgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZScpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5JykpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG1pc3NpbmcgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykpO1xuICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpO1xuICAgICAgICBpZiAoaXNOYU4oc291cmNlVmFsdWUpIHx8IGlzTmFOKHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbm90IGEgbnVtYmVyIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZW50cmllcy5zZXQoc291cmNlVmFsdWUsIHRhcmdldFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZSxcbiAgICAgIGV4dGVybmFsU2NvcmVkOiB0aGlzLmV4dGVybmFsU2NvcmVkXG4gICAgfTtcbiAgICBvdXRjb21lVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMob3V0Y29tZVZhcmlhYmxlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9ICgpID0+IHtcbiAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCgwLjEpLnJlcGxhY2UoL1xcZC9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgPSAobnVtYmVyOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgLy8gY2hlY2sgaWYgdHlwZSBpcyBzdHJpbmdcbiAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICBjb25zdCBkU2VwID0gZGVjaW1hbFNlcGFyYXRvcigpO1xuICBpZiAoZFNlcCA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJycpLnJlcGxhY2UoZFNlcCwgJy4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIElzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IElzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRmVlZGJhY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdzaG93LWhpZGUnIH0pXG4gIHByb3RlY3RlZCBzaG93SGlkZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnb3V0Y29tZS1pZGVudGlmaWVyJyB9KVxuICBwdWJsaWMgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHJvdGVjdGVkIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNob3dTdGF0dXM6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4oJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNoZWNrU2hvd0ZlZWRiYWNrKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcpIHsgICAgXG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gb3V0Y29tZUlkZW50aWZpZXIpIHx8IG51bGw7O1xuXG4gICAgaWYgKHRoaXMub3V0Y29tZUlkZW50aWZpZXIgIT09IG91dGNvbWVJZGVudGlmaWVyIHx8ICFvdXRjb21lVmFyaWFibGUpIHJldHVybjtcbiAgICBsZXQgaXNGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGNvbWVWYXJpYWJsZS52YWx1ZSkpIHtcbiAgICAgIGlzRm91bmQgPSBvdXRjb21lVmFyaWFibGUudmFsdWUuaW5jbHVkZXModGhpcy5pZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNGb3VuZCA9XG4gICAgICAgICghSXNOdWxsT3JVbmRlZmluZWQodGhpcy5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICFJc051bGxPclVuZGVmaW5lZChvdXRjb21lVmFyaWFibGU/LnZhbHVlKSAmJlxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9PT0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlKSB8fFxuICAgICAgICBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dGZWVkYmFjayhpc0ZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0ZlZWRiYWNrKHZhbHVlOiBib29sZWFuKSB7ICAgIFxuICAgIHRoaXMuc2hvd1N0YXR1cyA9ICh2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnc2hvdycpIHx8ICghdmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ2hpZGUnKSA/ICdvbicgOiAnb2ZmJzsgICAgXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtub3RoaW5nfSBmcm9tICcuLi9saXQtaHRtbC5qcyc7XG5cbi8qKlxuICogRm9yIEF0dHJpYnV0ZVBhcnRzLCBzZXRzIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGlzIGRlZmluZWQgYW5kIHJlbW92ZXNcbiAqIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBGb3Igb3RoZXIgcGFydCB0eXBlcywgdGhpcyBkaXJlY3RpdmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlmRGVmaW5lZCA9IDxUPih2YWx1ZTogVCkgPT4gdmFsdWUgPz8gbm90aGluZztcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIElJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7IC8vIEVuYWJsZSBmb3JtIGFzc29jaWF0aW9uXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyID0gJyc7XG4gIC8qKiBkaXNhYmxlZCBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIHJlYWRvbmx5IHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgX2NvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICB9XG5cbiAgYWJzdHJhY3QgdmFsaWRhdGUoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy5yZXBvcnRWYWxpZGl0eSgpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgfVxuXG4gIGFic3RyYWN0IGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgYWJzdHJhY3Qgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pO1xuXG4gIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICB9XG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlUmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAc3RhdGUoKVxuICBwcml2YXRlIF9yb3dzID0gNTtcblxuICAvKiogZXhwZWN0ZWQgbGVuZ3RoIGlzIG1hcHBlZCB0byB0aGUgcHJvcGVydHkgbWF4bGVuZ3RoIG9uIHRoZSB0ZXh0YXJlYSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICAvKiogdGV4dCBhcHBlYXJpbmcgaW4gdGhlIGV4dGVuZGVkLXRleHQtbnRlcmFjdGlvbiBpZiBpdCBpcyBlbXB0eSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnKVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICBsZXQgcm93c1NldCA9IGZhbHNlO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgncXRpLWhlaWdodC1saW5lcy0nKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWhlaWdodC1saW5lcy0nLCAnJyk7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSBwYXJzZUludChuclJvd3MpO1xuICAgICAgICByb3dzU2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBJZiBubyBxdGktaGVpZ2h0LWxpbmVzIGNsYXNzIGlzIHNldCwgY2FsY3VsYXRlIHJvd3MgYmFzZWQgb24gZXhwZWN0ZWRMZW5ndGhcbiAgICBpZiAoIXJvd3NTZXQgJiYgdGhpcy5leHBlY3RlZExlbmd0aCkge1xuICAgICAgY29uc3QgZXN0aW1hdGVkUm93cyA9IE1hdGguY2VpbCh0aGlzLmV4cGVjdGVkTGVuZ3RoIC8gNTApOyAvLyAgJzUwJyBiYXNlZCBvbiBhbiBlc3RpbWF0ZSBmb3IgY2hhcmFjdGVycyBwZXIgcm93XG4gICAgICB0aGlzLl9yb3dzID0gZXN0aW1hdGVkUm93cztcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpbml0aWFsbHlcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICBjb25zdCBwYXR0ZXJuU291cmNlID1cbiAgICAgICAgdGhpcy5wYXR0ZXJuTWFzay5zdGFydHNXaXRoKCdeJykgJiYgdGhpcy5wYXR0ZXJuTWFzay5lbmRzV2l0aCgnJCcpID8gdGhpcy5wYXR0ZXJuTWFzayA6IGBeJHt0aGlzLnBhdHRlcm5NYXNrfSRgO1xuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuU291cmNlKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCkgJiYgcGF0dGVybi50ZXN0KHRleHRhcmVhLnZhbHVlKTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGV4dGFyZWEucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICAvKiBQSzogZGlzcGxheSBob3N0IGFzIGJsb2NrLCBlbHNlIGRlc2lnbiB3aWxsIGJlIGNvbGxhcHNlZCAqL1xuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dGFyZWEge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdFxuICAgICAgPjx0ZXh0YXJlYVxuICAgICAgICBwYXJ0PVwidGV4dGFyZWFcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBtYXhsZW5ndGg9XCIkezUwMDB9XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICByb3dzPVwiJHt0aGlzLl9yb3dzfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLnZhbHVlPSR7dGhpcy5fdmFsdWV9XG4gICAgICA+PC90ZXh0YXJlYT5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJzogUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtcbiAgXyRMSCxcbiAgUGFydCxcbiAgRGlyZWN0aXZlUGFyZW50LFxuICBDb21waWxlZFRlbXBsYXRlUmVzdWx0LFxuICBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5pbXBvcnQge1xuICBEaXJlY3RpdmVSZXN1bHQsXG4gIERpcmVjdGl2ZUNsYXNzLFxuICBQYXJ0SW5mbyxcbiAgQXR0cmlidXRlUGFydEluZm8sXG59IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbnR5cGUgUHJpbWl0aXZlID0gbnVsbCB8IHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBzeW1ib2wgfCBiaWdpbnQ7XG5cbmNvbnN0IHtfQ2hpbGRQYXJ0OiBDaGlsZFBhcnR9ID0gXyRMSDtcblxudHlwZSBDaGlsZFBhcnQgPSBJbnN0YW5jZVR5cGU8dHlwZW9mIENoaWxkUGFydD47XG5cbmNvbnN0IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIID0gdHJ1ZTtcblxuY29uc3Qgd3JhcCA9XG4gIEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gIHdpbmRvdy5TaGFkeURPTT8uaW5Vc2UgJiZcbiAgd2luZG93LlNoYWR5RE9NPy5ub1BhdGNoID09PSB0cnVlXG4gICAgPyB3aW5kb3cuU2hhZHlET00hLndyYXBcbiAgICA6IChub2RlOiBOb2RlKSA9PiBub2RlO1xuXG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBwcmltaXRpdmUgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxuICovXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcmltaXRpdmUgPT5cbiAgdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT0gJ2Z1bmN0aW9uJyk7XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZVJlc3VsdFR5cGUgPSB7XG4gIEhUTUw6IDEsXG4gIFNWRzogMixcbiAgTUFUSE1MOiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSZXN1bHRUeXBlID1cbiAgKHR5cGVvZiBUZW1wbGF0ZVJlc3VsdFR5cGUpW2tleW9mIHR5cGVvZiBUZW1wbGF0ZVJlc3VsdFR5cGVdO1xuXG50eXBlIElzVGVtcGxhdGVSZXN1bHQgPSB7XG4gICh2YWw6IHVua25vd24pOiB2YWwgaXMgTWF5YmVDb21waWxlZFRlbXBsYXRlUmVzdWx0O1xuICA8VCBleHRlbmRzIFRlbXBsYXRlUmVzdWx0VHlwZT4oXG4gICAgdmFsOiB1bmtub3duLFxuICAgIHR5cGU6IFRcbiAgKTogdmFsIGlzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdDxUPjtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIFRlbXBsYXRlUmVzdWx0IG9yIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVSZXN1bHQ6IElzVGVtcGxhdGVSZXN1bHQgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuICB0eXBlPzogVGVtcGxhdGVSZXN1bHRUeXBlXG4pOiB2YWx1ZSBpcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPT5cbiAgdHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgPyAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgKHZhbHVlIGFzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdCk/LlsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWRcbiAgICA6ICh2YWx1ZSBhcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpPy5bJ18kbGl0VHlwZSQnXSA9PT0gdHlwZTtcblxuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPT4ge1xuICByZXR1cm4gKHZhbHVlIGFzIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQpPy5bJ18kbGl0VHlwZSQnXT8uaCAhPSBudWxsO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgRGlyZWN0aXZlUmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgaXNEaXJlY3RpdmVSZXN1bHQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEaXJlY3RpdmVSZXN1bHQgPT5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdCk/LlsnXyRsaXREaXJlY3RpdmUkJ10gIT09IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIERpcmVjdGl2ZSBjbGFzcyBmb3IgYSBEaXJlY3RpdmVSZXN1bHRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERpcmVjdGl2ZUNsYXNzID0gKHZhbHVlOiB1bmtub3duKTogRGlyZWN0aXZlQ2xhc3MgfCB1bmRlZmluZWQgPT5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdCk/LlsnXyRsaXREaXJlY3RpdmUkJ107XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIHBhcnQgaGFzIG9ubHkgYSBzaW5nbGUtZXhwcmVzc2lvbiB3aXRoIG5vIHN0cmluZ3MgdG9cbiAqIGludGVycG9sYXRlIGJldHdlZW4uXG4gKlxuICogT25seSBBdHRyaWJ1dGVQYXJ0IGFuZCBQcm9wZXJ0eVBhcnQgY2FuIGhhdmUgbXVsdGlwbGUgZXhwcmVzc2lvbnMuXG4gKiBNdWx0aS1leHByZXNzaW9uIHBhcnRzIGhhdmUgYSBgc3RyaW5nc2AgcHJvcGVydHkgYW5kIHNpbmdsZS1leHByZXNzaW9uXG4gKiBwYXJ0cyBkbyBub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NpbmdsZUV4cHJlc3Npb24gPSAocGFydDogUGFydEluZm8pID0+XG4gIChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnRJbmZvKS5zdHJpbmdzID09PSB1bmRlZmluZWQ7XG5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuXG4vKipcbiAqIEluc2VydHMgYSBDaGlsZFBhcnQgaW50byB0aGUgZ2l2ZW4gY29udGFpbmVyIENoaWxkUGFydCdzIERPTSwgZWl0aGVyIGF0IHRoZVxuICogZW5kIG9mIHRoZSBjb250YWluZXIgQ2hpbGRQYXJ0LCBvciBiZWZvcmUgdGhlIG9wdGlvbmFsIGByZWZQYXJ0YC5cbiAqXG4gKiBUaGlzIGRvZXMgbm90IGFkZCB0aGUgcGFydCB0byB0aGUgY29udGFpbmVyUGFydCdzIGNvbW1pdHRlZCB2YWx1ZS4gVGhhdCBtdXN0XG4gKiBiZSBkb25lIGJ5IGNhbGxlcnMuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lclBhcnQgUGFydCB3aXRoaW4gd2hpY2ggdG8gYWRkIHRoZSBuZXcgQ2hpbGRQYXJ0XG4gKiBAcGFyYW0gcmVmUGFydCBQYXJ0IGJlZm9yZSB3aGljaCB0byBhZGQgdGhlIG5ldyBDaGlsZFBhcnQ7IHdoZW4gb21pdHRlZCB0aGVcbiAqICAgICBwYXJ0IGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGBjb250YWluZXJQYXJ0YFxuICogQHBhcmFtIHBhcnQgUGFydCB0byBpbnNlcnQsIG9yIHVuZGVmaW5lZCB0byBjcmVhdGUgYSBuZXcgcGFydFxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0UGFydCA9IChcbiAgY29udGFpbmVyUGFydDogQ2hpbGRQYXJ0LFxuICByZWZQYXJ0PzogQ2hpbGRQYXJ0LFxuICBwYXJ0PzogQ2hpbGRQYXJ0XG4pOiBDaGlsZFBhcnQgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSB3cmFwKGNvbnRhaW5lclBhcnQuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhO1xuXG4gIGNvbnN0IHJlZk5vZGUgPVxuICAgIHJlZlBhcnQgPT09IHVuZGVmaW5lZCA/IGNvbnRhaW5lclBhcnQuXyRlbmROb2RlIDogcmVmUGFydC5fJHN0YXJ0Tm9kZTtcblxuICBpZiAocGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc3RhcnROb2RlID0gd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgcmVmTm9kZSk7XG4gICAgY29uc3QgZW5kTm9kZSA9IHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIHJlZk5vZGUpO1xuICAgIHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KFxuICAgICAgc3RhcnROb2RlLFxuICAgICAgZW5kTm9kZSxcbiAgICAgIGNvbnRhaW5lclBhcnQsXG4gICAgICBjb250YWluZXJQYXJ0Lm9wdGlvbnNcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVuZE5vZGUgPSB3cmFwKHBhcnQuXyRlbmROb2RlISkubmV4dFNpYmxpbmc7XG4gICAgY29uc3Qgb2xkUGFyZW50ID0gcGFydC5fJHBhcmVudDtcbiAgICBjb25zdCBwYXJlbnRDaGFuZ2VkID0gb2xkUGFyZW50ICE9PSBjb250YWluZXJQYXJ0O1xuICAgIGlmIChwYXJlbnRDaGFuZ2VkKSB7XG4gICAgICBwYXJ0Ll8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXM/Lihjb250YWluZXJQYXJ0KTtcbiAgICAgIC8vIE5vdGUgdGhhdCBhbHRob3VnaCBgXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlc2AgdXBkYXRlcyB0aGUgcGFydCdzXG4gICAgICAvLyBgXyRwYXJlbnRgIHJlZmVyZW5jZSBhZnRlciB1bmxpbmtpbmcgZnJvbSBpdHMgY3VycmVudCBwYXJlbnQsIHRoYXRcbiAgICAgIC8vIG1ldGhvZCBvbmx5IGV4aXN0cyBpZiBEaXNjb25uZWN0YWJsZXMgYXJlIHByZXNlbnQsIHNvIHdlIG5lZWQgdG9cbiAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgaXQgaGVyZVxuICAgICAgcGFydC5fJHBhcmVudCA9IGNvbnRhaW5lclBhcnQ7XG4gICAgICAvLyBTaW5jZSB0aGUgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIgaXMgc29tZXdoYXQgY29zdGx5LCBvbmx5XG4gICAgICAvLyByZWFkIGl0IG9uY2Ugd2Uga25vdyB0aGUgc3VidHJlZSBoYXMgZGlyZWN0aXZlcyB0aGF0IG5lZWRcbiAgICAgIC8vIHRvIGJlIG5vdGlmaWVkXG4gICAgICBsZXQgbmV3Q29ubmVjdGlvblN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAobmV3Q29ubmVjdGlvblN0YXRlID0gY29udGFpbmVyUGFydC5fJGlzQ29ubmVjdGVkKSAhPT1cbiAgICAgICAgICBvbGRQYXJlbnQhLl8kaXNDb25uZWN0ZWRcbiAgICAgICkge1xuICAgICAgICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQobmV3Q29ubmVjdGlvblN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuZE5vZGUgIT09IHJlZk5vZGUgfHwgcGFyZW50Q2hhbmdlZCkge1xuICAgICAgbGV0IHN0YXJ0OiBOb2RlIHwgbnVsbCA9IHBhcnQuXyRzdGFydE5vZGU7XG4gICAgICB3aGlsZSAoc3RhcnQgIT09IGVuZE5vZGUpIHtcbiAgICAgICAgY29uc3QgbjogTm9kZSB8IG51bGwgPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgICAgIHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoc3RhcnQhLCByZWZOb2RlKTtcbiAgICAgICAgc3RhcnQgPSBuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0O1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFBhcnQuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBzZXQvdXBkYXRlIHRoZSB2YWx1ZSBvZiB1c2VyLWNyZWF0ZWRcbiAqIHBhcnRzIChpLmUuIHRob3NlIGNyZWF0ZWQgdXNpbmcgYGluc2VydFBhcnRgKTsgaXQgc2hvdWxkIG5vdCBiZSB1c2VkXG4gKiBieSBkaXJlY3RpdmVzIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIGRpcmVjdGl2ZSdzIGNvbnRhaW5lciBwYXJ0LiBEaXJlY3RpdmVzXG4gKiBzaG91bGQgcmV0dXJuIGEgdmFsdWUgZnJvbSBgdXBkYXRlYC9gcmVuZGVyYCB0byB1cGRhdGUgdGhlaXIgcGFydCBzdGF0ZS5cbiAqXG4gKiBGb3IgZGlyZWN0aXZlcyB0aGF0IHJlcXVpcmUgc2V0dGluZyB0aGVpciBwYXJ0IHZhbHVlIGFzeW5jaHJvbm91c2x5LCB0aGV5XG4gKiBzaG91bGQgZXh0ZW5kIGBBc3luY0RpcmVjdGl2ZWAgYW5kIGNhbGwgYHRoaXMuc2V0VmFsdWUoKWAuXG4gKlxuICogQHBhcmFtIHBhcnQgUGFydCB0byBzZXRcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXRcbiAqIEBwYXJhbSBpbmRleCBGb3IgYEF0dHJpYnV0ZVBhcnRgcywgdGhlIGluZGV4IHRvIHNldFxuICogQHBhcmFtIGRpcmVjdGl2ZVBhcmVudCBVc2VkIGludGVybmFsbHk7IHNob3VsZCBub3QgYmUgc2V0IGJ5IHVzZXJcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENoaWxkUGFydFZhbHVlID0gPFQgZXh0ZW5kcyBDaGlsZFBhcnQ+KFxuICBwYXJ0OiBULFxuICB2YWx1ZTogdW5rbm93bixcbiAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSBwYXJ0XG4pOiBUID0+IHtcbiAgcGFydC5fJHNldFZhbHVlKHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICByZXR1cm4gcGFydDtcbn07XG5cbi8vIEEgc2VudGluZWwgdmFsdWUgdGhhdCBjYW4gbmV2ZXIgYXBwZWFyIGFzIGEgcGFydCB2YWx1ZSBleGNlcHQgd2hlbiBzZXQgYnlcbi8vIGxpdmUoKS4gVXNlZCB0byBmb3JjZSBhIGRpcnR5LWNoZWNrIHRvIGZhaWwgYW5kIGNhdXNlIGEgcmUtcmVuZGVyLlxuY29uc3QgUkVTRVRfVkFMVUUgPSB7fTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjb21taXR0ZWQgdmFsdWUgb2YgYSBDaGlsZFBhcnQgZGlyZWN0bHkgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZVxuICogY29tbWl0IHN0YWdlIG9mIHRoZSBwYXJ0LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIGEgZGlyZWN0aXZlIG5lZWRzIHRvIHVwZGF0ZSB0aGUgcGFydCBzdWNoXG4gKiB0aGF0IHRoZSBuZXh0IHVwZGF0ZSBkZXRlY3RzIGEgdmFsdWUgY2hhbmdlIG9yIG5vdC4gV2hlbiB2YWx1ZSBpcyBvbWl0dGVkLFxuICogdGhlIG5leHQgdXBkYXRlIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBkZXRlY3RlZCBhcyBhIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFydFxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0OiBQYXJ0LCB2YWx1ZTogdW5rbm93biA9IFJFU0VUX1ZBTFVFKSA9PlxuICAocGFydC5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbW1pdHRlZCB2YWx1ZSBvZiBhIENoaWxkUGFydC5cbiAqXG4gKiBUaGUgY29tbWl0dGVkIHZhbHVlIGlzIHVzZWQgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGVmZmljaWVudCB1cGRhdGVzIG9mXG4gKiB0aGUgcGFydC4gSXQgY2FuIGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHRlbXBsYXRlIG9yIGRpcmVjdGl2ZSBpblxuICogY2FzZXMgd2hlcmUgdGhlIHRlbXBsYXRlIHZhbHVlIGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBjb21taXR0ZWQuXG4gKlxuICogLSBgVGVtcGxhdGVSZXN1bHRgcyBhcmUgY29tbWl0dGVkIGFzIGEgYFRlbXBsYXRlSW5zdGFuY2VgXG4gKiAtIEl0ZXJhYmxlcyBhcmUgY29tbWl0dGVkIGFzIGBBcnJheTxDaGlsZFBhcnQ+YFxuICogLSBBbGwgb3RoZXIgdHlwZXMgYXJlIGNvbW1pdHRlZCBhcyB0aGUgdGVtcGxhdGUgdmFsdWUgb3IgdmFsdWUgcmV0dXJuZWQgb3JcbiAqICAgc2V0IGJ5IGEgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSBwYXJ0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0OiBDaGlsZFBhcnQpID0+IHBhcnQuXyRjb21taXR0ZWRWYWx1ZTtcblxuLyoqXG4gKiBSZW1vdmVzIGEgQ2hpbGRQYXJ0IGZyb20gdGhlIERPTSwgaW5jbHVkaW5nIGFueSBvZiBpdHMgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gcGFydCBUaGUgUGFydCB0byByZW1vdmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZVBhcnQgPSAocGFydDogQ2hpbGRQYXJ0KSA9PiB7XG4gIHBhcnQuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGZhbHNlLCB0cnVlKTtcbiAgbGV0IHN0YXJ0OiBDaGlsZE5vZGUgfCBudWxsID0gcGFydC5fJHN0YXJ0Tm9kZTtcbiAgY29uc3QgZW5kOiBDaGlsZE5vZGUgfCBudWxsID0gd3JhcChwYXJ0Ll8kZW5kTm9kZSEpLm5leHRTaWJsaW5nO1xuICB3aGlsZSAoc3RhcnQgIT09IGVuZCkge1xuICAgIGNvbnN0IG46IENoaWxkTm9kZSB8IG51bGwgPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgKHdyYXAoc3RhcnQhKSBhcyBDaGlsZE5vZGUpLnJlbW92ZSgpO1xuICAgIHN0YXJ0ID0gbjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUGFydCA9IChwYXJ0OiBDaGlsZFBhcnQpID0+IHtcbiAgcGFydC5fJGNsZWFyKCk7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5pbXBvcnQge0Rpc2Nvbm5lY3RhYmxlLCBQYXJ0fSBmcm9tICcuL2xpdC1odG1sLmpzJztcblxuZXhwb3J0IHtcbiAgQXR0cmlidXRlUGFydCxcbiAgQm9vbGVhbkF0dHJpYnV0ZVBhcnQsXG4gIENoaWxkUGFydCxcbiAgRWxlbWVudFBhcnQsXG4gIEV2ZW50UGFydCxcbiAgUGFydCxcbiAgUHJvcGVydHlQYXJ0LFxufSBmcm9tICcuL2xpdC1odG1sLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVDbGFzcyB7XG4gIG5ldyAocGFydDogUGFydEluZm8pOiBEaXJlY3RpdmU7XG59XG5cbi8qKlxuICogVGhpcyB1dGlsaXR5IHR5cGUgZXh0cmFjdHMgdGhlIHNpZ25hdHVyZSBvZiBhIGRpcmVjdGl2ZSBjbGFzcydzIHJlbmRlcigpXG4gKiBtZXRob2Qgc28gd2UgY2FuIHVzZSBpdCBmb3IgdGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCBkaXJlY3RpdmUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIERpcmVjdGl2ZVBhcmFtZXRlcnM8QyBleHRlbmRzIERpcmVjdGl2ZT4gPSBQYXJhbWV0ZXJzPENbJ3JlbmRlciddPjtcblxuLyoqXG4gKiBBIGdlbmVyYXRlZCBkaXJlY3RpdmUgZnVuY3Rpb24gZG9lc24ndCBldmFsdWF0ZSB0aGUgZGlyZWN0aXZlLCBidXQganVzdFxuICogcmV0dXJucyBhIERpcmVjdGl2ZVJlc3VsdCBvYmplY3QgdGhhdCBjYXB0dXJlcyB0aGUgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVJlc3VsdDxDIGV4dGVuZHMgRGlyZWN0aXZlQ2xhc3MgPSBEaXJlY3RpdmVDbGFzcz4ge1xuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBbJ18kbGl0RGlyZWN0aXZlJCddOiBDO1xuICAvKiogQGludGVybmFsICovXG4gIHZhbHVlczogRGlyZWN0aXZlUGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz4+O1xufVxuXG5leHBvcnQgY29uc3QgUGFydFR5cGUgPSB7XG4gIEFUVFJJQlVURTogMSxcbiAgQ0hJTEQ6IDIsXG4gIFBST1BFUlRZOiAzLFxuICBCT09MRUFOX0FUVFJJQlVURTogNCxcbiAgRVZFTlQ6IDUsXG4gIEVMRU1FTlQ6IDYsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBQYXJ0VHlwZSA9ICh0eXBlb2YgUGFydFR5cGUpW2tleW9mIHR5cGVvZiBQYXJ0VHlwZV07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRQYXJ0SW5mbyB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBQYXJ0VHlwZS5DSElMRDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVQYXJ0SW5mbyB7XG4gIHJlYWRvbmx5IHR5cGU6XG4gICAgfCB0eXBlb2YgUGFydFR5cGUuQVRUUklCVVRFXG4gICAgfCB0eXBlb2YgUGFydFR5cGUuUFJPUEVSVFlcbiAgICB8IHR5cGVvZiBQYXJ0VHlwZS5CT09MRUFOX0FUVFJJQlVURVxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLkVWRU5UO1xuICByZWFkb25seSBzdHJpbmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhZ05hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UGFydEluZm8ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgUGFydFR5cGUuRUxFTUVOVDtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFydCBhIGRpcmVjdGl2ZSBpcyBib3VuZCB0by5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhhdCBhIGRpcmVjdGl2ZSBpcyBhdHRhY2hlZCB0byBhIHZhbGlkIHBhcnQsXG4gKiBzdWNoIGFzIHdpdGggZGlyZWN0aXZlIHRoYXQgY2FuIG9ubHkgYmUgdXNlZCBvbiBhdHRyaWJ1dGUgYmluZGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnRJbmZvID0gQ2hpbGRQYXJ0SW5mbyB8IEF0dHJpYnV0ZVBhcnRJbmZvIHwgRWxlbWVudFBhcnRJbmZvO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB1c2VyLWZhY2luZyBkaXJlY3RpdmUgZnVuY3Rpb24gZnJvbSBhIERpcmVjdGl2ZSBjbGFzcy4gVGhpc1xuICogZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhlIGRpcmVjdGl2ZSdzIHJlbmRlcigpIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZSA9XG4gIDxDIGV4dGVuZHMgRGlyZWN0aXZlQ2xhc3M+KGM6IEMpID0+XG4gICguLi52YWx1ZXM6IERpcmVjdGl2ZVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+Pik6IERpcmVjdGl2ZVJlc3VsdDxDPiA9PiAoe1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgWydfJGxpdERpcmVjdGl2ZSQnXTogYyxcbiAgICB2YWx1ZXMsXG4gIH0pO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGN1c3RvbSBkaXJlY3RpdmVzLiBVc2VycyBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MsXG4gKiBpbXBsZW1lbnQgYHJlbmRlcmAgYW5kL29yIGB1cGRhdGVgLCBhbmQgdGhlbiBwYXNzIHRoZWlyIHN1YmNsYXNzIHRvXG4gKiBgZGlyZWN0aXZlYC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpcmVjdGl2ZSBpbXBsZW1lbnRzIERpc2Nvbm5lY3RhYmxlIHtcbiAgLy9AaW50ZXJuYWxcbiAgX19wYXJ0ITogUGFydDtcbiAgLy9AaW50ZXJuYWxcbiAgX19hdHRyaWJ1dGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvL0BpbnRlcm5hbFxuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcblxuICAvL0BpbnRlcm5hbFxuICBfJHBhcmVudCE6IERpc2Nvbm5lY3RhYmxlO1xuXG4gIC8vIFRoZXNlIHdpbGwgb25seSBleGlzdCBvbiB0aGUgQXN5bmNEaXJlY3RpdmUgc3ViY2xhc3NcbiAgLy9AaW50ZXJuYWxcbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPjtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgLy9AaW50ZXJuYWxcbiAgWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/KGlzQ29ubmVjdGVkOiBib29sZWFuKTogdm9pZDtcblxuICBjb25zdHJ1Y3RvcihfcGFydEluZm86IFBhcnRJbmZvKSB7fVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRpbml0aWFsaXplKFxuICAgIHBhcnQ6IFBhcnQsXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBhdHRyaWJ1dGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX19wYXJ0ID0gcGFydDtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuX19hdHRyaWJ1dGVJbmRleCA9IGF0dHJpYnV0ZUluZGV4O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRyZXNvbHZlKHBhcnQ6IFBhcnQsIHByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZShwYXJ0LCBwcm9wcyk7XG4gIH1cblxuICBhYnN0cmFjdCByZW5kZXIoLi4ucHJvcHM6IEFycmF5PHVua25vd24+KTogdW5rbm93bjtcblxuICB1cGRhdGUoX3BhcnQ6IFBhcnQsIHByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5wcm9wcyk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBPdmVydmlldzpcbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBkZXNpZ25lZCB0byBhZGQgc3VwcG9ydCBmb3IgYW4gYXN5bmMgYHNldFZhbHVlYCBBUEkgYW5kXG4gKiBgZGlzY29ubmVjdGVkYCBjYWxsYmFjayB0byBkaXJlY3RpdmVzIHdpdGggdGhlIGxlYXN0IGltcGFjdCBvbiB0aGUgY29yZVxuICogcnVudGltZSBvciBwYXlsb2FkIHdoZW4gdGhhdCBmZWF0dXJlIGlzIG5vdCB1c2VkLlxuICpcbiAqIFRoZSBzdHJhdGVneSBpcyB0byBpbnRyb2R1Y2UgYSBgQXN5bmNEaXJlY3RpdmVgIHN1YmNsYXNzIG9mXG4gKiBgRGlyZWN0aXZlYCB0aGF0IGNsaW1icyB0aGUgXCJwYXJlbnRcIiB0cmVlIGluIGl0cyBjb25zdHJ1Y3RvciB0byBub3RlIHdoaWNoXG4gKiBicmFuY2hlcyBvZiBsaXQtaHRtbCdzIFwibG9naWNhbCB0cmVlXCIgb2YgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRhaW4gc3VjaFxuICogZGlyZWN0aXZlcyBhbmQgdGh1cyBuZWVkIHRvIGJlIGNyYXdsZWQgd2hlbiBhIHN1YnRyZWUgaXMgYmVpbmcgY2xlYXJlZCAob3JcbiAqIG1hbnVhbGx5IGRpc2Nvbm5lY3RlZCkgaW4gb3JkZXIgdG8gcnVuIHRoZSBgZGlzY29ubmVjdGVkYCBjYWxsYmFjay5cbiAqXG4gKiBUaGUgXCJub2Rlc1wiIG9mIHRoZSBsb2dpY2FsIHRyZWUgaW5jbHVkZSBQYXJ0cywgVGVtcGxhdGVJbnN0YW5jZXMgKGZvciB3aGVuIGFcbiAqIFRlbXBsYXRlUmVzdWx0IGlzIGNvbW1pdHRlZCB0byBhIHZhbHVlIG9mIGEgQ2hpbGRQYXJ0KSwgYW5kIERpcmVjdGl2ZXM7IHRoZXNlXG4gKiBhbGwgaW1wbGVtZW50IGEgY29tbW9uIGludGVyZmFjZSBjYWxsZWQgYERpc2Nvbm5lY3RhYmxlQ2hpbGRgLiBFYWNoIGhhcyBhXG4gKiBgXyRwYXJlbnRgIHJlZmVyZW5jZSB3aGljaCBpcyBzZXQgZHVyaW5nIGNvbnN0cnVjdGlvbiBpbiB0aGUgY29yZSBjb2RlLCBhbmQgYVxuICogYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAgZmllbGQgd2hpY2ggaXMgaW5pdGlhbGx5IHVuZGVmaW5lZC5cbiAqXG4gKiBUaGUgc3BhcnNlIHRyZWUgY3JlYXRlZCBieSBtZWFucyBvZiB0aGUgYEFzeW5jRGlyZWN0aXZlYCBjb25zdHJ1Y3RvclxuICogY3Jhd2xpbmcgdXAgdGhlIGBfJHBhcmVudGAgdHJlZSBhbmQgcGxhY2luZyBhIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIFNldFxuICogb24gZWFjaCBwYXJlbnQgdGhhdCBpbmNsdWRlcyBlYWNoIGNoaWxkIHRoYXQgY29udGFpbnMgYVxuICogYEFzeW5jRGlyZWN0aXZlYCBkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkgdmlhIGl0cyBjaGlsZHJlbi4gSW4gb3JkZXIgdG9cbiAqIG5vdGlmeSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZXMgYW5kIGRpc2Nvbm5lY3QgKG9yIHJlY29ubmVjdCkgYSB0cmVlLCB0aGVcbiAqIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkYCBBUEkgaXMgcGF0Y2hlZCBvbnRvIENoaWxkUGFydHMgYXMgYSBkaXJlY3RpdmVcbiAqIGNsaW1icyB0aGUgcGFyZW50IHRyZWUsIHdoaWNoIGlzIGNhbGxlZCBieSB0aGUgY29yZSB3aGVuIGNsZWFyaW5nIGEgcGFydCBpZlxuICogaXQgZXhpc3RzLiBXaGVuIGNhbGxlZCwgdGhhdCBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgc3BhcnNlIHRyZWUgb2ZcbiAqIFNldDxEaXNjb25uZWN0YWJsZUNoaWxkcmVuPiBidWlsdCB1cCBieSBBc3luY0RpcmVjdGl2ZXMsIGFuZCBjYWxsc1xuICogYF8kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWRgIG9uIGFueSBkaXJlY3RpdmVzIHRoYXQgYXJlIGVuY291bnRlcmVkXG4gKiBpbiB0aGF0IHRyZWUsIHJ1bm5pbmcgdGhlIHJlcXVpcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBBIGdpdmVuIFwibG9naWNhbCB0cmVlXCIgb2YgbGl0LWh0bWwgZGF0YS1zdHJ1Y3R1cmVzIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOlxuICpcbiAqICBDaGlsZFBhcnQoTjEpIF8kZEM9W0QyLFQzXVxuICogICAuX2RpcmVjdGl2ZVxuICogICAgIEFzeW5jRGlyZWN0aXZlKEQyKVxuICogICAuX3ZhbHVlIC8vIHVzZXIgdmFsdWUgd2FzIFRlbXBsYXRlUmVzdWx0XG4gKiAgICAgVGVtcGxhdGVJbnN0YW5jZShUMykgXyRkQz1bQTQsQTYsTjEwLE4xMl1cbiAqICAgICAgLl8kcGFydHNbXVxuICogICAgICAgIEF0dHJpYnV0ZVBhcnQoQTQpIF8kZEM9W0Q1XVxuICogICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQ1KVxuICogICAgICAgIEF0dHJpYnV0ZVBhcnQoQTYpIF8kZEM9W0Q3LEQ4XVxuICogICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQ3KVxuICogICAgICAgICAgIERpcmVjdGl2ZShEOCkgXyRkQz1bRDldXG4gKiAgICAgICAgICAgIC5fZGlyZWN0aXZlXG4gKiAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDkpXG4gKiAgICAgICAgQ2hpbGRQYXJ0KE4xMCkgXyRkQz1bRDExXVxuICogICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxMSlcbiAqICAgICAgICAgLl92YWx1ZVxuICogICAgICAgICAgIHN0cmluZ1xuICogICAgICAgIENoaWxkUGFydChOMTIpIF8kZEM9W0QxMyxOMTQsTjE2XVxuICogICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxMylcbiAqICAgICAgICAgLl92YWx1ZSAvLyB1c2VyIHZhbHVlIHdhcyBpdGVyYWJsZVxuICogICAgICAgICAgIEFycmF5PENoaWxkUGFydD5cbiAqICAgICAgICAgICAgIENoaWxkUGFydChOMTQpIF8kZEM9W0QxNV1cbiAqICAgICAgICAgICAgICAuX3ZhbHVlXG4gKiAgICAgICAgICAgICAgICBzdHJpbmdcbiAqICAgICAgICAgICAgIENoaWxkUGFydChOMTYpIF8kZEM9W0QxNyxUMThdXG4gKiAgICAgICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQxNylcbiAqICAgICAgICAgICAgICAuX3ZhbHVlIC8vIHVzZXIgdmFsdWUgd2FzIFRlbXBsYXRlUmVzdWx0XG4gKiAgICAgICAgICAgICAgICBUZW1wbGF0ZUluc3RhbmNlKFQxOCkgXyRkQz1bQTE5LEEyMSxOMjVdXG4gKiAgICAgICAgICAgICAgICAgLl8kcGFydHNbXVxuICogICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFydChBMTkpIF8kZEM9W0QyMF1cbiAqICAgICAgICAgICAgICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDIwKVxuICogICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFydChBMjEpIF8kZEM9WzIyLDIzXVxuICogICAgICAgICAgICAgICAgICAgIC5fZGlyZWN0aXZlc1tdXG4gKiAgICAgICAgICAgICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShEMjIpXG4gKiAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RpdmUoRDIzKSBfJGRDPVtEMjRdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQyNClcbiAqICAgICAgICAgICAgICAgICAgIENoaWxkUGFydChOMjUpIF8kZEM9W0QyNl1cbiAqICAgICAgICAgICAgICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDI2KVxuICogICAgICAgICAgICAgICAgICAgIC5fdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1xuICpcbiAqIEV4YW1wbGUgMTogVGhlIGRpcmVjdGl2ZSBpbiBDaGlsZFBhcnQoTjEyKSB1cGRhdGVzIGFuZCByZXR1cm5zIGBub3RoaW5nYC4gVGhlXG4gKiBDaGlsZFBhcnQgd2lsbCBfY2xlYXIoKSBpdHNlbGYsIGFuZCBzbyB3ZSBuZWVkIHRvIGRpc2Nvbm5lY3QgdGhlIFwidmFsdWVcIiBvZlxuICogdGhlIENoaWxkUGFydCAoYnV0IG5vdCBpdHMgZGlyZWN0aXZlKS4gSW4gdGhpcyBjYXNlLCB3aGVuIGBfY2xlYXIoKWAgY2FsbHNcbiAqIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKClgLCB3ZSBkb24ndCBpdGVyYXRlIGFsbCBvZiB0aGVcbiAqIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiwgcmF0aGVyIHdlIGRvIGEgdmFsdWUtc3BlY2lmaWMgZGlzY29ubmVjdGlvbjogaS5lLlxuICogc2luY2UgdGhlIF92YWx1ZSB3YXMgYW4gQXJyYXk8Q2hpbGRQYXJ0PiAoYmVjYXVzZSBhbiBpdGVyYWJsZSBoYWQgYmVlblxuICogY29tbWl0dGVkKSwgd2UgaXRlcmF0ZSB0aGUgYXJyYXkgb2YgQ2hpbGRQYXJ0cyAoTjE0LCBOMTYpIGFuZCBydW5cbiAqIGBzZXRDb25uZWN0ZWRgIG9uIHRoZW0gKHdoaWNoIGRvZXMgcmVjdXJzZSBkb3duIHRoZSBmdWxsIHRyZWUgb2ZcbiAqIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIGJlbG93IGl0LCBhbmQgYWxzbyByZW1vdmVzIE4xNCBhbmQgTjE2IGZyb20gTjEyJ3NcbiAqIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gKS4gT25jZSB0aGUgdmFsdWVzIGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQsIHdlIHRoZW5cbiAqIGNoZWNrIHdoZXRoZXIgdGhlIENoaWxkUGFydChOMTIpJ3MgbGlzdCBvZiBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCBpcyBlbXB0eVxuICogKGFuZCB3b3VsZCByZW1vdmUgaXQgZnJvbSBpdHMgcGFyZW50IFRlbXBsYXRlSW5zdGFuY2UoVDMpIGlmIHNvKSwgYnV0IHNpbmNlXG4gKiBpdCB3b3VsZCBzdGlsbCBjb250YWluIGl0cyBkaXJlY3RpdmUgRDEzLCBpdCBzdGF5cyBpbiB0aGUgZGlzY29ubmVjdGFibGVcbiAqIHRyZWUuXG4gKlxuICogRXhhbXBsZSAyOiBJbiB0aGUgY291cnNlIG9mIEV4YW1wbGUgMSwgYHNldENvbm5lY3RlZGAgd2lsbCByZWFjaFxuICogQ2hpbGRQYXJ0KE4xNik7IGluIHRoaXMgY2FzZSB0aGUgZW50aXJlIHBhcnQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLCBzbyB3ZVxuICogc2ltcGx5IGl0ZXJhdGUgYWxsIG9mIE4xNidzIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIChEMTcsVDE4KSBhbmRcbiAqIHJlY3Vyc2l2ZWx5IHJ1biBgc2V0Q29ubmVjdGVkYCBvbiB0aGVtLiBOb3RlIHRoYXQgd2Ugb25seSByZW1vdmUgY2hpbGRyZW5cbiAqIGZyb20gYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAgZm9yIHRoZSB0b3AtbGV2ZWwgdmFsdWVzIGJlaW5nIGRpc2Nvbm5lY3RlZFxuICogb24gYSBjbGVhcjsgZG9pbmcgdGhpcyBib29ra2VlcGluZyBsb3dlciBpbiB0aGUgdHJlZSBpcyB3YXN0ZWZ1bCBzaW5jZSBpdCdzXG4gKiBhbGwgYmVpbmcgdGhyb3duIGF3YXkuXG4gKlxuICogRXhhbXBsZSAzOiBJZiB0aGUgTGl0RWxlbWVudCBjb250YWluaW5nIHRoZSBlbnRpcmUgdHJlZSBhYm92ZSBiZWNvbWVzXG4gKiBkaXNjb25uZWN0ZWQsIGl0IHdpbGwgcnVuIGBjaGlsZFBhcnQuc2V0Q29ubmVjdGVkKClgICh3aGljaCBjYWxsc1xuICogYGNoaWxkUGFydC5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKClgIGlmIGl0IGV4aXN0cyk7IGluIHRoaXMgY2FzZSwgd2VcbiAqIHJlY3Vyc2l2ZWx5IHJ1biBgc2V0Q29ubmVjdGVkKClgIG92ZXIgdGhlIGVudGlyZSB0cmVlLCB3aXRob3V0IHJlbW92aW5nIGFueVxuICogY2hpbGRyZW4gZnJvbSBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCwgc2luY2UgdGhpcyB0cmVlIGlzIHJlcXVpcmVkIHRvXG4gKiByZS1jb25uZWN0IHRoZSB0cmVlLCB3aGljaCBkb2VzIHRoZSBzYW1lIG9wZXJhdGlvbiwgc2ltcGx5IHBhc3NpbmdcbiAqIGBpc0Nvbm5lY3RlZDogdHJ1ZWAgZG93biB0aGUgdHJlZSwgc2lnbmFsaW5nIHdoaWNoIGNhbGxiYWNrIHRvIHJ1bi5cbiAqL1xuXG5pbXBvcnQge0F0dHJpYnV0ZVBhcnQsIENoaWxkUGFydCwgRGlzY29ubmVjdGFibGUsIFBhcnR9IGZyb20gJy4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtpc1NpbmdsZUV4cHJlc3Npb259IGZyb20gJy4vZGlyZWN0aXZlLWhlbHBlcnMuanMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgd2Fsa3MgZG93biB0aGUgdHJlZSBvZiBQYXJ0cy9UZW1wbGF0ZUluc3RhbmNlcy9EaXJlY3RpdmVzIHRvIHNldFxuICogdGhlIGNvbm5lY3RlZCBzdGF0ZSBvZiBkaXJlY3RpdmVzIGFuZCBydW4gYGRpc2Nvbm5lY3RlZGAvIGByZWNvbm5lY3RlZGBcbiAqIGNhbGxiYWNrcy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgd2VyZSBjaGlsZHJlbiB0byBkaXNjb25uZWN0OyBmYWxzZSBvdGhlcndpc2VcbiAqL1xuY29uc3Qgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkID0gKFxuICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICBpc0Nvbm5lY3RlZDogYm9vbGVhblxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBvYmogb2YgY2hpbGRyZW4pIHtcbiAgICAvLyBUaGUgZXhpc3RlbmNlIG9mIGBfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkYCBpcyB1c2VkIGFzIGEgXCJicmFuZFwiIHRvXG4gICAgLy8gZGlzYW1iaWd1YXRlIEFzeW5jRGlyZWN0aXZlcyBmcm9tIG90aGVyIERpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5cbiAgICAvLyAoYXMgb3Bwb3NlZCB0byB1c2luZyBhbiBpbnN0YW5jZW9mIGNoZWNrIHRvIGtub3cgd2hlbiB0byBjYWxsIGl0KTsgdGhlXG4gICAgLy8gcmVkdW5kYW5jeSBvZiBcIkRpcmVjdGl2ZVwiIGluIHRoZSBBUEkgbmFtZSBpcyB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoXG4gICAgLy8gYF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWRgLCB3aGljaCBleGlzdHMgYENoaWxkUGFydHNgIHdoaWNoIGFyZSBhbHNvIGluXG4gICAgLy8gdGhpcyBsaXN0XG4gICAgLy8gRGlzY29ubmVjdCBEaXJlY3RpdmUgKGFuZCBhbnkgbmVzdGVkIGRpcmVjdGl2ZXMgY29udGFpbmVkIHdpdGhpbilcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIChvYmogYXMgQXN5bmNEaXJlY3RpdmUpWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/LihcbiAgICAgIGlzQ29ubmVjdGVkLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIC8vIERpc2Nvbm5lY3QgUGFydC9UZW1wbGF0ZUluc3RhbmNlXG4gICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKG9iaiwgaXNDb25uZWN0ZWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCBmcm9tIGl0cyBwYXJlbnQgbGlzdCBvZiBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiwgYW5kXG4gKiBpZiB0aGUgcGFyZW50IGxpc3QgYmVjb21lcyBlbXB0eSBhcyBhIHJlc3VsdCwgcmVtb3ZlcyB0aGUgcGFyZW50IGZyb20gaXRzXG4gKiBwYXJlbnQsIGFuZCBzbyBmb3J0aCB1cCB0aGUgdHJlZSB3aGVuIHRoYXQgY2F1c2VzIHN1YnNlcXVlbnQgcGFyZW50IGxpc3RzIHRvXG4gKiBiZWNvbWUgZW1wdHkuXG4gKi9cbmNvbnN0IHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIGxldCBwYXJlbnQsIGNoaWxkcmVuO1xuICBkbyB7XG4gICAgaWYgKChwYXJlbnQgPSBvYmouXyRwYXJlbnQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4hO1xuICAgIGNoaWxkcmVuLmRlbGV0ZShvYmopO1xuICAgIG9iaiA9IHBhcmVudDtcbiAgfSB3aGlsZSAoY2hpbGRyZW4/LnNpemUgPT09IDApO1xufTtcblxuY29uc3QgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIC8vIENsaW1iIHRoZSBwYXJlbnQgdHJlZSwgY3JlYXRpbmcgYSBzcGFyc2UgdHJlZSBvZiBjaGlsZHJlbiBuZWVkaW5nXG4gIC8vIGRpc2Nvbm5lY3Rpb25cbiAgZm9yIChsZXQgcGFyZW50OyAocGFyZW50ID0gb2JqLl8kcGFyZW50KTsgb2JqID0gcGFyZW50KSB7XG4gICAgbGV0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IGNoaWxkcmVuID0gbmV3IFNldCgpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGRyZW4uaGFzKG9iaikpIHtcbiAgICAgIC8vIE9uY2Ugd2UndmUgcmVhY2hlZCBhIHBhcmVudCB0aGF0IGFscmVhZHkgY29udGFpbnMgdGhpcyBjaGlsZCwgd2VcbiAgICAgIC8vIGNhbiBzaG9ydC1jaXJjdWl0XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2hpbGRyZW4uYWRkKG9iaik7XG4gICAgaW5zdGFsbERpc2Nvbm5lY3RBUEkocGFyZW50KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2VzIHRoZSBwYXJlbnQgcmVmZXJlbmNlIG9mIHRoZSBDaGlsZFBhcnQsIGFuZCB1cGRhdGVzIHRoZSBzcGFyc2UgdHJlZSBvZlxuICogRGlzY29ubmVjdGFibGUgY2hpbGRyZW4gYWNjb3JkaW5nbHkuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb21cbiAqIHRoZSBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgbW92ZWQgYmV0d2VlbiBkaWZmZXJlbnQgcGFyZW50cy5cbiAqL1xuZnVuY3Rpb24gcmVwYXJlbnREaXNjb25uZWN0YWJsZXModGhpczogQ2hpbGRQYXJ0LCBuZXdQYXJlbnQ6IERpc2Nvbm5lY3RhYmxlKSB7XG4gIGlmICh0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBuZXdQYXJlbnQ7XG4gICAgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCh0aGlzKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl8kcGFyZW50ID0gbmV3UGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogU2V0cyB0aGUgY29ubmVjdGVkIHN0YXRlIG9uIGFueSBkaXJlY3RpdmVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvbW1pdHRlZFxuICogdmFsdWUgb2YgdGhpcyBwYXJ0IChpLmUuIHdpdGhpbiBhIFRlbXBsYXRlSW5zdGFuY2Ugb3IgaXRlcmFibGUgb2ZcbiAqIENoaWxkUGFydHMpIGFuZCBydW5zIHRoZWlyIGBkaXNjb25uZWN0ZWRgL2ByZWNvbm5lY3RlZGBzLCBhcyB3ZWxsIGFzIHdpdGhpblxuICogYW55IGRpcmVjdGl2ZXMgc3RvcmVkIG9uIHRoZSBDaGlsZFBhcnQgKHdoZW4gYHZhbHVlT25seWAgaXMgZmFsc2UpLlxuICpcbiAqIGBpc0NsZWFyaW5nVmFsdWVgIHNob3VsZCBiZSBwYXNzZWQgYXMgYHRydWVgIG9uIGEgdG9wLWxldmVsIHBhcnQgdGhhdCBpc1xuICogY2xlYXJpbmcgaXRzZWxmLCBhbmQgbm90IGFzIGEgcmVzdWx0IG9mIHJlY3Vyc2l2ZWx5IGRpc2Nvbm5lY3RpbmcgZGlyZWN0aXZlc1xuICogYXMgcGFydCBvZiBhIGBjbGVhcmAgb3BlcmF0aW9uIGhpZ2hlciB1cCB0aGUgdHJlZS4gVGhpcyBib3RoIGVuc3VyZXMgdGhhdCBhbnlcbiAqIGRpcmVjdGl2ZSBvbiB0aGlzIENoaWxkUGFydCB0aGF0IHByb2R1Y2VkIGEgdmFsdWUgdGhhdCBjYXVzZWQgdGhlIGNsZWFyXG4gKiBvcGVyYXRpb24gaXMgbm90IGRpc2Nvbm5lY3RlZCwgYW5kIGFsc28gc2VydmVzIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gKiB0byBhdm9pZCBuZWVkbGVzcyBib29ra2VlcGluZyB3aGVuIGEgc3VidHJlZSBpcyBnb2luZyBhd2F5OyB3aGVuIGNsZWFyaW5nIGFcbiAqIHN1YnRyZWUsIG9ubHkgdGhlIHRvcC1tb3N0IHBhcnQgbmVlZCB0byByZW1vdmUgaXRzZWxmIGZyb20gdGhlIHBhcmVudC5cbiAqXG4gKiBgZnJvbVBhcnRJbmRleGAgaXMgcGFzc2VkIG9ubHkgaW4gdGhlIGNhc2Ugb2YgYSBwYXJ0aWFsIGBfY2xlYXJgIHJ1bm5pbmcgYXMgYVxuICogcmVzdWx0IG9mIHRydW5jYXRpbmcgYW4gaXRlcmFibGUuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb20gdGhlXG4gKiBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgY2xlYXJlZCBvciB0aGUgY29ubmVjdGlvbiBzdGF0ZSBpcyBjaGFuZ2VkIGJ5IHRoZVxuICogdXNlci5cbiAqL1xuZnVuY3Rpb24gbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZChcbiAgdGhpczogQ2hpbGRQYXJ0LFxuICBpc0Nvbm5lY3RlZDogYm9vbGVhbixcbiAgaXNDbGVhcmluZ1ZhbHVlID0gZmFsc2UsXG4gIGZyb21QYXJ0SW5kZXggPSAwXG4pIHtcbiAgY29uc3QgdmFsdWUgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG4gIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkcmVuLnNpemUgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQ2xlYXJpbmdWYWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gSXRlcmFibGUgY2FzZTogQW55IENoaWxkUGFydHMgY3JlYXRlZCBieSB0aGUgaXRlcmFibGUgc2hvdWxkIGJlXG4gICAgICAvLyBkaXNjb25uZWN0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIENoaWxkUGFydCdzIGRpc2Nvbm5lY3RhYmxlXG4gICAgICAvLyBjaGlsZHJlbiAoc3RhcnRpbmcgYXQgYGZyb21QYXJ0SW5kZXhgIGluIHRoZSBjYXNlIG9mIHRydW5jYXRpb24pXG4gICAgICBmb3IgKGxldCBpID0gZnJvbVBhcnRJbmRleDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZVtpXSwgZmFsc2UpO1xuICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodmFsdWVbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgLy8gVGVtcGxhdGVJbnN0YW5jZSBjYXNlOiBJZiB0aGUgdmFsdWUgaGFzIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuICh3aWxsXG4gICAgICAvLyBvbmx5IGJlIGluIHRoZSBjYXNlIHRoYXQgaXQgaXMgYSBUZW1wbGF0ZUluc3RhbmNlKSwgd2UgZGlzY29ubmVjdCBpdFxuICAgICAgLy8gYW5kIHJlbW92ZSBpdCBmcm9tIHRoaXMgQ2hpbGRQYXJ0J3MgZGlzY29ubmVjdGFibGUgY2hpbGRyZW5cbiAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZSBhcyBEaXNjb25uZWN0YWJsZSwgZmFsc2UpO1xuICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHZhbHVlIGFzIERpc2Nvbm5lY3RhYmxlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHRoaXMsIGlzQ29ubmVjdGVkKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhdGNoZXMgZGlzY29ubmVjdGlvbiBBUEkgb250byBDaGlsZFBhcnRzLlxuICovXG5jb25zdCBpbnN0YWxsRGlzY29ubmVjdEFQSSA9IChvYmo6IERpc2Nvbm5lY3RhYmxlKSA9PiB7XG4gIGlmICgob2JqIGFzIENoaWxkUGFydCkudHlwZSA9PSBQYXJ0VHlwZS5DSElMRCkge1xuICAgIChvYmogYXMgQ2hpbGRQYXJ0KS5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkID8/PVxuICAgICAgbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZDtcbiAgICAob2JqIGFzIENoaWxkUGFydCkuXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyA/Pz0gcmVwYXJlbnREaXNjb25uZWN0YWJsZXM7XG4gIH1cbn07XG5cbi8qKlxuICogQW4gYWJzdHJhY3QgYERpcmVjdGl2ZWAgYmFzZSBjbGFzcyB3aG9zZSBgZGlzY29ubmVjdGVkYCBtZXRob2Qgd2lsbCBiZVxuICogY2FsbGVkIHdoZW4gdGhlIHBhcnQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIGlzIGNsZWFyZWQgYXMgYSByZXN1bHQgb2ZcbiAqIHJlLXJlbmRlcmluZywgb3Igd2hlbiB0aGUgdXNlciBjYWxscyBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBvblxuICogYSBwYXJ0IHRoYXQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIChhcyBoYXBwZW5zXG4gKiB3aGVuIGUuZy4gYSBMaXRFbGVtZW50IGRpc2Nvbm5lY3RzIGZyb20gdGhlIERPTSkuXG4gKlxuICogSWYgYHBhcnQuc2V0Q29ubmVjdGVkKHRydWUpYCBpcyBzdWJzZXF1ZW50bHkgY2FsbGVkIG9uIGFcbiAqIGNvbnRhaW5pbmcgcGFydCwgdGhlIGRpcmVjdGl2ZSdzIGByZWNvbm5lY3RlZGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHByaW9yXG4gKiB0byBpdHMgbmV4dCBgdXBkYXRlYC9gcmVuZGVyYCBjYWxsYmFja3MuIFdoZW4gaW1wbGVtZW50aW5nIGBkaXNjb25uZWN0ZWRgLFxuICogYHJlY29ubmVjdGVkYCBzaG91bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggcmVjb25uZWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB1cGRhdGVzIG1heSBvY2N1ciB3aGlsZSB0aGUgZGlyZWN0aXZlIGlzIGRpc2Nvbm5lY3RlZC4gQXMgc3VjaCxcbiAqIGRpcmVjdGl2ZXMgc2hvdWxkIGdlbmVyYWxseSBjaGVjayB0aGUgYHRoaXMuaXNDb25uZWN0ZWRgIGZsYWcgZHVyaW5nXG4gKiByZW5kZXIvdXBkYXRlIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIHRvIHJlc291cmNlc1xuICogdGhhdCBtYXkgcHJldmVudCBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3luY0RpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIC8vIEFzIG9wcG9zZWQgdG8gb3RoZXIgRGlzY29ubmVjdGFibGVzLCBBc3luY0RpcmVjdGl2ZXMgYWx3YXlzIGdldCBub3RpZmllZFxuICAvLyB3aGVuIHRoZSBSb290UGFydCBjb25uZWN0aW9uIGNoYW5nZXMsIHNvIHRoZSBwdWJsaWMgYGlzQ29ubmVjdGVkYFxuICAvLyBpcyBhIGxvY2FsbHkgc3RvcmVkIHZhcmlhYmxlIGluaXRpYWxpemVkIHZpYSBpdHMgcGFydCdzIGdldHRlciBhbmQgc3luY2VkXG4gIC8vIHZpYSBgXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZGAuIFRoaXMgaXMgY2hlYXBlciB0aGFuIHVzaW5nXG4gIC8vIHRoZSBfJGlzQ29ubmVjdGVkIGdldHRlciwgd2hpY2ggaGFzIHRvIGxvb2sgYmFjayB1cCB0aGUgdHJlZSBlYWNoIHRpbWUuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBmb3IgdGhpcyBEaXJlY3RpdmUuXG4gICAqL1xuICBpc0Nvbm5lY3RlZCE6IGJvb2xlYW47XG5cbiAgLy8gQGludGVybmFsXG4gIG92ZXJyaWRlIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBwYXJ0IHdpdGggaW50ZXJuYWwgZmllbGRzXG4gICAqIEBwYXJhbSBwYXJ0XG4gICAqIEBwYXJhbSBwYXJlbnRcbiAgICogQHBhcmFtIGF0dHJpYnV0ZUluZGV4XG4gICAqL1xuICBvdmVycmlkZSBfJGluaXRpYWxpemUoXG4gICAgcGFydDogUGFydCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIGF0dHJpYnV0ZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIuXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpO1xuICAgIGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQodGhpcyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHBhcnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAvKipcbiAgICogQ2FsbGVkIGZyb20gdGhlIGNvcmUgY29kZSB3aGVuIGEgZGlyZWN0aXZlIGlzIGdvaW5nIGF3YXkgZnJvbSBhIHBhcnQgKGluXG4gICAqIHdoaWNoIGNhc2UgYHNob3VsZFJlbW92ZUZyb21QYXJlbnRgIHNob3VsZCBiZSB0cnVlKSwgYW5kIGZyb20gdGhlXG4gICAqIGBzZXRDaGlsZHJlbkNvbm5lY3RlZGAgaGVscGVyIGZ1bmN0aW9uIHdoZW4gcmVjdXJzaXZlbHkgY2hhbmdpbmcgdGhlXG4gICAqIGNvbm5lY3Rpb24gc3RhdGUgb2YgYSB0cmVlIChpbiB3aGljaCBjYXNlIGBzaG91bGRSZW1vdmVGcm9tUGFyZW50YCBzaG91bGRcbiAgICogYmUgZmFsc2UpLlxuICAgKlxuICAgKiBAcGFyYW0gaXNDb25uZWN0ZWRcbiAgICogQHBhcmFtIGlzQ2xlYXJpbmdEaXJlY3RpdmUgLSBUcnVlIHdoZW4gdGhlIGRpcmVjdGl2ZSBpdHNlbGYgaXMgYmVpbmdcbiAgICogICAgIHJlbW92ZWQ7IGZhbHNlIHdoZW4gdGhlIHRyZWUgaXMgYmVpbmcgZGlzY29ubmVjdGVkXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb3ZlcnJpZGUgWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10oXG4gICAgaXNDb25uZWN0ZWQ6IGJvb2xlYW4sXG4gICAgaXNDbGVhcmluZ0RpcmVjdGl2ZSA9IHRydWVcbiAgKSB7XG4gICAgaWYgKGlzQ29ubmVjdGVkICE9PSB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICB0aGlzLmlzQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7XG4gICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RlZD8uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZD8uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NsZWFyaW5nRGlyZWN0aXZlKSB7XG4gICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodGhpcywgaXNDb25uZWN0ZWQpO1xuICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlyZWN0aXZlJ3MgUGFydCBvdXRzaWRlIHRoZSBub3JtYWwgYHVwZGF0ZWAvYHJlbmRlcmBcbiAgICogbGlmZWN5Y2xlIG9mIGEgZGlyZWN0aXZlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gYSBkaXJlY3RpdmUncyBgdXBkYXRlYFxuICAgKiBvciBgcmVuZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdGl2ZSBUaGUgZGlyZWN0aXZlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldFxuICAgKi9cbiAgc2V0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAoaXNTaW5nbGVFeHByZXNzaW9uKHRoaXMuX19wYXJ0IGFzIHVua25vd24gYXMgUGFydEluZm8pKSB7XG4gICAgICB0aGlzLl9fcGFydC5fJHNldFZhbHVlKHZhbHVlLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcy5fX2F0dHJpYnV0ZUluZGV4IHdpbGwgYmUgZGVmaW5lZCBpbiB0aGlzIGNhc2UsIGJ1dFxuICAgICAgLy8gYXNzZXJ0IGl0IGluIGRldiBtb2RlXG4gICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5fX2F0dHJpYnV0ZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aGlzLl9fYXR0cmlidXRlSW5kZXggdG8gYmUgYSBudW1iZXJgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IFsuLi4odGhpcy5fX3BhcnQuXyRjb21taXR0ZWRWYWx1ZSBhcyBBcnJheTx1bmtub3duPildO1xuICAgICAgbmV3VmFsdWVzW3RoaXMuX19hdHRyaWJ1dGVJbmRleCFdID0gdmFsdWU7XG4gICAgICAodGhpcy5fX3BhcnQgYXMgQXR0cmlidXRlUGFydCkuXyRzZXRWYWx1ZShuZXdWYWx1ZXMsIHRoaXMsIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VyIGNhbGxiYWNrcyBmb3IgaW1wbGVtZW50aW5nIGxvZ2ljIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcy9zdWJzY3JpcHRpb25zXG4gICAqIHRoYXQgbWF5IGhhdmUgYmVlbiByZXRhaW5lZCBieSB0aGlzIGRpcmVjdGl2ZS4gU2luY2UgZGlyZWN0aXZlcyBtYXkgYWxzbyBiZVxuICAgKiByZS1jb25uZWN0ZWQsIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gcmVzdG9yZSB0aGVcbiAgICogd29ya2luZyBzdGF0ZSBvZiB0aGUgZGlyZWN0aXZlIHByaW9yIHRvIHRoZSBuZXh0IHJlbmRlci5cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWQoKSB7fVxuICBwcm90ZWN0ZWQgcmVjb25uZWN0ZWQoKSB7fVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHtub3RoaW5nLCBFbGVtZW50UGFydH0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtkaXJlY3RpdmUsIEFzeW5jRGlyZWN0aXZlfSBmcm9tICcuLi9hc3luYy1kaXJlY3RpdmUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUmVmIG9iamVjdCwgd2hpY2ggaXMgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmID0gPFQgPSBFbGVtZW50PigpID0+IG5ldyBSZWY8VD4oKTtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBob2xkcyBhIHJlZiB2YWx1ZS5cbiAqL1xuY2xhc3MgUmVmPFQgPSBFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBFbGVtZW50IHZhbHVlIG9mIHRoZSByZWYsIG9yIGVsc2UgYHVuZGVmaW5lZGAgaWYgdGhlIHJlZiBpcyBub1xuICAgKiBsb25nZXIgcmVuZGVyZWQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IFQ7XG59XG5cbmV4cG9ydCB0eXBlIHtSZWZ9O1xuXG5pbnRlcmZhY2UgUmVmSW50ZXJuYWwge1xuICB2YWx1ZTogRWxlbWVudCB8IHVuZGVmaW5lZDtcbn1cblxuLy8gV2hlbiBjYWxsYmFja3MgYXJlIHVzZWQgZm9yIHJlZnMsIHRoaXMgbWFwIHRyYWNrcyB0aGUgbGFzdCB2YWx1ZSB0aGUgY2FsbGJhY2tcbi8vIHdhcyBjYWxsZWQgd2l0aCwgZm9yIGVuc3VyaW5nIGEgZGlyZWN0aXZlIGRvZXNuJ3QgY2xlYXIgdGhlIHJlZiBpZiB0aGUgcmVmXG4vLyBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIHRvIGEgbmV3IHNwb3QuIEl0IGlzIGRvdWJsZS1rZXllZCBvbiBib3RoIHRoZVxuLy8gY29udGV4dCAoYG9wdGlvbnMuaG9zdGApIGFuZCB0aGUgY2FsbGJhY2ssIHNpbmNlIHdlIGF1dG8tYmluZCBjbGFzcyBtZXRob2RzXG4vLyB0byBgb3B0aW9ucy5ob3N0YC5cbmNvbnN0IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrID0gbmV3IFdlYWtNYXA8XG4gIG9iamVjdCxcbiAgV2Vha01hcDxGdW5jdGlvbiwgRWxlbWVudCB8IHVuZGVmaW5lZD5cbj4oKTtcblxuZXhwb3J0IHR5cGUgUmVmT3JDYWxsYmFjazxUID0gRWxlbWVudD4gPSBSZWY8VD4gfCAoKGVsOiBUIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTtcblxuY2xhc3MgUmVmRGlyZWN0aXZlIGV4dGVuZHMgQXN5bmNEaXJlY3RpdmUge1xuICBwcml2YXRlIF9lbGVtZW50PzogRWxlbWVudDtcbiAgcHJpdmF0ZSBfcmVmPzogUmVmT3JDYWxsYmFjaztcbiAgcHJpdmF0ZSBfY29udGV4dD86IG9iamVjdDtcblxuICByZW5kZXIoX3JlZj86IFJlZk9yQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gbm90aGluZztcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZShwYXJ0OiBFbGVtZW50UGFydCwgW3JlZl06IFBhcmFtZXRlcnM8dGhpc1sncmVuZGVyJ10+KSB7XG4gICAgY29uc3QgcmVmQ2hhbmdlZCA9IHJlZiAhPT0gdGhpcy5fcmVmO1xuICAgIGlmIChyZWZDaGFuZ2VkICYmIHRoaXMuX3JlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGUgcmVmIHBhc3NlZCB0byB0aGUgZGlyZWN0aXZlIGhhcyBjaGFuZ2VkO1xuICAgICAgLy8gdW5zZXQgdGhlIHByZXZpb3VzIHJlZidzIHZhbHVlXG4gICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAocmVmQ2hhbmdlZCB8fCB0aGlzLl9sYXN0RWxlbWVudEZvclJlZiAhPT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgLy8gV2UgZWl0aGVyIGdvdCBhIG5ldyByZWYgb3IgdGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyO1xuICAgICAgLy8gc3RvcmUgdGhlIHJlZi9lbGVtZW50ICYgdXBkYXRlIHRoZSByZWYgdmFsdWVcbiAgICAgIHRoaXMuX3JlZiA9IHJlZjtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBwYXJ0Lm9wdGlvbnM/Lmhvc3Q7XG4gICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSgodGhpcy5fZWxlbWVudCA9IHBhcnQuZWxlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gbm90aGluZztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVJlZlZhbHVlKGVsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBJZiB0aGUgY3VycmVudCByZWYgd2FzIGNhbGxlZCB3aXRoIGEgcHJldmlvdXMgdmFsdWUsIGNhbGwgd2l0aFxuICAgICAgLy8gYHVuZGVmaW5lZGA7IFdlIGRvIHRoaXMgdG8gZW5zdXJlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGluIGEgY29uc2lzdGVudFxuICAgICAgLy8gd2F5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIHJlZiBtaWdodCBiZSBtb3ZpbmcgdXAgaW4gdGhlIHRyZWUgKGluXG4gICAgICAvLyB3aGljaCBjYXNlIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IHZhbHVlIGJlZm9yZSB0aGVcbiAgICAgIC8vIHByZXZpb3VzIG9uZSB1bnNldHMgaXQpIGFuZCBkb3duIGluIHRoZSB0cmVlICh3aGVyZSBpdCB3b3VsZCBiZSB1bnNldFxuICAgICAgLy8gYmVmb3JlIGJlaW5nIHNldCkuIE5vdGUgdGhhdCBlbGVtZW50IGxvb2t1cCBpcyBrZXllZCBieVxuICAgICAgLy8gYm90aCB0aGUgY29udGV4dCBhbmQgdGhlIGNhbGxiYWNrLCBzaW5jZSB3ZSBhbGxvdyBwYXNzaW5nIHVuYm91bmRcbiAgICAgIC8vIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgb24gb3B0aW9ucy5ob3N0LCBhbmQgd2Ugd2FudCB0byB0cmVhdFxuICAgICAgLy8gdGhlc2UgYXMgdW5pcXVlIFwiaW5zdGFuY2VzXCIgb2YgYSBmdW5jdGlvbi5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXM7XG4gICAgICBsZXQgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9XG4gICAgICAgIGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLmdldChjb250ZXh0KTtcbiAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLnNldChjb250ZXh0LCBsYXN0RWxlbWVudEZvckNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrLmdldCh0aGlzLl9yZWYpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2suc2V0KHRoaXMuX3JlZiwgZWxlbWVudCk7XG4gICAgICAvLyBDYWxsIHRoZSByZWYgd2l0aCB0aGUgbmV3IGVsZW1lbnQgdmFsdWVcbiAgICAgIGlmIChlbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLl9yZWYgYXMgUmVmSW50ZXJuYWwpIS52YWx1ZSA9IGVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2xhc3RFbGVtZW50Rm9yUmVmKCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrXG4gICAgICAgICAgLmdldCh0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXMpXG4gICAgICAgICAgPy5nZXQodGhpcy5fcmVmKVxuICAgICAgOiB0aGlzLl9yZWY/LnZhbHVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkKCkge1xuICAgIC8vIE9ubHkgY2xlYXIgdGhlIGJveCBpZiBvdXIgZWxlbWVudCBpcyBzdGlsbCB0aGUgb25lIGluIGl0IChpLmUuIGFub3RoZXJcbiAgICAvLyBkaXJlY3RpdmUgaW5zdGFuY2UgaGFzbid0IHJlbmRlcmVkIGl0cyBlbGVtZW50IHRvIGl0IGJlZm9yZSB1cyk7IHRoYXRcbiAgICAvLyBvbmx5IGhhcHBlbnMgaW4gdGhlIGV2ZW50IG9mIHRoZSBkaXJlY3RpdmUgYmVpbmcgY2xlYXJlZCAobm90IHZpYSBtYW51YWxcbiAgICAvLyBkaXNjb25uZWN0aW9uKVxuICAgIGlmICh0aGlzLl9sYXN0RWxlbWVudEZvclJlZiA9PT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZWNvbm5lY3RlZCgpIHtcbiAgICAvLyBJZiB3ZSB3ZXJlIG1hbnVhbGx5IGRpc2Nvbm5lY3RlZCwgd2UgY2FuIHNhZmVseSBwdXQgb3VyIGVsZW1lbnQgYmFjayBpblxuICAgIC8vIHRoZSBib3gsIHNpbmNlIG5vIHJlbmRlcmluZyBjb3VsZCBoYXZlIG9jY3VycmVkIHRvIGNoYW5nZSBpdHMgc3RhdGVcbiAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh0aGlzLl9lbGVtZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgUmVmIG9iamVjdCBvciBjYWxscyBhIHJlZiBjYWxsYmFjayB3aXRoIHRoZSBlbGVtZW50IGl0J3NcbiAqIGJvdW5kIHRvLlxuICpcbiAqIEEgUmVmIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LiBBIHJlZlxuICogY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGVsZW1lbnQgYXMgaXRzIG9ubHkgYXJndW1lbnQuXG4gKlxuICogVGhlIHJlZiBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIFJlZiBvYmplY3Qgb3IgY2FsbHMgdGhlIHJlZiBjYWxsYmFja1xuICogZHVyaW5nIHJlbmRlcmluZywgaWYgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBjaGFuZ2VkLlxuICpcbiAqIE5vdGU6IElmIGEgcmVmIGNhbGxiYWNrIGlzIHJlbmRlcmVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQgcG9zaXRpb24gb3IgaXNcbiAqIHJlbW92ZWQgaW4gYSBzdWJzZXF1ZW50IHJlbmRlciwgaXQgd2lsbCBmaXJzdCBiZSBjYWxsZWQgd2l0aCBgdW5kZWZpbmVkYCxcbiAqIGZvbGxvd2VkIGJ5IGFub3RoZXIgY2FsbCB3aXRoIHRoZSBuZXcgZWxlbWVudCBpdCB3YXMgcmVuZGVyZWQgdG8gKGlmIGFueSkuXG4gKlxuICogYGBganNcbiAqIC8vIFVzaW5nIFJlZiBvYmplY3RcbiAqIGNvbnN0IGlucHV0UmVmID0gY3JlYXRlUmVmKCk7XG4gKiByZW5kZXIoaHRtbGA8aW5wdXQgJHtyZWYoaW5wdXRSZWYpfT5gLCBjb250YWluZXIpO1xuICogaW5wdXRSZWYudmFsdWUuZm9jdXMoKTtcbiAqXG4gKiAvLyBVc2luZyBjYWxsYmFja1xuICogY29uc3QgY2FsbGJhY2sgPSAoaW5wdXRFbGVtZW50KSA9PiBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAqIHJlbmRlcihodG1sYDxpbnB1dCAke3JlZihjYWxsYmFjayl9PmAsIGNvbnRhaW5lcik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHJlZiA9IGRpcmVjdGl2ZShSZWZEaXJlY3RpdmUpO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1JlZkRpcmVjdGl2ZX07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIFtwYXJ0PSdjb3JyZWN0J10ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMS4xcmVtO1xuICAgIG1pbi13aWR0aDogMS4xcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIuM3JlbTtcbiAgICBtaW4td2lkdGg6IDIuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMykgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzLjNyZW07XG4gICAgbWluLXdpZHRoOiAzLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNC4ycmVtO1xuICAgIG1pbi13aWR0aDogNC4ycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC02KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDYuNnJlbTtcbiAgICBtaW4td2lkdGg6IDYuNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogOHJlbTtcbiAgICBtaW4td2lkdGg6IDhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTE1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEycmVtO1xuICAgIG1pbi13aWR0aDogMTJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDE3cmVtO1xuICAgIG1pbi13aWR0aDogMTdyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTI1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIG1pbi13aWR0aDogMjByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI0cmVtO1xuICAgIG1pbi13aWR0aDogMjRyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTM1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI4cmVtO1xuICAgIG1pbi13aWR0aDogMjhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMycmVtO1xuICAgIG1pbi13aWR0aDogMzJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQ1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDM2cmVtO1xuICAgIG1pbi13aWR0aDogMzZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTUwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQwcmVtO1xuICAgIG1pbi13aWR0aDogNDByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTcyKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDU3cmVtO1xuICAgIG1pbi13aWR0aDogNTdyZW07XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnN0eWxlcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVRleHRFbnRyeUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBpbnB1dFJlZiA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpZiB0aGUgaW5wdXQgaXMgdmFsaWRcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gbWVzc2FnZVxuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTsgLy8gU2V0IGN1c3RvbSBtZXNzYWdlIG9ubHkgaWYgaW52YWxpZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxpbnB1dFxuICAgICAgICBwYXJ0PVwiaW5wdXRcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICB0eXBlPVwiJHt0aGlzLnBhdHRlcm5NYXNrID09ICdbMC05XSonID8gJ251bWJlcicgOiAndGV4dCd9XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICAudmFsdWU9XCIke3RoaXMuX3ZhbHVlfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgbWF4bGVuZ3RoPSR7MTAwMH1cbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RSZXNwb25zZX08L2Rpdj5cbiAgICBgO1xuICB9XG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbic6IFF0aVRleHRFbnRyeUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHF1ZXJ5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuaW1wb3J0IHsgQ2hvaWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgdHlwZSBDaG9pY2UgPSBIVE1MRWxlbWVudCAmIENob2ljZUludGVyZmFjZSAmIHsgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlc0ludGVyZmFjZSBleHRlbmRzIElJbnRlcmFjdGlvbiB7XG4gIF9jaG9pY2VFbGVtZW50czogQXJyYXk8Q2hvaWNlPjtcbiAgY29ycmVjdFJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IENob2ljZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIENob2ljZXNNaXhpbkVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZSB7XG4gICAgcHVibGljIF9jaG9pY2VFbGVtZW50czogQ2hvaWNlW10gPSBbXTtcblxuICAgIEBxdWVyeSgnI3ZhbGlkYXRpb25NZXNzYWdlJylcbiAgICBwcml2YXRlIF92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWluLWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1pbkNob2ljZXMgPSAwO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcycgfSlcbiAgICBwdWJsaWMgbWF4Q2hvaWNlcyA9IDE7XG5cbiAgICBAd2F0Y2goJ21heENob2ljZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZU1heENob2ljZXNDaGFuZ2UoX29sZFZhbHVlOiBudW1iZXIsIF9uZXdWYWx1ZTogbnVtYmVyKSB7XG4gICAgICB0aGlzLl9kZXRlcm1pbmVJbnB1dFR5cGUoKTtcbiAgICB9XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2guZGlzYWJsZWQgPSBkaXNhYmxlZCkpO1xuICAgIH07XG5cbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChfOiBib29sZWFuLCByZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4gKGNob2ljZS5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlLmpvaW4oJywnKSA6IHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID4gMSAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbC5zcGxpdCgnLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWluZyB0aGlzLnZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB0aGlzLl92YWx1ZS5mb3JFYWNoKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoaXMudmFsdWUgaXMgbm90IGFuIGFycmF5XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2NvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdpbmNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChyZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBzZWxlY3RlZENob2ljZXMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gc2VsZWN0ZWRDaG9pY2VzLmxlbmd0aDtcbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIGxldCB2YWxpZGl0eU1lc3NhZ2UgPSAnJztcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgIT09IDAgJiYgc2VsZWN0ZWRDb3VudCA+IHRoaXMubWF4Q2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5tYXhTZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IGNhbiBzZWxlY3QgYXQgbW9zdCAke3RoaXMubWF4Q2hvaWNlc30gY2hvaWNlcy5gO1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50IDwgdGhpcy5taW5DaG9pY2VzKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlNZXNzYWdlID0gdGhpcy5kYXRhc2V0Lm1pblNlbGVjdGlvbnNNZXNzYWdlIHx8IGBZb3UgbXVzdCBzZWxlY3QgYXQgbGVhc3QgJHt0aGlzLm1pbkNob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShcbiAgICAgICAgICBpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiB0cnVlIH0sXG4gICAgICAgICAgdmFsaWRpdHlNZXNzYWdlLFxuICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlc1tzZWxlY3RlZENvdW50IC0gMV0gfHwgdGhpcy5fY2hvaWNlRWxlbWVudHNbMF0gfHwgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgICBpZiAodGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5faW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5faW50ZXJuYWxzLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgY2hvaWNlRWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG5cblxuICAgICAgXG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5wdXNoKGNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiBjaG9pY2UgIT09IGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGVybWluZUlucHV0VHlwZSgpIHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudDogQ2hvaWNlKSB7XG4gICAgICAvLyBjaG9pY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsIHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/ICdyYWRpbycgOiAnY2hlY2tib3gnKTtcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94JztcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnN0YXRlcy5hZGQoY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSlcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuYXJpYVJlYWRPbmx5ID0gdGhpcy5yZWFkb25seSA9PSB0cnVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIoZXZlbnQ6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nIH0+KSB7XG4gICAgICB0aGlzLl90b2dnbGVDaG9pY2VDaGVja2VkKGV2ZW50LnRhcmdldCBhcyBDaG9pY2UpO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgICAgaWYgKGNob2ljZS5pZGVudGlmaWVyICE9PSBldmVudC5kZXRhaWwuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSwgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgaWYgKGNob2ljZS5pbnRlcm5hbHM/LnN0YXRlcykge1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnLS1jaGVja2VkJyk7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmhhcygnLS1jaGVja2VkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9nZ2xlQ2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSkge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKTtcbiAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCAhY2hlY2tlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJZGVudGlmaWVycyA9IHNlbGVjdGVkQ2hvaWNlcy5tYXAoY2hvaWNlID0+IGNob2ljZS5pZGVudGlmaWVyKTtcblxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/IHNlbGVjdGVkSWRlbnRpZmllcnNbMF0gfHwgJycgOiBzZWxlY3RlZElkZW50aWZpZXJzO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBlYWNoIGNob2ljZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlIDogW3RoaXMuX3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHJlc3BvbnNlQXJyYXkuaW5jbHVkZXMoY2hvaWNlLmlkZW50aWZpZXIpO1xuICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgaXNTZWxlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENob2ljZXNNaXhpbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Q2hvaWNlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHRleHQnKSB7XG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJywgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nOiBRdGlIb3R0ZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtub3RoaW5nLCBUZW1wbGF0ZVJlc3VsdCwgbm9DaGFuZ2V9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7ZGlyZWN0aXZlLCBEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcblxuY29uc3QgSFRNTF9SRVNVTFQgPSAxO1xuXG5leHBvcnQgY2xhc3MgVW5zYWZlSFRNTERpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIHN0YXRpYyBkaXJlY3RpdmVOYW1lID0gJ3Vuc2FmZUhUTUwnO1xuICBzdGF0aWMgcmVzdWx0VHlwZSA9IEhUTUxfUkVTVUxUO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiB1bmtub3duID0gbm90aGluZztcbiAgcHJpdmF0ZSBfdGVtcGxhdGVSZXN1bHQ/OiBUZW1wbGF0ZVJlc3VsdDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0SW5mbzogUGFydEluZm8pIHtcbiAgICBzdXBlcihwYXJ0SW5mbyk7XG4gICAgaWYgKHBhcnRJbmZvLnR5cGUgIT09IFBhcnRUeXBlLkNISUxEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke1xuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKS5kaXJlY3RpdmVOYW1lXG4gICAgICAgIH0oKSBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGJpbmRpbmdzYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIodmFsdWU6IHN0cmluZyB8IHR5cGVvZiBub3RoaW5nIHwgdHlwZW9mIG5vQ2hhbmdlIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZVJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAodGhpcy5fdmFsdWUgPSB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtcbiAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVW5zYWZlSFRNTERpcmVjdGl2ZSkuZGlyZWN0aXZlTmFtZVxuICAgICAgICB9KCkgY2FsbGVkIHdpdGggYSBub24tc3RyaW5nIHZhbHVlYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlUmVzdWx0O1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHN0cmluZ3MgPSBbdmFsdWVdIGFzIHVua25vd24gYXMgVGVtcGxhdGVTdHJpbmdzQXJyYXk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAoc3RyaW5ncyBhcyBhbnkpLnJhdyA9IHN0cmluZ3M7XG4gICAgLy8gV0FSTklORzogaW1wZXJzb25hdGluZyBhIFRlbXBsYXRlUmVzdWx0IGxpa2UgdGhpcyBpcyBleHRyZW1lbHlcbiAgICAvLyBkYW5nZXJvdXMuIFRoaXJkLXBhcnR5IGRpcmVjdGl2ZXMgc2hvdWxkIG5vdCBkbyB0aGlzLlxuICAgIHJldHVybiAodGhpcy5fdGVtcGxhdGVSZXN1bHQgPSB7XG4gICAgICAvLyBDYXN0IHRvIGEga25vd24gc2V0IG9mIGludGVnZXJzIHRoYXQgc2F0aXNmeSBSZXN1bHRUeXBlIHNvIHRoYXQgd2VcbiAgICAgIC8vIGRvbid0IGhhdmUgdG8gZXhwb3J0IFJlc3VsdFR5cGUgYW5kIHBvc3NpYmx5IGVuY291cmFnZSB0aGlzIHBhdHRlcm4uXG4gICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgWydfJGxpdFR5cGUkJ106ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKVxuICAgICAgICAucmVzdWx0VHlwZSBhcyAxIHwgMixcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXM6IFtdLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgcmVzdWx0IGFzIEhUTUwsIHJhdGhlciB0aGFuIHRleHQuXG4gKlxuICogVGhlIHZhbHVlcyBgdW5kZWZpbmVkYCwgYG51bGxgLCBhbmQgYG5vdGhpbmdgLCB3aWxsIGFsbCByZXN1bHQgaW4gbm8gY29udGVudFxuICogKGVtcHR5IHN0cmluZykgYmVpbmcgcmVuZGVyZWQuXG4gKlxuICogTm90ZSwgdGhpcyBpcyB1bnNhZmUgdG8gdXNlIHdpdGggYW55IHVzZXItcHJvdmlkZWQgaW5wdXQgdGhhdCBoYXNuJ3QgYmVlblxuICogc2FuaXRpemVkIG9yIGVzY2FwZWQsIGFzIGl0IG1heSBsZWFkIHRvIGNyb3NzLXNpdGUtc2NyaXB0aW5nXG4gKiB2dWxuZXJhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVIVE1MID0gZGlyZWN0aXZlKFVuc2FmZUhUTUxEaXJlY3RpdmUpO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBPcHRpb25UeXBlIHtcbiAgdGV4dENvbnRlbnQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgc2xvdCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIFtyb2xlPSdtZW51J10ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC5hbmNob3Ige1xuICAgICAgICAgIC8qIGFuY2hvci1uYW1lOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLnBvc2l0aW9uZWRFbGVtZW50IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgLyogcG9zaXRpb24tYW5jaG9yOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgLyogdG9wOiBhbmNob3IoYm90dG9tKTsgKi9cbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlucHV0V2lkdGhDbGFzcyA9IFtcbiAgICAnJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTInLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0zJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTQnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xNScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC03MidcbiAgXTtcblxuICBAc3RhdGUoKSBvcHRpb25zOiBPcHRpb25UeXBlW10gPSBbXTtcblxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uOiBzdHJpbmcgPSAnJztcblxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkYXRhLXByb21wdCcsIHR5cGU6IFN0cmluZyB9KVxuICBkYXRhUHJvbXB0OiBzdHJpbmcgPSAnc2VsZWN0JztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2VsZWN0IHBhcnQ9XCJzZWxlY3RcIiBAY2hhbmdlPVwiJHt0aGlzLmNob2ljZVNlbGVjdGVkfVwiID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIiA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCI+XG4gICAgICAgICR7dGhpcy5vcHRpb25zLm1hcChcbiAgICAgICAgICBvcHRpb24gPT4gaHRtbGBcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIke29wdGlvbi52YWx1ZX1cIiA/c2VsZWN0ZWQ9XCIke29wdGlvbi5zZWxlY3RlZH1cIj4ke3Vuc2FmZUhUTUwob3B0aW9uLnRleHRDb250ZW50KX08L29wdGlvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cblxuICAgICAgJHt1bnNhZmVIVE1MKHRoaXMuY29ycmVjdE9wdGlvbil9XG4gICAgYDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH0pO1xuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS52YWx1ZTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9IGA8c3BhbiBwYXJ0PVwiY29ycmVjdC1vcHRpb25cIj4ke1xuICAgICAgdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IHZhbHVlID09PSBvcHRpb24udmFsdWUpLnRleHRDb250ZW50XG4gICAgfTwvc3Bhbj5gO1xuICB9XG5cbiAgcHVibGljIGNob2ljZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBvcHRpb24udmFsdWUgPT09IHNlbGVjdGVkT3B0aW9uVmFsdWUgfSkpO1xuICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHNlbGVjdGVkT3B0aW9uVmFsdWUpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJzogUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIFNodWZmbGVJbnRlcmZhY2Uge31cbmV4cG9ydCBjb25zdCBTaHVmZmxlTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTaHVmZmxlRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX3NodWZmbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgY29udmVydGVyOiBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHNldCBzaHVmZmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NodWZmbGU7XG4gICAgICB0aGlzLl9zaHVmZmxlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgnc2h1ZmZsZScsIG9sZFZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2h1ZmZsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaHVmZmxlO1xuICAgIH1cblxuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIC8vIENhbGwgX3Jlc2V0U2h1ZmZsZUNob2ljZXMgaW5pdGlhbGx5IHRvIHNldCB0aGUgQ1NTIG9yZGVyIHRvIGluaXRpYWwuXG4gICAgICAvLyBJZiBzaHVmZmxlIGlzIHRydWUsIF9zaHVmZmxlQ2hvaWNlcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgc2V0dGVyLlxuICAgICAgaWYgKHRoaXMuc2h1ZmZsZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihzZWxlY3RvcikpO1xuICAgICAgY29uc3QgZml4ZWRFbGVtZW50czogQXJyYXk8eyBlbGVtZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgICAgY29uc3Qgbm9uRml4ZWRFbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG5cbiAgICAgIC8vIFNlcGFyYXRlIGZpeGVkIGFuZCBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGZpeGVkRWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGNob2ljZSwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vbkZpeGVkRWxlbWVudHMucHVzaChjaG9pY2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIDEgb3IgZmV3ZXIgbm9uLWZpeGVkIGVsZW1lbnRzLCB0aHJvdyBhbiBlcnJvciAobm8gc2h1ZmZsZSBwb3NzaWJsZSlcbiAgICAgIGlmIChub25GaXhlZEVsZW1lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2h1ZmZsaW5nIGlzIG5vdCBwb3NzaWJsZSB3aXRoIGZld2VyIHRoYW4gMiBub24tZml4ZWQgZWxlbWVudHMuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU2h1ZmZsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7IC8vIE1heCBhdHRlbXB0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG9yZGVyIGZvciBjb21wYXJpc29uXG4gICAgICBjb25zdCBvcmlnaW5hbE9yZGVyID0gWy4uLm5vbkZpeGVkRWxlbWVudHNdO1xuXG4gICAgICAvLyBTaHVmZmxlIHVudGlsIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IG9yIG1heEF0dGVtcHRzIGlzIHJlYWNoZWRcbiAgICAgIHdoaWxlICghaXNTaHVmZmxlZCAmJiBhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuXG4gICAgICAgIC8vIFNodWZmbGUgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSBub25GaXhlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgW25vbkZpeGVkRWxlbWVudHNbaV0sIG5vbkZpeGVkRWxlbWVudHNbal1dID0gW25vbkZpeGVkRWxlbWVudHNbal0sIG5vbkZpeGVkRWxlbWVudHNbaV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNodWZmbGVkIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgb3JkZXJcbiAgICAgICAgaXNTaHVmZmxlZCA9ICFub25GaXhlZEVsZW1lbnRzLmV2ZXJ5KChjaG9pY2UsIGluZGV4KSA9PiBjaG9pY2UgPT09IG9yaWdpbmFsT3JkZXJbaW5kZXhdKTtcblxuICAgICAgICBpZiAoaXNTaHVmZmxlZCkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTaHVmZmxlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzaHVmZmxlIHRoZSBjaG9pY2VzIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gb3JkZXIgdG8gZWFjaCBlbGVtZW50XG4gICAgICBsZXQgb3JkZXIgPSAxO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vbkZpeGVkQ2hvaWNlID0gbm9uRml4ZWRFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICAgIG5vbkZpeGVkQ2hvaWNlIS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNldFNodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgJ2luaXRpYWwnKTsgLy8gY2hvaWNlLnN0eWxlLm9yZGVyID0gJ2luaXRpYWwnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBTaHVmZmxlRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFQ7XG59O1xuXG5jb25zdCBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXIgPSB7XG4gIGZyb21BdHRyaWJ1dGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSxcbiAgdG9BdHRyaWJ1dGUodmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cbn07XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQ2hvaWNlIH0gZnJvbSAnLi4vLi4vcXRpLXNpbXBsZS1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbnR5cGUgTGFiZWxUeXBlID0gJ3F0aS1sYWJlbHMtZGVjaW1hbCcgfCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScgfCAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG50eXBlIExhYmVsU3VmZml4VHlwZSA9ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnIHwgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJztcblxuZGVjbGFyZSBjbGFzcyBWb2NhYnVsYXJ5SW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBWb2NhYnVsYXJ5TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBWb2NhYnVsYXJ5RWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX2NsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxzID0gWydxdGktbGFiZWxzLWRlY2ltYWwnLCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScsICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJ107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxTdWZmaXhlcyA9IFsncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJywgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJ10gYXMgTGFiZWxTdWZmaXhUeXBlW107XG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWVcbiAgICB9KVxuICAgIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICB0aGlzLl9jbGFzc2VzID0gdmFsdWUuc3BsaXQoJyAnKTtcblxuICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICAvLyB0aGlzLnJlcXVlc3RVcGRhdGUoJ2NsYXNzJywgb2xkVmFsdWUpO1xuICAgIH1cbiAgICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGFzc2VzPy5qb2luKCcgJykgfHwgJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IHZvaWQge1xuICAgICAgc3VwZXIudXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgaWYgKF9jaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NodWZmbGUnKSkge1xuICAgICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRMYWJlbHMoKSB7XG4gICAgICBjb25zdCBjbGFzc0NvbnRhaW5zTGFiZWwgPSB0aGlzLl9jbGFzc2VzLnNvbWUoXG4gICAgICAgIGNscyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoY2xzKSB8fCB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGNscyBhcyBMYWJlbFN1ZmZpeFR5cGUpXG4gICAgICApO1xuICAgICAgY29uc3QgaXNOdW1iZXIgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4oK3ZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAoY2xhc3NDb250YWluc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpLm1hcChjID0+IGMgYXMgUXRpU2ltcGxlQ2hvaWNlKTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IGNob2ljZUVsZW1lbnRzXG4gICAgICAgICAgLm1hcCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGVsOiBjaG9pY2UsIG9yZGVyOiBpc051bWJlcihjaG9pY2Uuc3R5bGUub3JkZXIpID8gK2Nob2ljZS5zdHlsZS5vcmRlciA6IGluZGV4ICsgMSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgICAgIC5tYXAoY2hvaWNlID0+IGNob2ljZS5lbCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIChjaG9pY2VzW2ldIGFzIFF0aVNpbXBsZUNob2ljZSkubWFya2VyID0gdGhpcy5fZ2V0TGFiZWwoaSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldExhYmVsKGluZGV4OiBudW1iZXIpIHtcbiAgICAgIGxldCBsYXN0TGFiZWwgPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjKSkucG9wKCkgYXMgTGFiZWxUeXBlO1xuICAgICAgY29uc3QgbGFzdExhYmVsU3VmZml4ID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGMgYXMgTGFiZWxTdWZmaXhUeXBlKSkucG9wKCk7XG5cbiAgICAgIGlmICghbGFzdExhYmVsICYmIGxhc3RMYWJlbFN1ZmZpeCkge1xuICAgICAgICAvLyBhIHN1ZmZpeCB3aXRob3V0IGEgbGFiZWwgaXMgc3RyYW5nZSBzbyBhZGQgcXRpLWxhYmVscy11cHBlci1hbHBoYVxuICAgICAgICBsYXN0TGFiZWwgPSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG4gICAgICB9XG4gICAgICBsZXQgbGFiZWwgPSAnJztcbiAgICAgIHN3aXRjaCAobGFzdExhYmVsKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtZGVjaW1hbCc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtpbmRleH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoOTcgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnKSB7XG4gICAgICAgIGxhYmVsICs9ICcuJztcbiAgICAgIH0gZWxzZSBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnKSB7XG4gICAgICAgIGxhYmVsICs9IGApYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFZvY2FidWxhcnlFbGVtZW50IGFzIENvbnN0cnVjdG9yPFZvY2FidWxhcnlJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBbcGFydD0nc2xvdCddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiB2YXIoLS1xdGktZ2FwLXNpemUpO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuXG4gIDo6c2xvdHRlZChxdGktc2ltcGxlLWNob2ljZSkge1xuICAgIGZsZXg6IDAgMFxuICAgICAgY2FsYygoMTAwJSAtICh2YXIoLS1xdGktZ2FwLXNpemUpICogdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpKSAvIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0xKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMTtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0yKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMykgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDM7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTQpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA0O1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy01KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNTtcbiAgfVxuICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuYDtcbiIsICJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzSW50ZXJmYWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJztcbmltcG9ydCB7IFZvY2FidWxhcnlNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvblxuICBleHRlbmRzIFZvY2FidWxhcnlNaXhpbihcbiAgICBTaHVmZmxlTWl4aW4oQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLXNpbXBsZS1jaG9pY2UnKSwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksXG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuICApXG4gIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZVxue1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+PHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIGlkPVwidmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbWF0Y2hDb3JyZWN0ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktbWF0Y2g+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICAgIDxxdGktY29ycmVjdCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1jb3JyZWN0PlxuICAgICAgPC9xdGktbWF0Y2g+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4xPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2UgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjAuMDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj4gPC9xdGktbWFwLXJlc3BvbnNlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2VQb2ludCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZS1wb2ludCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1tYXAtcmVzcG9uc2UtcG9pbnQ+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IG1hcFJlc3BvbnNlLCBtYXBSZXNwb25zZVBvaW50LCBtYXRjaENvcnJlY3QgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzJztcbmltcG9ydCB7IHR5cGUgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aVJlc3BvbnNlUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSkge1xuICAgICAgY29uc3Qgc3BsaXR0ZWRUZW1wbGF0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSEuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHNwbGl0dGVkVGVtcGxhdGVOYW1lW3NwbGl0dGVkVGVtcGxhdGVOYW1lLmxlbmd0aCAtIDFdLnJlcGxhY2UoJy54bWwnLCAnJyk7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3dpdGNoICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlJzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2UpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2VfcG9pbnQnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZVBvaW50KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWF0Y2hfY29ycmVjdCc6XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXRjaENvcnJlY3QpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZyYWdtZW50RnJvbVN0cmluZyhzdHJIVE1MOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RySFRNTCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnOiBRdGlSZXNwb25zZVByb2Nlc3Npbmc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVsZScpXG5leHBvcnQgY2xhc3MgUXRpUnVsZSBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdGlSdWxlQmFzZSB7XG4gIHByb2Nlc3MoKTogYW55O1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVsZSc6IFF0aVJ1bGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uLy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcbmltcG9ydCB7IFF0aVJlc3BvbnNlRWxzZSB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1lbHNlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUVsc2Uge1xuICBwdWJsaWMgb3ZlcnJpZGUgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWlmJywgUXRpUmVzcG9uc2VJZik7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUlmIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWlmJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VJZiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZS1pZicsIFF0aVJlc3BvbnNlRWxzZUlmKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTXVsdGlwbGUgfSBmcm9tICcuL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgLy8gZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtO1xuXG4gIC8vIGdldFZhcmlhYmxlcygpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdO1xuICBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlFeHByZXNzaW9uPFQ+IGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIHJlc3VsdDogYW55O1xuXG4gIC8vIGhpZGUgdGhlIHNsb3Qgd2l0aCBjc3NcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICBzbG90IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQsIG51bGwsIDIpfTwvcHJlPlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlc3VsdCgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LnRyaW0oKSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IHJlc3BvbnNlVmFyaWFibGUuYmFzZVR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6IHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHlcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gYWRkZWQgZm9yIHVzZSBvZiBxdGktZXF1YWwtcm91bmRlZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGUgYXMgUXRpRXhwcmVzc2lvbjxudW1iZXI+O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV4cHJlc3Npb24uZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdkZWZhdWx0IG5vdCBzdWZmaWNpZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG59XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3VsdCgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5leHBvcnQgY2xhc3MgUXRpQW5kIGV4dGVuZHMgcXRpQW5kTWl4aW4oUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFF0aUNvbmRpdGlvbkV4cHJlc3Npb24+KSB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2hpbGRyZW4oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W10pKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNb2NrUXRpRXhwcmVzc2lvbjxUPiA9IHsgY2FsY3VsYXRlOiAoKSA9PiBUIH07XG50eXBlIE1vY2tDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIHF0aUFuZE1peGluPFRCYXNlIGV4dGVuZHMgTW9ja0NvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICByZXR1cm4gY2xhc3MgTW9ja1F0aUFuZCBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyBjYWxjdWxhdGVDaGlsZHJlbihjaGlsZHJlbjogQXJyYXk8TW9ja1F0aUV4cHJlc3Npb248YW55Pj4pIHtcbiAgICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBjaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgTW9ja1F0aUV4cHJlc3Npb248YW55PjtcbiAgICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYmFzZS12YWx1ZScsIFF0aUJhc2VWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpQ29udGFpbnMgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmb3Igb3RoZXIgdHlwZXMgdGhhbiBkaXJlY3RlZFBhaXJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZW51bWVyYWJsZSA9IHByb2plY3Rpb24xLmZpbHRlcih4ID0+IHByb2plY3Rpb24yLmluY2x1ZGVzKHgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBlbnVtZXJhYmxlLmxlbmd0aCA+IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICd1bnN1cHBvcnRlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgY29udGFpbnMsIG9ubHkgYmFzZVR5cGU6IGRpcmVjdGVkUGFpciBhbmQgY2FyZGluYWxpdHk6IG11bHRpcGxlIGlzIHN1cHBvcnRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIGNvbnRhaW5zJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb250YWlucycsIFF0aUNvbnRhaW5zKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICBpZiAocmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZS5sZW5ndGggPiAwID8gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2VbMF0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb3JyZWN0JywgUXRpQ29ycmVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbFJvdW5kZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHJvdW5kaW5nTW9kZTogJ2RlY2ltYWxQbGFjZXMnIHwgJ3NpZ25pZmljYW50RmlndXJlcycgPSAnc2lnbmlmaWNhbnRGaWd1cmVzJztcblxuICBnZXQgZmlndXJlcygpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG1pc3NpbmcnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWd1cmVzID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKSB8fCAnMCcpO1xuICAgIGlmIChpc05hTihmaWd1cmVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMSAmJiB0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIGZvciBSb3VuZGluZ01vZGUgc2lnbmlmaWNhbnRGaWd1cmVzJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZ3VyZXM7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWx1ZXNbMF0uYmFzZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvYXQxLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcykgPT09IGZsb2F0Mi50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MSAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpID09PVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQyICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWUgY2Fubm90IGJlIGNhc3RlZCB0byBudW1lcmljIHZhbHVlIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvcjogJHtmbG9hdDF9LCAke2Zsb2F0Mn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlcyBvdGhlciB0aGFuIGZsb2F0IGFuZCBpbnQgY2Fubm90IGJlIHVzZWQgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yLmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbC1yb3VuZGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwtcm91bmRlZCcsIFF0aUVxdWFsUm91bmRlZCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpR3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID4gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3QnLCBRdGlHdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpR3RlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3RlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3RlJywgUXRpR3RlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUlzTnVsbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzWzBdLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJztcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIE51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1pcy1udWxsJywgUXRpSXNOdWxsKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlMdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPCArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdCcsIFF0aUx0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlMdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDw9ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdGUnLCBRdGlMdGUpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQociA9PiByLmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBwaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RlZmF1bHQtdmFsdWUnLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSBsb3dlckJvdW5kOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIHVwcGVyQm91bmQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IG1hcEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktbWFwLWVudHJ5JykpLm1hcChlbCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZSgnbWFwLWtleScpLFxuICAgICAgICBtYXBwZWRWYWx1ZTogK2VsLmdldEF0dHJpYnV0ZSgnbWFwcGVkLXZhbHVlJylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwcGluZycsIFF0aU1hcHBpbmcpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgLy9QSyA6IEZJWE1FLlxuICAvLyBUaGlzIHdhcyBhIGxpdHRsZSBleHBlcmltZW50IGlmIHdlIGNvdWxkIGNhbGwgdGhlIG1hdGNoIGZ1bmN0aW9uIGFzIGEgc3RhdGljIGZ1bmN0aW9uLFxuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbGwga2luZCBvZiB0aGluZ3MsIGJ1dCBub3cgZXNwZWNpYWxseSBmb3IgdXNlIGluXG4gIC8vIHF0aS1yZXNwb25zZS1jb25kaXRpb24tc2NyaXB0XG4gIC8vIGluIHdoaWNoIHdlIHBhc3MgdGhlIGV4cHJlc3Npb25zIGFzIHB1cmUgZnVuY3Rpb25zLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuXG4gIC8vIFNBRExZLCB0aGUgZ2V0VmFyaWFibGVzIHRocm93cyByb2V0IGluIGRlIGV0ZW4uLiB3ZWV0IG5vZyBuaWV0IHByZWNpZXMgaG9lIGRlemUgd2Vya3QuXG4gIC8vIE1hYXIgaWsgZ2EgZXJpbiBkdWlrZW4uXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlVG9NYXAgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBjb3JyZWN0VmFsdWVJbmZvID0gdmFsdWVzWzFdO1xuICAgICAgcmV0dXJuIFF0aU1hdGNoLm1hdGNoKHZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8pO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIG1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1hdGNoKHZhbHVlVG9NYXA6IFJlc3BvbnNlVmFyaWFibGUsIGNvcnJlY3RWYWx1ZUluZm86IFJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICBzd2l0Y2ggKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkpIHtcbiAgICAgIGNhc2UgJ3NpbmdsZSc6IHtcbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgdmFsdWVUb01hcC52YWx1ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvcmRlcmVkJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUb01hcC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWVbaV0sXG4gICAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlW2ldLFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ211bHRpcGxlJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29ycmVjdEFuc3dlciBvZiBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1hdGNoaW5nVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi52YWx1ZVRvTWFwLnZhbHVlXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIGFycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGNvcnJlY3RBbnN3ZXIsIG12LCBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbWF0Y2hpbmdWYWx1ZSA9IG12O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIChhcnIgYXMgc3RyaW5nW10pLnNwbGljZShhcnIuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKS52YWx1ZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ21vZHVsZScgfSlcbiAgbW9kdWxlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjdXN0b20taW50ZXJhY3Rpb24tdHlwZS1pZGVudGlmaWVyJyB9KVxuICBjdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY29udmVydFF0aVZhcmlhYmxlSlNPTihpbnB1dDogUXRpVmFyaWFibGVKU09OKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGZvciAoY29uc3QgdG9wTGV2ZWxLZXkgaW4gaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSh0b3BMZXZlbEtleSkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkT2JqZWN0ID0gaW5wdXRbdG9wTGV2ZWxLZXkgYXMgJ2xpc3QnIHwgJ2Jhc2UnXTtcbiAgICAgICAgaWYgKG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IGluIG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKG5lc3RlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShuZXN0ZWRLZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmVzdGVkT2JqZWN0W25lc3RlZEtleSBhcyBrZXlvZiB0eXBlb2YgbmVzdGVkT2JqZWN0XTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpOyAvLyBDb252ZXJ0IGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpOyAvLyBDb252ZXJ0IHRoZSBzaW5nbGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2hlY2tpbmcoKTogdm9pZCB7XG4gICAgLy8gYmVjYXVzZSB0aGUgcGNpIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCB0byBjaGVjayBmb3IgY2hhbmdlcyB3ZSdsbCB1c2UgYW4gaW50ZXJ2YWxcbiAgICAvLyB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQuIElmIGNoYW5nZWQgd2UnbGwgc2F2ZSB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBuZXdSZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy5yYXdSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gc3RyaW5naWZpZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb252ZXJ0UXRpVmFyaWFibGVKU09OKG5ld1Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENoZWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvLyBGT1IgTk9XXG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgZ2V0VEFPQ29uZmlnKG5vZGUpIHtcbiAgICBjb25zdCBhID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdwcm9wZXJ0aWVzJyk7XG4gICAgbGV0IGNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3QgZ2V0UHJvcGVydHlWYWx1ZSA9IGVsID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge307XG4gICAgICBjb25zdCBrZXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBhbGxLZXkgPSBjaGlsZHJlbi5tYXAoKGM6IEhUTUxFbGVtZW50KSA9PiBjLmdldEF0dHJpYnV0ZSgna2V5JykpO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gYWxsS2V5Lmxlbmd0aCA+IDAgJiYgIWFsbEtleS5maW5kKGsgPT4gIU51bWJlci5pc0ludGVnZXIoK2spKTtcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gY2hpbGRyZW4ubWFwKGMgPT4gZ2V0Q2hpbGRQcm9wZXJ0aWVzKGMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hpbGRQcm9wZXJ0aWVzID0gKGVsKToge30gfCB2b2lkID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcHJvcGVydGllcyA9IHsgLi4ucHJvcGVydGllcywgLi4uZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzIG9mIGEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnRpZXMuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIGNvbmZpZyA9IHsgLi4uY29uZmlnLCAuLi5nZXRDaGlsZFByb3BlcnRpZXMocHJvcGVydGllcykgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDYW4gbm90IGZpbmQgcXRpLWN1c3RvbS1pbnRlcmFjdGlvbiBjb25maWcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKHBjaTogSU1TcGNpPHVua25vd24+KSB7XG4gICAgdGhpcy5wY2kgPSBwY2k7XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdRVEktQ1VTVE9NLUlOVEVSQUNUSU9OJyA/ICdUQU8nIDogJ0lNUyc7XG4gICAgY29uc3QgZG9tOiBIVE1MRWxlbWVudCA9XG4gICAgICB0eXBlID09ICdJTVMnID8gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbWFya3VwJykgOiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ21hcmt1cCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKCdxdGktY3VzdG9tSW50ZXJhY3Rpb24nKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nICYmIHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpKSB7XG4gICAgICAodGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPVxuICAgICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIG9ucmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29ucmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5nZXRUQU9Db25maWcodGhpcyk7XG4gICAgaWYgKHR5cGUgPT0gJ0lNUycpIHtcbiAgICAgIHBjaS5nZXRJbnN0YW5jZShkb20sIGNvbmZpZywgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09ICdUQU8nKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rJykpLm1hcChhY2MgPT4gYWNjLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0Q2hlY2tpbmcoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBkZWZpbmUoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyOiBjdHhBID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGN0eEEpO1xuICAgICAgICB9LFxuICAgICAgICBub3RpZnlSZWFkeTogKCkgPT4ge1xuICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB0aGUgVEFPIHZlcnNpb24gKi9cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYnVpbGRSZXF1aXJlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVxdWlyZVBDSSA9IHJlcXVpcmVqcy5jb25maWcoY29uZmlnKTtcbiAgICByZXF1aXJlUENJKFsncmVxdWlyZSddLCByZXF1aXJlID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICByZXF1aXJlanMudW5kZWYodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyKTtcbiAgICAvLyBDbGVhciB0aGUgbW9kdWxlcyBpbiB0aGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSByZXF1aXJlanMucy5jb250ZXh0cztcbiAgICBkZWxldGUgY29udGV4dFt0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXJdO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBidWlsZFJlcXVpcmVDb25maWcoKSB7XG4gICAgLy8gU2V0IFJlcXVpcmVKUyBwYXRocyBhbmQgc2hpbSBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczogd2luZG93WydyZXF1aXJlUGF0aHMnXSB8fCB7fSxcbiAgICAgIHNoaW06IHdpbmRvd1sncmVxdWlyZVNoaW0nXSB8fCB7fVxuICAgIH07XG4gICAgLy8gQ2hlY2sgaWYgUmVxdWlyZUpTIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBzZXQgYW4gZXJyb3IgbWVzc2FnZVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgUmVxdWlyZUpTIG5vdCBmb3VuZC4gUGxlYXNlIGxvYWQgaXQgdmlhIENETjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGNvbnN0IGludGVyYWN0aW9uTW9kdWxlcyA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1vZHVsZXMnKTtcblxuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZXMgPSBpbnRlcmFjdGlvbk1vZHVsZXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVyYWN0aW9uLW1vZHVsZScpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJyk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2ZhbGxiYWNrLXBhdGgnKTtcblxuICAgICAgICBpZiAobW9kdWxlSWQgJiYgcHJpbWFyeVBhdGgpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzIHVzaW5nIFJlcXVpcmVKUydzIGZhbGxiYWNrIGFycmF5XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICAgID8gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKGZhbGxiYWNrUGF0aCwgYmFzZVVybClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBjb25maWcucGF0aHNbbW9kdWxlSWRdIHx8IFtdO1xuICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKGV4aXN0aW5nUGF0aCwgcGF0aHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKHBhdGgxOiBzdHJpbmcgfCBzdHJpbmdbXSwgcGF0aDI6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGF0aDFBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDEpID8gcGF0aDEgOiBbcGF0aDFdO1xuICAgIGNvbnN0IHBhdGgyQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgyKSA/IHBhdGgyIDogW3BhdGgyXTtcbiAgICByZXR1cm4gcGF0aDFBcnJheS5jb25jYXQocGF0aDJBcnJheSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoU3RyaW5nID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgcmV0dXJuIHBhdGg/LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpIHx8ICFiYXNlUGF0aFxuICAgICAgPyBwYXRoXG4gICAgICA6IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyhgJHtiYXNlUGF0aH0vJHtwYXRofWApO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpXG4gICAgICA/IHBhdGgubWFwKHAgPT4gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwLCBiYXNlUGF0aCkpXG4gICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocGF0aCwgYmFzZVBhdGgpO1xuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+JHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJzogUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUb3VjaERyYWdBbmREcm9wIHtcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0VGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0UG9pbnQgPSBudWxsOyAvLyBQb2ludCBvZiB0aGUgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSBsYXN0Q2xpY2tUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBjbGlja1xuICBwcml2YXRlIGlzRHJhZ2dhYmxlID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnZ2FibGUgZWxlbWVudCBpcyBhY3RpdmVcbiAgcHJpdmF0ZSBkcmFnU291cmNlOiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIFRoZSBzb3VyY2UgZWxlbWVudCBiZWluZyBkcmFnZ2VkXG4gIHByaXZhdGUgZHJhZ0Nsb25lOiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIENsb25lIG9mIGRyYWcgc291cmNlIGZvciB2aXN1YWwgZmVlZGJhY2tcbiAgcHJpdmF0ZSB0b3VjaEVuZFRyaWdnZXJlZCA9IGZhbHNlOyAvLyBGbGFnIGZvciB0b3VjaEVuZCBldmVudFxuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWcgb3BlcmF0aW9uIGlzIG9uZ29pbmdcbiAgcHJpdmF0ZSBpbml0aWFsVHJhbnNmb3JtID0gJyc7IC8vIE9yaWdpbmFsIHRyYW5zZm9ybSBzdHlsZVxuICBwcml2YXRlIGhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTsgLy8gRmxhZyB0byBlbnN1cmUgZHJhZ3N0YXJ0IGV2ZW50IGlzIGRpc3BhdGNoZWQgb25jZVxuICBwcml2YXRlIHJvb3ROb2RlOiBOb2RlID0gbnVsbDsgLy8gUm9vdCBub2RlIGZvciBib3VuZGFyeSBjYWxjdWxhdGlvbnNcblxuICBwcml2YXRlIGZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIFRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGRyYWdnYWJsZSBlbGVtZW50XG4gIHByaXZhdGUgZm9jdXNhYmxlRHJvcFpvbmVzOiBIVE1MRWxlbWVudFtdID0gW107IC8vIEFsbCBkcm9wem9uZXMgZm9yIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBJbmRleCBmb3IgdGFiYmluZyB0aHJvdWdoIGRyb3Agem9uZXNcblxuICBwcml2YXRlIGRhdGFUcmFuc2ZlciA9IHtcbiAgICBkYXRhOiB7fSxcbiAgICBzZXREYXRhKHR5cGUsIHZhbCkge1xuICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgIH0sXG4gICAgZ2V0RGF0YSh0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgIH0sXG4gICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gIH07XG4gIHByaXZhdGUgY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTsgLy8gT2Zmc2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJhZyBjbG9uZVxuXG4gIHByaXZhdGUgbGFzdFRhcmdldCA9IG51bGw7IC8vIExhc3QgdG91Y2ggdGFyZ2V0XG4gIHByaXZhdGUgY3VycmVudERyb3BUYXJnZXQgPSBudWxsOyAvLyBDdXJyZW50IGRyb3BwYWJsZSBlbGVtZW50XG4gIHByaXZhdGUgYWxsb3dDbGljayA9IHRydWU7IC8vIEZsYWcgdG8gYWxsb3cgb3IgcHJldmVudCBjbGlja1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICBjb3B5U3R5bGVzRm9yRHJhZ0Nsb25lID0gdHJ1ZTtcbiAgZHJhZ09uQ2xpY2tFbmFibGVkID0gZmFsc2U7XG4gIHVzZURyYWdDbG9uZSA9IGZhbHNlOyAvLyBTZXQgdG8gdHJ1ZSB0byBkcmFnIHdpdGggYSBjbG9uZTsgc2V0IHRvIGZhbHNlIHRvIGRyYWcgdGhlIG9yaWdpbmFsIGVsZW1lbnRcblxuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9EUkFHX0RJU1RBTkNFID0gNTsgLy8gTWluaW11bSBwaXhlbCBtb3ZlbWVudCB0byBzdGFydCBkcmFnZ2luZ1xuICBwcml2YXRlIHJlYWRvbmx5IERSQUdfQ0xPTkVfT1BBQ0lUWSA9IDE7IC8vIE9wYWNpdHkgb2YgdGhlIGRyYWcgY2xvbmUgZWxlbWVudFxuICBpbml0aWFsVHJhbnNpdGlvbjogc3RyaW5nO1xuICAvLyBkcm9wcGFibGVzOiBFbGVtZW50W107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlO1xuICAgIH1cbiAgICBUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlID0gdGhpcztcblxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMgZm9yIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuaGFuZGxlVG91Y2hDYW5jZWwuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24uYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmhhbmRsZUtleVVwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgYWRkRHJhZ2dhYmxlRWxlbWVudHMoZHJhZ2dhYmxlczogRWxlbWVudFtdKSB7XG4gICAgZHJhZ2dhYmxlcy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpOyAvLyBNYWtlIGRyYWdnYWJsZSBlbGVtZW50cyBmb2N1c2FibGVcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudCkpO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gbnVsbCkpO1xuXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGFkZERyb3BwYWJsZUVsZW1lbnRzKGRyb3BwYWJsZXM6IEVsZW1lbnRbXSkge1xuICAvLyAgIC8vIHRoaXMuZHJvcHBhYmxlcyA9IGRyb3BwYWJsZXM7XG4gIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKGVsID0+IHtcbiAgLy8gICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpOyAvLyBNYWtlIGRyYWdnYWJsZSBlbGVtZW50cyBmb2N1c2FibGVcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudCkpO1xuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gbnVsbCkpO1xuXG4gIC8vICAgICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hTdGFydChlKSB7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSB7IHgsIHkgfTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IHRydWU7XG5cbiAgICAvLyBHZXQgdGhlIHJvb3Qgbm9kZVxuICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Um9vdE5vZGUoKTtcblxuICAgIGlmICh0aGlzLmRyYWdPbkNsaWNrRW5hYmxlZCkge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3JlYXRlRHJhZ0Nsb25lKGUsIHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAvLyBTYXZlIGluaXRpYWwgdHJhbnNmb3JtXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kcmFnU291cmNlKTtcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zZm9ybSA9IGNvbXB1dGVkU3R5bGUudHJhbnNmb3JtID09PSAnbm9uZScgPyAnJyA6IGNvbXB1dGVkU3R5bGUudHJhbnNmb3JtO1xuXG4gICAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gY29tcHV0ZWRTdHlsZS50cmFuc2l0aW9uIHx8ICcnO1xuXG4gICAgICAvLyBEaXNhYmxlIHRyYW5zaXRpb25zXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgLy8gQ2FsY3VsYXRlIGNsb25lIG9mZnNldFxuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueCA9IHggLSByZWN0LmxlZnQ7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB5IC0gcmVjdC50b3A7XG5cbiAgICAgIC8vIFNldCBoaWdoZXIgei1pbmRleCB0byBicmluZyBpdCBvbiB0b3BcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS56SW5kZXggPSAnOTk5OSc7XG4gICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5mb2N1cygpO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hNb3ZlKGUpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnYWJsZSAmJiB0aGlzLmRyYWdTb3VyY2UpIHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgICAgY29uc3QgY3VycmVudFRvdWNoID0geyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH07XG5cbiAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZURyYWdEaXN0YW5jZShjdXJyZW50VG91Y2gpID49IHRoaXMuTUlOX0RSQUdfRElTVEFOQ0UpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAvLyBFeGlzdGluZyBjb2RlIGZvciBjcmVhdGluZyBhbmQgaGFuZGxpbmcgdGhlIGRyYWcgY2xvbmVcbiAgICAgIGlmICghdGhpcy5kcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSB0aGlzLkRSQUdfQ0xPTkVfT1BBQ0lUWS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZSA9IHRoaXMuZHJhZ1NvdXJjZS5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuY29weVN0eWxlc0ZvckRyYWdDbG9uZSkge1xuICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kcmFnU291cmNlKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0eWxlIG9mIGNvbXB1dGVkU3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZVtzdHlsZV0gPSBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIHRoZSBkcmFnIGNsb25lIHRvIHRoZSByb290IG5vZGVcbiAgICAgICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBob3N0IG9mIHRoZSBzaGFkb3cgcm9vdFxuICAgICAgICAgIHRoaXMucm9vdE5vZGUuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICAgICAgdGhpcy5zZXREcmFnQ2xvbmVTdHlsZXMoY3VycmVudFRvdWNoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZURyYWdDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBkcmFnZ2luZyB0aGUgb3JpZ2luYWwgZWxlbWVudCB1c2luZyBDU1MgdHJhbnNmb3Jtc1xuICAgICAgaWYgKHRoaXMudG91Y2hTdGFydFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGRlbHRhWCA9IGN1cnJlbnRUb3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueDtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFRvdWNoLmNsaWVudFkgLSB0aGlzLnRvdWNoU3RhcnRQb2ludC55O1xuXG4gICAgICAgIC8vIEFwcGx5IGJvdW5kYXJpZXNcbiAgICAgICAgLy8gY29uc3QgeyBib3VuZGVkRGVsdGFYLCBib3VuZGVkRGVsdGFZIH0gPSB0aGlzLmFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0aGlzLmluaXRpYWxUcmFuc2Zvcm19IHRyYW5zbGF0ZSgke2JvdW5kZWREZWx0YVh9cHgsICR7Ym91bmRlZERlbHRhWX1weClgO1xuXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0aGlzLmluaXRpYWxUcmFuc2Zvcm19IHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpYDtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCkge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgICAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHJvcFRhcmdldCA9IHRoaXMuZmluZERyb3BUYXJnZXQoZSk7XG5cbiAgICBpZiAoZHJvcFRhcmdldCAhPT0gdGhpcy5sYXN0VGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdlbnRlcicpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMubGFzdFRhcmdldCwgJ2RyYWdsZWF2ZScpO1xuICAgICAgdGhpcy5sYXN0VGFyZ2V0ID0gZHJvcFRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gZHJvcFRhcmdldDtcbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnb3ZlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaEVuZChlKSB7XG4gICAgdGhpcy50b3VjaEVuZFRyaWdnZXJlZCA9IHRydWU7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIGxldCBkcm9wRm91bmQgPSBmYWxzZTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wRm91bmQnLCBkcm9wRm91bmQpO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIGRyb3BGb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGNvbnN0IGRyYWdFbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnZHJhZ2VuZCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgIGRyYWdFbmRFdmVudFsnZGF0YVRyYW5zZmVyJ10gPSB7IGRyb3BFZmZlY3Q6ICdub25lJyB9O1xuICAgICAgdGhpcy5kcmFnU291cmNlPy5kaXNwYXRjaEV2ZW50KGRyYWdFbmRFdmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldERyYWdTdGF0ZShkcm9wRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaENhbmNlbChlKSB7XG4gICAgdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRHJvcFRhcmdldChldmVudCkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50KTtcbiAgICByZXR1cm4gdGhpcy5nZXREcm9wVGFyZ2V0QXRQb2ludChkb2N1bWVudCwgeCwgeSk7XG4gIH1cblxuICBwcml2YXRlIGdldERyb3BUYXJnZXRBdFBvaW50KHJvb3Q6IERvY3VtZW50T3JTaGFkb3dSb290LCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGVwdGg6IG51bWJlciA9IDApOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgLy8gTGltaXQgdGhlIHJlY3Vyc2lvbiBkZXB0aFxuICAgIGNvbnN0IE1BWF9ERVBUSCA9IDI7XG4gICAgaWYgKGRlcHRoID4gTUFYX0RFUFRIKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gcm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIGFuIGFuY2VzdG9yIHdpdGggJ2Ryb3B6b25lJyBhdHRyaWJ1dGVcbiAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBTaGFkb3cgRE9NIGFuZCBkZXB0aCBsaW1pdCBub3QgcmVhY2hlZCwgdHJhdmVyc2UgaXRcbiAgICBpZiAoZWxlbWVudC5zaGFkb3dSb290ICYmIGRlcHRoIDwgTUFYX0RFUFRIKSB7XG4gICAgICBjb25zdCBzaGFkb3dFbGVtZW50ID0gdGhpcy5nZXREcm9wVGFyZ2V0QXRQb2ludChlbGVtZW50LnNoYWRvd1Jvb3QsIHgsIHksIGRlcHRoICsgMSk7XG4gICAgICBpZiAoc2hhZG93RWxlbWVudCkge1xuICAgICAgICByZXR1cm4gc2hhZG93RWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyBlbGVtZW50IHdpdGggJ2Ryb3B6b25lJyBmb3VuZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5mb2N1c2VkRWxlbWVudCkge1xuICAgICAgaWYgKGUua2V5ID09PSAnICcgJiYgIXRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIHRvIHN0YXJ0IGRyYWdnaW5nXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZSA9IHRoaXMuZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG5cbiAgICAgICAgLy8gU3RvcmUgdGhlIGRyb3Agem9uZXMgZm9yIG5hdmlnYXRpb25cbiAgICAgICAgdGhpcy5jb2xsZWN0RHJvcFpvbmVzKCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBkcmFnc3RhcnQgZXZlbnRcbiAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ1RhYicgJiYgdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFRhYiBrZXkgdG8gbmF2aWdhdGUgdGhyb3VnaCBkcm9wIHpvbmVzXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlVG9OZXh0RHJvcFpvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleVVwKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiB0aGlzLmlzRHJhZ2dpbmcgJiYgdGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCBhZ2FpbiB0byBkcm9wIHRoZSBlbGVtZW50XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdERyb3Bab25lcygpIHtcbiAgICAvLyBDb2xsZWN0IGFsbCBlbGVtZW50cyB3aXRoIGRyb3B6b25lIGF0dHJpYnV0ZVxuICAgIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZHJvcHpvbmVdJykpIGFzIEhUTUxFbGVtZW50W107IC8vIEFycmF5LmZyb20odGhpcy5kcm9wcGFibGVzKTtcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIFJlc2V0IG5hdmlnYXRpb24gaW5kZXhcbiAgfVxuXG4gIHByaXZhdGUgbW92ZVRvTmV4dERyb3Bab25lKCkge1xuICAgIGlmICh0aGlzLmZvY3VzYWJsZURyb3Bab25lcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFVwZGF0ZSBpbmRleCBmb3IgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9ICh0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ICsgMSkgJSB0aGlzLmZvY3VzYWJsZURyb3Bab25lcy5sZW5ndGg7XG5cbiAgICAvLyBGb2N1cyB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICBjb25zdCBuZXh0RHJvcFpvbmUgPSB0aGlzLmZvY3VzYWJsZURyb3Bab25lc1t0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4XTtcbiAgICBuZXh0RHJvcFpvbmUuZm9jdXMoKTtcblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IGRyb3AgdGFyZ2V0XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG5leHREcm9wWm9uZTtcblxuICAgIC8vIERpc3BhdGNoIGRyYWdlbnRlciBldmVudFxuICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChuZXh0RHJvcFpvbmUsICdkcmFnZW50ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCwgcGFnZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzID8gZXZlbnQudG91Y2hlc1swXSA6IGV2ZW50O1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwYWdlID8gdG91Y2gucGFnZVggOiB0b3VjaC5jbGllbnRYLFxuICAgICAgeTogcGFnZSA/IHRvdWNoLnBhZ2VZIDogdG91Y2guY2xpZW50WVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgdGhpcy5jbG9uZU9mZnNldC55ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREcmFnQ2xvbmVTdHlsZXModG91Y2gpIHtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7dG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueX1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke3RvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lnh9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUuekluZGV4ID0gJzk5OTk5OSc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkIHx8ICF0aGlzLmRyYWdDbG9uZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZXdMZWZ0ID0gdG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueDtcbiAgICAgIGNvbnN0IG5ld1RvcCA9IHRvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnk7XG5cbiAgICAgIC8vIEFwcGx5IGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9ID0gdGhpcy5hcHBseUJvdW5kYXJpZXMobmV3TGVmdCwgbmV3VG9wLCB0aGlzLmRyYWdDbG9uZSk7XG5cbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHtib3VuZGVkTGVmdH1weGA7XG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHtib3VuZGVkVG9wfXB4YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcikge1xuICAgIC8vIEdldCB0aGUgYm91bmRhcmllcyBvZiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGJvdW5kYXJ5UmVjdDogRE9NUmVjdDtcbiAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IHRoaXMucm9vdE5vZGUuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZpZXdwb3J0XG4gICAgICBib3VuZGFyeVJlY3QgPSBuZXcgRE9NUmVjdCgwLCAwLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbnMgYW5kIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudFJlY3Qud2lkdGg7XG4gICAgY29uc3QgZWxlbWVudEhlaWdodCA9IGVsZW1lbnRSZWN0LmhlaWdodDtcblxuICAgIC8vIENhbGN1bGF0ZSBwb3RlbnRpYWwgbmV3IHBvc2l0aW9uXG4gICAgY29uc3QgbmV3TGVmdCA9IGVsZW1lbnRSZWN0LmxlZnQgKyBkZWx0YVg7XG4gICAgY29uc3QgbmV3VG9wID0gZWxlbWVudFJlY3QudG9wICsgZGVsdGFZO1xuXG4gICAgLy8gTGltaXQgdGhlIG5ldyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBib3VuZGVkIGRlbHRhIHZhbHVlc1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVggPSBib3VuZGVkTGVmdCAtIGVsZW1lbnRSZWN0LmxlZnQ7XG4gICAgY29uc3QgYm91bmRlZERlbHRhWSA9IGJvdW5kZWRUb3AgLSBlbGVtZW50UmVjdC50b3A7XG5cbiAgICByZXR1cm4geyBib3VuZGVkRGVsdGFYLCBib3VuZGVkRGVsdGFZIH07XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0OiBudW1iZXIsIG5ld1RvcDogbnVtYmVyLCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIEdldCB0aGUgYm91bmRhcmllcyBvZiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGJvdW5kYXJ5UmVjdDogRE9NUmVjdDtcbiAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IHRoaXMucm9vdE5vZGUuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZpZXdwb3J0XG4gICAgICBib3VuZGFyeVJlY3QgPSBuZXcgRE9NUmVjdCgwLCAwLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudFJlY3Qud2lkdGg7XG4gICAgY29uc3QgZWxlbWVudEhlaWdodCA9IGVsZW1lbnRSZWN0LmhlaWdodDtcblxuICAgIC8vIExpbWl0IHRoZSBuZXdMZWZ0IGFuZCBuZXdUb3Agd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIHJldHVybiB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKHRvdWNoKTogbnVtYmVyIHtcbiAgICBjb25zdCB4RGlzdCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54KTtcbiAgICBjb25zdCB5RGlzdCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLnRvdWNoU3RhcnRQb2ludC55KTtcbiAgICByZXR1cm4geERpc3QgKyB5RGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hDdXN0b21FdmVudChlbGVtZW50LCBldmVudFR5cGUsIGJ1YmJsZSA9IHRydWUpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudFR5cGUsIHsgYnViYmxlczogYnViYmxlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIGV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHRoaXMuZGF0YVRyYW5zZmVyO1xuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgaWYgKHRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gJzEuMCc7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lPy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgc3R5bGVzXG4gICAgICAgIGlmICghZHJvcEZvdW5kKSB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS56SW5kZXggPSAnJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNpdGlvbiA9IHRoaXMuaW5pdGlhbFRyYW5zaXRpb247XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gcHJvcGVydHlcbiAgICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5kcmFnQ2xvbmUgPSBudWxsO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IG51bGw7XG4gICAgdGhpcy50b3VjaEVuZFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyID0ge1xuICAgICAgZGF0YToge30sXG4gICAgICBzZXREYXRhKHR5cGUsIHZhbCkge1xuICAgICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgICB9LFxuICAgICAgZ2V0RGF0YSh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgICB9LFxuICAgICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gICAgfTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG4gICAgdGhpcy5sYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLmFsbG93Q2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbFRyYW5zZm9ybSA9ICcnO1xuICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5yb290Tm9kZSA9IG51bGw7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgRHJvcHBhYmxlc0ludGVyZmFjZSB7fVxuXG5leHBvcnQgY29uc3QgRHJvcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICB1c2VTaGFkb3dSb290OiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIERyb3BwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuXG4gICAgICBjb25zdCBkcm9wcGFibGVzID0gdGhpcy5nZXREcm9wcGFibGVFbGVtZW50cygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRXZlbnRIYW5kbGVycygpO1xuICAgICAgZHJvcHBhYmxlcy5mb3JFYWNoKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgIHRoaXMucHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgICB0aGlzLm9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTogRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290ID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKSA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdvdmVySGFuZGxlciA9IHRoaXMuZHJhZ292ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIgPSB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2VudGVySGFuZGxlciA9IHRoaXMuZHJhZ2VudGVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcm9wSGFuZGxlciA9IHRoaXMuZHJvcEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5kcmFnbGVhdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCh7IGF0dHJpYnV0ZU5hbWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyb3BwYWJsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBkaXNhYmxlZCA9IGRyb3BwYWJsZS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnZW50ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnb3ZlckhhbmRsZXIoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVEcm9wcGFibGUoZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRyb3BIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGV2LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0Jyk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLmZpbmREcmFnZ2FibGUoaWRlbnRpZmllcik7XG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmlzVmFsaWREcm9wKGRyb3BwYWJsZSwgZHJhZ2dhYmxlKSk7XG5cbiAgICAgIGlmICghZHJhZ2dhYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZHJhZ2dhYmxlICYmICF0aGlzLmlzVmFsaWREcm9wKGRyb3BwYWJsZSwgZHJhZ2dhYmxlKSkge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5tb3ZlRHJhZ2dhYmxlVG9Ecm9wcGFibGUoZHJhZ2dhYmxlLCBkcm9wcGFibGUpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRHJhZ2dhYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2lkZW50aWZpZXJ9XWApIHx8IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2lkZW50aWZpZXJ9XWApXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZERyb3AoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCwgZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGRyYWdnYWJsZS5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICE9PSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtb3ZlRHJhZ2dhYmxlVG9Ecm9wcGFibGUoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG5cbiAgICAgICAgLy8gY2hlY2tNYXhBc3NvY2lhdGlvbnMgYW5kIHNhdmVSZXNwb25zZSBhcmUgZGVmaW5lZC9vdmVycmlkZGVuIGluIGEgbWl4aW5cbiAgICAgICAgdGhpc1snY2hlY2tNYXhBc3NvY2lhdGlvbnMnXSgpO1xuICAgICAgICB0aGlzWydzYXZlUmVzcG9uc2UnXShudWxsKTsgLy9cbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG5cbiAgICAgIC8vIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnbGVhdmVIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERyb3BwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPERyb3BwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiLy8gVEhJUyBJUyBBIE1JWElOLCBUSElTIElTIEEgTUlYSU5cbi8vIFVTRSBMSUtFIFRISVNcbi8vIGBgYGNsYXNzIERyb3BMaXN0IGV4dGVuZHMgRmxpcHBhYmxlcyhMaXRFbGVtZW50KSB7YGBgXG4vLyBtaXhpbiB3aGljaCBhbmltYXRlcyBjaGlsZHJlbiB3aXRoIEZMSVBcbi8vIGEgY29tYmluYXRpb24gYmV0d2VlbiB0aGlzIGRpcmVjdGl2ZTpcbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG4vLyBhbmQgYSB0dXRvcmlhbCBob3cgdG8gbWFrZSBhIG1peGluXG4vLyBodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb3NpdGlvbi9taXhpbnMvXG5cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEZsaXBwYWJsZXNJbnRlcmZhY2Uge1xuICBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xufVxuXG4vLyBqdXN0IGEgY29udmVyc2lvbiBvZiBhIGFuZ3VsYXIgRkxJUCBkaXJlY3RpdmUsIG1hZGUgYXMgYSBNaXhpblxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbmV4cG9ydCBjb25zdCBGbGlwcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyb3BwYWJsZXNTZWw6IHN0cmluZyxcbiAgZHJhZ2dhYmxlc1NlbDogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRmxpcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICAvLyBwcml2YXRlIHN0YXRlID0gbmV3IE1hcDxFbGVtZW50LCBhbnk+KCk7XG4gICAgLy8gcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICAvLyBmbGlwcGFibGVzU2VsZWN0b3I6IHN0cmluZztcbiAgICAvLyBvdmVycmlkZSBhc3luYyBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKSB7XG4gICAgLy8gICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOyAvLyBwazogdGhpcyBpcyB0aGUga2V5IHRvIGNhbGN1bGF0ZSBjb3JyZWN0IHByb3BvcnRpb25zXG4gICAgLy8gICBjb25zdCBkcmFnZ2FibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJhZ2dhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJhZ2dhYmxlcy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuYW5pbWF0ZU1lKTtcbiAgICAvLyAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsKSk7XG4gICAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goKGRyYWdnYWJsZSkgPT4ge1xuICAgIC8vICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJhZ2dhYmxlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgLy8gfVxuICAgIC8vIHByaXZhdGUgYW5pbWF0ZU1lID0gKCkgPT4ge1xuICAgIC8vICAgdGhpcy5zdGF0ZS5mb3JFYWNoKCh2YWx1ZSwgZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgaWYgKHRoaXMuc3RhdGUuZ2V0KGVsZW0pID09IG51bGwpIHtcbiAgICAvLyAgICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBjb25zdCBjYWNoZSA9IHRoaXMuc3RhdGUuZ2V0KGVsZW0pO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVggPSBjYWNoZS5sZWZ0IC0gbGVmdDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFZID0gY2FjaGUudG9wIC0gdG9wO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVcgPSBjYWNoZS53aWR0aCAvIHdpZHRoO1xuICAgIC8vICAgICBjb25zdCBkZWx0YUggPSBjYWNoZS5oZWlnaHQgLyBoZWlnaHQ7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICBjb25zdCB7IGR1cmF0aW9uLCBlYXNpbmcgfSA9IHsgZHVyYXRpb246IDM1MCwgZWFzaW5nOiAnY3ViaWMtYmV6aWVyKDAuMjYsIDAuODYsIDAuNDQsIDAuOTg1KScgfTtcbiAgICAvLyAgICAgZWxlbS5hbmltYXRlKFxuICAgIC8vICAgICAgIFtcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06IGBcbiAgICAvLyB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KVxuICAgIC8vIHNjYWxlKCR7ZGVsdGFXfSwgJHtkZWx0YUh9KVxuICAgIC8vIGAsXG4gICAgLy8gICAgICAgICAgIC8vIHdpZHRoOiBjYWNoZS53aWR0aCxcbiAgICAvLyAgICAgICAgICAgLy8gaGVpZ2h0OiBjYWNoZS5oZWlnaHQrICdweCcsXG4gICAgLy8gICAgICAgICAgIC8vIG9wYWNpdHk6IGNhY2hlLm9wYWNpdHksXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogJ25vbmUnLFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICBdLFxuICAgIC8vICAgICAgIHtcbiAgICAvLyAgICAgICAgIGR1cmF0aW9uLFxuICAgIC8vICAgICAgICAgZWFzaW5nLFxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgKTtcbiAgICAvLyAgIH0pO1xuICAgIC8vIH07XG4gICAgLy8gb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgLy8gICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgLy8gfVxuICB9XG4gIHJldHVybiBGbGlwcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxGbGlwcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IERyb3BwYWJsZXNNaXhpbiB9IGZyb20gJy4vZHJvcHBhYmxlcy1taXhpbic7XG5pbXBvcnQgeyBGbGlwcGFibGVzTWl4aW4gfSBmcm9tICcuL2ZsaXBwYWJsZXMtbWl4aW4nO1xuXG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGxpdmVRdWVyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvbGl2ZS1xdWVyeSc7XG5pbXBvcnQgeyBUb3VjaERyYWdBbmREcm9wIH0gZnJvbSAnLi9kcmFnLWRyb3AtYXBpJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5pbnRlcmZhY2UgSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgY29weVN0eWxlc0RyYWdDbG9uZTogYm9vbGVhbjtcbiAgZHJhZ0NhbkJlUGxhY2VkQmFjazogYm9vbGVhbjtcbiAgZHJhZ09uQ2xpY2s6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyYWdnYWJsZXNTZWxlY3Rvcjogc3RyaW5nLFxuICB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlczogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBleHRlbmRzIEZsaXBwYWJsZXNNaXhpbihcbiAgICBEcm9wcGFibGVzTWl4aW4oc3VwZXJDbGFzcywgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXMsIGRyb3BwYWJsZXNTZWxlY3RvciksXG4gICAgZHJvcHBhYmxlc1NlbGVjdG9yLFxuICAgIGRyYWdnYWJsZXNTZWxlY3RvclxuICApIHtcbiAgICBwcm90ZWN0ZWQgZHJhZ2dhYmxlcyA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIHsgcGFyZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PigpO1xuICAgIHByb3RlY3RlZCBkcm9wcGFibGVzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlLCB0eXBlOiBPYmplY3QgfSkgY29uZmlndXJhdGlvbjogSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uID0ge1xuICAgICAgY29weVN0eWxlc0RyYWdDbG9uZTogdHJ1ZSxcbiAgICAgIGRyYWdDYW5CZVBsYWNlZEJhY2s6IHRydWUsXG4gICAgICBkcmFnT25DbGljazogZmFsc2VcbiAgICB9O1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWluLWFzc29jaWF0aW9ucycgfSkgbWluQXNzb2NpYXRpb25zID0gMTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21heC1hc3NvY2lhdGlvbnMnIH0pIG1heEFzc29jaWF0aW9ucyA9IDE7XG5cbiAgICBAbGl2ZVF1ZXJ5KGRyYWdnYWJsZXNTZWxlY3RvcilcbiAgICBoYW5kbGVEcmFnZ2FibGVzQ2hhbmdlKGRyYWdzQWRkZWQ6IEhUTUxFbGVtZW50W10sIGRyYWdzUmVtb3ZlZDogRWxlbWVudFtdKSB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBjb25zdCBuZXdEcmFnZ2FibGVzID0gdGhpcy5maWx0ZXJFeGlzdGluZ0RyYWdnYWJsZXMoZHJhZ3NBZGRlZCk7XG5cbiAgICAgIGlmIChuZXdEcmFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5hZGROZXdEcmFnZ2FibGVzKG5ld0RyYWdnYWJsZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRHJvcHBhYmxlcygpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJhZ0Ryb3BBcGkoKSB7XG4gICAgICB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50PigncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRjaFRhYnVsYXIoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJFeGlzdGluZ0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IEhUTUxFbGVtZW50W10ge1xuICAgICAgcmV0dXJuIGRyYWdnYWJsZXMuZmlsdGVyKGQgPT4gIXRoaXMuZHJhZ2dhYmxlcy5oYXMoZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTmV3RHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBIVE1MRWxlbWVudFtdKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXMpO1xuICAgICAgZHJhZ2dhYmxlcy5mb3JFYWNoKGRyYWdnYWJsZSA9PiB0aGlzLnN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RvcmVEcmFnZ2FibGUoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgaW5kZXggPSBBcnJheS5mcm9tKGRyYWdnYWJsZS5wYXJlbnROb2RlLmNoaWxkcmVuKS5pbmRleE9mKGRyYWdnYWJsZSk7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuc2V0KGRyYWdnYWJsZSwge1xuICAgICAgICBwYXJlbnQ6IGRyYWdnYWJsZS5wYXJlbnRFbGVtZW50LFxuICAgICAgICBpbmRleFxuICAgICAgfSk7XG4gICAgICBkcmFnZ2FibGUuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lID0gYGRyYWctJHtpbmRleH0tJHt0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8IGNyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICAgIGRyYWdnYWJsZS5zZXRBdHRyaWJ1dGUoJ3F0aS1kcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgZHJhZ2dhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXNcbiAgICAgICAgICA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICAgICA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkcmFnZ2luZycsICcnKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVEcm9wcGFibGVzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ0VuZCA9IGFzeW5jIChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGRyYWdnYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnaW5nJyk7XG4gICAgICBjb25zdCB3YXNEcm9wcGVkID0gYXdhaXQgdGhpcy53YXNEcm9wcGVkKGV2KTtcbiAgICAgIGlmICghd2FzRHJvcHBlZCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmRyYWdDYW5CZVBsYWNlZEJhY2spIHtcbiAgICAgICAgICB0aGlzLnJlc3RvcmVJbml0aWFsRHJhZ2dhYmxlUG9zaXRpb24oZHJhZ2dhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5zZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCAnJykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQucmVtb3ZlQXR0cmlidXRlKCdlbmFibGVkJykpO1xuICAgIH1cblxuICAgIC8vIE1IOiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGlzIGNhbiBiZSB0ZXN0ZWQuXG4gICAgLy8gYmVjYXVzZSBJIGNhbid0IGdldCB0aGUgZHJvcEVmZmVjdCB0byBiZSAnbW92ZScgaW4gdGhlIHRlc3RcbiAgICBwcml2YXRlIGNoZWNrRm9yTW92ZVRlc3RJdGVtID0gKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgIGlmICghZXYuZGF0YVRyYW5zZmVyLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBsZXQgaGFzTW92ZVRlc3RJdGVtID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBkYXRhVHJhbnNmZXIgaXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKGV2LmRhdGFUcmFuc2Zlci5pdGVtcyk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBpdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zLCByZXNvbHZlIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5raW5kID09PSAnc3RyaW5nJyAmJiBpdGVtLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaXRlbS5nZXRBc1N0cmluZyhkYXRhID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEgPT09ICdtb3ZlLXRlc3QnKSB7XG4gICAgICAgICAgICAgICAgaGFzTW92ZVRlc3RJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2UgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgaXRlbXNcbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGhhc01vdmVUZXN0SXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgaXRlbSBpcyBub3QgJ3N0cmluZycsIHN0aWxsIGNvdW50IGRvd24gcGVuZGluZ1xuICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyB3YXNEcm9wcGVkKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IGhhc01vdmVUZXN0SXRlbSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JNb3ZlVGVzdEl0ZW0oZXYpO1xuICAgICAgcmV0dXJuIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ICE9PSAnbm9uZScgfHwgaGFzTW92ZVRlc3RJdGVtO1xuICAgIH1cblxuICAgIHByaXZhdGUgd2FzTW92ZWQoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID09PSAnbW92ZSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHsgcGFyZW50LCBpbmRleCB9ID0gdGhpcy5kcmFnZ2FibGVzLmdldChkcmFnZ2FibGUpO1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IG1vdmVEcmFnZ2FibGUgPSAoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHZpZXcgdHJhbnNpdGlvbnMgaWYgc3VwcG9ydGVkXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgfSk7XG4gICAgICAvLyB0cmFuc2l0aW9uLmZpbmlzaGVkLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gICBkcmFnZ2FibGUuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrTWF4QXNzb2NpYXRpb25zKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goKGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG1heE1hdGNoID0gKyhkLmdldEF0dHJpYnV0ZSgnbWF0Y2gtbWF4JykgfHwgMSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRBc3NvY2lhdGlvbnMgPSBkLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGlzYWJsZURyb3BwYWJsZSA9IGN1cnJlbnRBc3NvY2lhdGlvbnMgPj0gbWF4TWF0Y2g7XG4gICAgICAgIGlmIChkaXNhYmxlRHJvcHBhYmxlKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlRHJvcHBhYmxlKGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRHJvcHBhYmxlKGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2FibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Ryb3B6b25lJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgdmFsdWU/LmZvckVhY2goZW50cnkgPT4gdGhpcy5wbGFjZVJlc3BvbnNlKGVudHJ5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwbGFjZVJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IFtkcm9wSWQsIC4uLmRyYWdJZHNdID0gcmVzcG9uc2Uuc3BsaXQoJyAnKS5yZXZlcnNlKCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSB0aGlzLmZpbmREcm9wcGFibGVCeUlkKGRyb3BJZCk7XG4gICAgICBkcmFnSWRzLmZvckVhY2goZHJhZ0lkID0+IHRoaXMucGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQsIGRyb3BwYWJsZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyb3BwYWJsZUJ5SWQoaWRlbnRpZmllcjogc3RyaW5nKTogRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbmQoZHJvcCA9PiBkcm9wLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkOiBzdHJpbmcsIGRyb3BwYWJsZTogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2lkZW50aWZpZXI9JHtkcmFnSWR9XWApO1xuICAgICAgaWYgKCFkcm9wcGFibGUgfHwgIWRyYWdnYWJsZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgZmluZCBkcmFnZ2FibGUgb3IgZHJvcHBhYmxlIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXI6ICR7ZHJhZ0lkfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB2YWxpZEFzc29jaWF0aW9ucyA9IHRoaXMuZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTtcbiAgICAgIHJldHVybiB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSAwIHx8IHRoaXMubWluQXNzb2NpYXRpb25zIDw9IHZhbGlkQXNzb2NpYXRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmlsdGVyKGQgPT4gZC5jaGlsZEVsZW1lbnRDb3VudCA+IDApLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2F2ZVJlc3BvbnNlKCk6IHZvaWQge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb2xsZWN0UmVzcG9uc2VEYXRhKCk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kcm9wcGFibGVzXG4gICAgICAgIC5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgICAgICBjb25zdCBkcmFnZ2FibGVzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdnYWJsZXNJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICAgICAgY29uc3QgZHJvcHBhYmxlSWRlbnRpZmllciA9IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICByZXR1cm4gaWRlbnRpZmllcnMubWFwKGlkID0+IGAke2lkfSAke2Ryb3BwYWJsZUlkZW50aWZpZXJ9YCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5mbGF0KCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcmVzZXQoc2F2ZSA9IHRydWUpOiB2b2lkIHtcbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICBpZiAoc2F2ZSkgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc2V0RHJvcHBhYmxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVEcmFnZ2FibGUgPSAoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHZpZXcgdHJhbnNpdGlvbnMgaWYgc3VwcG9ydGVkXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxJSW50ZXJhY3Rpb24+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7IC8qIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgc2NhbGluZyBwb3NpdGlvbiAqL1xuICB9XG4gIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBnYXA6IDAuNXJlbTtcbiAgfVxuXG4gIDpob3N0OjpwYXJ0KGFzc29jaWFibGVzLWNvbnRhaW5lcikge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgIDE4MGRlZyxcbiAgICAgIHJnYigwIDAgMCAvIDAlKSBjYWxjKDUwJSAtIDFweCksXG4gICAgICB2YXIoLS1xdGktYm9yZGVyLWNvbG9yLWdyYXkpIGNhbGMoNTAlKSxcbiAgICAgIHJnYigwIDAgMCAvIDAlKSBjYWxjKDUwJSArIDFweClcbiAgICApO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICB0cnVlLFxuICAnLmRsJ1xuKSB7XG4gIEBzdGF0ZSgpIHByaXZhdGUgX2NoaWxkcmVuTWFwOiBFbGVtZW50W10gPSBbXTtcblxuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VIYW5kbGVyOiAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyID0gdGhpcy5fcmVnaXN0ZXJDaG9pY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2UoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgY29uc3QgY2hvaWNlID0gZXZlbnQudGFyZ2V0IGFzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gICAgdGhpcy5fY2hpbGRyZW5NYXAucHVzaChjaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJkcm9wLWNvbnRhaW5lclwiPlxuICAgICAgICAke3RoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgQXJyYXkuZnJvbShBcnJheShNYXRoLmNlaWwodGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoIC8gMikpLmtleXMoKSkubWFwKFxuICAgICAgICAgIChfLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPGRpdiBwYXJ0PVwiYXNzb2NpYWJsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cImxlZnQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fbGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJyaWdodCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9yaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICApfVxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICAvLyBUaGlzIGN1c3RvbS1pbnRlcmFjdGlvbiBzdXBwb3J0IHRoZSBDRVMgQVBJIHdoaWNoIGlzIHVzZSBpbiBGQUNFVFxuICAvL1xuICAvLyBJdCB3b3JrcyBsaWtlIHRoaXM6XG4gIC8vIDEuIFRoZSBDSSBtYW5pZmVzdCBpcyBmZXRjaGVkXG4gIC8vIDIuIEFuIGlmcmFtZSBpcyBjcmVhdGVkIGFuZCB0aGUgZmlyc3Qgc3R5bGUgYW5kIGZpcnN0IHNjcmlwdCBmcm9tIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkXG4gIC8vIDMuIFRoZSBmaXJzdCBzY3JpcHQgaXMgYm9vdHN0cmFwLmpzIHdoaWNoIGFsc28gY3JlYXRlcyBhbiBpZnJhbWUgYW5kIGxvYWRzIHRoZSBmaXJzdCBtZWRpYSBmcm9tIHRoZSBtYW5pZmVzdFxuICAvLyA0LiBDb21tdW5pY2F0aW9uIGlzIGRvbmUgdmlhIHRoZSBDRVMgQVBJIGJ1dCBiZWNhdXNlIHRoZSBpZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cucG9zdE1lc3NhZ2VcblxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgY2hhbmdlIHRoZSBwYWNrYWdlIGJ5IHJlcGxhY2luZyB0aGUgYm9vdHN0cmFwLmpzIHdpdGggb3VyIG93biBhbmQgaW5qZWN0IGEgcHJveHkgQ0VTIEFQSSB0aGF0IGNvbW11bmljYXRlcyB2aWEgcG9zdE1lc3NhZ2VcbiAgLy8gQmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gcnVuIHRoaXMgaW4gc3Rvcnlib29rLCB3ZSBjYW5ub3QgdXNlIHdpbmRvdy50b3AgYmVjYXVzZSB0byBzZW5kIG1lc3NhZ2VzIHRoZXJlLCBiZWNhdXNlIGluIGNhc2Ugb2Ygc3Rvcnlib29rIHRoYXQgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAvLyBTbyB3ZSBzZW5kIG1lc3NhZ2VzIHRvIGFsbCBwYXJlbnQgd2luZG93c1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlID0gdGhpcy5oYW5kbGVQb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhJyB9KVxuICBkYXRhOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtaXRlbScgfSlcbiAgYmFzZUl0ZW1Vcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1yZWYnIH0pXG4gIGJhc2VSZWZVcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2lkJyB9KVxuICBpZDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgbWFuaWZlc3Q6IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdO1xuICAgIHN0eWxlOiBzdHJpbmdbXTtcbiAgICBtZWRpYTogc3RyaW5nW107XG4gIH07XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHVyaVRvTWFuaWZlc3QgPSB0aGlzLmRhdGEuc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICA/IHRoaXMuZGF0YVxuICAgICAgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZUl0ZW1VcmwgKyAnLycgKyB0aGlzLmRhdGEpO1xuICAgIC8vIGZldGNoIHRoZSBqc29uIGZpbGUgbG9jYXRlZCBhdCB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICBmZXRjaCh1cmlUb01hbmlmZXN0KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldHVwQ0VTKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTUg6IENoYW5nZWQgdGhlIGRlZmF1bHQgYm9vdHN0cmFwLmpzIHRvIHVzZSB0aGUgbmV3IENFUyBBUElcbiAgLy8gQmVjYXVzZSB0aGUgb2xkIG9uZSB1c2VzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGFjY2Vzc2VkIHdoZW4gdGhlIENJXG4gIC8vIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZSBhbmQgY29taW5nIGZyb20gYW5vdGhlciBkb21haW5cbiAgLy8gVGhlcmVmb3Igd2UgbmVlZCB0byB1c2UgdGhlIG5ldyBDRVMgQVBJIHRvIGNvbW11bmljYXRlcyB2aWEgdGhlIGJyb2FkY2FzdCBBUElcbiAgc2V0dXBDRVMoKSB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwY2lDb250YWluZXInKSBhcyBIVE1MSUZyYW1lRWxlbWVudCxcbiAgICAgIGlmcmFtZVdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZSxcbiAgICAgIGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAvLyBjb25zdCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ2Nlc19jaGFubmVsJyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBpZnJhbWVEb2Mub3BlbigpO1xuICAgIGlmcmFtZURvYy53cml0ZShgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPGxpbmsgaHJlZj0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnN0eWxlWzBdfWApfScgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4gICAgICAgICAgPHNjcmlwdCBzcmM9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zY3JpcHRbMF19YCl9Jz48L3NjcmlwdD5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keT48L2JvZHk+XG4gICAgICA8L2h0bWw+XG4gICAgICBgKTtcblxuICAgIGlmcmFtZURvYy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJRnJhbWVzKCkge1xuICAgIGNvbnN0IGlmcmFtZXNJblNoYWRvd1Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGNvbnN0IG91dGVySUZyYW1lcyA9IFsuLi5pZnJhbWVzSW5TaGFkb3dSb290LCAuLi5pZnJhbWVdO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIG91dGVySUZyYW1lcykge1xuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dGVyRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICBpZiAob3V0ZXJEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG91dGVyRG9jLCBvdXRlcklGcmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGdldCBvbmx5IHVuaXF1ZSBpZnJhbWVzXG4gICAgb3V0ZXJJRnJhbWVzLmZvckVhY2goKGlmcmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChvdXRlcklGcmFtZXMuaW5kZXhPZihpZnJhbWUpICE9PSBpbmRleCkge1xuICAgICAgICBvdXRlcklGcmFtZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0ZXJJRnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbm5lcklGcmFtZXMoaWZyYW1lRG9jdW1lbnQ6IERvY3VtZW50LCBpZnJhbWVzID0gW10pIHtcbiAgICAvLyBHZXQgYWxsIGlmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICBjb25zdCBjdXJyZW50SWZyYW1lcyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY3VycmVudElmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGlmcmFtZSB0byB0aGUgbGlzdFxuICAgICAgaWZyYW1lcy5wdXNoKGlmcmFtZSk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBpZnJhbWVzIHdpdGhpbiB0aGUgY3VycmVudCBpZnJhbWVcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpZnJhbWUgc3JjIGlzIGZyb20gdGhlIHNhbWUgb3JpZ2luXG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG5cbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG5lc3RlZERvYywgaWZyYW1lcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGNyb3NzLW9yaWdpbiBpZnJhbWU6JywgaWZyYW1lU3JjKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpZnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0VG9XaW5kb3dBbmRJZnJhbWVzKHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgIGNvbnN0IGlmcmFtZXMgPSB0aGlzLmdldElGcmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9zdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dldFJlc3BvbnNlJzoge1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ3Jlc3BvbnNlRGF0YScsIHRoaXMucmF3UmVzcG9uc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dldE1lZGlhJzoge1xuICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbWVkaWEuc3RhcnRzV2l0aCgnaHR0cCcpID8gbWVkaWEgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZVJlZlVybCArICcvJyArIG1lZGlhKTtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdtZWRpYURhdGEnLCBtZWRpYURhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFN0YWdlSGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSB2YWw7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8YnV0dG9uID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9IHBhcnQ9XCJidXR0b25cIiBAY2xpY2s9JHt0aGlzLmVuZEF0dGVtcHR9PiR7dGhpcy50aXRsZX08L2J1dHRvbj5gO1xuICB9XG4gIHB1YmxpYyBlbmRBdHRlbXB0KGU6IEV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdlbmQtYXR0ZW1wdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQ6IHRoaXMuY291bnRBdHRlbXB0ID09PSAndHJ1ZScgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic6IFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktZ2FwLXRleHQnLCBmYWxzZSwgJ3F0aS1nYXAnKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgICAvKiBbcGFydD0nZHJvcHMnXSAsICovXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PjxzbG90IHBhcnQ9XCJkcmFnc1wiIG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+IDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBsZXQgbWF0Y2hlczogeyB0ZXh0OiBzdHJpbmc7IGdhcDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1hdGNoZXMgPSByZXNwb25zZS5tYXAoeCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0geC5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4geyB0ZXh0OiBzcGxpdFswXSwgZ2FwOiBzcGxpdFsxXSB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwcyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWdhcCcpO1xuICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGdhcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgIGNvbnN0IHRleHRJZGVudGlmaWVyID0gbWF0Y2hlcy5maW5kKHggPT4geC5nYXAgPT09IGlkZW50aWZpZXIpPy50ZXh0O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICBpZiAodGV4dElkZW50aWZpZXIgJiYgdGV4dCkge1xuICAgICAgICBpZiAoIWdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIHRleHRTcGFuLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0aW9uJyk7XG4gICAgICAgICAgdGV4dFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q2hpbGRQYXJ0LCBub0NoYW5nZX0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtkaXJlY3RpdmUsIERpcmVjdGl2ZSwgUGFydEluZm8sIFBhcnRUeXBlfSBmcm9tICcuLi9kaXJlY3RpdmUuanMnO1xuaW1wb3J0IHtcbiAgaW5zZXJ0UGFydCxcbiAgZ2V0Q29tbWl0dGVkVmFsdWUsXG4gIHJlbW92ZVBhcnQsXG4gIHNldENvbW1pdHRlZFZhbHVlLFxuICBzZXRDaGlsZFBhcnRWYWx1ZSxcbn0gZnJvbSAnLi4vZGlyZWN0aXZlLWhlbHBlcnMuanMnO1xuXG5leHBvcnQgdHlwZSBLZXlGbjxUPiA9IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgSXRlbVRlbXBsYXRlPFQ+ID0gKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+IHVua25vd247XG5cbi8vIEhlbHBlciBmb3IgZ2VuZXJhdGluZyBhIG1hcCBvZiBhcnJheSBpdGVtIHRvIGl0cyBpbmRleCBvdmVyIGEgc3Vic2V0XG4vLyBvZiBhbiBhcnJheSAodXNlZCB0byBsYXppbHkgZ2VuZXJhdGUgYG5ld0tleVRvSW5kZXhNYXBgIGFuZFxuLy8gYG9sZEtleVRvSW5kZXhNYXBgKVxuY29uc3QgZ2VuZXJhdGVNYXAgPSAobGlzdDogdW5rbm93bltdLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHVua25vd24sIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgbWFwLnNldChsaXN0W2ldLCBpKTtcbiAgfVxuICByZXR1cm4gbWFwO1xufTtcblxuY2xhc3MgUmVwZWF0RGlyZWN0aXZlIGV4dGVuZHMgRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSBfaXRlbUtleXM/OiB1bmtub3duW107XG5cbiAgY29uc3RydWN0b3IocGFydEluZm86IFBhcnRJbmZvKSB7XG4gICAgc3VwZXIocGFydEluZm8pO1xuICAgIGlmIChwYXJ0SW5mby50eXBlICE9PSBQYXJ0VHlwZS5DSElMRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXBlYXQoKSBjYW4gb25seSBiZSB1c2VkIGluIHRleHQgZXhwcmVzc2lvbnMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRWYWx1ZXNBbmRLZXlzPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbk9yVGVtcGxhdGU6IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlPzogSXRlbVRlbXBsYXRlPFQ+XG4gICkge1xuICAgIGxldCBrZXlGbjogS2V5Rm48VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlID0ga2V5Rm5PclRlbXBsYXRlO1xuICAgIH0gZWxzZSBpZiAoa2V5Rm5PclRlbXBsYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleUZuID0ga2V5Rm5PclRlbXBsYXRlIGFzIEtleUZuPFQ+O1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGtleXNbaW5kZXhdID0ga2V5Rm4gPyBrZXlGbihpdGVtLCBpbmRleCkgOiBpbmRleDtcbiAgICAgIHZhbHVlc1tpbmRleF0gPSB0ZW1wbGF0ZSEoaXRlbSwgaW5kZXgpO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGtleXMsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcjxUPihpdGVtczogSXRlcmFibGU8VD4sIHRlbXBsYXRlOiBJdGVtVGVtcGxhdGU8VD4pOiBBcnJheTx1bmtub3duPjtcbiAgcmVuZGVyPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbjogS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgdGVtcGxhdGU6IEl0ZW1UZW1wbGF0ZTxUPlxuICApOiBBcnJheTx1bmtub3duPjtcbiAgcmVuZGVyPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbk9yVGVtcGxhdGU6IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlPzogSXRlbVRlbXBsYXRlPFQ+XG4gICkge1xuICAgIHJldHVybiB0aGlzLl9nZXRWYWx1ZXNBbmRLZXlzKGl0ZW1zLCBrZXlGbk9yVGVtcGxhdGUsIHRlbXBsYXRlKS52YWx1ZXM7XG4gIH1cblxuICBvdmVycmlkZSB1cGRhdGU8VD4oXG4gICAgY29udGFpbmVyUGFydDogQ2hpbGRQYXJ0LFxuICAgIFtpdGVtcywga2V5Rm5PclRlbXBsYXRlLCB0ZW1wbGF0ZV06IFtcbiAgICAgIEl0ZXJhYmxlPFQ+LFxuICAgICAgS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgICBJdGVtVGVtcGxhdGU8VD4sXG4gICAgXVxuICApIHtcbiAgICAvLyBPbGQgcGFydCAmIGtleSBsaXN0cyBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGxhc3QgdXBkYXRlICh3aGljaCBtYXlcbiAgICAvLyBiZSBwcmltZWQgYnkgaHlkcmF0aW9uKVxuICAgIGNvbnN0IG9sZFBhcnRzID0gZ2V0Q29tbWl0dGVkVmFsdWUoXG4gICAgICBjb250YWluZXJQYXJ0XG4gICAgKSBhcyBBcnJheTxDaGlsZFBhcnQgfCBudWxsPjtcbiAgICBjb25zdCB7dmFsdWVzOiBuZXdWYWx1ZXMsIGtleXM6IG5ld0tleXN9ID0gdGhpcy5fZ2V0VmFsdWVzQW5kS2V5cyhcbiAgICAgIGl0ZW1zLFxuICAgICAga2V5Rm5PclRlbXBsYXRlLFxuICAgICAgdGVtcGxhdGVcbiAgICApO1xuXG4gICAgLy8gV2UgY2hlY2sgdGhhdCBvbGRQYXJ0cywgdGhlIGNvbW1pdHRlZCB2YWx1ZSwgaXMgYW4gQXJyYXkgYXMgYW5cbiAgICAvLyBpbmRpY2F0b3IgdGhhdCB0aGUgcHJldmlvdXMgdmFsdWUgY2FtZSBmcm9tIGEgcmVwZWF0KCkgY2FsbC4gSWZcbiAgICAvLyBvbGRQYXJ0cyBpcyBub3QgYW4gQXJyYXkgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgYW5kIHdlIHJldHVyblxuICAgIC8vIGFuIGFycmF5IGZvciBsaXQtaHRtbCdzIGFycmF5IGhhbmRsaW5nIHRvIHJlbmRlciwgYW5kIHJlbWVtYmVyIHRoZVxuICAgIC8vIGtleXMuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFBhcnRzKSkge1xuICAgICAgdGhpcy5faXRlbUtleXMgPSBuZXdLZXlzO1xuICAgICAgcmV0dXJuIG5ld1ZhbHVlcztcbiAgICB9XG5cbiAgICAvLyBJbiBTU1IgaHlkcmF0aW9uIGl0J3MgcG9zc2libGUgZm9yIG9sZFBhcnRzIHRvIGJlIGFuIGFycmF5IGJ1dCBmb3IgdXNcbiAgICAvLyB0byBub3QgaGF2ZSBpdGVtIGtleXMgYmVjYXVzZSB0aGUgdXBkYXRlKCkgaGFzbid0IHJ1biB5ZXQuIFdlIHNldCB0aGVcbiAgICAvLyBrZXlzIHRvIGFuIGVtcHR5IGFycmF5LiBUaGlzIHdpbGwgY2F1c2UgYWxsIG9sZEtleS9uZXdLZXkgY29tcGFyaXNvbnNcbiAgICAvLyB0byBmYWlsIGFuZCBleGVjdXRpb24gdG8gZmFsbCB0byB0aGUgbGFzdCBuZXN0ZWQgYnJhY2ggYmVsb3cgd2hpY2hcbiAgICAvLyByZXVzZXMgdGhlIG9sZFBhcnQuXG4gICAgY29uc3Qgb2xkS2V5cyA9ICh0aGlzLl9pdGVtS2V5cyA/Pz0gW10pO1xuXG4gICAgLy8gTmV3IHBhcnQgbGlzdCB3aWxsIGJlIGJ1aWx0IHVwIGFzIHdlIGdvIChlaXRoZXIgcmV1c2VkIGZyb21cbiAgICAvLyBvbGQgcGFydHMgb3IgY3JlYXRlZCBmb3IgbmV3IGtleXMgaW4gdGhpcyB1cGRhdGUpLiBUaGlzIGlzXG4gICAgLy8gc2F2ZWQgaW4gdGhlIGFib3ZlIGNhY2hlIGF0IHRoZSBlbmQgb2YgdGhlIHVwZGF0ZS5cbiAgICBjb25zdCBuZXdQYXJ0czogQ2hpbGRQYXJ0W10gPSBbXTtcblxuICAgIC8vIE1hcHMgZnJvbSBrZXkgdG8gaW5kZXggZm9yIGN1cnJlbnQgYW5kIHByZXZpb3VzIHVwZGF0ZTsgdGhlc2VcbiAgICAvLyBhcmUgZ2VuZXJhdGVkIGxhemlseSBvbmx5IHdoZW4gbmVlZGVkIGFzIGEgcGVyZm9ybWFuY2VcbiAgICAvLyBvcHRpbWl6YXRpb24sIHNpbmNlIHRoZXkgYXJlIG9ubHkgcmVxdWlyZWQgZm9yIG11bHRpcGxlXG4gICAgLy8gbm9uLWNvbnRpZ3VvdXMgY2hhbmdlcyBpbiB0aGUgbGlzdCwgd2hpY2ggYXJlIGxlc3MgY29tbW9uLlxuICAgIGxldCBuZXdLZXlUb0luZGV4TWFwITogTWFwPHVua25vd24sIG51bWJlcj47XG4gICAgbGV0IG9sZEtleVRvSW5kZXhNYXAhOiBNYXA8dW5rbm93biwgbnVtYmVyPjtcblxuICAgIC8vIEhlYWQgYW5kIHRhaWwgcG9pbnRlcnMgdG8gb2xkIHBhcnRzIGFuZCBuZXcgdmFsdWVzXG4gICAgbGV0IG9sZEhlYWQgPSAwO1xuICAgIGxldCBvbGRUYWlsID0gb2xkUGFydHMubGVuZ3RoIC0gMTtcbiAgICBsZXQgbmV3SGVhZCA9IDA7XG4gICAgbGV0IG5ld1RhaWwgPSBuZXdWYWx1ZXMubGVuZ3RoIC0gMTtcblxuICAgIC8vIE92ZXJ2aWV3IG9mIE8obikgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtIChnZW5lcmFsIGFwcHJvYWNoXG4gICAgLy8gYmFzZWQgb24gaWRlYXMgZm91bmQgaW4gaXZpLCB2dWUsIHNuYWJiZG9tLCBldGMuKTpcbiAgICAvL1xuICAgIC8vICogV2Ugc3RhcnQgd2l0aCB0aGUgbGlzdCBvZiBvbGQgcGFydHMgYW5kIG5ldyB2YWx1ZXMgKGFuZFxuICAgIC8vICAgYXJyYXlzIG9mIHRoZWlyIHJlc3BlY3RpdmUga2V5cyksIGhlYWQvdGFpbCBwb2ludGVycyBpbnRvXG4gICAgLy8gICBlYWNoLCBhbmQgd2UgYnVpbGQgdXAgdGhlIG5ldyBsaXN0IG9mIHBhcnRzIGJ5IHVwZGF0aW5nXG4gICAgLy8gICAoYW5kIHdoZW4gbmVlZGVkLCBtb3ZpbmcpIG9sZCBwYXJ0cyBvciBjcmVhdGluZyBuZXcgb25lcy5cbiAgICAvLyAgIFRoZSBpbml0aWFsIHNjZW5hcmlvIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIChmb3IgYnJldml0eSBvZlxuICAgIC8vICAgdGhlIGRpYWdyYW1zLCB0aGUgbnVtYmVycyBpbiB0aGUgYXJyYXkgcmVmbGVjdCBrZXlzXG4gICAgLy8gICBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBwYXJ0cyBvciBuZXcgdmFsdWVzLCBhbHRob3VnaCBrZXlzXG4gICAgLy8gICBhbmQgcGFydHMvdmFsdWVzIGFyZSBhY3R1YWxseSBzdG9yZWQgaW4gcGFyYWxsZWwgYXJyYXlzXG4gICAgLy8gICBpbmRleGVkIHVzaW5nIHRoZSBzYW1lIGhlYWQvdGFpbCBwb2ludGVycyk6XG4gICAgLy9cbiAgICAvLyAgICAgIG9sZEhlYWQgdiAgICAgICAgICAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIDIsIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWyAsICAsICAsICAsICAsICAsICBdXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdIDwtIHJlZmxlY3RzIHRoZSB1c2VyJ3MgbmV3XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gb3JkZXJcbiAgICAvLyAgICAgIG5ld0hlYWQgXiAgICAgICAgICAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIEl0ZXJhdGUgb2xkICYgbmV3IGxpc3RzIGZyb20gYm90aCBzaWRlcywgdXBkYXRpbmcsXG4gICAgLy8gICBzd2FwcGluZywgb3IgcmVtb3ZpbmcgcGFydHMgYXQgdGhlIGhlYWQvdGFpbCBsb2NhdGlvbnNcbiAgICAvLyAgIHVudGlsIG5laXRoZXIgaGVhZCBub3IgdGFpbCBjYW4gbW92ZS5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzoga2V5cyBhdCBoZWFkIHBvaW50ZXJzIG1hdGNoLCBzbyB1cGRhdGUgb2xkXG4gICAgLy8gICBwYXJ0IDAgaW4tcGxhY2UgKG5vIG5lZWQgdG8gbW92ZSBpdCkgYW5kIHJlY29yZCBwYXJ0IDAgaW5cbiAgICAvLyAgIHRoZSBgbmV3UGFydHNgIGxpc3QuIFRoZSBsYXN0IHRoaW5nIHdlIGRvIGlzIGFkdmFuY2UgdGhlXG4gICAgLy8gICBgb2xkSGVhZGAgYW5kIGBuZXdIZWFkYCBwb2ludGVycyAod2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlXG4gICAgLy8gICBuZXh0IGRpYWdyYW0pLlxuICAgIC8vXG4gICAgLy8gICAgICBvbGRIZWFkIHYgICAgICAgICAgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAyLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAgLCAgLCAgLCAgLCAgLCAgXSA8LSBoZWFkcyBtYXRjaGVkOiB1cGRhdGUgMFxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBib3RoIG9sZEhlYWRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBuZXdIZWFkXG4gICAgLy8gICAgICBuZXdIZWFkIF4gICAgICAgICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBoZWFkIHBvaW50ZXJzIGRvbid0IG1hdGNoLCBidXQgdGFpbFxuICAgIC8vICAgcG9pbnRlcnMgZG8sIHNvIHVwZGF0ZSBwYXJ0IDYgaW4gcGxhY2UgKG5vIG5lZWQgdG8gbW92ZVxuICAgIC8vICAgaXQpLCBhbmQgcmVjb3JkIHBhcnQgNiBpbiB0aGUgYG5ld1BhcnRzYCBsaXN0LiBMYXN0LFxuICAgIC8vICAgYWR2YW5jZSB0aGUgYG9sZFRhaWxgIGFuZCBgb2xkSGVhZGAgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIDIsIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsICAsICAsICAsICAsICAsIDZdIDwtIHRhaWxzIG1hdGNoZWQ6IHVwZGF0ZSA2XG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGFuZCBhZHZhbmNlIGJvdGggb2xkVGFpbFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIG5ld1RhaWxcbiAgICAvLyAgICAgICAgIG5ld0hlYWQgXiAgICAgICAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIElmIG5laXRoZXIgaGVhZCBub3IgdGFpbCBtYXRjaDsgbmV4dCBjaGVjayBpZiBvbmUgb2YgdGhlXG4gICAgLy8gICBvbGQgaGVhZC90YWlsIGl0ZW1zIHdhcyByZW1vdmVkLiBXZSBmaXJzdCBuZWVkIHRvIGdlbmVyYXRlXG4gICAgLy8gICB0aGUgcmV2ZXJzZSBtYXAgb2YgbmV3IGtleXMgdG8gaW5kZXggKGBuZXdLZXlUb0luZGV4TWFwYCksXG4gICAgLy8gICB3aGljaCBpcyBkb25lIG9uY2UgbGF6aWx5IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLFxuICAgIC8vICAgc2luY2Ugd2Ugb25seSBoaXQgdGhpcyBjYXNlIGlmIG11bHRpcGxlIG5vbi1jb250aWd1b3VzXG4gICAgLy8gICBjaGFuZ2VzIHdlcmUgbWFkZS4gTm90ZSB0aGF0IGZvciBjb250aWd1b3VzIHJlbW92YWxcbiAgICAvLyAgIGFueXdoZXJlIGluIHRoZSBsaXN0LCB0aGUgaGVhZCBhbmQgdGFpbHMgd291bGQgYWR2YW5jZVxuICAgIC8vICAgZnJvbSBlaXRoZXIgZW5kIGFuZCBwYXNzIGVhY2ggb3RoZXIgYmVmb3JlIHdlIGdldCB0byB0aGlzXG4gICAgLy8gICBjYXNlIGFuZCByZW1vdmFscyB3b3VsZCBiZSBoYW5kbGVkIGluIHRoZSBmaW5hbCB3aGlsZSBsb29wXG4gICAgLy8gICB3aXRob3V0IG5lZWRpbmcgdG8gZ2VuZXJhdGUgdGhlIG1hcC5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogVGhlIGtleSBhdCBgb2xkVGFpbGAgd2FzIHJlbW92ZWQgKG5vIGxvbmdlclxuICAgIC8vICAgaW4gdGhlIGBuZXdLZXlUb0luZGV4TWFwYCksIHNvIHJlbW92ZSB0aGF0IHBhcnQgZnJvbSB0aGVcbiAgICAvLyAgIERPTSBhbmQgYWR2YW5jZSBqdXN0IHRoZSBgb2xkVGFpbGAgcG9pbnRlci5cbiAgICAvL1xuICAgIC8vICAgICAgICAgb2xkSGVhZCB2ICAgICAgICAgICB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgMiwgMywgNCwgNSwgNl1cbiAgICAvLyAgIG5ld1BhcnRzOiBbMCwgICwgICwgICwgICwgICwgNl0gPC0gNSBub3QgaW4gbmV3IG1hcDogcmVtb3ZlXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIDUgYW5kIGFkdmFuY2Ugb2xkVGFpbFxuICAgIC8vICAgICAgICAgbmV3SGVhZCBeICAgICAgICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogT25jZSBoZWFkIGFuZCB0YWlsIGNhbm5vdCBtb3ZlLCBhbnkgbWlzbWF0Y2hlcyBhcmUgZHVlIHRvXG4gICAgLy8gICBlaXRoZXIgbmV3IG9yIG1vdmVkIGl0ZW1zOyBpZiBhIG5ldyBrZXkgaXMgaW4gdGhlIHByZXZpb3VzXG4gICAgLy8gICBcIm9sZCBrZXkgdG8gb2xkIGluZGV4XCIgbWFwLCBtb3ZlIHRoZSBvbGQgcGFydCB0byB0aGUgbmV3XG4gICAgLy8gICBsb2NhdGlvbiwgb3RoZXJ3aXNlIGNyZWF0ZSBhbmQgaW5zZXJ0IGEgbmV3IHBhcnQuIE5vdGVcbiAgICAvLyAgIHRoYXQgd2hlbiBtb3ZpbmcgYW4gb2xkIHBhcnQgd2UgbnVsbCBpdHMgcG9zaXRpb24gaW4gdGhlXG4gICAgLy8gICBvbGRQYXJ0cyBhcnJheSBpZiBpdCBsaWVzIGJldHdlZW4gdGhlIGhlYWQgYW5kIHRhaWwgc28gd2VcbiAgICAvLyAgIGtub3cgdG8gc2tpcCBpdCB3aGVuIHRoZSBwb2ludGVycyBnZXQgdGhlcmUuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IG5laXRoZXIgaGVhZCBub3IgdGFpbCBtYXRjaCwgYW5kIG5laXRoZXJcbiAgICAvLyAgIHdlcmUgcmVtb3ZlZDsgc28gZmluZCB0aGUgYG5ld0hlYWRgIGtleSBpbiB0aGVcbiAgICAvLyAgIGBvbGRLZXlUb0luZGV4TWFwYCwgYW5kIG1vdmUgdGhhdCBvbGQgcGFydCdzIERPTSBpbnRvIHRoZVxuICAgIC8vICAgbmV4dCBoZWFkIHBvc2l0aW9uIChiZWZvcmUgYG9sZFBhcnRzW29sZEhlYWRdYCkuIExhc3QsXG4gICAgLy8gICBudWxsIHRoZSBwYXJ0IGluIHRoZSBgb2xkUGFydGAgYXJyYXkgc2luY2UgaXQgd2FzXG4gICAgLy8gICBzb21ld2hlcmUgaW4gdGhlIHJlbWFpbmluZyBvbGRQYXJ0cyBzdGlsbCB0byBiZSBzY2FubmVkXG4gICAgLy8gICAoYmV0d2VlbiB0aGUgaGVhZCBhbmQgdGFpbCBwb2ludGVycykgc28gdGhhdCB3ZSBrbm93IHRvXG4gICAgLy8gICBza2lwIHRoYXQgb2xkIHBhcnQgb24gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsICAsICAsICAsICAsIDZdIDwtIHN0dWNrOiB1cGRhdGUgJiBtb3ZlIDJcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl0gICAgaW50byBwbGFjZSBhbmQgYWR2YW5jZVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkXG4gICAgLy8gICAgICAgICBuZXdIZWFkIF4gICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBOb3RlIHRoYXQgZm9yIG1vdmVzL2luc2VydGlvbnMgbGlrZSB0aGUgb25lIGFib3ZlLCBhIHBhcnRcbiAgICAvLyAgIGluc2VydGVkIGF0IHRoZSBoZWFkIHBvaW50ZXIgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZVxuICAgIC8vICAgY3VycmVudCBgb2xkUGFydHNbb2xkSGVhZF1gLCBhbmQgYSBwYXJ0IGluc2VydGVkIGF0IHRoZVxuICAgIC8vICAgdGFpbCBwb2ludGVyIGlzIGluc2VydGVkIGJlZm9yZSBgbmV3UGFydHNbbmV3VGFpbCsxXWAuIFRoZVxuICAgIC8vICAgc2VlbWluZyBhc3ltbWV0cnkgbGllcyBpbiB0aGUgZmFjdCB0aGF0IG5ldyBwYXJ0cyBhcmVcbiAgICAvLyAgIG1vdmVkIGludG8gcGxhY2Ugb3V0c2lkZSBpbiwgc28gdG8gdGhlIHJpZ2h0IG9mIHRoZSBoZWFkXG4gICAgLy8gICBwb2ludGVyIGFyZSBvbGQgcGFydHMsIGFuZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRhaWxcbiAgICAvLyAgIHBvaW50ZXIgYXJlIG5ldyBwYXJ0cy5cbiAgICAvL1xuICAgIC8vICogV2UgYWx3YXlzIHJlc3RhcnQgYmFjayBmcm9tIHRoZSB0b3Agb2YgdGhlIGFsZ29yaXRobSxcbiAgICAvLyAgIGFsbG93aW5nIG1hdGNoaW5nIGFuZCBzaW1wbGUgdXBkYXRlcyBpbiBwbGFjZSB0b1xuICAgIC8vICAgY29udGludWUuLi5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogdGhlIGhlYWQgcG9pbnRlcnMgb25jZSBhZ2FpbiBtYXRjaCwgc29cbiAgICAvLyAgIHNpbXBseSB1cGRhdGUgcGFydCAxIGFuZCByZWNvcmQgaXQgaW4gdGhlIGBuZXdQYXJ0c2BcbiAgICAvLyAgIGFycmF5LiAgTGFzdCwgYWR2YW5jZSBib3RoIGhlYWQgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsICAsICAsICAsIDZdIDwtIGhlYWRzIG1hdGNoZWQ6IHVwZGF0ZSAxXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGFuZCBhZHZhbmNlIGJvdGggb2xkSGVhZFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIG5ld0hlYWRcbiAgICAvLyAgICAgICAgICAgIG5ld0hlYWQgXiAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIEFzIG1lbnRpb25lZCBhYm92ZSwgaXRlbXMgdGhhdCB3ZXJlIG1vdmVkIGFzIGEgcmVzdWx0IG9mXG4gICAgLy8gICBiZWluZyBzdHVjayAodGhlIGZpbmFsIGVsc2UgY2xhdXNlIGluIHRoZSBjb2RlIGJlbG93KSBhcmVcbiAgICAvLyAgIG1hcmtlZCB3aXRoIG51bGwsIHNvIHdlIGFsd2F5cyBhZHZhbmNlIG9sZCBwb2ludGVycyBvdmVyXG4gICAgLy8gICB0aGVzZSBzbyB3ZSdyZSBjb21wYXJpbmcgdGhlIG5leHQgYWN0dWFsIG9sZCB2YWx1ZSBvblxuICAgIC8vICAgZWl0aGVyIGVuZC5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogYG9sZEhlYWRgIGlzIG51bGwgKGFscmVhZHkgcGxhY2VkIGluXG4gICAgLy8gICBuZXdQYXJ0cyksIHNvIGFkdmFuY2UgYG9sZEhlYWRgLlxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICBvbGRIZWFkIHYgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XSA8LSBvbGQgaGVhZCBhbHJlYWR5IHVzZWQ6XG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsICAsICAsICAsIDZdICAgIGFkdmFuY2Ugb2xkSGVhZFxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XVxuICAgIC8vICAgICAgICAgICAgICAgbmV3SGVhZCBeICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogTm90ZSBpdCdzIG5vdCBjcml0aWNhbCB0byBtYXJrIG9sZCBwYXJ0cyBhcyBudWxsIHdoZW4gdGhleVxuICAgIC8vICAgYXJlIG1vdmVkIGZyb20gaGVhZCB0byB0YWlsIG9yIHRhaWwgdG8gaGVhZCwgc2luY2UgdGhleVxuICAgIC8vICAgd2lsbCBiZSBvdXRzaWRlIHRoZSBwb2ludGVyIHJhbmdlIGFuZCBuZXZlciB2aXNpdGVkIGFnYWluLlxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBIZXJlIHRoZSBvbGQgdGFpbCBrZXkgbWF0Y2hlcyB0aGUgbmV3IGhlYWRcbiAgICAvLyAgIGtleSwgc28gdGhlIHBhcnQgYXQgdGhlIGBvbGRUYWlsYCBwb3NpdGlvbiBhbmQgbW92ZSBpdHNcbiAgICAvLyAgIERPTSB0byB0aGUgbmV3IGhlYWQgcG9zaXRpb24gKGJlZm9yZSBgb2xkUGFydHNbb2xkSGVhZF1gKS5cbiAgICAvLyAgIExhc3QsIGFkdmFuY2UgYG9sZFRhaWxgIGFuZCBgbmV3SGVhZGAgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgIG9sZEhlYWQgdiAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsIDQsICAsICAsIDZdIDwtIG9sZCB0YWlsIG1hdGNoZXMgbmV3XG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgaGVhZDogdXBkYXRlICYgbW92ZSA0LFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2Ugb2xkVGFpbCAmIG5ld0hlYWRcbiAgICAvLyAgICAgICAgICAgICAgIG5ld0hlYWQgXiAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IE9sZCBhbmQgbmV3IGhlYWQga2V5cyBtYXRjaCwgc28gdXBkYXRlIHRoZVxuICAgIC8vICAgb2xkIGhlYWQgcGFydCBpbiBwbGFjZSwgYW5kIGFkdmFuY2UgdGhlIGBvbGRIZWFkYCBhbmRcbiAgICAvLyAgIGBuZXdIZWFkYCBwb2ludGVycy5cbiAgICAvL1xuICAgIC8vICAgICAgICAgICAgICAgb2xkSGVhZCB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgLSwgMywgNCwgNSwgNl1cbiAgICAvLyAgIG5ld1BhcnRzOiBbMCwgMiwgMSwgNCwgMywgICAsNl0gPC0gaGVhZHMgbWF0Y2g6IHVwZGF0ZSAzXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGFuZCBhZHZhbmNlIG9sZEhlYWQgJlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkXG4gICAgLy8gICAgICAgICAgICAgICAgICBuZXdIZWFkIF4gIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBPbmNlIHRoZSBuZXcgb3Igb2xkIHBvaW50ZXJzIG1vdmUgcGFzdCBlYWNoIG90aGVyIHRoZW4gYWxsXG4gICAgLy8gICB3ZSBoYXZlIGxlZnQgaXMgYWRkaXRpb25zIChpZiBvbGQgbGlzdCBleGhhdXN0ZWQpIG9yXG4gICAgLy8gICByZW1vdmFscyAoaWYgbmV3IGxpc3QgZXhoYXVzdGVkKS4gVGhvc2UgYXJlIGhhbmRsZWQgaW4gdGhlXG4gICAgLy8gICBmaW5hbCB3aGlsZSBsb29wcyBhdCB0aGUgZW5kLlxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBgb2xkSGVhZGAgZXhjZWVkZWQgYG9sZFRhaWxgLCBzbyB3ZSdyZSBkb25lXG4gICAgLy8gICB3aXRoIHRoZSBtYWluIGxvb3AuICBDcmVhdGUgdGhlIHJlbWFpbmluZyBwYXJ0IGFuZCBpbnNlcnRcbiAgICAvLyAgIGl0IGF0IHRoZSBuZXcgaGVhZCBwb3NpdGlvbiwgYW5kIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAob2xkSGVhZCA+IG9sZFRhaWwpXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsIDQsIDMsIDcgLDZdIDwtIGNyZWF0ZSBhbmQgaW5zZXJ0IDdcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl1cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWQgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGlmL2Vsc2UgY2xhdXNlcyBpcyBub3RcbiAgICAvLyAgIGltcG9ydGFudCB0byB0aGUgYWxnb3JpdGhtLCBhcyBsb25nIGFzIHRoZSBudWxsIGNoZWNrc1xuICAgIC8vICAgY29tZSBmaXJzdCAodG8gZW5zdXJlIHdlJ3JlIGFsd2F5cyB3b3JraW5nIG9uIHZhbGlkIG9sZFxuICAgIC8vICAgcGFydHMpIGFuZCB0aGF0IHRoZSBmaW5hbCBlbHNlIGNsYXVzZSBjb21lcyBsYXN0IChzaW5jZVxuICAgIC8vICAgdGhhdCdzIHdoZXJlIHRoZSBleHBlbnNpdmUgbW92ZXMgb2NjdXIpLiBUaGUgb3JkZXIgb2ZcbiAgICAvLyAgIHJlbWFpbmluZyBjbGF1c2VzIGlzIGp1c3QgYSBzaW1wbGUgZ3Vlc3MgYXQgd2hpY2ggY2FzZXNcbiAgICAvLyAgIHdpbGwgYmUgbW9zdCBjb21tb24uXG4gICAgLy9cbiAgICAvLyAqIE5vdGUsIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGUgbG9uZ2VzdFxuICAgIC8vICAgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSAoTElTKSBvZiBvbGQgaXRlbXMgaW4gbmV3IHBvc2l0aW9uLFxuICAgIC8vICAgYW5kIG9ubHkgbW92ZSB0aG9zZSBub3QgaW4gdGhlIExJUyBzZXQuIEhvd2V2ZXIgdGhhdCBjb3N0c1xuICAgIC8vICAgTyhubG9nbikgdGltZSBhbmQgYWRkcyBhIGJpdCBtb3JlIGNvZGUsIGFuZCBvbmx5IGhlbHBzXG4gICAgLy8gICBtYWtlIHJhcmUgdHlwZXMgb2YgbXV0YXRpb25zIHJlcXVpcmUgZmV3ZXIgbW92ZXMuIFRoZVxuICAgIC8vICAgYWJvdmUgaGFuZGxlcyByZW1vdmVzLCBhZGRzLCByZXZlcnNhbCwgc3dhcHMsIGFuZCBzaW5nbGVcbiAgICAvLyAgIG1vdmVzIG9mIGNvbnRpZ3VvdXMgaXRlbXMgaW4gbGluZWFyIHRpbWUsIGluIHRoZSBtaW5pbXVtXG4gICAgLy8gICBudW1iZXIgb2YgbW92ZXMuIEFzIHRoZSBudW1iZXIgb2YgbXVsdGlwbGUgbW92ZXMgd2hlcmUgTElTXG4gICAgLy8gICBtaWdodCBoZWxwIGFwcHJvYWNoZXMgYSByYW5kb20gc2h1ZmZsZSwgdGhlIExJU1xuICAgIC8vICAgb3B0aW1pemF0aW9uIGJlY29tZXMgbGVzcyBoZWxwZnVsLCBzbyBpdCBzZWVtcyBub3Qgd29ydGhcbiAgICAvLyAgIHRoZSBjb2RlIGF0IHRoaXMgcG9pbnQuIENvdWxkIHJlY29uc2lkZXIgaWYgYSBjb21wZWxsaW5nXG4gICAgLy8gICBjYXNlIGFyaXNlcy5cblxuICAgIHdoaWxlIChvbGRIZWFkIDw9IG9sZFRhaWwgJiYgbmV3SGVhZCA8PSBuZXdUYWlsKSB7XG4gICAgICBpZiAob2xkUGFydHNbb2xkSGVhZF0gPT09IG51bGwpIHtcbiAgICAgICAgLy8gYG51bGxgIG1lYW5zIG9sZCBwYXJ0IGF0IGhlYWQgaGFzIGFscmVhZHkgYmVlbiB1c2VkXG4gICAgICAgIC8vIGJlbG93OyBza2lwXG4gICAgICAgIG9sZEhlYWQrKztcbiAgICAgIH0gZWxzZSBpZiAob2xkUGFydHNbb2xkVGFpbF0gPT09IG51bGwpIHtcbiAgICAgICAgLy8gYG51bGxgIG1lYW5zIG9sZCBwYXJ0IGF0IHRhaWwgaGFzIGFscmVhZHkgYmVlbiB1c2VkXG4gICAgICAgIC8vIGJlbG93OyBza2lwXG4gICAgICAgIG9sZFRhaWwtLTtcbiAgICAgIH0gZWxzZSBpZiAob2xkS2V5c1tvbGRIZWFkXSA9PT0gbmV3S2V5c1tuZXdIZWFkXSkge1xuICAgICAgICAvLyBPbGQgaGVhZCBtYXRjaGVzIG5ldyBoZWFkOyB1cGRhdGUgaW4gcGxhY2VcbiAgICAgICAgbmV3UGFydHNbbmV3SGVhZF0gPSBzZXRDaGlsZFBhcnRWYWx1ZShcbiAgICAgICAgICBvbGRQYXJ0c1tvbGRIZWFkXSEsXG4gICAgICAgICAgbmV3VmFsdWVzW25ld0hlYWRdXG4gICAgICAgICk7XG4gICAgICAgIG9sZEhlYWQrKztcbiAgICAgICAgbmV3SGVhZCsrO1xuICAgICAgfSBlbHNlIGlmIChvbGRLZXlzW29sZFRhaWxdID09PSBuZXdLZXlzW25ld1RhaWxdKSB7XG4gICAgICAgIC8vIE9sZCB0YWlsIG1hdGNoZXMgbmV3IHRhaWw7IHVwZGF0ZSBpbiBwbGFjZVxuICAgICAgICBuZXdQYXJ0c1tuZXdUYWlsXSA9IHNldENoaWxkUGFydFZhbHVlKFxuICAgICAgICAgIG9sZFBhcnRzW29sZFRhaWxdISxcbiAgICAgICAgICBuZXdWYWx1ZXNbbmV3VGFpbF1cbiAgICAgICAgKTtcbiAgICAgICAgb2xkVGFpbC0tO1xuICAgICAgICBuZXdUYWlsLS07XG4gICAgICB9IGVsc2UgaWYgKG9sZEtleXNbb2xkSGVhZF0gPT09IG5ld0tleXNbbmV3VGFpbF0pIHtcbiAgICAgICAgLy8gT2xkIGhlYWQgbWF0Y2hlcyBuZXcgdGFpbDsgdXBkYXRlIGFuZCBtb3ZlIHRvIG5ldyB0YWlsXG4gICAgICAgIG5ld1BhcnRzW25ld1RhaWxdID0gc2V0Q2hpbGRQYXJ0VmFsdWUoXG4gICAgICAgICAgb2xkUGFydHNbb2xkSGVhZF0hLFxuICAgICAgICAgIG5ld1ZhbHVlc1tuZXdUYWlsXVxuICAgICAgICApO1xuICAgICAgICBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG5ld1BhcnRzW25ld1RhaWwgKyAxXSwgb2xkUGFydHNbb2xkSGVhZF0hKTtcbiAgICAgICAgb2xkSGVhZCsrO1xuICAgICAgICBuZXdUYWlsLS07XG4gICAgICB9IGVsc2UgaWYgKG9sZEtleXNbb2xkVGFpbF0gPT09IG5ld0tleXNbbmV3SGVhZF0pIHtcbiAgICAgICAgLy8gT2xkIHRhaWwgbWF0Y2hlcyBuZXcgaGVhZDsgdXBkYXRlIGFuZCBtb3ZlIHRvIG5ldyBoZWFkXG4gICAgICAgIG5ld1BhcnRzW25ld0hlYWRdID0gc2V0Q2hpbGRQYXJ0VmFsdWUoXG4gICAgICAgICAgb2xkUGFydHNbb2xkVGFpbF0hLFxuICAgICAgICAgIG5ld1ZhbHVlc1tuZXdIZWFkXVxuICAgICAgICApO1xuICAgICAgICBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG9sZFBhcnRzW29sZEhlYWRdISwgb2xkUGFydHNbb2xkVGFpbF0hKTtcbiAgICAgICAgb2xkVGFpbC0tO1xuICAgICAgICBuZXdIZWFkKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3S2V5VG9JbmRleE1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTGF6aWx5IGdlbmVyYXRlIGtleS10by1pbmRleCBtYXBzLCB1c2VkIGZvciByZW1vdmFscyAmXG4gICAgICAgICAgLy8gbW92ZXMgYmVsb3dcbiAgICAgICAgICBuZXdLZXlUb0luZGV4TWFwID0gZ2VuZXJhdGVNYXAobmV3S2V5cywgbmV3SGVhZCwgbmV3VGFpbCk7XG4gICAgICAgICAgb2xkS2V5VG9JbmRleE1hcCA9IGdlbmVyYXRlTWFwKG9sZEtleXMsIG9sZEhlYWQsIG9sZFRhaWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmV3S2V5VG9JbmRleE1hcC5oYXMob2xkS2V5c1tvbGRIZWFkXSkpIHtcbiAgICAgICAgICAvLyBPbGQgaGVhZCBpcyBubyBsb25nZXIgaW4gbmV3IGxpc3Q7IHJlbW92ZVxuICAgICAgICAgIHJlbW92ZVBhcnQob2xkUGFydHNbb2xkSGVhZF0hKTtcbiAgICAgICAgICBvbGRIZWFkKys7XG4gICAgICAgIH0gZWxzZSBpZiAoIW5ld0tleVRvSW5kZXhNYXAuaGFzKG9sZEtleXNbb2xkVGFpbF0pKSB7XG4gICAgICAgICAgLy8gT2xkIHRhaWwgaXMgbm8gbG9uZ2VyIGluIG5ldyBsaXN0OyByZW1vdmVcbiAgICAgICAgICByZW1vdmVQYXJ0KG9sZFBhcnRzW29sZFRhaWxdISk7XG4gICAgICAgICAgb2xkVGFpbC0tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFueSBtaXNtYXRjaGVzIGF0IHRoaXMgcG9pbnQgYXJlIGR1ZSB0byBhZGRpdGlvbnMgb3JcbiAgICAgICAgICAvLyBtb3Zlczsgc2VlIGlmIHdlIGhhdmUgYW4gb2xkIHBhcnQgd2UgY2FuIHJldXNlIGFuZCBtb3ZlXG4gICAgICAgICAgLy8gaW50byBwbGFjZVxuICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gb2xkS2V5VG9JbmRleE1hcC5nZXQobmV3S2V5c1tuZXdIZWFkXSk7XG4gICAgICAgICAgY29uc3Qgb2xkUGFydCA9IG9sZEluZGV4ICE9PSB1bmRlZmluZWQgPyBvbGRQYXJ0c1tvbGRJbmRleF0gOiBudWxsO1xuICAgICAgICAgIGlmIChvbGRQYXJ0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBObyBvbGQgcGFydCBmb3IgdGhpcyB2YWx1ZTsgY3JlYXRlIGEgbmV3IG9uZSBhbmRcbiAgICAgICAgICAgIC8vIGluc2VydCBpdFxuICAgICAgICAgICAgY29uc3QgbmV3UGFydCA9IGluc2VydFBhcnQoY29udGFpbmVyUGFydCwgb2xkUGFydHNbb2xkSGVhZF0hKTtcbiAgICAgICAgICAgIHNldENoaWxkUGFydFZhbHVlKG5ld1BhcnQsIG5ld1ZhbHVlc1tuZXdIZWFkXSk7XG4gICAgICAgICAgICBuZXdQYXJ0c1tuZXdIZWFkXSA9IG5ld1BhcnQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJldXNlIG9sZCBwYXJ0XG4gICAgICAgICAgICBuZXdQYXJ0c1tuZXdIZWFkXSA9IHNldENoaWxkUGFydFZhbHVlKG9sZFBhcnQsIG5ld1ZhbHVlc1tuZXdIZWFkXSk7XG4gICAgICAgICAgICBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG9sZFBhcnRzW29sZEhlYWRdISwgb2xkUGFydCk7XG4gICAgICAgICAgICAvLyBUaGlzIG1hcmtzIHRoZSBvbGQgcGFydCBhcyBoYXZpbmcgYmVlbiB1c2VkLCBzbyB0aGF0XG4gICAgICAgICAgICAvLyBpdCB3aWxsIGJlIHNraXBwZWQgaW4gdGhlIGZpcnN0IHR3byBjaGVja3MgYWJvdmVcbiAgICAgICAgICAgIG9sZFBhcnRzW29sZEluZGV4IGFzIG51bWJlcl0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdIZWFkKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQWRkIHBhcnRzIGZvciBhbnkgcmVtYWluaW5nIG5ldyB2YWx1ZXNcbiAgICB3aGlsZSAobmV3SGVhZCA8PSBuZXdUYWlsKSB7XG4gICAgICAvLyBGb3IgYWxsIHJlbWFpbmluZyBhZGRpdGlvbnMsIHdlIGluc2VydCBiZWZvcmUgbGFzdCBuZXdcbiAgICAgIC8vIHRhaWwsIHNpbmNlIG9sZCBwb2ludGVycyBhcmUgbm8gbG9uZ2VyIHZhbGlkXG4gICAgICBjb25zdCBuZXdQYXJ0ID0gaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBuZXdQYXJ0c1tuZXdUYWlsICsgMV0pO1xuICAgICAgc2V0Q2hpbGRQYXJ0VmFsdWUobmV3UGFydCwgbmV3VmFsdWVzW25ld0hlYWRdKTtcbiAgICAgIG5ld1BhcnRzW25ld0hlYWQrK10gPSBuZXdQYXJ0O1xuICAgIH1cbiAgICAvLyBSZW1vdmUgYW55IHJlbWFpbmluZyB1bnVzZWQgb2xkIHBhcnRzXG4gICAgd2hpbGUgKG9sZEhlYWQgPD0gb2xkVGFpbCkge1xuICAgICAgY29uc3Qgb2xkUGFydCA9IG9sZFBhcnRzW29sZEhlYWQrK107XG4gICAgICBpZiAob2xkUGFydCAhPT0gbnVsbCkge1xuICAgICAgICByZW1vdmVQYXJ0KG9sZFBhcnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNhdmUgb3JkZXIgb2YgbmV3IHBhcnRzIGZvciBuZXh0IHJvdW5kXG4gICAgdGhpcy5faXRlbUtleXMgPSBuZXdLZXlzO1xuICAgIC8vIERpcmVjdGx5IHNldCBwYXJ0IHZhbHVlLCBieXBhc3NpbmcgaXQncyBkaXJ0eS1jaGVja2luZ1xuICAgIHNldENvbW1pdHRlZFZhbHVlKGNvbnRhaW5lclBhcnQsIG5ld1BhcnRzKTtcbiAgICByZXR1cm4gbm9DaGFuZ2U7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBlYXREaXJlY3RpdmVGbiB7XG4gIDxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm5PclRlbXBsYXRlOiBLZXlGbjxUPiB8IEl0ZW1UZW1wbGF0ZTxUPixcbiAgICB0ZW1wbGF0ZT86IEl0ZW1UZW1wbGF0ZTxUPlxuICApOiB1bmtub3duO1xuICA8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCB0ZW1wbGF0ZTogSXRlbVRlbXBsYXRlPFQ+KTogdW5rbm93bjtcbiAgPFQ+KFxuICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICBrZXlGbjogS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgdGVtcGxhdGU6IEl0ZW1UZW1wbGF0ZTxUPlxuICApOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgcmVwZWF0cyBhIHNlcmllcyBvZiB2YWx1ZXMgKHVzdWFsbHkgYFRlbXBsYXRlUmVzdWx0c2ApXG4gKiBnZW5lcmF0ZWQgZnJvbSBhbiBpdGVyYWJsZSwgYW5kIHVwZGF0ZXMgdGhvc2UgaXRlbXMgZWZmaWNpZW50bHkgd2hlbiB0aGVcbiAqIGl0ZXJhYmxlIGNoYW5nZXMgYmFzZWQgb24gdXNlci1wcm92aWRlZCBga2V5c2AgYXNzb2NpYXRlZCB3aXRoIGVhY2ggaXRlbS5cbiAqXG4gKiBOb3RlIHRoYXQgaWYgYSBga2V5Rm5gIGlzIHByb3ZpZGVkLCBzdHJpY3Qga2V5LXRvLURPTSBtYXBwaW5nIGlzIG1haW50YWluZWQsXG4gKiBtZWFuaW5nIHByZXZpb3VzIERPTSBmb3IgYSBnaXZlbiBrZXkgaXMgbW92ZWQgaW50byB0aGUgbmV3IHBvc2l0aW9uIGlmXG4gKiBuZWVkZWQsIGFuZCBET00gd2lsbCBuZXZlciBiZSByZXVzZWQgd2l0aCB2YWx1ZXMgZm9yIGRpZmZlcmVudCBrZXlzIChuZXcgRE9NXG4gKiB3aWxsIGFsd2F5cyBiZSBjcmVhdGVkIGZvciBuZXcga2V5cykuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBtb3N0IGVmZmljaWVudFxuICogd2F5IHRvIHVzZSBgcmVwZWF0YCBzaW5jZSBpdCBwZXJmb3JtcyBtaW5pbXVtIHVubmVjZXNzYXJ5IHdvcmsgZm9yIGluc2VydGlvbnNcbiAqIGFuZCByZW1vdmFscy5cbiAqXG4gKiBUaGUgYGtleUZuYCB0YWtlcyB0d28gcGFyYW1ldGVycywgdGhlIGl0ZW0gYW5kIGl0cyBpbmRleCwgYW5kIHJldHVybnMgYSB1bmlxdWUga2V5IHZhbHVlLlxuICpcbiAqIGBgYGpzXG4gKiBodG1sYFxuICogICA8b2w+XG4gKiAgICAgJHtyZXBlYXQodGhpcy5pdGVtcywgKGl0ZW0pID0+IGl0ZW0uaWQsIChpdGVtLCBpbmRleCkgPT4ge1xuICogICAgICAgcmV0dXJuIGh0bWxgPGxpPiR7aW5kZXh9OiAke2l0ZW0ubmFtZX08L2xpPmA7XG4gKiAgICAgfSl9XG4gKiAgIDwvb2w+XG4gKiBgXG4gKiBgYGBcbiAqXG4gKiAqKkltcG9ydGFudCoqOiBJZiBwcm92aWRpbmcgYSBga2V5Rm5gLCBrZXlzICptdXN0KiBiZSB1bmlxdWUgZm9yIGFsbCBpdGVtcyBpbiBhXG4gKiBnaXZlbiBjYWxsIHRvIGByZXBlYXRgLiBUaGUgYmVoYXZpb3Igd2hlbiB0d28gb3IgbW9yZSBpdGVtcyBoYXZlIHRoZSBzYW1lIGtleVxuICogaXMgdW5kZWZpbmVkLlxuICpcbiAqIElmIG5vIGBrZXlGbmAgaXMgcHJvdmlkZWQsIHRoaXMgZGlyZWN0aXZlIHdpbGwgcGVyZm9ybSBzaW1pbGFyIHRvIG1hcHBpbmdcbiAqIGl0ZW1zIHRvIHZhbHVlcywgYW5kIERPTSB3aWxsIGJlIHJldXNlZCBhZ2FpbnN0IHBvdGVudGlhbGx5IGRpZmZlcmVudCBpdGVtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGVhdCA9IGRpcmVjdGl2ZShSZXBlYXREaXJlY3RpdmUpIGFzIFJlcGVhdERpcmVjdGl2ZUZuO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1JlcGVhdERpcmVjdGl2ZX07XG4iLCAiaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvbkhvdHNwb3RzKFxuICBzaGFwZTogc3RyaW5nLFxuICBjb29yZHNOdW1iZXI6IG51bWJlcltdLFxuICBpbWc6IEhUTUxJbWFnZUVsZW1lbnQsXG4gIGhvdHNwb3Q6IFF0aUhvdHNwb3RDaG9pY2Vcbikge1xuICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGNlbnRlclhQZXIgPSAoY2VudGVyWCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGNlbnRlcllQZXIgPSAoY2VudGVyWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByYWRpdXNQZXIgPSAocmFkaXVzIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWFBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZUGVyIC0gcmFkaXVzUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSA0ICogcmFkaXVzUGVyICsgJ3B4JztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgOTk5OXB4YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncmVjdCc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYUGVyIC0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWVBlciAtIHRvcFlQZXIgKyAnJSc7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvbHknOlxuICAgICAge1xuICAgICAgICAvLyBmcm9tIGEsYixjLGQsZSxmID0+IFt7eDphLCB5OmJ9LHt4OmMsIHk6ZH0se3g6ZSwgeTpmfV1cbiAgICAgICAgY29uc3QgcG9seWNvb3JkcyA9IGNvb3Jkc051bWJlci5yZWR1Y2UoKGFjYywgY3VycmVudFZhbHVlLCBjdXJyZW50SW5kZXgsIHBvbHlDKSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RWYWwgPSBhY2MucG9wKCk7XG4gICAgICAgICAgICBhY2NbYWNjLmxlbmd0aF0gPSB7IHg6IGxhc3RWYWwsIHk6IHBvbHlDW2N1cnJlbnRJbmRleF0gfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBib3VuZGluZyBib3ggYnkgZmluZGluZyB0aGUgbWF4IGF4IG1pbiBjb29yZGluYXRlcyBvZiB4IGFuZCB5XG4gICAgICAgIGNvbnN0IGxlZnRYID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCByaWdodFggPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC54KSk7XG4gICAgICAgIGNvbnN0IHRvcFkgPSBNYXRoLm1pbiguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG4gICAgICAgIGNvbnN0IGJvdHRvbVkgPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBjYXVzZSB3ZSB3YW50IHRvIHVzZSBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBsZWZ0WFBlciA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHRvcFlQZXIgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByaWdodFhQZXIgPSAocmlnaHRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgYm90dG9tWVBlciA9IChib3R0b21ZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBob3RzcG90IG9uIHgseSBhbmQgc2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBlcmNlbnRhZ2VzXG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMCArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuXG4gICAgICAgIC8vIGFsbCB0aGUgcG9seWdvbiBwb2ludHMgc2hvdWxkIGJlIGNvcnJlY3RlZCBjYXVzZWQgdGhleSBhcmUgZnJvbVxuICAgICAgICAvLyBpbWFnZSAwLDAgcG9pbnQsIGFuZCBzaG91bGQgYmUgZnJvbSB0aGUgaG90c3BvdCBwb2ludCB3aGljaCBhbHJlYWR5XG4gICAgICAgIC8vIGhhcyBiZWVuIG9mZnNldHRlZCBmcm9tIHRoZSBpbWFnZSBpbiB0aGUgcHJldmlvdXMgZmV3IGxpbmVzIG9mIGNvZGVcbiAgICAgICAgLy8gYWxzbyB0aGUgcG9pbnRzIGhhdmUgYSByZWxhdGl2ZSBkaXN0YW5jZSB0byB0aGUgaW1hZ2UsIGJ1dCBub3cgaGF2ZVxuICAgICAgICAvLyB0byBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgZnJvbSB0aGUgd2lkdGggb2YgdGhlIGhvdHNwb3RcbiAgICAgICAgY29uc3QgcG9seWdvbkRhdGEgPSBwb2x5Y29vcmRzLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgIHg6ICgocG9pbnQueCAtIGxlZnRYKSAvIChyaWdodFggLSBsZWZ0WCkpICogMTAwLFxuICAgICAgICAgIHk6ICgocG9pbnQueSAtIHRvcFkpIC8gKGJvdHRvbVkgLSB0b3BZKSkgKiAxMDBcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjbGlwIHBhdGggY29vcmRpbmF0ZSBzdHlsZSBpbiBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBwb2x5RCA9IHBvbHlnb25EYXRhLm1hcChwID0+IE1hdGgucm91bmQocC54KSArICclICcgKyBNYXRoLnJvdW5kKHAueSkgKyAnJScpLmpvaW4oJywnKTtcblxuICAgICAgICAvLyA1MCUgMCUsIDEwMCUgNTAlLCA1MCUgMTAwJSwgMCUgNTAlXG4gICAgICAgIGhvdHNwb3Quc3R5bGUuY2xpcFBhdGggPSBgcG9seWdvbigke3BvbHlEfSlgO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIHN2ZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBxdWVyeSwgcXVlcnlBc3NpZ25lZEVsZW1lbnRzLCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIGhvdHNwb3RzO1xuICBzdGFydFBvaW50ID0gbnVsbDtcbiAgZW5kUG9pbnQgPSBudWxsO1xuICBAc3RhdGUoKSBfbGluZXMgPSBbXTtcbiAgQHN0YXRlKCkgc3RhcnRDb29yZDogeyB4OiBhbnk7IHk6IGFueSB9O1xuICBAc3RhdGUoKSBtb3VzZUNvb3JkOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIEBxdWVyeSgnc3ZnJykgc3ZnQ29udGFpbmVyO1xuICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2VsZWN0b3I6ICdpbWcnIH0pIGdySW1hZ2U7XG5cbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICAvLyBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKHF0aS1hc3NvY2lhYmxlLWhvdHNwb3QpIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB9XG4gICAgICBsaW5lLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgICBzdmcge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMHB4O1xuICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICB9XG4gICAgYFxuICBdO1xuICBzdmc6IFNWR1NWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpbmVzID0gW107XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzLmxlbmd0aCA+IDA7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB0aGlzLl9saW5lcyA9IHZhbDtcbiAgICB9XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fbGluZXM7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxsaW5lLWNvbnRhaW5lcj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPSR7aWZEZWZpbmVkKHRoaXMuZ3JJbWFnZVswXT8ud2lkdGgpfVxuICAgICAgICAgIGhlaWdodD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LmhlaWdodCl9XG4gICAgICAgICAgdmlld2JveD1cIjAgMCAke3RoaXMuZ3JJbWFnZVswXT8ud2lkdGh9ICR7dGhpcy5nckltYWdlWzBdPy5oZWlnaHR9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgICAgdGhpcy5fbGluZXMsXG4gICAgICAgICAgICBsaW5lID0+IGxpbmUsXG4gICAgICAgICAgICAobGluZSwgaW5kZXgpID0+IHN2Z2BcbiAgICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgICBwYXJ0PVwibGluZVwiXG4gICAgICAgICAgICAgICAgeDE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5MT0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMF0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgeDI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5Mj0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMV0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saW5lcyA9IHRoaXMuX2xpbmVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgKX1cbiAgICAgICAgICAke3RoaXMuc3RhcnRQb2ludCAmJlxuICAgICAgICAgIHN2Z2A8bGluZVxuICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgIHgxPSR7dGhpcy5zdGFydENvb3JkLnh9XG4gICAgICAgICAgICB5MT0ke3RoaXMuc3RhcnRDb29yZC55fVxuICAgICAgICAgICAgeDI9JHt0aGlzLm1vdXNlQ29vcmQueH1cbiAgICAgICAgICAgIHkyPSR7dGhpcy5tb3VzZUNvb3JkLnl9XG4gICAgICAgICAgICBzdHJva2U9XCJyZWRcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgLz5gfVxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9saW5lLWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoZSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChlKTtcblxuICAgIHRoaXMuaG90c3BvdHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMubW91c2VDb29yZCA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LFxuICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gdGhpcy5nckltYWdlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuaG90c3BvdHMuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdICsgJ3B4JztcbiAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMV0gKyAncHgnO1xuXG4gICAgICBob3RzcG90LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRQb2ludCkge1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHRoaXMuc3RhcnRDb29yZCA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMF0sXG4gICAgICAgICAgICB5OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5lbmRQb2ludCkge1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLl9saW5lcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICsgJyAnICsgdGhpcy5lbmRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKVxuICAgICAgICAgIF07XG4gICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5lbmRQb2ludCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgLy8gcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlclkgLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDIgKiByYWRpdXMgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYIC0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWSAtIHRvcFkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgQ2hvaWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBIb3RzcG90Q2hvaWNlID0gQ2hvaWNlICYgeyBvcmRlcjogbnVtYmVyIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5yZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuLy8gaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBDb2x1bW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3cge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzQ2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICBmYWxzZSxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ1xuKSB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIHJvd3M6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgY29sczogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBsYXN0Q2hlY2tlZFJhZGlvOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKCkgX3Jlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtdO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm4gc3VwZXIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgZWxzZSByZXR1cm4gdGhpcy5fcmVzcG9uc2UgYXMgc3RyaW5nW107XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSBzdXBlci52YWx1ZSA9IHZhbDtcbiAgICBlbHNlIHRoaXMuX3Jlc3BvbnNlID0gdmFsO1xuICB9XG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoXG4gICAgLy8gICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0OmZpcnN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyb3BwYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICB0aGlzLnJvd3MgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U+KFxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG4gICAgdGhpcy5jb2xzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG5cbiAgICB0aGlzLnZhbHVlID0gW107XG4gIH1cblxuICBoYW5kbGVSYWRpb0NsaWNrID0gZSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICh0aGlzLmxhc3RDaGVja2VkUmFkaW8gPT09IHJhZGlvKSB7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gcmFkaW87XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVJhZGlvQ2hhbmdlID0gZSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gY2hlY2tib3gudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94Lm5hbWU7XG4gICAgY29uc3QgdHlwZSA9IGNoZWNrYm94LnR5cGU7XG5cbiAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbdmFsdWVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdmFsdWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gWy4uLnRoaXMudmFsdWVdIDogdGhpcy52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChyZXNwb25zZVZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSkge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IHJlc3BvbnNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IGByYiAke2NoZWNrZWQgPyAncmItY2hlY2tlZCcgOiAnJ30gJHt0aGlzLmNvcnJlY3RPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSA/ICdyYi1jb3JyZWN0JyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogcm93Lm1hdGNoTWF4ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICBwYXJ0PSR7cGFydH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3Jvd0lkfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHtkaXNhYmxlfVxuICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7ZSA9PiB0aGlzLmhhbmRsZVJhZGlvQ2hhbmdlKGUpfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHtlID0+IChyb3cubWF0Y2hNYXggPT09IDEgPyB0aGlzLmhhbmRsZVJhZGlvQ2xpY2soZSkgOiBudWxsKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YFxuICAgICAgICApfVxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aU1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtBdHRyaWJ1dGVQYXJ0LCBub0NoYW5nZX0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtcbiAgZGlyZWN0aXZlLFxuICBEaXJlY3RpdmUsXG4gIERpcmVjdGl2ZVBhcmFtZXRlcnMsXG4gIFBhcnRJbmZvLFxuICBQYXJ0VHlwZSxcbn0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcblxuLyoqXG4gKiBBIGtleS12YWx1ZSBzZXQgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIHZhbHVlcy5cbiAqXG4gKiBUaGUga2V5IHNob3VsZCBiZSBlaXRoZXIgYSB2YWxpZCBDU1MgcHJvcGVydHkgbmFtZSBzdHJpbmcsIGxpa2VcbiAqIGAnYmFja2dyb3VuZC1jb2xvcidgLCBvciBhIHZhbGlkIEphdmFTY3JpcHQgY2FtZWwgY2FzZSBwcm9wZXJ0eSBuYW1lXG4gKiBmb3IgQ1NTU3R5bGVEZWNsYXJhdGlvbiBsaWtlIGBiYWNrZ3JvdW5kQ29sb3JgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlSW5mbyB7XG4gIFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xufVxuXG5jb25zdCBpbXBvcnRhbnQgPSAnaW1wb3J0YW50Jztcbi8vIFRoZSBsZWFkaW5nIHNwYWNlIGlzIGltcG9ydGFudFxuY29uc3QgaW1wb3J0YW50RmxhZyA9ICcgIScgKyBpbXBvcnRhbnQ7XG4vLyBIb3cgbWFueSBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIGEgdmFsdWUsIGFzIGEgbmVnYXRpdmUgbnVtYmVyXG5jb25zdCBmbGFnVHJpbSA9IDAgLSBpbXBvcnRhbnRGbGFnLmxlbmd0aDtcblxuY2xhc3MgU3R5bGVNYXBEaXJlY3RpdmUgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICBwcml2YXRlIF9wcmV2aW91c1N0eWxlUHJvcGVydGllcz86IFNldDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKHBhcnRJbmZvOiBQYXJ0SW5mbykge1xuICAgIHN1cGVyKHBhcnRJbmZvKTtcbiAgICBpZiAoXG4gICAgICBwYXJ0SW5mby50eXBlICE9PSBQYXJ0VHlwZS5BVFRSSUJVVEUgfHxcbiAgICAgIHBhcnRJbmZvLm5hbWUgIT09ICdzdHlsZScgfHxcbiAgICAgIChwYXJ0SW5mby5zdHJpbmdzPy5sZW5ndGggYXMgbnVtYmVyKSA+IDJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBgc3R5bGVNYXBgIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQgaW4gdGhlIGBzdHlsZWAgYXR0cmlidXRlICcgK1xuICAgICAgICAgICdhbmQgbXVzdCBiZSB0aGUgb25seSBwYXJ0IGluIHRoZSBhdHRyaWJ1dGUuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoc3R5bGVJbmZvOiBSZWFkb25seTxTdHlsZUluZm8+KSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0eWxlSW5mbykucmVkdWNlKChzdHlsZSwgcHJvcCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBzdHlsZUluZm9bcHJvcF07XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IHByb3BlcnR5IG5hbWVzIGZyb20gY2FtZWwtY2FzZSB0byBkYXNoLWNhc2UsIGkuZS46XG4gICAgICAvLyAgYGJhY2tncm91bmRDb2xvcmAgLT4gYGJhY2tncm91bmQtY29sb3JgXG4gICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgbmFtZXMgbmVlZCBhbiBleHRyYSBgLWAgYXBwZW5kZWQgdG8gZnJvbnQ6XG4gICAgICAvLyAgYHdlYmtpdEFwcGVhcmFuY2VgIC0+IGAtd2Via2l0LWFwcGVhcmFuY2VgXG4gICAgICAvLyBFeGNlcHRpb24gaXMgYW55IHByb3BlcnR5IG5hbWUgY29udGFpbmluZyBhIGRhc2gsIGluY2x1ZGluZ1xuICAgICAgLy8gY3VzdG9tIHByb3BlcnRpZXM7IHdlIGFzc3VtZSB0aGVzZSBhcmUgYWxyZWFkeSBkYXNoLWNhc2VkIGkuZS46XG4gICAgICAvLyAgYC0tbXktYnV0dG9uLWNvbG9yYCAtLT4gYC0tbXktYnV0dG9uLWNvbG9yYFxuICAgICAgcHJvcCA9IHByb3AuaW5jbHVkZXMoJy0nKVxuICAgICAgICA/IHByb3BcbiAgICAgICAgOiBwcm9wXG4gICAgICAgICAgICAucmVwbGFjZSgvKD86Xih3ZWJraXR8bW96fG1zfG8pfCkoPz1bQS1aXSkvZywgJy0kJicpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBzdHlsZSArIGAke3Byb3B9OiR7dmFsdWV9O2A7XG4gICAgfSwgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlKHBhcnQ6IEF0dHJpYnV0ZVBhcnQsIFtzdHlsZUluZm9dOiBEaXJlY3RpdmVQYXJhbWV0ZXJzPHRoaXM+KSB7XG4gICAgY29uc3Qge3N0eWxlfSA9IHBhcnQuZWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc3R5bGVJbmZvKSk7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXIoc3R5bGVJbmZvKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgb2xkIHByb3BlcnRpZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4gc3R5bGVJbmZvXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMuX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBJZiB0aGUgbmFtZSBpc24ndCBpbiBzdHlsZUluZm8gb3IgaXQncyBudWxsL3VuZGVmaW5lZFxuICAgICAgaWYgKHN0eWxlSW5mb1tuYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzIS5kZWxldGUobmFtZSk7XG4gICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIChzdHlsZSBhcyBhbnkpW25hbWVdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBvciB1cGRhdGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZUluZm8pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3R5bGVJbmZvW25hbWVdO1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZVByb3BlcnRpZXMuYWRkKG5hbWUpO1xuICAgICAgICBjb25zdCBpc0ltcG9ydGFudCA9XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aChpbXBvcnRhbnRGbGFnKTtcbiAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoJy0nKSB8fCBpc0ltcG9ydGFudCkge1xuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlzSW1wb3J0YW50XG4gICAgICAgICAgICAgID8gKHZhbHVlIGFzIHN0cmluZykuc2xpY2UoMCwgZmxhZ1RyaW0pXG4gICAgICAgICAgICAgIDogKHZhbHVlIGFzIHN0cmluZyksXG4gICAgICAgICAgICBpc0ltcG9ydGFudCA/IGltcG9ydGFudCA6ICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIChzdHlsZSBhcyBhbnkpW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgdGhhdCBhcHBsaWVzIENTUyBwcm9wZXJ0aWVzIHRvIGFuIGVsZW1lbnQuXG4gKlxuICogYHN0eWxlTWFwYCBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBgc3R5bGVgIGF0dHJpYnV0ZSBhbmQgbXVzdCBiZSB0aGUgb25seVxuICogZXhwcmVzc2lvbiBpbiB0aGUgYXR0cmlidXRlLiBJdCB0YWtlcyB0aGUgcHJvcGVydHkgbmFtZXMgaW4gdGhlXG4gKiB7QGxpbmsgU3R5bGVJbmZvIHN0eWxlSW5mb30gb2JqZWN0IGFuZCBhZGRzIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBpbmxpbmVcbiAqIHN0eWxlIG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIFByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIChgLWApIGFyZSBhc3N1bWVkIHRvIGJlIHZhbGlkIENTU1xuICogcHJvcGVydHkgbmFtZXMgYW5kIHNldCBvbiB0aGUgZWxlbWVudCdzIHN0eWxlIG9iamVjdCB1c2luZyBgc2V0UHJvcGVydHkoKWAuXG4gKiBOYW1lcyB3aXRob3V0IGRhc2hlcyBhcmUgYXNzdW1lZCB0byBiZSBjYW1lbENhc2VkIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZXNcbiAqIGFuZCBzZXQgb24gdGhlIGVsZW1lbnQncyBzdHlsZSBvYmplY3QgdXNpbmcgcHJvcGVydHkgYXNzaWdubWVudCwgYWxsb3dpbmcgdGhlXG4gKiBzdHlsZSBvYmplY3QgdG8gdHJhbnNsYXRlIEphdmFTY3JpcHQtc3R5bGUgbmFtZXMgdG8gQ1NTIHByb3BlcnR5IG5hbWVzLlxuICpcbiAqIEZvciBleGFtcGxlIGBzdHlsZU1hcCh7YmFja2dyb3VuZENvbG9yOiAncmVkJywgJ2JvcmRlci10b3AnOiAnNXB4JywgJy0tc2l6ZSc6XG4gKiAnMCd9KWAgc2V0cyB0aGUgYGJhY2tncm91bmQtY29sb3JgLCBgYm9yZGVyLXRvcGAgYW5kIGAtLXNpemVgIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHN0eWxlSW5mb1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2RpcmVjdGl2ZXMvI3N0eWxlbWFwIHN0eWxlTWFwIGNvZGUgc2FtcGxlcyBvbiBMaXQuZGV2fVxuICovXG5leHBvcnQgY29uc3Qgc3R5bGVNYXAgPSBkaXJlY3RpdmUoU3R5bGVNYXBEaXJlY3RpdmUpO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1N0eWxlTWFwRGlyZWN0aXZlfTtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktY29tcG9uZW50cyc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpSXRlbUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gIGhyZWY/OiBzdHJpbmc7XG4gIHhtbERvYzogRG9jdW1lbnRGcmFnbWVudDtcbiAgYXNzZXNzbWVudEl0ZW06IFF0aUFzc2Vzc21lbnRJdGVtIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFF0aUl0ZW1NaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KEJhc2U6IFQpIHtcbiAgY2xhc3MgUXRpSXRlbUNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWY/OiBzdHJpbmc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgICB4bWxEb2MhOiBEb2N1bWVudEZyYWdtZW50OyAvLyB0aGUgWE1MRG9jdW1lbnRcblxuICAgIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJSb290KCk6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW0gfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclJvb3Q/LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pdGVtLWNvbm5lY3RlZCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsIGhyZWY6IHRoaXMuaHJlZiB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBodG1sYCR7dGhpcy54bWxEb2N9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFF0aUl0ZW1DbGFzcyBhcyBDb25zdHJ1Y3RvcjxRdGlJdGVtSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpSXRlbU1peGluIH0gZnJvbSAnLi9xdGktaXRlbS5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpSXRlbSBleHRlbmRzIFF0aUl0ZW1NaXhpbihMaXRFbGVtZW50KSB7fVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbSc6IFF0aUl0ZW07XG4gIH1cbn0iLCAiaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1JdGVtLCBxdGlUcmFuc2Zvcm1UZXN0IH0gZnJvbSAnLi4vcXRpLXRyYW5zZm9ybWVycyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1NYW5pZmVzdCB9IGZyb20gJy4uL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdCc7XG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0SW5mbyA9IHtcbiAgdGVzdElkZW50aWZpZXI6IHN0cmluZztcbiAgdGVzdEhUTUxEb2M6IERvY3VtZW50RnJhZ21lbnQ7XG4gIHRlc3RVUkk6IHN0cmluZztcbiAgdGVzdFVSTDogc3RyaW5nO1xuICBpdGVtczoge1xuICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICBocmVmOiBzdHJpbmc7XG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgfVtdO1xufTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBlbnN1cmUgcGFja2FnZSBVUklzIGVuZCB3aXRoIGEgJy8nXG4vLyBjb25zdCBub3JtYWxpemVVcmkgPSAodXJpOiBzdHJpbmcpID0+ICh1cmkuZW5kc1dpdGgoJy8nKSA/IHVyaSA6IGAke3VyaX0vYCk7XG5cbi8vIEZldGNoZXMgYXNzZXNzbWVudCBkYXRhIGZyb20gdGhlIG1hbmlmZXN0XG5leHBvcnQgY29uc3QgZ2V0TWFuaWZlc3RJbmZvID0gYXN5bmMgKG1hbmlmZXN0VVJMOiBzdHJpbmcpOiBQcm9taXNlPE1hbmlmZXN0SW5mbz4gPT4ge1xuICBjb25zdCBiYXNlVVJJID0gbWFuaWZlc3RVUkwuc3Vic3RyaW5nKDAsIG1hbmlmZXN0VVJMLmxhc3RJbmRleE9mKCcvJykpO1xuXG4gIGNvbnN0IHRlc3QgPSBhd2FpdCBxdGlUcmFuc2Zvcm1NYW5pZmVzdCgpXG4gICAgLmxvYWQoYCR7bWFuaWZlc3RVUkx9YClcbiAgICAudGhlbihhcGkgPT4gYXBpLmFzc2Vzc21lbnRUZXN0KCkpO1xuXG4gIGNvbnN0IHRlc3RIVE1MRG9jID0gYXdhaXQgcXRpVHJhbnNmb3JtVGVzdCgpXG4gICAgLmxvYWQoYCR7YmFzZVVSSX0vJHt0ZXN0LmhyZWZ9YClcbiAgICAudGhlbihhcGkgPT4gYXBpLmh0bWxEb2MoKSk7XG5cbiAgY29uc3QgaXRlbXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1UZXN0KClcbiAgICAubG9hZChgJHtiYXNlVVJJfS8ke3Rlc3QuaHJlZn1gKVxuICAgIC50aGVuKGFwaSA9PiBhcGkuaXRlbXMoKSk7XG5cbiAgY29uc3QgdGVzdFVSTCA9IGAke2Jhc2VVUkl9LyR7dGVzdC5ocmVmfWA7XG4gIGNvbnN0IHRlc3RVUkkgPSBgJHtiYXNlVVJJfS8ke3Rlc3QuaHJlZi5zdWJzdHJpbmcoMCwgdGVzdC5ocmVmLmxhc3RJbmRleE9mKCcvJykpfWA7XG5cbiAgcmV0dXJuIHtcbiAgICB0ZXN0SFRNTERvYyxcbiAgICB0ZXN0VVJJLFxuICAgIHRlc3RVUkwsXG4gICAgaXRlbXMsXG4gICAgdGVzdElkZW50aWZpZXI6IHRlc3QuaWRlbnRpZmllclxuICB9O1xufTtcblxuLy8gRmV0Y2hlcyBhIHNpbmdsZSBpdGVtIGJ5IFVSSVxuZXhwb3J0IGNvbnN0IGdldEl0ZW1CeVVyaSA9IGFzeW5jIChpdGVtVXJpOiBzdHJpbmcpOiBQcm9taXNlPFF0aUFzc2Vzc21lbnRJdGVtPiA9PlxuICBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAubG9hZChpdGVtVXJpKVxuICAgIC50aGVuKGFwaSA9PiBhcGkuaHRtbERvYygpLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUFzc2Vzc21lbnRJdGVtKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlETSxJQUFPQSxJQUFQLGNBQ0lDLE1BQUFBO0VBYVIsWUFDRUMsSUFDQUMsSUFDQUMsS0FBQUE7QUFFQUMsVUFBTSxtQkFBbUIsRUFBQ0MsU0FBQUEsTUFBZUMsVUFBQUEsS0FBVSxDQUFBLEdBQ25EQyxLQUFLTixVQUFVQSxJQUNmTSxLQUFLTCxXQUFXQSxJQUNoQkssS0FBS0osWUFBWUEsT0FBQUEsT0FBQUEsTUFBQUE7RUFDbEI7QUFBQTs7O0FDbkJHLFNBQVVLLEVBQXNDQyxJQUFBQTtBQUNwRCxTQUFPQTtBQUNUOzs7SUNyQmFDLFdBQUFBO0VBc0JYLFlBQ0VDLElBQ0FDLElBQ0FDLElBQ0FDLElBQUFBOztBQUtBLFFBdkJNQyxLQUFTRCxZQUFBQSxPQUVUQyxLQUFRQyxXQUFBQSxPQUVoQkQsS0FBS0UsUUFBQUEsUUFxREdGLEtBQUFHLElBQTZDLENBQUNELElBQU9FLE9BQUFBO0FBRXZESixXQUFLSSxnQkFFSEosS0FBS0ksZ0JBQWdCQSxPQUV2QkosS0FBS0MsV0FBQUEsT0FDTEQsS0FBS0ksWUFBQUEsSUFHRkosS0FBS0QsYUFDUkMsS0FBS0ksWUFBQUEsSUFLVEosS0FBS0UsUUFBUUEsSUFFYkYsS0FBS0osS0FBS1MsY0FBQUEsR0FJTEwsS0FB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QUssR0FBRyxXQUFXLEVBQUUsRUFDckIsS0FBSyxTQUFPLElBQUksZUFBZSxDQUFDO0FBRW5DLFFBQU0sY0FBYyxNQUFNLGlCQUFpQixFQUN4QyxLQUFLLEdBQUcsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFLEVBQzlCLEtBQUssU0FBTyxJQUFJLFFBQVEsQ0FBQztBQUU1QixRQUFNLFFBQVEsTUFBTSxpQkFBaUIsRUFDbEMsS0FBSyxHQUFHLE9BQU8sSUFBSSxLQUFLLElBQUksRUFBRSxFQUM5QixLQUFLLFNBQU8sSUFBSSxNQUFNLENBQUM7QUFFMUIsUUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssSUFBSTtBQUN2QyxRQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksS0FBSyxLQUFLLFVBQVUsR0FBRyxLQUFLLEtBQUssWUFBWSxHQUFHLENBQUMsQ0FBQztBQUVoRixTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsZ0JBQWdCLEtBQUs7QUFBQSxFQUN2QjtBQUNGO0FBR08sSUFBTSxlQUFlLE9BQU8sWUFDakMsaUJBQWlCLEVBQ2QsS0FBSyxPQUFPLEVBQ1osS0FBSyxTQUFPLElBQUksUUFBUSxFQUFFLGlCQUFzQzsiLAogICJuYW1lcyI6IFsiQ29udGV4dFJlcXVlc3RFdmVudCIsICJFdmVudCIsICJjb250ZXh0IiwgImNhbGxiYWNrIiwgInN1YnNjcmliZSIsICJzdXBlciIsICJidWJibGVzIiwgImNvbXBvc2VkIiwgInRoaXMiLCAiY3JlYXRlQ29udGV4dCIsICJrZXkiLCAiQ29udGV4dENvbnN1bWVyIiwgImhvc3QiLCAiY29udGV4dE9yT3B0aW9ucyIsICJjYWxsYmFjayIsICJzdWJzY3JpYmUiLCAidGhpcyIsICJwcm92aWRlZCIsICJ2YWx1ZSIsICJfY2FsbGJhY2siLCAidW5zdWJzY3JpYmUiLCAicmVxdWVzdFVwZGF0ZSIsICJjb250ZXh0IiwgIm9wdGlvbnMiLCAiYWRkQ29udHJvbGxlciIsICJob3N0Q29ubmVjdGVkIiwgImRpc3BhdGNoUmVxdWVzdCIsICJob3N0RGlzY29ubmVjdGVkIiwgImRpc3BhdGNoRXZlbnQiLCAiQ29udGV4dFJlcXVlc3RFdmVudCIsICJWYWx1ZU5vdGlmaWVyIiwgInZhbHVlIiwgInRoaXMiLCAiX3ZhbHVlIiwgInYiLCAic2V0VmFsdWUiLCAiZm9yY2UiLCAidXBkYXRlIiwgIk9iamVjdCIsICJpcyIsICJ1cGRhdGVPYnNlcnZlcnMiLCAiZGVmYXVsdFZhbHVlIiwgInN1YnNjcmlwdGlvbnMiLCAiTWFwIiwgImNhbGxiYWNrIiwgImRpc3Bvc2VyIiwgImNvbnN1bWVySG9zdCIsICJzdWJzY3JpYmUiLCAiaGFzIiwgInNldCIsICJkZWxldGUiLCAiZ2V0IiwgImNsZWFyQ2FsbGJhY2tzIiwgImNsZWFyIiwgIkNvbnRleHRQcm92aWRlckV2ZW50IiwgIkV2ZW50IiwgImNvbnRleHQiLCAic3VwZXIiLCAiYnViYmxlcyIsICJjb21wb3NlZCIsICJ0aGlzIiwgIkNvbnRleHRQcm92aWRlciIsICJWYWx1ZU5vdGlmaWVyIiwgImhvc3QiLCAiY29udGV4dE9yT3B0aW9ucyIsICJpbml0aWFsVmFsdWUiLCAib25Db250ZXh0UmVxdWVzdCIsICJldiIsICJjb25zdW1lckhvc3QiLCAiY29tcG9zZWRQYXRoIiwgInN0b3BQcm9wYWdhdGlvbiIsICJhZGRDYWxsYmFjayIsICJjYWxsYmFjayIsICJzdWJzY3JpYmUiLCAib25Qcm92aWRlclJlcXVlc3QiLCAiY2hpbGRQcm92aWRlckhvc3QiLCAic2VlbiIsICJTZXQiLCAic3Vic2NyaXB0aW9ucyIsICJoYXMiLCAiYWRkIiwgImRpc3BhdGNoRXZlbnQiLCAiQ29udGV4dFJlcXVlc3RFdmVudCIsICJhdHRhY2hMaXN0ZW5lcnMiLCAiYWRkQ29udHJvbGxlciIsICJhZGRFdmVudExpc3RlbmVyIiwgImhvc3RDb25uZWN0ZWQiLCAicHJvdmlkZSIsICJjb250ZXh0IiwgInByb3RvT3JUYXJnZXQiLCAibmFtZU9yQ29udGV4dCIsICJjb250cm9sbGVyTWFwIiwgIldlYWtNYXAiLCAiYWRkSW5pdGlhbGl6ZXIiLCAic2V0IiwgInRoaXMiLCAiQ29udGV4dFByb3ZpZGVyIiwgImdldCIsICJjYWxsIiwgInZhbHVlIiwgInNldFZhbHVlIiwgImNvbnN0cnVjdG9yIiwgImVsZW1lbnQiLCAiZGVzY3JpcHRvciIsICJPYmplY3QiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgIm5ld0Rlc2NyaXB0b3IiLCAidmFsdWVNYXAiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAib2xkU2V0dGVyIiwgImRlZmluZVByb3BlcnR5IiwgImNvbnN1bWUiLCAiY29udGV4dCIsICJzdWJzY3JpYmUiLCAicHJvdG9PclRhcmdldCIsICJuYW1lT3JDb250ZXh0IiwgImFkZEluaXRpYWxpemVyIiwgIkNvbnRleHRDb25zdW1lciIsICJ0aGlzIiwgImNhbGxiYWNrIiwgInZhbHVlIiwgInNldCIsICJjYWxsIiwgImNvbnN0cnVjdG9yIiwgImVsZW1lbnQiLCAiX2EiLCAiX2EiLCAiY3VzdG9tRWxlbWVudHMiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAic3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIiwgIlNoYWRvd1Jvb3QiLCAiU2hhZHlDU1MiLCAibmF0aXZlU2hhZG93IiwgIkRvY3VtZW50IiwgInByb3RvdHlwZSIsICJDU1NTdHlsZVNoZWV0IiwgImNvbnN0cnVjdGlvblRva2VuIiwgIlN5bWJvbCIsICJjc3NUYWdDYWNoZSIsICJXZWFrTWFwIiwgIkNTU1Jlc3VsdCIsICJjc3NUZXh0IiwgInN0cmluZ3MiLCAic2FmZVRva2VuIiwgInRoaXMiLCAiRXJyb3IiLCAiX3N0cmluZ3MiLCAic3R5bGVTaGVldCIsICJfc3R5bGVTaGVldCIsICJjYWNoZWFibGUiLCAibGVuZ3RoIiwgImdldCIsICJyZXBsYWNlU3luYyIsICJzZXQiLCAidG9TdHJpbmciLCAidW5zYWZlQ1NTIiwgInZhbHVlIiwgIlN0cmluZyIsICJjc3MiLCAidmFsdWVzIiwgInJlZHVjZSIsICJhY2MiLCAidiIsICJpZHgiLCAiYWRvcHRTdHlsZXMiLCAicmVuZGVyUm9vdCIsICJzdHlsZXMiLCAiYWRvcHRlZFN0eWxlU2hlZXRzIiwgIm1hcCIsICJzIiwgInN0eWxlIiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAibm9uY2UiLCAic2V0QXR0cmlidXRlIiwgInRleHRDb250ZW50IiwgImFwcGVuZENoaWxkIiwgImdldENvbXBhdGlibGVTdHlsZSIsICJzaGVldCIsICJydWxlIiwgImNzc1J1bGVzIiwgImlzIiwgImRlZmluZVByb3BlcnR5IiwgImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImdldE93blByb3BlcnR5U3ltYm9scyIsICJnZXRQcm90b3R5cGVPZiIsICJPYmplY3QiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAiY3VzdG9tRWxlbWVudHMiLCAidHJ1c3RlZFR5cGVzIiwgImVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSIsICJlbXB0eVNjcmlwdCIsICJwb2x5ZmlsbFN1cHBvcnQiLCAicmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0IiwgIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCAicHJvcCIsICJfb2JqIiwgImRlZmF1bHRDb252ZXJ0ZXIiLCAidmFsdWUiLCAidHlwZSIsICJCb29sZWFuIiwgIkFycmF5IiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImZyb21WYWx1ZSIsICJOdW1iZXIiLCAicGFyc2UiLCAiZSIsICJub3RFcXVhbCIsICJvbGQiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgIlN0cmluZyIsICJjb252ZXJ0ZXIiLCAicmVmbGVjdCIsICJoYXNDaGFuZ2VkIiwgIlN5bWJvbCIsICJtZXRhZGF0YSIsICJsaXRQcm9wZXJ0eU1ldGFkYXRhIiwgIldlYWtNYXAiLCAiUmVhY3RpdmVFbGVtZW50IiwgIkhUTUxFbGVtZW50IiwgImluaXRpYWxpemVyIiwgInRoaXMiLCAiX19wcmVwYXJlIiwgIl9pbml0aWFsaXplcnMiLCAicHVzaCIsICJvYnNlcnZlZEF0dHJpYnV0ZXMiLCAiZmluYWxpemUiLCAiX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIiwgImtleXMiLCAibmFtZSIsICJvcHRpb25zIiwgInN0YXRlIiwgImVsZW1lbnRQcm9wZXJ0aWVzIiwgInNldCIsICJub0FjY2Vzc29yIiwgImtleSIsICJkZXNjcmlwdG9yIiwgImdldFByb3BlcnR5RGVzY3JpcHRvciIsICJwcm90b3R5cGUiLCAiZ2V0IiwgInYiLCAiY2FsbCIsICJvbGRWYWx1ZSIsICJyZXF1ZXN0VXBkYXRlIiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgImhhc093blByb3BlcnR5IiwgInN1cGVyQ3RvciIsICJNYXAiLCAiZmluYWxpemVkIiwgInByb3BzIiwgInByb3BlcnRpZXMiLCAicHJvcEtleXMiLCAicCIsICJjcmVhdGVQcm9wZXJ0eSIsICJhdHRyIiwgIl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5IiwgImVsZW1lbnRTdHlsZXMiLCAiZmluYWxpemVTdHlsZXMiLCAic3R5bGVzIiwgImlzQXJyYXkiLCAiU2V0IiwgImZsYXQiLCAiSW5maW5pdHkiLCAicmV2ZXJzZSIsICJzIiwgInVuc2hpZnQiLCAiZ2V0Q29tcGF0aWJsZVN0eWxlIiwgInRvTG93ZXJDYXNlIiwgImNvbnN0cnVjdG9yIiwgInN1cGVyIiwgIl9faW5zdGFuY2VQcm9wZXJ0aWVzIiwgImlzVXBkYXRlUGVuZGluZyIsICJoYXNVcGRhdGVkIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnR5IiwgIl9faW5pdGlhbGl6ZSIsICJfX3VwZGF0ZVByb21pc2UiLCAiUHJvbWlzZSIsICJyZXMiLCAiZW5hYmxlVXBkYXRpbmciLCAiXyRjaGFuZ2VkUHJvcGVydGllcyIsICJfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMiLCAiZm9yRWFjaCIsICJpIiwgImNvbnRyb2xsZXIiLCAiX19jb250cm9sbGVycyIsICJhZGQiLCAicmVuZGVyUm9vdCIsICJpc0Nvbm5lY3RlZCIsICJob3N0Q29ubmVjdGVkIiwgImRlbGV0ZSIsICJpbnN0YW5jZVByb3BlcnRpZXMiLCAic2l6ZSIsICJjcmVhdGVSZW5kZXJSb290IiwgInNoYWRvd1Jvb3QiLCAiYXR0YWNoU2hhZG93IiwgInNoYWRvd1Jvb3RPcHRpb25zIiwgImFkb3B0U3R5bGVzIiwgImNvbm5lY3RlZENhbGxiYWNrIiwgImMiLCAiX3JlcXVlc3RlZFVwZGF0ZSIsICJkaXNjb25uZWN0ZWRDYWxsYmFjayIsICJob3N0RGlzY29ubmVjdGVkIiwgIl9vbGQiLCAiXyRhdHRyaWJ1dGVUb1Byb3BlcnR5IiwgImF0dHJWYWx1ZSIsICJ0b0F0dHJpYnV0ZSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgImN0b3IiLCAicHJvcE5hbWUiLCAiZ2V0UHJvcGVydHlPcHRpb25zIiwgImZyb21BdHRyaWJ1dGUiLCAiXyRjaGFuZ2VQcm9wZXJ0eSIsICJfX2VucXVldWVVcGRhdGUiLCAiaGFzIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMiLCAicmVqZWN0IiwgInJlc3VsdCIsICJzY2hlZHVsZVVwZGF0ZSIsICJwZXJmb3JtVXBkYXRlIiwgIndyYXBwZWQiLCAic2hvdWxkVXBkYXRlIiwgImNoYW5nZWRQcm9wZXJ0aWVzIiwgIndpbGxVcGRhdGUiLCAiaG9zdFVwZGF0ZSIsICJ1cGRhdGUiLCAiX19tYXJrVXBkYXRlZCIsICJfJGRpZFVwZGF0ZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiaG9zdFVwZGF0ZWQiLCAiZmlyc3RVcGRhdGVkIiwgInVwZGF0ZWQiLCAidXBkYXRlQ29tcGxldGUiLCAiZ2V0VXBkYXRlQ29tcGxldGUiLCAiX19wcm9wZXJ0eVRvQXR0cmlidXRlIiwgIm1vZGUiLCAicmVhY3RpdmVFbGVtZW50VmVyc2lvbnMiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAidHJ1c3RlZFR5cGVzIiwgInBvbGljeSIsICJjcmVhdGVQb2xpY3kiLCAiY3JlYXRlSFRNTCIsICJzIiwgImJvdW5kQXR0cmlidXRlU3VmZml4IiwgIm1hcmtlciIsICJNYXRoIiwgInJhbmRvbSIsICJ0b0ZpeGVkIiwgInNsaWNlIiwgIm1hcmtlck1hdGNoIiwgIm5vZGVNYXJrZXIiLCAiZCIsICJkb2N1bWVudCIsICJjcmVhdGVUcmVlV2Fsa2VyIiwgImNyZWF0ZU1hcmtlciIsICJjcmVhdGVDb21tZW50IiwgImlzUHJpbWl0aXZlIiwgInZhbHVlIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiaXNJdGVyYWJsZSIsICJTeW1ib2wiLCAiaXRlcmF0b3IiLCAiU1BBQ0VfQ0hBUiIsICJ0ZXh0RW5kUmVnZXgiLCAiY29tbWVudEVuZFJlZ2V4IiwgImNvbW1lbnQyRW5kUmVnZXgiLCAidGFnRW5kUmVnZXgiLCAiUmVnRXhwIiwgInNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgImRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgInJhd1RleHRFbGVtZW50IiwgInRhZyIsICJ0eXBlIiwgInN0cmluZ3MiLCAidmFsdWVzIiwgIl8kbGl0VHlwZSQiLCAiaHRtbCIsICJzdmciLCAibWF0aG1sIiwgIm5vQ2hhbmdlIiwgImZvciIsICJub3RoaW5nIiwgInRlbXBsYXRlQ2FjaGUiLCAiV2Vha01hcCIsICJ3YWxrZXIiLCAidHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmciLCAidHNhIiwgInN0cmluZ0Zyb21UU0EiLCAiaGFzT3duUHJvcGVydHkiLCAiRXJyb3IiLCAiZ2V0VGVtcGxhdGVIdG1sIiwgImwiLCAibGVuZ3RoIiwgImF0dHJOYW1lcyIsICJyYXdUZXh0RW5kUmVnZXgiLCAicmVnZXgiLCAiaSIsICJhdHRyTmFtZSIsICJtYXRjaCIsICJhdHRyTmFtZUVuZEluZGV4IiwgImxhc3RJbmRleCIsICJleGVjIiwgInRlc3QiLCAiZW5kIiwgInN0YXJ0c1dpdGgiLCAicHVzaCIsICJUZW1wbGF0ZSIsICJjb25zdHJ1Y3RvciIsICJvcHRpb25zIiwgIm5vZGUiLCAidGhpcyIsICJwYXJ0cyIsICJub2RlSW5kZXgiLCAiYXR0ck5hbWVJbmRleCIsICJwYXJ0Q291bnQiLCAiZWwiLCAiY3JlYXRlRWxlbWVudCIsICJjdXJyZW50Tm9kZSIsICJjb250ZW50IiwgIndyYXBwZXIiLCAiZmlyc3RDaGlsZCIsICJyZXBsYWNlV2l0aCIsICJjaGlsZE5vZGVzIiwgIm5leHROb2RlIiwgIm5vZGVUeXBlIiwgImhhc0F0dHJpYnV0ZXMiLCAibmFtZSIsICJnZXRBdHRyaWJ1dGVOYW1lcyIsICJlbmRzV2l0aCIsICJyZWFsTmFtZSIsICJzdGF0aWNzIiwgImdldEF0dHJpYnV0ZSIsICJzcGxpdCIsICJtIiwgImluZGV4IiwgImN0b3IiLCAiUHJvcGVydHlQYXJ0IiwgIkJvb2xlYW5BdHRyaWJ1dGVQYXJ0IiwgIkV2ZW50UGFydCIsICJBdHRyaWJ1dGVQYXJ0IiwgInJlbW92ZUF0dHJpYnV0ZSIsICJ0YWdOYW1lIiwgInRleHRDb250ZW50IiwgImVtcHR5U2NyaXB0IiwgImFwcGVuZCIsICJkYXRhIiwgImluZGV4T2YiLCAiX29wdGlvbnMiLCAiaW5uZXJIVE1MIiwgInJlc29sdmVEaXJlY3RpdmUiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiY3VycmVudERpcmVjdGl2ZSIsICJfX2RpcmVjdGl2ZXMiLCAiX19kaXJlY3RpdmUiLCAibmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yIiwgIl8kaW5pdGlhbGl6ZSIsICJfJHJlc29sdmUiLCAiVGVtcGxhdGVJbnN0YW5jZSIsICJ0ZW1wbGF0ZSIsICJfJHBhcnRzIiwgIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsICJfJHRlbXBsYXRlIiwgIl8kcGFyZW50IiwgInBhcmVudE5vZGUiLCAiXyRpc0Nvbm5lY3RlZCIsICJmcmFnbWVudCIsICJjcmVhdGlvblNjb3BlIiwgImltcG9ydE5vZGUiLCAicGFydEluZGV4IiwgInRlbXBsYXRlUGFydCIsICJDaGlsZFBhcnQiLCAibmV4dFNpYmxpbmciLCAiRWxlbWVudFBhcnQiLCAiXyRzZXRWYWx1ZSIsICJfX2lzQ29ubmVjdGVkIiwgInN0YXJ0Tm9kZSIsICJlbmROb2RlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiXyRzdGFydE5vZGUiLCAiXyRlbmROb2RlIiwgImlzQ29ubmVjdGVkIiwgImRpcmVjdGl2ZVBhcmVudCIsICJfJGNsZWFyIiwgIl9jb21taXRUZXh0IiwgIl9jb21taXRUZW1wbGF0ZVJlc3VsdCIsICJfY29tbWl0Tm9kZSIsICJfY29tbWl0SXRlcmFibGUiLCAiaW5zZXJ0QmVmb3JlIiwgIl9pbnNlcnQiLCAiY3JlYXRlVGV4dE5vZGUiLCAicmVzdWx0IiwgIl8kZ2V0VGVtcGxhdGUiLCAiaCIsICJfdXBkYXRlIiwgImluc3RhbmNlIiwgIl9jbG9uZSIsICJnZXQiLCAic2V0IiwgIml0ZW1QYXJ0cyIsICJpdGVtUGFydCIsICJpdGVtIiwgInN0YXJ0IiwgImZyb20iLCAiXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCIsICJuIiwgInJlbW92ZSIsICJlbGVtZW50IiwgImZpbGwiLCAiU3RyaW5nIiwgInZhbHVlSW5kZXgiLCAibm9Db21taXQiLCAiY2hhbmdlIiwgInYiLCAiX2NvbW1pdFZhbHVlIiwgInNldEF0dHJpYnV0ZSIsICJ0b2dnbGVBdHRyaWJ1dGUiLCAic3VwZXIiLCAibmV3TGlzdGVuZXIiLCAib2xkTGlzdGVuZXIiLCAic2hvdWxkUmVtb3ZlTGlzdGVuZXIiLCAiY2FwdHVyZSIsICJvbmNlIiwgInBhc3NpdmUiLCAic2hvdWxkQWRkTGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJhZGRFdmVudExpc3RlbmVyIiwgImV2ZW50IiwgImNhbGwiLCAiaG9zdCIsICJoYW5kbGVFdmVudCIsICJfJExIIiwgIl9ib3VuZEF0dHJpYnV0ZVN1ZmZpeCIsICJfbWFya2VyIiwgIl9tYXJrZXJNYXRjaCIsICJfSFRNTF9SRVNVTFQiLCAiX2dldFRlbXBsYXRlSHRtbCIsICJfVGVtcGxhdGVJbnN0YW5jZSIsICJfaXNJdGVyYWJsZSIsICJfcmVzb2x2ZURpcmVjdGl2ZSIsICJfQ2hpbGRQYXJ0IiwgIl9BdHRyaWJ1dGVQYXJ0IiwgIl9Cb29sZWFuQXR0cmlidXRlUGFydCIsICJfRXZlbnRQYXJ0IiwgIl9Qcm9wZXJ0eVBhcnQiLCAiX0VsZW1lbnRQYXJ0IiwgInBvbHlmaWxsU3VwcG9ydCIsICJsaXRIdG1sUG9seWZpbGxTdXBwb3J0IiwgImxpdEh0bWxWZXJzaW9ucyIsICJyZW5kZXIiLCAiY29udGFpbmVyIiwgInBhcnRPd25lck5vZGUiLCAicmVuZGVyQmVmb3JlIiwgIkxpdEVsZW1lbnQiLCAiUmVhY3RpdmVFbGVtZW50IiwgImNvbnN0cnVjdG9yIiwgInRoaXMiLCAicmVuZGVyT3B0aW9ucyIsICJob3N0IiwgIl9fY2hpbGRQYXJ0IiwgImNyZWF0ZVJlbmRlclJvb3QiLCAicmVuZGVyUm9vdCIsICJzdXBlciIsICJyZW5kZXJCZWZvcmUiLCAiZmlyc3RDaGlsZCIsICJjaGFuZ2VkUHJvcGVydGllcyIsICJ2YWx1ZSIsICJyZW5kZXIiLCAiaGFzVXBkYXRlZCIsICJpc0Nvbm5lY3RlZCIsICJ1cGRhdGUiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAic2V0Q29ubmVjdGVkIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgIm5vQ2hhbmdlIiwgImdsb2JhbFRoaXMiLCAibGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0IiwgInBvbHlmaWxsU3VwcG9ydCIsICJsaXRFbGVtZW50UG9seWZpbGxTdXBwb3J0IiwgImdsb2JhbFRoaXMiLCAibGl0RWxlbWVudFZlcnNpb25zIiwgInB1c2giLCAiY3VzdG9tRWxlbWVudCIsICJ0YWdOYW1lIiwgImNsYXNzT3JUYXJnZXQiLCAiY29udGV4dCIsICJhZGRJbml0aWFsaXplciIsICJjdXN0b21FbGVtZW50cyIsICJkZWZpbmUiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgInR5cGUiLCAiU3RyaW5nIiwgImNvbnZlcnRlciIsICJkZWZhdWx0Q29udmVydGVyIiwgInJlZmxlY3QiLCAiaGFzQ2hhbmdlZCIsICJub3RFcXVhbCIsICJzdGFuZGFyZFByb3BlcnR5IiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgImNvbnRleHQiLCAia2luZCIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImdsb2JhbFRoaXMiLCAibGl0UHJvcGVydHlNZXRhZGF0YSIsICJnZXQiLCAic2V0IiwgIk1hcCIsICJuYW1lIiwgInYiLCAib2xkVmFsdWUiLCAiY2FsbCIsICJ0aGlzIiwgInJlcXVlc3RVcGRhdGUiLCAiXyRjaGFuZ2VQcm9wZXJ0eSIsICJ2YWx1ZSIsICJFcnJvciIsICJwcm9wZXJ0eSIsICJwcm90b09yVGFyZ2V0IiwgIm5hbWVPckNvbnRleHQiLCAicHJvdG8iLCAiaGFzT3duUHJvcGVydHkiLCAiY29uc3RydWN0b3IiLCAiY3JlYXRlUHJvcGVydHkiLCAid3JhcHBlZCIsICJPYmplY3QiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgInN0YXRlIiwgIm9wdGlvbnMiLCAicHJvcGVydHkiLCAiYXR0cmlidXRlIiwgImRlc2MiLCAib2JqIiwgIm5hbWUiLCAiZGVzY3JpcHRvciIsICJjb25maWd1cmFibGUiLCAiZW51bWVyYWJsZSIsICJSZWZsZWN0IiwgImRlY29yYXRlIiwgIk9iamVjdCIsICJkZWZpbmVQcm9wZXJ0eSIsICJxdWVyeSIsICJzZWxlY3RvciIsICJjYWNoZSIsICJwcm90b09yVGFyZ2V0IiwgIm5hbWVPckNvbnRleHQiLCAiZGVzY3JpcHRvciIsICJkb1F1ZXJ5IiwgImVsIiwgInJlbmRlclJvb3QiLCAicXVlcnlTZWxlY3RvciIsICJnZXQiLCAic2V0IiwgImtleSIsICJTeW1ib2wiLCAidGhpcyIsICJ2IiwgImRlc2MiLCAicmVzdWx0IiwgImNhbGwiLCAiaGFzVXBkYXRlZCIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAib3B0aW9ucyIsICJvYmoiLCAibmFtZSIsICJzbG90IiwgInNlbGVjdG9yIiwgInNsb3RTZWxlY3RvciIsICJkZXNjIiwgImdldCIsICJzbG90RWwiLCAidGhpcyIsICJyZW5kZXJSb290IiwgInF1ZXJ5U2VsZWN0b3IiLCAiZWxlbWVudHMiLCAiYXNzaWduZWRFbGVtZW50cyIsICJmaWx0ZXIiLCAibm9kZSIsICJtYXRjaGVzIiwgInIiLCAiXyIsICJlIiwgInYiLCAiaSIsICJfYSIsICJuIiwgInQiLCAiX2EiLCAieG1sIiwgImF0dHJpYnV0ZXMiLCAieG1sIiwgInhtbCIsICJyIiwgIm4iLCAidCIsICJuIiwgImkiLCAiciIsICJ0IiwgInIiLCAidCIsICJyIiwgInQiLCAiciIsICJuIiwgInQiLCAiX2EiLCAiX2IiLCAidiIsICJpIiwgIm4iLCAiciIsICJ0IiwgIl9hIiwgIl9iIiwgInYiLCAiaSIsICJuIiwgInIiLCAidCIsICJyIiwgInQiLCAiciIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJ2IiwgIm4iLCAiaSIsICJ0IiwgImkiLCAidCIsICJpIiwgInQiLCAiaWZEZWZpbmVkIiwgInZhbHVlIiwgIm5vdGhpbmciLCAiciIsICJuIiwgImkiLCAibyIsICJyIiwgIm4iLCAidCIsICJfQ2hpbGRQYXJ0IiwgIkNoaWxkUGFydCIsICJfJExIIiwgImlzU2luZ2xlRXhwcmVzc2lvbiIsICJwYXJ0IiwgInN0cmluZ3MiLCAiY3JlYXRlTWFya2VyIiwgImRvY3VtZW50IiwgImNyZWF0ZUNvbW1lbnQiLCAiaW5zZXJ0UGFydCIsICJjb250YWluZXJQYXJ0IiwgInJlZlBhcnQiLCAiY29udGFpbmVyIiwgIl8kc3RhcnROb2RlIiwgInBhcmVudE5vZGUiLCAicmVmTm9kZSIsICJfJGVuZE5vZGUiLCAic3RhcnROb2RlIiwgImluc2VydEJlZm9yZSIsICJlbmROb2RlIiwgIkNoaWxkUGFydCIsICJvcHRpb25zIiwgIm5leHRTaWJsaW5nIiwgIm9sZFBhcmVudCIsICJfJHBhcmVudCIsICJwYXJlbnRDaGFuZ2VkIiwgIm5ld0Nvbm5lY3Rpb25TdGF0ZSIsICJfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzIiwgIl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQiLCAiXyRpc0Nvbm5lY3RlZCIsICJzdGFydCIsICJuIiwgInNldENoaWxkUGFydFZhbHVlIiwgInZhbHVlIiwgImRpcmVjdGl2ZVBhcmVudCIsICJfJHNldFZhbHVlIiwgIlJFU0VUX1ZBTFVFIiwgInNldENvbW1pdHRlZFZhbHVlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiZ2V0Q29tbWl0dGVkVmFsdWUiLCAicmVtb3ZlUGFydCIsICJlbmQiLCAicmVtb3ZlIiwgIlBhcnRUeXBlIiwgIkFUVFJJQlVURSIsICJDSElMRCIsICJQUk9QRVJUWSIsICJCT09MRUFOX0FUVFJJQlVURSIsICJFVkVOVCIsICJFTEVNRU5UIiwgImRpcmVjdGl2ZSIsICJjIiwgInZhbHVlcyIsICJfJGxpdERpcmVjdGl2ZSQiLCAiRGlyZWN0aXZlIiwgIl9wYXJ0SW5mbyIsICJfJGlzQ29ubmVjdGVkIiwgInRoaXMiLCAiXyRwYXJlbnQiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiX19wYXJ0IiwgIl9fYXR0cmlidXRlSW5kZXgiLCAicHJvcHMiLCAidXBkYXRlIiwgIl9wYXJ0IiwgInJlbmRlciIsICJub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQiLCAicGFyZW50IiwgImlzQ29ubmVjdGVkIiwgImNoaWxkcmVuIiwgIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsICJvYmoiLCAicmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50IiwgIl8kcGFyZW50IiwgImRlbGV0ZSIsICJzaXplIiwgImFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQiLCAiU2V0IiwgImhhcyIsICJhZGQiLCAiaW5zdGFsbERpc2Nvbm5lY3RBUEkiLCAicmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCAibmV3UGFyZW50IiwgInRoaXMiLCAibm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZCIsICJpc0NsZWFyaW5nVmFsdWUiLCAiZnJvbVBhcnRJbmRleCIsICJ2YWx1ZSIsICJfJGNvbW1pdHRlZFZhbHVlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAiaSIsICJsZW5ndGgiLCAidHlwZSIsICJQYXJ0VHlwZSIsICJDSElMRCIsICJfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkIiwgIl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCAiQXN5bmNEaXJlY3RpdmUiLCAiRGlyZWN0aXZlIiwgImNvbnN0cnVjdG9yIiwgInBhcnQiLCAiYXR0cmlidXRlSW5kZXgiLCAic3VwZXIiLCAiXyRpbml0aWFsaXplIiwgIl8kaXNDb25uZWN0ZWQiLCAiaXNDbGVhcmluZ0RpcmVjdGl2ZSIsICJyZWNvbm5lY3RlZCIsICJkaXNjb25uZWN0ZWQiLCAiaXNTaW5nbGVFeHByZXNzaW9uIiwgIl9fcGFydCIsICJfJHNldFZhbHVlIiwgIm5ld1ZhbHVlcyIsICJfX2F0dHJpYnV0ZUluZGV4IiwgImNyZWF0ZVJlZiIsICJSZWYiLCAibGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2siLCAiV2Vha01hcCIsICJyZWYiLCAiZGlyZWN0aXZlIiwgIkFzeW5jRGlyZWN0aXZlIiwgIl9yZWYiLCAibm90aGluZyIsICJwYXJ0IiwgInJlZkNoYW5nZWQiLCAidGhpcyIsICJfdXBkYXRlUmVmVmFsdWUiLCAidW5kZWZpbmVkIiwgIl9sYXN0RWxlbWVudEZvclJlZiIsICJfZWxlbWVudCIsICJfY29udGV4dCIsICJvcHRpb25zIiwgImhvc3QiLCAiZWxlbWVudCIsICJpc0Nvbm5lY3RlZCIsICJjb250ZXh0IiwgImdsb2JhbFRoaXMiLCAibGFzdEVsZW1lbnRGb3JDYWxsYmFjayIsICJnZXQiLCAic2V0IiwgImNhbGwiLCAidmFsdWUiLCAiZGlzY29ubmVjdGVkIiwgInJlY29ubmVjdGVkIiwgImkiLCAiZSIsICJvIiwgIm4iLCAiciIsICJ0IiwgIl8iLCAiX2EiLCAiZSIsICJuIiwgInQiLCAiVW5zYWZlSFRNTERpcmVjdGl2ZSIsICJEaXJlY3RpdmUiLCAicGFydEluZm8iLCAic3VwZXIiLCAidGhpcyIsICJfdmFsdWUiLCAibm90aGluZyIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIkVycm9yIiwgImNvbnN0cnVjdG9yIiwgImRpcmVjdGl2ZU5hbWUiLCAidmFsdWUiLCAiX3RlbXBsYXRlUmVzdWx0IiwgIm5vQ2hhbmdlIiwgInN0cmluZ3MiLCAicmF3IiwgIl8kbGl0VHlwZSQiLCAicmVzdWx0VHlwZSIsICJ2YWx1ZXMiLCAidW5zYWZlSFRNTCIsICJkaXJlY3RpdmUiLCAiaSIsICJvIiwgInIiLCAibiIsICJ0IiwgImkiLCAiaiIsICJuIiwgIl9hIiwgImMiLCAiYSIsICJiIiwgImkiLCAibiIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAidCIsICJyIiwgImkiLCAidCIsICJyIiwgInQiLCAibiIsICJpIiwgInYiLCAiciIsICJpIiwgImkiLCAiciIsICJlIiwgInYiLCAiaSIsICJjIiwgImUiLCAibiIsICJ4IiwgInYiLCAibiIsICJuIiwgInIiLCAibiIsICJyIiwgIm4iLCAiX2EiLCAiaSIsICJjIiwgImUiLCAiciIsICJfYSIsICJfYiIsICJ2IiwgIm4iLCAidjIiLCAibiIsICJjIiwgImEiLCAiYiIsICJ2IiwgImUiLCAicCIsICJhIiwgImMiLCAiayIsICJyZXF1aXJlIiwgIm4iLCAiciIsICJ0IiwgImUiLCAieCIsICJ5IiwgIl9hIiwgIl9hIiwgIm4iLCAiX2EiLCAiZSIsICJuIiwgImQiLCAiZHJhZ2dhYmxlIiwgInBhcmVudCIsICJpbmRleCIsICJ0YXJnZXRJbmRleCIsICJuIiwgImkiLCAiXyIsICJyIiwgInQiLCAiaWZyYW1lIiwgImUiLCAibiIsICJyIiwgInQiLCAiZSIsICJuIiwgInQiLCAieCIsICJfYSIsICJfYiIsICJpIiwgInQiLCAiZ2VuZXJhdGVNYXAiLCAibGlzdCIsICJzdGFydCIsICJlbmQiLCAibWFwIiwgIk1hcCIsICJpIiwgInNldCIsICJyZXBlYXQiLCAiZGlyZWN0aXZlIiwgIkRpcmVjdGl2ZSIsICJwYXJ0SW5mbyIsICJzdXBlciIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIkVycm9yIiwgIml0ZW1zIiwgImtleUZuT3JUZW1wbGF0ZSIsICJ0ZW1wbGF0ZSIsICJrZXlGbiIsICJrZXlzIiwgInZhbHVlcyIsICJpbmRleCIsICJpdGVtIiwgInRoaXMiLCAiX2dldFZhbHVlc0FuZEtleXMiLCAiY29udGFpbmVyUGFydCIsICJvbGRQYXJ0cyIsICJnZXRDb21taXR0ZWRWYWx1ZSIsICJuZXdWYWx1ZXMiLCAibmV3S2V5cyIsICJBcnJheSIsICJpc0FycmF5IiwgIl9pdGVtS2V5cyIsICJvbGRLZXlzIiwgIm5ld1BhcnRzIiwgIm5ld0tleVRvSW5kZXhNYXAiLCAib2xkS2V5VG9JbmRleE1hcCIsICJvbGRIZWFkIiwgIm9sZFRhaWwiLCAibGVuZ3RoIiwgIm5ld0hlYWQiLCAibmV3VGFpbCIsICJzZXRDaGlsZFBhcnRWYWx1ZSIsICJpbnNlcnRQYXJ0IiwgImhhcyIsICJvbGRJbmRleCIsICJnZXQiLCAib2xkUGFydCIsICJuZXdQYXJ0IiwgInJlbW92ZVBhcnQiLCAic2V0Q29tbWl0dGVkVmFsdWUiLCAibm9DaGFuZ2UiLCAicCIsICJfYSIsICJfYiIsICJvIiwgImMiLCAiZSIsICJfIiwgImkiLCAicyIsICJyIiwgInQiLCAiZSIsICJzIiwgImkiLCAidCIsICJlIiwgImkiLCAiaG90c3BvdCIsICJzIiwgInQiLCAiZSIsICJzIiwgImkiLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgImkiLCAiZSIsICJ2IiwgImkiLCAibyIsICJyIiwgIm4iLCAidCIsICJpIiwgInQiLCAiXyIsICJpIiwgIm8iLCAiZCIsICJyIiwgIm4iLCAidCIsICJyIiwgImkiLCAiciIsICJhIiwgImkiLCAidCIsICJpbXBvcnRhbnQiLCAiaW1wb3J0YW50RmxhZyIsICJzdHlsZU1hcCIsICJkaXJlY3RpdmUiLCAiRGlyZWN0aXZlIiwgInBhcnRJbmZvIiwgInN1cGVyIiwgInR5cGUiLCAiUGFydFR5cGUiLCAiQVRUUklCVVRFIiwgIm5hbWUiLCAic3RyaW5ncyIsICJsZW5ndGgiLCAiRXJyb3IiLCAic3R5bGVJbmZvIiwgIk9iamVjdCIsICJrZXlzIiwgInJlZHVjZSIsICJzdHlsZSIsICJwcm9wIiwgInZhbHVlIiwgImluY2x1ZGVzIiwgInJlcGxhY2UiLCAidG9Mb3dlckNhc2UiLCAicGFydCIsICJlbGVtZW50IiwgInRoaXMiLCAiX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzIiwgIlNldCIsICJyZW5kZXIiLCAiZGVsZXRlIiwgInJlbW92ZVByb3BlcnR5IiwgImFkZCIsICJpc0ltcG9ydGFudCIsICJlbmRzV2l0aCIsICJzZXRQcm9wZXJ0eSIsICJzbGljZSIsICJub0NoYW5nZSIsICJ4IiwgInkiLCAiYyIsICJvIiwgImUiLCAiXyIsICJpIiwgIm4iLCAiciIsICJ0IiwgImV2ZW50IiwgIngiLCAiZGlmZlgiLCAiZSIsICJpIiwgIm4iLCAidCIsICJyIiwgIl9hIiwgIl9iIiwgImUiLCAidiIsICJ0IiwgInIiLCAiaSIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJpIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgIl9hIiwgIm4iLCAiciIsICJ0Il0KfQo=
7860
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRleHQtcmVxdWVzdC1ldmVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9jb250ZXh0L3NyYy9saWIvY3JlYXRlLWNvbnRleHQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2NvbnRyb2xsZXJzL2NvbnRleHQtY29uc3VtZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL3ZhbHVlLW5vdGlmaWVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L2NvbnRleHQvc3JjL2xpYi9kZWNvcmF0b3JzL3Byb3ZpZGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvY29udGV4dC9zcmMvbGliL2RlY29yYXRvcnMvY29uc3VtZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvbGliL2VsZW1lbnQtaW50ZXJuYWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0LWxhYnMvc3NyLWRvbS1zaGltL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9jc3MtdGFnLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL3JlYWN0aXZlLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9saXQtaHRtbC50cyIsICIuLi9ub2RlX21vZHVsZXMvbGl0LWVsZW1lbnQvc3JjL2xpdC1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvZGVjb3JhdG9ycy9wcm9wZXJ0eS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3N0YXRlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvYmFzZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL3F1ZXJ5LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtZWxlbWVudHMudHMiLCAiLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm1lcnMudHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0taXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdC50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS10ZXN0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcHJvbXB0L3F0aS1wcm9tcHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3V0aWxzLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlLWhlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9hc3luYy1kaXJlY3RpdmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL3NyYy9kaXJlY3RpdmVzL3JlZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uL3NyYy9saWIvZGVjb3JhdG9ycy9saXZlLXF1ZXJ5LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9yZXBlYXQudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy9zdHlsZS1tYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyIsICIuLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2luZGV4LnRzIiwgIi4uL3NyYy9saWIvcXRpLWl0ZW0vcXRpLWl0ZW0ubWl4aW4udHMiLCAiLi4vc3JjL2xpYi9xdGktaXRlbS9xdGktaXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS1sb2FkZXIvcXRpLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFR5cGUsIENvbnRleHR9IGZyb20gJy4vY3JlYXRlLWNvbnRleHQuanMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudEV2ZW50TWFwIHtcbiAgICAvKipcbiAgICAgKiBBICdjb250ZXh0LXJlcXVlc3QnIGV2ZW50IGNhbiBiZSBlbWl0dGVkIGJ5IGFueSBlbGVtZW50IHdoaWNoIGRlc2lyZXNcbiAgICAgKiBhIGNvbnRleHQgdmFsdWUgdG8gYmUgaW5qZWN0ZWQgYnkgYW4gZXh0ZXJuYWwgcHJvdmlkZXIuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcmVxdWVzdCc6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj47XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IGEgY29udGV4dCByZXF1ZXN0ZXIgYW5kIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSBzYXRpc2Z5aW5nIHRoZSByZXF1ZXN0LlxuICogVGhpcyBjYWxsYmFjayBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJ5IGNvbnRleHQgcHJvdmlkZXJzIGFzIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dENhbGxiYWNrPFZhbHVlVHlwZT4gPSAoXG4gIHZhbHVlOiBWYWx1ZVR5cGUsXG4gIHVuc3Vic2NyaWJlPzogKCkgPT4gdm9pZFxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIENvbnRleHRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dFJlcXVlc3Q8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcbiAgcmVhZG9ubHkgY2FsbGJhY2s6IENvbnRleHRDYWxsYmFjazxDb250ZXh0VHlwZTxDPj47XG4gIHJlYWRvbmx5IHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gZXZlbnQgZmlyZWQgYnkgYSBjb250ZXh0IHJlcXVlc3RlciB0byBzaWduYWwgaXQgZGVzaXJlcyBhIHNwZWNpZmllZCBjb250ZXh0IHdpdGggdGhlIGdpdmVuIGtleS5cbiAqXG4gKiBBIHByb3ZpZGVyIHNob3VsZCBpbnNwZWN0IHRoZSBgY29udGV4dGAgcHJvcGVydHkgb2YgdGhlIGV2ZW50IHRvIGRldGVybWluZSBpZiBpdCBoYXMgYSB2YWx1ZSB0aGF0IGNhblxuICogc2F0aXNmeSB0aGUgcmVxdWVzdCwgY2FsbGluZyB0aGUgYGNhbGxiYWNrYCB3aXRoIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaWYgc28uXG4gKlxuICogSWYgdGhlIHJlcXVlc3RlZCBjb250ZXh0IGV2ZW50IGNvbnRhaW5zIGEgdHJ1dGh5IGBzdWJzY3JpYmVgIHZhbHVlLCB0aGVuIGEgcHJvdmlkZXIgY2FuIGNhbGwgdGhlIGNhbGxiYWNrXG4gKiBtdWx0aXBsZSB0aW1lcyBpZiB0aGUgdmFsdWUgaXMgY2hhbmdlZCwgaWYgdGhpcyBpcyB0aGUgY2FzZSB0aGUgcHJvdmlkZXIgc2hvdWxkIHBhc3MgYW4gYHVuc3Vic2NyaWJlYFxuICogbWV0aG9kIHRvIHRoZSBjYWxsYmFjayB3aGljaCBjb25zdW1lcnMgY2FuIGludm9rZSB0byBpbmRpY2F0ZSB0aGV5IG5vIGxvbmdlciB3aXNoIHRvIHJlY2VpdmUgdGhlc2UgdXBkYXRlcy5cbiAqXG4gKiBJZiBubyBgc3Vic2NyaWJlYCB2YWx1ZSBpcyBwcmVzZW50IGluIHRoZSBldmVudCwgdGhlbiB0aGUgcHJvdmlkZXIgY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgYSAnb25lIHRpbWUnXG4gKiByZXF1ZXN0IGZvciB0aGUgY29udGV4dCBhbmQgY2FuIHRoZXJlZm9yZSBub3QgdHJhY2sgdGhlIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFJlcXVlc3RFdmVudDxDIGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgZXh0ZW5kcyBFdmVudFxuICBpbXBsZW1lbnRzIENvbnRleHRSZXF1ZXN0PEM+XG57XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEM7XG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+O1xuICByZWFkb25seSBzdWJzY3JpYmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBrZXkgdG8gcmVxdWVzdFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgd2hlbiB0aGUgY29udGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGlzIGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gc3Vic2NyaWJlIHdoZW4sIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gc3Vic2NyaWJlIHRvIGZ1dHVyZSB1cGRhdGVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb250ZXh0OiBDLFxuICAgIGNhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+LFxuICAgIHN1YnNjcmliZT86IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoJ2NvbnRleHQtcmVxdWVzdCcsIHtidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZX0pO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhlIENvbnRleHQgdHlwZSBkZWZpbmVzIGEgdHlwZSBicmFuZCB0byBhc3NvY2lhdGUgYSBrZXkgdmFsdWUgd2l0aCB0aGUgY29udGV4dCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHQ8S2V5VHlwZSwgVmFsdWVUeXBlPiA9IEtleVR5cGUgJiB7X19jb250ZXh0X186IFZhbHVlVHlwZX07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIENvbnRleHQgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5PEtleVR5cGUsIFZhbHVlVHlwZT4gPSBDb250ZXh0PEtleVR5cGUsIFZhbHVlVHlwZT47XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZSB3aGljaCBjYW4gZXh0cmFjdCBhIENvbnRleHQgdmFsdWUgdHlwZSBmcm9tIGEgQ29udGV4dCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRUeXBlPEtleSBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+ID1cbiAgS2V5IGV4dGVuZHMgQ29udGV4dDx1bmtub3duLCBpbmZlciBWYWx1ZVR5cGU+ID8gVmFsdWVUeXBlIDogbmV2ZXI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGVkIENvbnRleHQuXG4gKlxuICogQ29udGV4dHMgYXJlIGNvbXBhcmVkIHdpdGggc3RyaWN0IGVxdWFsaXR5LlxuICpcbiAqIElmIHlvdSB3YW50IHR3byBzZXBhcmF0ZSBgY3JlYXRlQ29udGV4dCgpYCBjYWxscyB0byByZWZlcmVyIHRvIHRoZSBzYW1lXG4gKiBjb250ZXh0LCB0aGVuIHVzZSBhIGtleSB0aGF0IHdpbGwgYnkgZXF1YWwgdW5kZXIgc3RyaWN0IGVxdWFsaXR5IGxpa2UgYVxuICogc3RyaW5nIGZvciBgU3ltYm9sLmZvcigpYDpcbiAqXG4gKiBgYGB0c1xuICogLy8gdHJ1ZVxuICogY3JlYXRlQ29udGV4dCgnbXktY29udGV4dCcpID09PSBjcmVhdGVDb250ZXh0KCdteS1jb250ZXh0JylcbiAqIC8vIHRydWVcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sLmZvcignbXktY29udGV4dCcpKSA9PT0gY3JlYXRlQ29udGV4dChTeW1ib2wuZm9yKCdteS1jb250ZXh0JykpXG4gKiBgYGBcbiAqXG4gKiBJZiB5b3Ugd2FudCBhIGNvbnRleHQgdG8gYmUgdW5pcXVlIHNvIHRoYXQgaXQncyBndWFyYW50ZWVkIHRvIG5vdCBjb2xsaWRlXG4gKiB3aXRoIG90aGVyIGNvbnRleHRzLCB1c2UgYSBrZXkgdGhhdCdzIHVuaXF1ZSB1bmRlciBzdHJpY3QgZXF1YWxpdHksIGxpa2VcbiAqIGEgYFN5bWJvbCgpYCBvciBvYmplY3QuOlxuICpcbiAqIGBgYFxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoe30pID09PSBjcmVhdGVDb250ZXh0KHt9KVxuICogLy8gZmFsc2VcbiAqIGNyZWF0ZUNvbnRleHQoU3ltYm9sKCdteS1jb250ZXh0JykpID09PSBjcmVhdGVDb250ZXh0KFN5bWJvbCgnbXktY29udGV4dCcpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGtleSBhIGNvbnRleHQga2V5IHZhbHVlXG4gKiBAdGVtcGxhdGUgVmFsdWVUeXBlIHRoZSB0eXBlIG9mIHZhbHVlIHRoYXQgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoaXMgY29udGV4dC5cbiAqIEByZXR1cm5zIHRoZSBjb250ZXh0IGtleSB2YWx1ZSBjYXN0IHRvIGBDb250ZXh0PEssIFZhbHVlVHlwZT5gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFZhbHVlVHlwZSwgSyA9IHVua25vd24+KGtleTogSykge1xuICByZXR1cm4ga2V5IGFzIENvbnRleHQ8SywgVmFsdWVUeXBlPjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29udGV4dENhbGxiYWNrLFxuICBDb250ZXh0UmVxdWVzdEV2ZW50LFxufSBmcm9tICcuLi9jb250ZXh0LXJlcXVlc3QtZXZlbnQuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zPEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+PiB7XG4gIGNvbnRleHQ6IEM7XG4gIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQ7XG4gIHN1YnNjcmliZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBSZWFjdGl2ZUNvbnRyb2xsZXIgd2hpY2ggYWRkcyBjb250ZXh0IGNvbnN1bWluZyBiZWhhdmlvciB0byBhIGN1c3RvbVxuICogZWxlbWVudCBieSBkaXNwYXRjaGluZyBgY29udGV4dC1yZXF1ZXN0YCBldmVudHMuXG4gKlxuICogV2hlbiB0aGUgaG9zdCBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgZG9jdW1lbnQgaXQgd2lsbCBlbWl0IGFcbiAqIGBjb250ZXh0LXJlcXVlc3RgIGV2ZW50IHdpdGggaXRzIGNvbnRleHQga2V5LiBXaGVuIHRoZSBjb250ZXh0IHJlcXVlc3RcbiAqIGlzIHNhdGlzZmllZCB0aGUgY29udHJvbGxlciB3aWxsIGludm9rZSB0aGUgY2FsbGJhY2ssIGlmIHByZXNlbnQsIGFuZFxuICogdHJpZ2dlciBhIGhvc3QgdXBkYXRlIHNvIGl0IGNhbiByZXNwb25kIHRvIHRoZSBuZXcgdmFsdWUuXG4gKlxuICogSXQgd2lsbCBhbHNvIGNhbGwgdGhlIGRpc3Bvc2UgbWV0aG9kIGdpdmVuIGJ5IHRoZSBwcm92aWRlciB3aGVuIHRoZVxuICogaG9zdCBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHRDb25zdW1lcjxcbiAgQyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4sXG4gIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVDb250cm9sbGVySG9zdCAmIEhUTUxFbGVtZW50LFxuPiBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgY29udGV4dDogQztcbiAgcHJpdmF0ZSBjYWxsYmFjaz86ICh2YWx1ZTogQ29udGV4dFR5cGU8Qz4sIGRpc3Bvc2U/OiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICBwcml2YXRlIHN1YnNjcmliZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHJvdmlkZWQgPSBmYWxzZTtcblxuICB2YWx1ZT86IENvbnRleHRUeXBlPEM+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEhvc3RFbGVtZW50LCBvcHRpb25zOiBPcHRpb25zPEM+KTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBuZXcgQ29udGV4dENvbnN1bWVyKGhvc3QsIG9wdGlvbnMpICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHQ6IEMsXG4gICAgY2FsbGJhY2s/OiAodmFsdWU6IENvbnRleHRUeXBlPEM+LCBkaXNwb3NlPzogKCkgPT4gdm9pZCkgPT4gdm9pZCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEhvc3RFbGVtZW50LFxuICAgIGNvbnRleHRPck9wdGlvbnM6IEMgfCBPcHRpb25zPEM+LFxuICAgIGNhbGxiYWNrPzogKHZhbHVlOiBDb250ZXh0VHlwZTxDPiwgZGlzcG9zZT86ICgpID0+IHZvaWQpID0+IHZvaWQsXG4gICAgc3Vic2NyaWJlPzogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIC8vIFRoaXMgaXMgYSBwb3RlbnRpYWxseSBmcmFnaWxlIGR1Y2stdHlwZS4gSXQgbWVhbnMgYSBjb250ZXh0IG9iamVjdCBjYW4ndFxuICAgIC8vIGhhdmUgYSBwcm9wZXJ0eSBuYW1lIGNvbnRleHQgYW5kIGJlIHVzZWQgaW4gcG9zaXRpb25hbCBhcmd1bWVudCBmb3JtLlxuICAgIGlmICgoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPEM+KS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8Qz47XG4gICAgICB0aGlzLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gb3B0aW9ucy5zdWJzY3JpYmUgPz8gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRPck9wdGlvbnMgYXMgQztcbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHRoaXMuc3Vic2NyaWJlID0gc3Vic2NyaWJlID8/IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmhvc3QuYWRkQ29udHJvbGxlcih0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmU/OiAoKSA9PiB2b2lkO1xuXG4gIGhvc3RDb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaFJlcXVlc3QoKTtcbiAgfVxuXG4gIGhvc3REaXNjb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJlcXVlc3QoKSB7XG4gICAgdGhpcy5ob3N0LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ29udGV4dFJlcXVlc3RFdmVudCh0aGlzLmNvbnRleHQsIHRoaXMuX2NhbGxiYWNrLCB0aGlzLnN1YnNjcmliZSlcbiAgICApO1xuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgc3RhYmxlIGlkZW50aXR5IHRvIHByb3Blcmx5IGRlZHVwZSBpbiBDb250ZXh0Um9vdFxuICAvLyBpZiB0aGlzIGVsZW1lbnQgY29ubmVjdHMgbXVsdGlwbGUgdGltZXMuXG4gIHByaXZhdGUgX2NhbGxiYWNrOiBDb250ZXh0Q2FsbGJhY2s8Q29udGV4dFR5cGU8Qz4+ID0gKHZhbHVlLCB1bnN1YnNjcmliZSkgPT4ge1xuICAgIC8vIHNvbWUgcHJvdmlkZXJzIHdpbGwgcGFzcyBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiBpbmRpY2F0aW5nIHRoZXkgbWF5IHByb3ZpZGUgZnV0dXJlIHZhbHVlc1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICAvLyBpZiB0aGUgdW5zdWJzY3JpYmUgZnVuY3Rpb24gY2hhbmdlcyB0aGlzIGltcGxpZXMgd2UgaGF2ZSBjaGFuZ2VkIHByb3ZpZGVyXG4gICAgICBpZiAodGhpcy51bnN1YnNjcmliZSAhPT0gdW5zdWJzY3JpYmUpIHtcbiAgICAgICAgLy8gY2xlYW51cCB0aGUgb2xkIHByb3ZpZGVyXG4gICAgICAgIHRoaXMucHJvdmlkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgLy8gaWYgd2UgZG9uJ3Qgc3VwcG9ydCBzdWJzY3JpcHRpb24sIGltbWVkaWF0ZWx5IHVuc3Vic2NyaWJlXG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzdG9yZSB0aGUgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGNvbnRyb2xsZXJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgLy8gc2NoZWR1bGUgYW4gdXBkYXRlIGluIGNhc2UgdGhpcyB2YWx1ZSBpcyB1c2VkIGluIGEgdGVtcGxhdGVcbiAgICB0aGlzLmhvc3QucmVxdWVzdFVwZGF0ZSgpO1xuXG4gICAgLy8gb25seSBpbnZva2UgY2FsbGJhY2sgaWYgd2UgYXJlIGVpdGhlciBleHBlY3RpbmcgdXBkYXRlcyBvciBoYXZlIG5vdCB5ZXRcbiAgICAvLyBiZWVuIHByb3ZpZGVkIGEgdmFsdWVcbiAgICBpZiAoIXRoaXMucHJvdmlkZWQgfHwgdGhpcy5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMucHJvdmlkZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayh2YWx1ZSwgdW5zdWJzY3JpYmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtDb250ZXh0Q2FsbGJhY2t9IGZyb20gJy4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcblxuLyoqXG4gKiBBIGRpc3Bvc2VyIGZ1bmN0aW9uXG4gKi9cbnR5cGUgRGlzcG9zZXIgPSAoKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgQ2FsbGJhY2tJbmZvIHtcbiAgZGlzcG9zZXI6IERpc3Bvc2VyO1xuICBjb25zdW1lckhvc3Q6IEVsZW1lbnQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgY2xhc3Mgd2hpY2ggc3RvcmVzIGEgdmFsdWUsIGFuZCB0cmlnZ2VycyByZWdpc3RlcmVkIGNhbGxiYWNrcyB3aGVuXG4gKiB0aGUgdmFsdWUgaXMgY2hhbmdlZCB2aWEgaXRzIHNldHRlci5cbiAqXG4gKiBBbiBpbXBsZW1lbnRvciBtaWdodCB1c2Ugb3RoZXIgb2JzZXJ2YWJsZSBwYXR0ZXJucyBzdWNoIGFzIE1vYlggb3IgUmVkdXggdG9cbiAqIGdldCBiZWhhdmlvciBsaWtlIHRoaXMuIEJ1dCB0aGlzIGlzIGEgcHJldHR5IG1pbmltYWwgYXBwcm9hY2ggdGhhdCB3aWxsXG4gKiBsaWtlbHkgd29yayBmb3IgYSBudW1iZXIgb2YgdXNlIGNhc2VzLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVOb3RpZmllcjxUPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IE1hcDxcbiAgICBDb250ZXh0Q2FsbGJhY2s8VD4sXG4gICAgQ2FsbGJhY2tJbmZvXG4gID4oKTtcbiAgcHJpdmF0ZSBfdmFsdWUhOiBUO1xuICBnZXQgdmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBUKSB7XG4gICAgdGhpcy5zZXRWYWx1ZSh2KTtcbiAgfVxuXG4gIHNldFZhbHVlKHY6IFQsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBjb25zdCB1cGRhdGUgPSBmb3JjZSB8fCAhT2JqZWN0LmlzKHYsIHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgaWYgKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU/OiBUKSB7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU9ic2VydmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IFtjYWxsYmFjaywge2Rpc3Bvc2VyfV0gb2YgdGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLl92YWx1ZSwgZGlzcG9zZXIpO1xuICAgIH1cbiAgfTtcblxuICBhZGRDYWxsYmFjayhcbiAgICBjYWxsYmFjazogQ29udGV4dENhbGxiYWNrPFQ+LFxuICAgIGNvbnN1bWVySG9zdDogRWxlbWVudCxcbiAgICBzdWJzY3JpYmU/OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmICghc3Vic2NyaWJlKSB7XG4gICAgICAvLyBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYW5kIHdlJ3JlIGRvbmVcbiAgICAgIGNhbGxiYWNrKHRoaXMudmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGNhbGxiYWNrLCB7XG4gICAgICAgIGRpc3Bvc2VyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnN1bWVySG9zdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7ZGlzcG9zZXJ9ID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChjYWxsYmFjaykhO1xuICAgIGNhbGxiYWNrKHRoaXMudmFsdWUsIGRpc3Bvc2VyKTtcbiAgfVxuXG4gIGNsZWFyQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5jbGVhcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7Q29udGV4dFJlcXVlc3RFdmVudH0gZnJvbSAnLi4vY29udGV4dC1yZXF1ZXN0LWV2ZW50LmpzJztcbmltcG9ydCB7VmFsdWVOb3RpZmllcn0gZnJvbSAnLi4vdmFsdWUtbm90aWZpZXIuanMnO1xuaW1wb3J0IHR5cGUge0NvbnRleHQsIENvbnRleHRUeXBlfSBmcm9tICcuLi9jcmVhdGUtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRFdmVudE1hcCB7XG4gICAgLyoqXG4gICAgICogQSAnY29udGV4dC1wcm92aWRlcicgZXZlbnQgY2FuIGJlIGVtaXR0ZWQgYnkgYW55IGVsZW1lbnQgd2hpY2ggaG9zdHNcbiAgICAgKiBhIGNvbnRleHQgcHJvdmlkZXIgdG8gaW5kaWNhdGUgaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAgICovXG4gICAgJ2NvbnRleHQtcHJvdmlkZXInOiBDb250ZXh0UHJvdmlkZXJFdmVudDxDb250ZXh0PHVua25vd24sIHVua25vd24+PjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyRXZlbnQ8XG4gIEMgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuPiBleHRlbmRzIEV2ZW50IHtcbiAgcmVhZG9ubHkgY29udGV4dDogQztcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgd2hpY2ggdGhpcyBwcm92aWRlciBjYW4gcHJvdmlkZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29udGV4dDogQykge1xuICAgIHN1cGVyKCdjb250ZXh0LXByb3ZpZGVyJywge2J1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlfSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnM8QyBleHRlbmRzIENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+IHtcbiAgY29udGV4dDogQztcbiAgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8Qz47XG59XG5cbnR5cGUgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFBhcnRpYWw8UmVhY3RpdmVDb250cm9sbGVySG9zdD4gJiBIVE1MRWxlbWVudDtcblxuLyoqXG4gKiBBIFJlYWN0aXZlQ29udHJvbGxlciB3aGljaCBhZGRzIGNvbnRleHQgcHJvdmlkZXIgYmVoYXZpb3IgdG8gYVxuICogY3VzdG9tIGVsZW1lbnQuXG4gKlxuICogVGhpcyBjb250cm9sbGVyIHNpbXBseSBsaXN0ZW5zIHRvIHRoZSBgY29udGV4dC1yZXF1ZXN0YCBldmVudCB3aGVuXG4gKiB0aGUgaG9zdCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTSBhbmQgcmVnaXN0ZXJzIHRoZSByZWNlaXZlZCBjYWxsYmFja3NcbiAqIGFnYWluc3QgaXRzIG9ic2VydmFibGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGUgY29udHJvbGxlciBtYXkgYWxzbyBiZSBhdHRhY2hlZCB0byBhbnkgSFRNTCBlbGVtZW50IGluIHdoaWNoIGNhc2UgaXQnc1xuICogdXAgdG8gdGhlIHVzZXIgdG8gY2FsbCBob3N0Q29ubmVjdGVkKCkgd2hlbiBhdHRhY2hlZCB0byB0aGUgRE9NLiBUaGlzIGlzXG4gKiBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIGFueSBjdXN0b20gZWxlbWVudHMgaW1wbGVtZW50aW5nXG4gKiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LlxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyPFxuICAgIFQgZXh0ZW5kcyBDb250ZXh0PHVua25vd24sIHVua25vd24+LFxuICAgIEhvc3RFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVFbGVtZW50SG9zdCA9IFJlYWN0aXZlRWxlbWVudEhvc3QsXG4gID5cbiAgZXh0ZW5kcyBWYWx1ZU5vdGlmaWVyPENvbnRleHRUeXBlPFQ+PlxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlclxue1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG9zdDogSG9zdEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogVDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgb3B0aW9uczogT3B0aW9uczxUPik7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgbmV3IENvbnRleHRQcm92aWRlcihob3N0LCBvcHRpb25zKSAqL1xuICBjb25zdHJ1Y3Rvcihob3N0OiBIb3N0RWxlbWVudCwgY29udGV4dDogVCwgaW5pdGlhbFZhbHVlPzogQ29udGV4dFR5cGU8VD4pO1xuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBIb3N0RWxlbWVudCxcbiAgICBjb250ZXh0T3JPcHRpb25zOiBUIHwgT3B0aW9uczxUPixcbiAgICBpbml0aWFsVmFsdWU/OiBDb250ZXh0VHlwZTxUPlxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmNvbnRleHQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IChjb250ZXh0T3JPcHRpb25zIGFzIE9wdGlvbnM8VD4pLmluaXRpYWxWYWx1ZVxuICAgICAgICA6IGluaXRpYWxWYWx1ZVxuICAgICk7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICBpZiAoKGNvbnRleHRPck9wdGlvbnMgYXMgT3B0aW9uczxUPikuY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSAoY29udGV4dE9yT3B0aW9ucyBhcyBPcHRpb25zPFQ+KS5jb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0T3JPcHRpb25zIGFzIFQ7XG4gICAgfVxuICAgIHRoaXMuYXR0YWNoTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5ob3N0LmFkZENvbnRyb2xsZXI/Lih0aGlzKTtcbiAgfVxuXG4gIG9uQ29udGV4dFJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRSZXF1ZXN0RXZlbnQ8Q29udGV4dDx1bmtub3duLCB1bmtub3duPj5cbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gT25seSBjYWxsIHRoZSBjYWxsYmFjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCwgd2Ugd2FudCB0byBhdm9pZCB0aGUgZWxlbWVudCB0byBzZWxmLXJlZ2lzdGVyLlxuICAgIC8vIFRoZSBjaGVjayBvbiBjb21wb3NlZFBhdGggKGFzIG9wcG9zZWQgdG8gZXYudGFyZ2V0KSBpcyB0byBjb3ZlciBjYXNlc1xuICAgIC8vIHdoZXJlIHRoZSBjb25zdW1lciBpcyBpbiB0aGUgc2hhZG93RG9tIG9mIHRoZSBwcm92aWRlciAoaW4gd2hpY2ggY2FzZSxcbiAgICAvLyBldmVudC50YXJnZXQgPT09IHRoaXMuaG9zdCBiZWNhdXNlIG9mIGV2ZW50IHJldGFyZ2V0aW5nKS5cbiAgICBjb25zdCBjb25zdW1lckhvc3QgPSBldi5jb21wb3NlZFBhdGgoKVswXSBhcyBFbGVtZW50O1xuICAgIGlmIChldi5jb250ZXh0ICE9PSB0aGlzLmNvbnRleHQgfHwgY29uc3VtZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hZGRDYWxsYmFjayhldi5jYWxsYmFjaywgY29uc3VtZXJIb3N0LCBldi5zdWJzY3JpYmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGVuIHdlIGdldCBhIHByb3ZpZGVyIHJlcXVlc3QgZXZlbnQsIHRoYXQgbWVhbnMgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnRcbiAgICogaGFzIGp1c3Qgd29rZW4gdXAuIElmIGl0J3MgYSBwcm92aWRlciBvZiBvdXIgY29udGV4dCwgdGhlbiB3ZSBtYXkgbmVlZCB0b1xuICAgKiByZS1wYXJlbnQgb3VyIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgaXMgYSBtb3JlIHNwZWNpZmljIHByb3ZpZGVyIHRoYW4gdXNcbiAgICogZm9yIGl0cyBzdWJ0cmVlLlxuICAgKi9cbiAgb25Qcm92aWRlclJlcXVlc3QgPSAoXG4gICAgZXY6IENvbnRleHRQcm92aWRlckV2ZW50PENvbnRleHQ8dW5rbm93biwgdW5rbm93bj4+XG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIElnbm9yZSBldmVudHMgd2hlbiB0aGUgY29udGV4dCBkb2Vzbid0IG1hdGNoLlxuICAgIC8vIEFsc28sIGluIGNhc2UgYW4gZWxlbWVudCBpcyBhIGNvbnN1bWVyIEFORCBhIHByb3ZpZGVyXG4gICAgLy8gb2YgdGhlIHNhbWUgY29udGV4dCBpdCBzaG91bGRuJ3QgcHJvdmlkZSB0byBpdHNlbGYuXG4gICAgLy8gV2UgdXNlIGNvbXBvc2VkUGF0aCAoYXMgb3Bwb3NlZCB0byBldi50YXJnZXQpIHRvIGNvdmVyIGNhc2VzXG4gICAgLy8gd2hlcmUgdGhlIGNvbnN1bWVyIGlzIGluIHRoZSBzaGFkb3dEb20gb2YgdGhlIHByb3ZpZGVyIChpbiB3aGljaCBjYXNlLFxuICAgIC8vIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5ob3N0IGJlY2F1c2Ugb2YgZXZlbnQgcmV0YXJnZXRpbmcpLlxuICAgIGNvbnN0IGNoaWxkUHJvdmlkZXJIb3N0ID0gZXYuY29tcG9zZWRQYXRoKClbMF0gYXMgRWxlbWVudDtcbiAgICBpZiAoZXYuY29udGV4dCAhPT0gdGhpcy5jb250ZXh0IHx8IGNoaWxkUHJvdmlkZXJIb3N0ID09PSB0aGlzLmhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmUtcGFyZW50IGFsbCBvZiBvdXIgc3Vic2NyaXB0aW9ucyBpbiBjYXNlIHRoaXMgbmV3IGNoaWxkIHByb3ZpZGVyXG4gICAgLy8gc2hvdWxkIHRha2UgdGhlbSBvdmVyLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgZm9yIChjb25zdCBbY2FsbGJhY2ssIHtjb25zdW1lckhvc3R9XSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlIGNhc2Ugd2hlcmUgYSBvbmUgaG9zdCBlbGVtZW50XG4gICAgICAvLyBpcyBwcm92aWRpbmcgdGhlIHNhbWUgY29udGV4dCBtdWx0aXBsZSB0aW1lcy5cbiAgICAgIC8vXG4gICAgICAvLyBXaGlsZSBub3JtYWxseSBpdCdzIGEgbm8tb3AgdG8gYXR0ZW1wdCB0byByZS1wYXJlbnQgYSBzdWJzY3JpcHRpb25cbiAgICAgIC8vIHRoYXQgYWxyZWFkeSBoYXMgaXRzIHByb3BlciBwYXJlbnQsIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MgbW9yZVxuICAgICAgLy8gdGhhbiBvbmUgVmFsdWVQcm92aWRlciBmb3IgdGhlIHNhbWUgY29udGV4dCBvbiB0aGUgc2FtZSBob3N0RWxlbWVudCxcbiAgICAgIC8vIHRoZXkgd2lsbCBlYWNoIGNhbGwgdGhlIGNvbnN1bWVyLCBhbmQgc2luY2UgdGhleSB3aWxsIGVhY2ggaGF2ZSB0aGVpclxuICAgICAgLy8gb3duIGRpc3Bvc2UgZnVuY3Rpb24sIGEgd2VsbCBiZWhhdmVkIGNvbnN1bWVyIHdpbGwgbm90aWNlIHRoZSBjaGFuZ2VcbiAgICAgIC8vIGluIGRpc3Bvc2UgZnVuY3Rpb24gYW5kIGNhbGwgdGhlaXIgb2xkIG9uZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgdGhlIHN1YnNjcmlwdGlvbnMgdG8gdGhyYXNoLCBidXQgd29yc2UsIHdpdGhvdXQgdGhpc1xuICAgICAgLy8gc2V0IGNoZWNrIGhlcmUsIHdlIGNhbiBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCwgYXMgd2UgYWRkIGFuZCByZW1vdmVcbiAgICAgIC8vIHRoZSBzYW1lIHN1YnNjcmlwdGlvbnMgb250byB0aGUgZW5kIG9mIHRoZSBtYXAgb3ZlciBhbmQgb3Zlci5cbiAgICAgIGlmIChzZWVuLmhhcyhjYWxsYmFjaykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChjYWxsYmFjayk7XG4gICAgICBjb25zdW1lckhvc3QuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IENvbnRleHRSZXF1ZXN0RXZlbnQodGhpcy5jb250ZXh0LCBjYWxsYmFjaywgdHJ1ZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIHByaXZhdGUgYXR0YWNoTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXJlcXVlc3QnLCB0aGlzLm9uQ29udGV4dFJlcXVlc3QpO1xuICAgIHRoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0LXByb3ZpZGVyJywgdGhpcy5vblByb3ZpZGVyUmVxdWVzdCk7XG4gIH1cblxuICBob3N0Q29ubmVjdGVkKCk6IHZvaWQge1xuICAgIC8vIGVtaXQgYW4gZXZlbnQgdG8gc2lnbmFsIGEgcHJvdmlkZXIgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGNvbnRleHRcbiAgICB0aGlzLmhvc3QuZGlzcGF0Y2hFdmVudChuZXcgQ29udGV4dFByb3ZpZGVyRXZlbnQodGhpcy5jb250ZXh0KSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcbmltcG9ydCB7Q29udGV4dFByb3ZpZGVyfSBmcm9tICcuLi9jb250cm9sbGVycy9jb250ZXh0LXByb3ZpZGVyLmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0UHJvdmlkZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiBtYWtpbmcgaXQgcmVzcG9uZCB0byBhbnkgYGNvbnRleHQtcmVxdWVzdGAgZXZlbnRzIGZyb20gaXRzIGNoaWxkcmVuIGNvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBpZGVudGlmaWVyIHZhbHVlIGNyZWF0ZWQgdmlhIGBjcmVhdGVDb250ZXh0YFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnQGxpdC9jb250ZXh0JztcbiAqIGltcG9ydCB7TG9nZ2VyfSBmcm9tICdteS1sb2dnaW5nLWxpYnJhcnknO1xuICogaW1wb3J0IHtsb2dnZXJDb250ZXh0fSBmcm9tICcuL2xvZ2dlci1jb250ZXh0LmpzJztcbiAqXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcHJvdmlkZSh7Y29udGV4dDogbG9nZ2VyQ29udGV4dH0pXG4gKiAgIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZTxWYWx1ZVR5cGU+KHtcbiAgY29udGV4dDogY29udGV4dCxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xufSk6IFByb3ZpZGVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICAvLyBNYXAgb2YgaW5zdGFuY2VzIHRvIGNvbnRyb2xsZXJzXG4gICAgY29uc3QgY29udHJvbGxlck1hcCA9IG5ldyBXZWFrTWFwPFxuICAgICAgUmVhY3RpdmVFbGVtZW50LFxuICAgICAgQ29udGV4dFByb3ZpZGVyPENvbnRleHQ8dW5rbm93biwgVmFsdWVUeXBlPj5cbiAgICA+KCk7XG4gICAgaWYgKHR5cGVvZiBuYW1lT3JDb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU3RhbmRhcmQgZGVjb3JhdG9ycyBicmFuY2hcbiAgICAgIG5hbWVPckNvbnRleHQuYWRkSW5pdGlhbGl6ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb250cm9sbGVyTWFwLnNldCh0aGlzLCBuZXcgQ29udGV4dFByb3ZpZGVyKHRoaXMsIHtjb250ZXh0fSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHByb3RvT3JUYXJnZXQuZ2V0LmNhbGwodGhpcyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiBwcm90b09yVGFyZ2V0LnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiBWYWx1ZVR5cGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBjb250cm9sbGVyTWFwLnNldChlbGVtZW50LCBuZXcgQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQsIHtjb250ZXh0fSkpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgLy8gcHJveHkgYW55IGV4aXN0aW5nIHNldHRlciBmb3IgdGhpcyBwcm9wZXJ0eSBhbmQgdXNlIGl0IHRvXG4gICAgICAvLyBub3RpZnkgdGhlIGNvbnRyb2xsZXIgb2YgYW4gdXBkYXRlZCB2YWx1ZVxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHByb3RvT3JUYXJnZXQsXG4gICAgICAgIG5hbWVPckNvbnRleHRcbiAgICAgICk7XG4gICAgICBsZXQgbmV3RGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB2YWx1ZU1hcCA9IG5ldyBXZWFrTWFwPFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPigpO1xuICAgICAgICBuZXdEZXNjcmlwdG9yID0ge1xuICAgICAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZU1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVNYXAuc2V0KHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2xkU2V0dGVyID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgIG5ld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyTWFwLmdldCh0aGlzKSEuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgb2xkU2V0dGVyPy5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIG5ld0Rlc2NyaXB0b3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSkgYXMgUHJvdmlkZURlY29yYXRvcjxWYWx1ZVR5cGU+O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHB1YmxpYyBpbnRlcmZhY2UgdHlwZSB0aGF0IHJlbW92ZXMgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIGZpZWxkcy5cbiAqIFRoaXMgYWxsb3dzIGFjY2VwdGluZyBvdGhlcndpc2UgY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbnR5cGUgSW50ZXJmYWNlPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXTtcbn07XG5cbnR5cGUgUHJvdmlkZURlY29yYXRvcjxDb250ZXh0VHlwZT4gPSB7XG4gIC8vIGxlZ2FjeVxuICA8XG4gICAgSyBleHRlbmRzIFByb3BlcnR5S2V5LFxuICAgIFByb3RvIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgPihcbiAgICBwcm90b09yRGVzY3JpcHRvcjogUHJvdG8sXG4gICAgbmFtZT86IEtcbiAgKTogRmllbGRNdXN0TWF0Y2hDb250ZXh0VHlwZTxQcm90bywgSywgQ29udGV4dFR5cGU+O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxcbiAgICBDIGV4dGVuZHMgSW50ZXJmYWNlPE9taXQ8UmVhY3RpdmVFbGVtZW50LCAncmVuZGVyUm9vdCc+PixcbiAgICBWIGV4dGVuZHMgQ29udGV4dFR5cGUsXG4gID4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogdm9pZDtcbn07XG5cbi8vIE5vdGUgVHlwZVNjcmlwdCByZXF1aXJlcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBkZWNvcmF0b3IgdG8gYmUgYHZvaWQgfCBhbnlgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBEZWNvcmF0b3JSZXR1cm4gPSB2b2lkIHwgYW55O1xuXG50eXBlIEZpZWxkTXVzdE1hdGNoQ29udGV4dFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgQ29udGV4dFR5cGU+ID1cbiAgLy8gRmlyc3Qgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYSByZXF1aXJlZCBmaWVsZFxuICBPYmogZXh0ZW5kcyBSZWNvcmQ8S2V5LCBpbmZlciBQcm92aWRpbmdUeXBlPlxuICAgID8gLy8gT2ssIGl0IGRvZXMsIGp1c3QgY2hlY2sgd2hldGhlciBpdCdzIG9rIHRvIGFzc2lnbiB0aGVcbiAgICAgIC8vIHByb3ZpZGVkIHR5cGUgdG8gdGhlIGNvbnN1bWluZyBmaWVsZFxuICAgICAgW1Byb3ZpZGluZ1R5cGVdIGV4dGVuZHMgW0NvbnRleHRUeXBlXVxuICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgIDoge1xuICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRpbmcgZmllbGQgbm90IGFzc2lnbmFibGUgdG8gY29udGV4dCc7XG4gICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgcHJvdmlkZWQ6IFByb3ZpZGluZ1R5cGU7XG4gICAgICAgIH1cbiAgICA6IC8vIE5leHQgd2UgY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkgYXMgYW4gb3B0aW9uYWwgZmllbGRcbiAgICAgIE9iaiBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtleSwgaW5mZXIgUHJvdmlkaW5nPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgcHJvdmlkaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkaW5nIHwgdW5kZWZpbmVkXSBleHRlbmRzIFtDb250ZXh0VHlwZV1cbiAgICAgICAgPyBEZWNvcmF0b3JSZXR1cm5cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAncHJvdmlkaW5nIGZpZWxkIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnRleHQnO1xuICAgICAgICAgICAgY29udGV4dDogQ29udGV4dFR5cGU7XG4gICAgICAgICAgICBjb25zdW1pbmc6IFByb3ZpZGluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICA6IC8vIE9rLCB0aGUgZmllbGQgaXNuJ3QgcHJlc2VudCwgc28gZWl0aGVyIHNvbWVvbmUncyB1c2luZyBwcm92aWRlXG4gICAgICAgIC8vIG1hbnVhbGx5LCBpLmUuIG5vdCBhcyBhIGRlY29yYXRvciAobWF5YmUgZG9uJ3QgZG8gdGhhdCEgYnV0IGlmIHlvdSBkbyxcbiAgICAgICAgLy8geW91J3JlIG9uIHlvdXIgb3duIGZvciB5b3VyIHR5cGUgY2hlY2tpbmcsIHNvcnJ5KSwgb3IgdGhlIGZpZWxkIGlzXG4gICAgICAgIC8vIHByaXZhdGUsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3QgY2hlY2sgaXQuXG4gICAgICAgIERlY29yYXRvclJldHVybjtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge0NvbnRleHRDb25zdW1lcn0gZnJvbSAnLi4vY29udHJvbGxlcnMvY29udGV4dC1jb25zdW1lci5qcyc7XG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2NyZWF0ZS1jb250ZXh0LmpzJztcblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuLyoqXG4gKiBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGFkZHMgYSBDb250ZXh0Q29uc3VtZXIgY29udHJvbGxlciB0byB0aGUgY29tcG9uZW50XG4gKiB3aGljaCB3aWxsIHRyeSBhbmQgcmV0cmlldmUgYSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHZpYSB0aGUgQ29udGV4dCBBUEkuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IGlkZW50aWZpZXIgdmFsdWUgY3JlYXRlZCB2aWEgYGNyZWF0ZUNvbnRleHRgXG4gKiBAcGFyYW0gc3Vic2NyaWJlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIGFsbG93cyB0aGUgdmFsdWUgdG8gYmUgdXBkYXRlZFxuICogICBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2NvbnN1bWV9IGZyb20gJ0BsaXQvY29udGV4dCc7XG4gKiBpbXBvcnQge2xvZ2dlckNvbnRleHQsIExvZ2dlcn0gZnJvbSAnY29tbXVuaXR5LXByb3RvY29scy9sb2dnZXInO1xuICpcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBjb25zdW1lKHtjb250ZXh0OiBsb2dnZXJDb250ZXh0fSlcbiAqICAgbG9nZ2VyPzogTG9nZ2VyO1xuICpcbiAqICAgZG9UaGluZygpIHtcbiAqICAgICB0aGlzLmxvZ2dlciEubG9nKCd0aGluZyB3YXMgZG9uZScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWU8VmFsdWVUeXBlPih7XG4gIGNvbnRleHQsXG4gIHN1YnNjcmliZSxcbn06IHtcbiAgY29udGV4dDogQ29udGV4dDx1bmtub3duLCBWYWx1ZVR5cGU+O1xuICBzdWJzY3JpYmU/OiBib29sZWFuO1xufSk6IENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiB7XG4gIHJldHVybiAoKFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8UmVhY3RpdmVFbGVtZW50LCBWYWx1ZVR5cGU+LFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PFJlYWN0aXZlRWxlbWVudCwgVmFsdWVUeXBlPlxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgbmFtZU9yQ29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5ldyBDb250ZXh0Q29uc3VtZXIodGhpcywge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgY2FsbGJhY2s6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcHJvdG9PclRhcmdldC5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIGJyYW5jaFxuICAgICAgKHByb3RvT3JUYXJnZXQuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuYWRkSW5pdGlhbGl6ZXIoXG4gICAgICAgIChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXcgQ29udGV4dENvbnN1bWVyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBjYWxsYmFjazogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgIChlbGVtZW50IGFzIGFueSlbbmFtZU9yQ29udGV4dF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBDb25zdW1lRGVjb3JhdG9yPFZhbHVlVHlwZT47XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcHVibGljIGludGVyZmFjZSB0eXBlIHRoYXQgcmVtb3ZlcyBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgZmllbGRzLlxuICogVGhpcyBhbGxvd3MgYWNjZXB0aW5nIG90aGVyd2lzZSBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgdGhlIHR5cGUgKGUuZy4gZnJvbVxuICogbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHBhY2thZ2UgaW4gYG5vZGVfbW9kdWxlc2ApLlxuICovXG50eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG50eXBlIENvbnN1bWVEZWNvcmF0b3I8VmFsdWVUeXBlPiA9IHtcbiAgLy8gbGVnYWN5XG4gIDxcbiAgICBLIGV4dGVuZHMgUHJvcGVydHlLZXksXG4gICAgUHJvdG8gZXh0ZW5kcyBJbnRlcmZhY2U8T21pdDxSZWFjdGl2ZUVsZW1lbnQsICdyZW5kZXJSb290Jz4+LFxuICA+KFxuICAgIHByb3RvT3JEZXNjcmlwdG9yOiBQcm90byxcbiAgICBuYW1lPzogS1xuICApOiBGaWVsZE11c3RNYXRjaFByb3ZpZGVkVHlwZTxQcm90bywgSywgVmFsdWVUeXBlPjtcblxuICAvLyBzdGFuZGFyZFxuICA8XG4gICAgQyBleHRlbmRzIEludGVyZmFjZTxPbWl0PFJlYWN0aXZlRWxlbWVudCwgJ3JlbmRlclJvb3QnPj4sXG4gICAgViBleHRlbmRzIFZhbHVlVHlwZSxcbiAgPihcbiAgICB2YWx1ZTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPixcbiAgICBjb250ZXh0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICApOiB2b2lkO1xufTtcblxuLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGRlY29yYXRvciB0byBiZSBgdm9pZCB8IGFueWBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIERlY29yYXRvclJldHVybiA9IHZvaWQgfCBhbnk7XG5cbnR5cGUgRmllbGRNdXN0TWF0Y2hQcm92aWRlZFR5cGU8T2JqLCBLZXkgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgUHJvdmlkZWRUeXBlPiA9XG4gIC8vIEZpcnN0IHdlIGNoZWNrIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5IGFzIGEgcmVxdWlyZWQgZmllbGRcbiAgT2JqIGV4dGVuZHMgUmVjb3JkPEtleSwgaW5mZXIgQ29uc3VtaW5nVHlwZT5cbiAgICA/IC8vIE9rLCBpdCBkb2VzLCBqdXN0IGNoZWNrIHdoZXRoZXIgaXQncyBvayB0byBhc3NpZ24gdGhlXG4gICAgICAvLyBwcm92aWRlZCB0eXBlIHRvIHRoZSBjb25zdW1pbmcgZmllbGRcbiAgICAgIFtQcm92aWRlZFR5cGVdIGV4dGVuZHMgW0NvbnN1bWluZ1R5cGVdXG4gICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgOiB7XG4gICAgICAgICAgbWVzc2FnZTogJ3Byb3ZpZGVkIHR5cGUgbm90IGFzc2lnbmFibGUgdG8gY29uc3VtaW5nIGZpZWxkJztcbiAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgIGNvbnN1bWluZzogQ29uc3VtaW5nVHlwZTtcbiAgICAgICAgfVxuICAgIDogLy8gTmV4dCB3ZSBjaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eSBhcyBhbiBvcHRpb25hbCBmaWVsZFxuICAgICAgT2JqIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8S2V5LCBpbmZlciBDb25zdW1pbmdUeXBlPj5cbiAgICAgID8gLy8gQ2hlY2sgYXNzaWduYWJpbGl0eSBhZ2Fpbi4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gaW5jbHVkZSB1bmRlZmluZWRcbiAgICAgICAgLy8gaGVyZSBvbiB0aGUgY29uc3VtaW5nIHR5cGUgYmVjYXVzZSBpdCdzIG9wdGlvbmFsLlxuICAgICAgICBbUHJvdmlkZWRUeXBlXSBleHRlbmRzIFtDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkXVxuICAgICAgICA/IERlY29yYXRvclJldHVyblxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdwcm92aWRlZCB0eXBlIG5vdCBhc3NpZ25hYmxlIHRvIGNvbnN1bWluZyBmaWVsZCc7XG4gICAgICAgICAgICBwcm92aWRlZDogUHJvdmlkZWRUeXBlO1xuICAgICAgICAgICAgY29uc3VtaW5nOiBDb25zdW1pbmdUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgIDogLy8gT2ssIHRoZSBmaWVsZCBpc24ndCBwcmVzZW50LCBzbyBlaXRoZXIgc29tZW9uZSdzIHVzaW5nIGNvbnN1bWVcbiAgICAgICAgLy8gbWFudWFsbHksIGkuZS4gbm90IGFzIGEgZGVjb3JhdG9yIChtYXliZSBkb24ndCBkbyB0aGF0ISBidXQgaWYgeW91IGRvLFxuICAgICAgICAvLyB5b3UncmUgb24geW91ciBvd24gZm9yIHlvdXIgdHlwZSBjaGVja2luZywgc29ycnkpLCBvciB0aGUgZmllbGQgaXNcbiAgICAgICAgLy8gcHJpdmF0ZSwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndCBjaGVjayBpdC5cbiAgICAgICAgRGVjb3JhdG9yUmV0dXJuO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG50eXBlIEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIFtLIGluIGtleW9mIEFSSUFNaXhpbl06IHN0cmluZztcbn07XG5cbi8qKlxuICogTWFwIG9mIEFSSUFNaXhpbiBwcm9wZXJ0aWVzIHRvIGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGFyaWFNaXhpbkF0dHJpYnV0ZXM6IEFSSUFBdHRyaWJ1dGVNYXAgPSB7XG4gIGFyaWFBdG9taWM6ICdhcmlhLWF0b21pYycsXG4gIGFyaWFBdXRvQ29tcGxldGU6ICdhcmlhLWF1dG9jb21wbGV0ZScsXG4gIGFyaWFCcmFpbGxlTGFiZWw6ICdhcmlhLWJyYWlsbGVsYWJlbCcsXG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uOiAnYXJpYS1icmFpbGxlcm9sZWRlc2NyaXB0aW9uJyxcbiAgYXJpYUJ1c3k6ICdhcmlhLWJ1c3knLFxuICBhcmlhQ2hlY2tlZDogJ2FyaWEtY2hlY2tlZCcsXG4gIGFyaWFDb2xDb3VudDogJ2FyaWEtY29sY291bnQnLFxuICBhcmlhQ29sSW5kZXg6ICdhcmlhLWNvbGluZGV4JyxcbiAgYXJpYUNvbFNwYW46ICdhcmlhLWNvbHNwYW4nLFxuICBhcmlhQ3VycmVudDogJ2FyaWEtY3VycmVudCcsXG4gIGFyaWFEZXNjcmlwdGlvbjogJ2FyaWEtZGVzY3JpcHRpb24nLFxuICBhcmlhRGlzYWJsZWQ6ICdhcmlhLWRpc2FibGVkJyxcbiAgYXJpYUV4cGFuZGVkOiAnYXJpYS1leHBhbmRlZCcsXG4gIGFyaWFIYXNQb3B1cDogJ2FyaWEtaGFzcG9wdXAnLFxuICBhcmlhSGlkZGVuOiAnYXJpYS1oaWRkZW4nLFxuICBhcmlhSW52YWxpZDogJ2FyaWEtaW52YWxpZCcsXG4gIGFyaWFLZXlTaG9ydGN1dHM6ICdhcmlhLWtleXNob3J0Y3V0cycsXG4gIGFyaWFMYWJlbDogJ2FyaWEtbGFiZWwnLFxuICBhcmlhTGV2ZWw6ICdhcmlhLWxldmVsJyxcbiAgYXJpYUxpdmU6ICdhcmlhLWxpdmUnLFxuICBhcmlhTW9kYWw6ICdhcmlhLW1vZGFsJyxcbiAgYXJpYU11bHRpTGluZTogJ2FyaWEtbXVsdGlsaW5lJyxcbiAgYXJpYU11bHRpU2VsZWN0YWJsZTogJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJyxcbiAgYXJpYU9yaWVudGF0aW9uOiAnYXJpYS1vcmllbnRhdGlvbicsXG4gIGFyaWFQbGFjZWhvbGRlcjogJ2FyaWEtcGxhY2Vob2xkZXInLFxuICBhcmlhUG9zSW5TZXQ6ICdhcmlhLXBvc2luc2V0JyxcbiAgYXJpYVByZXNzZWQ6ICdhcmlhLXByZXNzZWQnLFxuICBhcmlhUmVhZE9ubHk6ICdhcmlhLXJlYWRvbmx5JyxcbiAgYXJpYVJlcXVpcmVkOiAnYXJpYS1yZXF1aXJlZCcsXG4gIGFyaWFSb2xlRGVzY3JpcHRpb246ICdhcmlhLXJvbGVkZXNjcmlwdGlvbicsXG4gIGFyaWFSb3dDb3VudDogJ2FyaWEtcm93Y291bnQnLFxuICBhcmlhUm93SW5kZXg6ICdhcmlhLXJvd2luZGV4JyxcbiAgYXJpYVJvd1NwYW46ICdhcmlhLXJvd3NwYW4nLFxuICBhcmlhU2VsZWN0ZWQ6ICdhcmlhLXNlbGVjdGVkJyxcbiAgYXJpYVNldFNpemU6ICdhcmlhLXNldHNpemUnLFxuICBhcmlhU29ydDogJ2FyaWEtc29ydCcsXG4gIGFyaWFWYWx1ZU1heDogJ2FyaWEtdmFsdWVtYXgnLFxuICBhcmlhVmFsdWVNaW46ICdhcmlhLXZhbHVlbWluJyxcbiAgYXJpYVZhbHVlTm93OiAnYXJpYS12YWx1ZW5vdycsXG4gIGFyaWFWYWx1ZVRleHQ6ICdhcmlhLXZhbHVldGV4dCcsXG4gIHJvbGU6ICdyb2xlJyxcbn07XG5cbnR5cGUgRWxlbWVudEludGVybmFsc0ludGVyZmFjZSA9IEVsZW1lbnRJbnRlcm5hbHM7XG5cbi8vIFNoaW0gdGhlIGdsb2JhbCBlbGVtZW50IGludGVybmFscyBvYmplY3Rcbi8vIE1ldGhvZHMgc2hvdWxkIGJlIGZpbmUgYXMgbm9vcHMgYW5kIHByb3BlcnRpZXMgY2FuIGdlbmVyYWxseVxuLy8gYmUgd2hpbGUgb24gdGhlIHNlcnZlci5cbmV4cG9ydCBjb25zdCBFbGVtZW50SW50ZXJuYWxzU2hpbSA9IGNsYXNzIEVsZW1lbnRJbnRlcm5hbHNcbiAgaW1wbGVtZW50cyBFbGVtZW50SW50ZXJuYWxzSW50ZXJmYWNlXG57XG4gIGFyaWFBdG9taWMgPSAnJztcbiAgYXJpYUF1dG9Db21wbGV0ZSA9ICcnO1xuICBhcmlhQnJhaWxsZUxhYmVsID0gJyc7XG4gIGFyaWFCcmFpbGxlUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFCdXN5ID0gJyc7XG4gIGFyaWFDaGVja2VkID0gJyc7XG4gIGFyaWFDb2xDb3VudCA9ICcnO1xuICBhcmlhQ29sSW5kZXggPSAnJztcbiAgYXJpYUNvbFNwYW4gPSAnJztcbiAgYXJpYUN1cnJlbnQgPSAnJztcbiAgYXJpYURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFEaXNhYmxlZCA9ICcnO1xuICBhcmlhRXhwYW5kZWQgPSAnJztcbiAgYXJpYUhhc1BvcHVwID0gJyc7XG4gIGFyaWFIaWRkZW4gPSAnJztcbiAgYXJpYUludmFsaWQgPSAnJztcbiAgYXJpYUtleVNob3J0Y3V0cyA9ICcnO1xuICBhcmlhTGFiZWwgPSAnJztcbiAgYXJpYUxldmVsID0gJyc7XG4gIGFyaWFMaXZlID0gJyc7XG4gIGFyaWFNb2RhbCA9ICcnO1xuICBhcmlhTXVsdGlMaW5lID0gJyc7XG4gIGFyaWFNdWx0aVNlbGVjdGFibGUgPSAnJztcbiAgYXJpYU9yaWVudGF0aW9uID0gJyc7XG4gIGFyaWFQbGFjZWhvbGRlciA9ICcnO1xuICBhcmlhUG9zSW5TZXQgPSAnJztcbiAgYXJpYVByZXNzZWQgPSAnJztcbiAgYXJpYVJlYWRPbmx5ID0gJyc7XG4gIGFyaWFSZXF1aXJlZCA9ICcnO1xuICBhcmlhUm9sZURlc2NyaXB0aW9uID0gJyc7XG4gIGFyaWFSb3dDb3VudCA9ICcnO1xuICBhcmlhUm93SW5kZXggPSAnJztcbiAgYXJpYVJvd1NwYW4gPSAnJztcbiAgYXJpYVNlbGVjdGVkID0gJyc7XG4gIGFyaWFTZXRTaXplID0gJyc7XG4gIGFyaWFTb3J0ID0gJyc7XG4gIGFyaWFWYWx1ZU1heCA9ICcnO1xuICBhcmlhVmFsdWVNaW4gPSAnJztcbiAgYXJpYVZhbHVlTm93ID0gJyc7XG4gIGFyaWFWYWx1ZVRleHQgPSAnJztcbiAgcm9sZSA9ICcnO1xuICBfX2hvc3Q6IEhUTUxFbGVtZW50O1xuICBnZXQgc2hhZG93Um9vdCgpIHtcbiAgICAvLyBHcmFiIHRoZSBzaGFkb3cgcm9vdCBpbnN0YW5jZSBmcm9tIHRoZSBFbGVtZW50IHNoaW1cbiAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc2hhZG93IHJvb3QgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIC8vIHRvIHRoZSBpbnRlcm5hbHMgaW5zdGFuY2UgZXZlbiBpZiB0aGUgbW9kZSBpcyAnY2xvc2VkJ1xuICAgIHJldHVybiAodGhpcy5fX2hvc3QgYXMgSFRNTEVsZW1lbnQgJiB7X19zaGFkb3dSb290OiBTaGFkb3dSb290fSlcbiAgICAgIC5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgY29uc3RydWN0b3IoX2hvc3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fX2hvc3QgPSBfaG9zdDtcbiAgfVxuICBjaGVja1ZhbGlkaXR5KCkge1xuICAgIC8vIFRPRE8oYXVndXN0amspIENvbnNpZGVyIGFjdHVhbGx5IGltcGxlbWVudGluZyBsb2dpYy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzM3NDBcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYEVsZW1lbnRJbnRlcm5hbHMuY2hlY2tWYWxpZGl0eSgpYCB3YXMgY2FsbGVkIG9uIHRoZSBzZXJ2ZXIuJyArXG4gICAgICAgICdUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0cnVlLidcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvcm0gPSBudWxsO1xuICBsYWJlbHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8SFRNTExhYmVsRWxlbWVudD47XG4gIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldEZvcm1WYWx1ZSgpOiB2b2lkIHt9XG4gIHNldFZhbGlkaXR5KCk6IHZvaWQge31cbiAgc3RhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIHZhbGlkaXR5ID0ge30gYXMgVmFsaWRpdHlTdGF0ZTtcbiAgd2lsbFZhbGlkYXRlID0gdHJ1ZTtcbn07XG5cbmNvbnN0IEVsZW1lbnRJbnRlcm5hbHNTaGltV2l0aFJlYWxUeXBlID1cbiAgRWxlbWVudEludGVybmFsc1NoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50SW50ZXJuYWxzO1xuZXhwb3J0IHtFbGVtZW50SW50ZXJuYWxzU2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50SW50ZXJuYWxzfTtcblxuZXhwb3J0IGNvbnN0IEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYID0gJ2h5ZHJhdGUtaW50ZXJuYWxzLSc7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQge0VsZW1lbnRJbnRlcm5hbHNTaGltfSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmV4cG9ydCB7XG4gIGFyaWFNaXhpbkF0dHJpYnV0ZXMsXG4gIEVsZW1lbnRJbnRlcm5hbHMsXG4gIEhZRFJBVEVfSU5URVJOQUxTX0FUVFJfUFJFRklYLFxufSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgV2Vha01hcDxcbiAgSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+LFxuICBNYXA8c3RyaW5nLCBzdHJpbmc+XG4+KCk7XG5jb25zdCBhdHRyaWJ1dGVzRm9yRWxlbWVudCA9IChcbiAgZWxlbWVudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+XG4pID0+IHtcbiAgbGV0IGF0dHJzID0gYXR0cmlidXRlcy5nZXQoZWxlbWVudCk7XG4gIGlmIChhdHRycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXR0cmlidXRlcy5zZXQoZWxlbWVudCwgKGF0dHJzID0gbmV3IE1hcCgpKSk7XG4gIH1cbiAgcmV0dXJuIGF0dHJzO1xufTtcblxuLy8gVGhlIHR5cGluZ3MgYXJvdW5kIHRoZSBleHBvcnRzIGJlbG93IGFyZSBhIGxpdHRsZSBmdW5reTpcbi8vXG4vLyAxLiBXZSB3YW50IHRoZSBgbmFtZWAgb2YgdGhlIHNoaW0gY2xhc3NlcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzIGF0IHJ1bnRpbWUsXG4vLyAgICBoZW5jZSBlLmcuIGBjbGFzcyBFbGVtZW50YC5cbi8vIDIuIFdlIGNhbid0IHNoYWRvdyB0aGUgZ2xvYmFsIHR5cGVzIHdpdGggYSBzaW1wbGUgY2xhc3MgZGVjbGFyYXRpb24sIGJlY2F1c2Vcbi8vICAgIHRoZW4gd2UgY2FuJ3QgcmVmZXJlbmNlIHRoZSBnbG9iYWwgdHlwZXMgZm9yIGNhc3RpbmcsIGhlbmNlIGUuZy5cbi8vICAgIGBjb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnRgLlxuLy8gMy4gV2Ugd2FudCB0byBleHBvcnQgdGhlIGNsYXNzZXMgdHlwZWQgYXMgdGhlIHJlYWwgb25lcywgaGVuY2UgZS5nLlxuLy8gICAgYGNvbnN0IEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID0gRWxlbWVudFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50O2AuXG4vLyA0LiBXZSB3YW50IHRoZSBleHBvcnRlZCBuYW1lcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzLCBoZW5jZSBlLmcuXG4vLyAgICBgZXhwb3J0IHtFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50fWAuXG5jb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnQge1xuICBnZXQgYXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhdHRyaWJ1dGVzRm9yRWxlbWVudCh0aGlzKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pKTtcbiAgfVxuICBwcml2YXRlIF9fc2hhZG93Um9vdE1vZGU6IG51bGwgfCBTaGFkb3dSb290TW9kZSA9IG51bGw7XG4gIHByb3RlY3RlZCBfX3NoYWRvd1Jvb3Q6IG51bGwgfCBTaGFkb3dSb290ID0gbnVsbDtcbiAgcHJvdGVjdGVkIF9faW50ZXJuYWxzOiBudWxsIHwgRWxlbWVudEludGVybmFscyA9IG51bGw7XG5cbiAgZ2V0IHNoYWRvd1Jvb3QoKSB7XG4gICAgaWYgKHRoaXMuX19zaGFkb3dSb290TW9kZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgZ2V0IGxvY2FsTmFtZSgpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZTtcbiAgfVxuICBnZXQgdGFnTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU/LnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBFbXVsYXRlIGJyb3dzZXIgYmVoYXZpb3IgdGhhdCBzaWxlbnRseSBjYXN0cyBhbGwgdmFsdWVzIHRvIHN0cmluZy4gRS5nLlxuICAgIC8vIGA0MmAgYmVjb21lcyBgXCI0MlwiYCBhbmQgYHt9YCBiZWNvbWVzIGBcIltvYmplY3QgT2JqZWN0XVwiXCJgLlxuICAgIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLnNldChuYW1lLCBTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZW1vdmVBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZGVsZXRlKG5hbWUpO1xuICB9XG4gIHRvZ2dsZUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIFN0ZXBzIHJlZmVyZW5jZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1lbGVtZW50LXRvZ2dsZWF0dHJpYnV0ZVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgLy8gU3RlcCA1XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCAhZm9yY2UpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA0XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCBmb3JjZSkge1xuICAgICAgICAvLyBTdGVwIDQuMVxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RlcCA0LjJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTdGVwIDZcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBoYXNBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLmhhcyhuYW1lKTtcbiAgfVxuICBhdHRhY2hTaGFkb3coaW5pdDogU2hhZG93Um9vdEluaXQpOiBTaGFkb3dSb290IHtcbiAgICBjb25zdCBzaGFkb3dSb290ID0ge2hvc3Q6IHRoaXN9IGFzIG9iamVjdCBhcyBTaGFkb3dSb290O1xuICAgIHRoaXMuX19zaGFkb3dSb290TW9kZSA9IGluaXQubW9kZTtcbiAgICBpZiAoaW5pdCAmJiBpbml0Lm1vZGUgPT09ICdvcGVuJykge1xuICAgICAgdGhpcy5fX3NoYWRvd1Jvb3QgPSBzaGFkb3dSb290O1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93Um9vdDtcbiAgfVxuICBhdHRhY2hJbnRlcm5hbHMoKTogRWxlbWVudEludGVybmFscyB7XG4gICAgaWYgKHRoaXMuX19pbnRlcm5hbHMgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlICdhdHRhY2hJbnRlcm5hbHMnIG9uICdIVE1MRWxlbWVudCc6IGAgK1xuICAgICAgICAgIGBFbGVtZW50SW50ZXJuYWxzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgd2FzIGFscmVhZHkgYXR0YWNoZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJuYWxzID0gbmV3IEVsZW1lbnRJbnRlcm5hbHNTaGltKHRoaXMgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5fX2ludGVybmFscyA9IGludGVybmFscztcbiAgICByZXR1cm4gaW50ZXJuYWxzIGFzIEVsZW1lbnRJbnRlcm5hbHM7XG4gIH1cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZ2V0KG5hbWUpO1xuICAgIHJldHVybiB2YWx1ZSA/PyBudWxsO1xuICB9XG59O1xuY29uc3QgRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgPSBFbGVtZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEVsZW1lbnQ7XG5leHBvcnQge0VsZW1lbnRTaGltV2l0aFJlYWxUeXBlIGFzIEVsZW1lbnR9O1xuXG5jb25zdCBIVE1MRWxlbWVudFNoaW0gPSBjbGFzcyBIVE1MRWxlbWVudCBleHRlbmRzIEVsZW1lbnRTaGltIHt9O1xuY29uc3QgSFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID1cbiAgSFRNTEVsZW1lbnRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgSFRNTEVsZW1lbnQ7XG5leHBvcnQge0hUTUxFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBIVE1MRWxlbWVudH07XG5cbmludGVyZmFjZSBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgbmV3ICgpOiBIVE1MRWxlbWVudDtcbiAgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBOYW1lZEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3JcbiAgZXh0ZW5kcyBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgX19sb2NhbE5hbWU6IHN0cmluZztcbn1cblxudHlwZSBDdXN0b21FbGVtZW50UmVnaXN0cmF0aW9uID0ge1xuICBjdG9yOiB7bmV3ICgpOiBIVE1MRWxlbWVudH07XG4gIG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW107XG59O1xuXG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltID0gY2xhc3MgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfX2RlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRSZWdpc3RyYXRpb24+KCk7XG5cbiAgZGVmaW5lKG5hbWU6IHN0cmluZywgY3RvcjogQ3VzdG9tSFRNTEVsZW1lbnRDb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0aGlzLl9fZGVmaW5pdGlvbnMuaGFzKG5hbWUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JyBhbHJlYWR5IGhhcyBcIiR7bmFtZX1cIiBkZWZpbmVkLiBgICtcbiAgICAgICAgICAgIGBUaGlzIG1heSBoYXZlIGJlZW4gY2F1c2VkIGJ5IGxpdmUgcmVsb2FkIG9yIGhvdCBtb2R1bGUgYCArXG4gICAgICAgICAgICBgcmVwbGFjZW1lbnQgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuXFxuYCArXG4gICAgICAgICAgICBgTWFrZSBzdXJlIHRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbiB3aXRoIGEgcHJvZHVjdGlvbiBidWlsZCBhcyBgICtcbiAgICAgICAgICAgIGByZXBlYXQgcmVnaXN0cmF0aW9ucyB3aWxsIHRocm93IGluIHByb2R1Y3Rpb24uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSAnZGVmaW5lJyBvbiAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JzogYCArXG4gICAgICAgICAgICBgdGhlIG5hbWUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggdGhpcyByZWdpc3RyeWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUHJvdmlkZSB0YWdOYW1lIGFuZCBsb2NhbE5hbWUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgKGN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fX2RlZmluaXRpb25zLnNldChuYW1lLCB7XG4gICAgICBjdG9yLFxuICAgICAgLy8gTm90ZSBpdCdzIGltcG9ydGFudCB3ZSByZWFkIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGluIGNhc2UgaXQgaXMgYSBnZXR0ZXJcbiAgICAgIC8vIHdpdGggc2lkZS1lZmZlY3RzLCBhcyBpcyB0aGUgY2FzZSBpbiBMaXQsIHdoZXJlIGl0IHRyaWdnZXJzIGNsYXNzXG4gICAgICAvLyBmaW5hbGl6YXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gVE9ETyhhb21hcmtzKSBUbyBiZSBzcGVjIGNvbXBsaWFudCwgd2Ugc2hvdWxkIGFsc28gY2FwdHVyZSB0aGVcbiAgICAgIC8vIHJlZ2lzdHJhdGlvbi10aW1lIGxpZmVjeWNsZSBtZXRob2RzIGxpa2UgYGNvbm5lY3RlZENhbGxiYWNrYC4gRm9yIHRoZW1cbiAgICAgIC8vIHRvIGJlIGFjdHVhbGx5IGFjY2Vzc2libGUgdG8gZS5nLiB0aGUgTGl0IFNTUiBlbGVtZW50IHJlbmRlcmVyLCB0aG91Z2gsXG4gICAgICAvLyB3ZSdkIG5lZWQgdG8gaW50cm9kdWNlIGEgbmV3IEFQSSBmb3IgYWNjZXNzaW5nIHRoZW0gKHNpbmNlIGBnZXRgIG9ubHlcbiAgICAgIC8vIHJldHVybnMgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIG9ic2VydmVkQXR0cmlidXRlczogY3Rvci5vYnNlcnZlZEF0dHJpYnV0ZXMgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMuX19kZWZpbml0aW9ucy5nZXQobmFtZSk7XG4gICAgcmV0dXJuIGRlZmluaXRpb24/LmN0b3I7XG4gIH1cbn07XG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlID1cbiAgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEN1c3RvbUVsZW1lbnRSZWdpc3RyeTtcbmV4cG9ydCB7Q3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSBhcyBDdXN0b21FbGVtZW50UmVnaXN0cnl9O1xuXG5leHBvcnQgY29uc3QgY3VzdG9tRWxlbWVudHMgPSBuZXcgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSgpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBgYWRvcHRlZFN0eWxlU2hlZXRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0czogYm9vbGVhbiA9XG4gIGdsb2JhbC5TaGFkb3dSb290ICYmXG4gIChnbG9iYWwuU2hhZHlDU1MgPT09IHVuZGVmaW5lZCB8fCBnbG9iYWwuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJlxuICAnYWRvcHRlZFN0eWxlU2hlZXRzJyBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiZcbiAgJ3JlcGxhY2UnIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4vKipcbiAqIEEgQ1NTUmVzdWx0IG9yIG5hdGl2ZSBDU1NTdHlsZVNoZWV0LlxuICpcbiAqIEluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBjb25zdHJ1Y3RpYmxlIENTUyBzdHlsZSBzaGVldHMsIENTU1N0eWxlU2hlZXRcbiAqIG9iamVjdCBjYW4gYmUgdXNlZCBmb3Igc3R5bGluZyBhbG9uZyBzaWRlIENTU1Jlc3VsdCBmcm9tIHRoZSBgY3NzYFxuICogdGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRPck5hdGl2ZSA9IENTU1Jlc3VsdCB8IENTU1N0eWxlU2hlZXQ7XG5cbmV4cG9ydCB0eXBlIENTU1Jlc3VsdEFycmF5ID0gQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmUgfCBDU1NSZXN1bHRBcnJheT47XG5cbi8qKlxuICogQSBzaW5nbGUgQ1NTUmVzdWx0LCBDU1NTdHlsZVNoZWV0LCBvciBhbiBhcnJheSBvciBuZXN0ZWQgYXJyYXlzIG9mIHRob3NlLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRHcm91cCA9IENTU1Jlc3VsdE9yTmF0aXZlIHwgQ1NTUmVzdWx0QXJyYXk7XG5cbmNvbnN0IGNvbnN0cnVjdGlvblRva2VuID0gU3ltYm9sKCk7XG5cbmNvbnN0IGNzc1RhZ0NhY2hlID0gbmV3IFdlYWtNYXA8VGVtcGxhdGVTdHJpbmdzQXJyYXksIENTU1N0eWxlU2hlZXQ+KCk7XG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgc3RyaW5nIG9mIENTUyB0ZXh0LCB0aGF0IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhIENTU1N0eWxlU2hlZXQuXG4gKlxuICogQ1NTUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNzc2AtdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxzIGFuZFxuICogYHVuc2FmZUNTUygpYC4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgQ1NTUmVzdWx0cyBhcmUgb25seSBjcmVhdGVkIHZpYSB0aGVcbiAqIGBjc3NgIHRhZyBhbmQgYHVuc2FmZUNTUygpYCwgQ1NTUmVzdWx0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNsYXNzIENTU1Jlc3VsdCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIFsnXyRjc3NSZXN1bHQkJ10gPSB0cnVlO1xuICByZWFkb25seSBjc3NUZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N0eWxlU2hlZXQ/OiBDU1NTdHlsZVNoZWV0O1xuICBwcml2YXRlIF9zdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGNzc1RleHQ6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZCxcbiAgICBzYWZlVG9rZW46IHN5bWJvbFxuICApIHtcbiAgICBpZiAoc2FmZVRva2VuICE9PSBjb25zdHJ1Y3Rpb25Ub2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNzc1RleHQgPSBjc3NUZXh0O1xuICAgIHRoaXMuX3N0cmluZ3MgPSBzdHJpbmdzO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBhIGdldHRlciBzbyB0aGF0IGl0J3MgbGF6eS4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgc3R5bGVzaGVldHNcbiAgLy8gYXJlIG5vdCBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBlbGVtZW50IGluc3RhbmNlIGlzIG1hZGUuXG4gIGdldCBzdHlsZVNoZWV0KCk6IENTU1N0eWxlU2hlZXQgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIGBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHNgIGlzIHRydWUgdGhlbiB3ZSBhc3N1bWUgQ1NTU3R5bGVTaGVldCBpc1xuICAgIC8vIGNvbnN0cnVjdGFibGUuXG4gICAgbGV0IHN0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZVNoZWV0O1xuICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLl9zdHJpbmdzO1xuICAgIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgJiYgc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjYWNoZWFibGUgPSBzdHJpbmdzICE9PSB1bmRlZmluZWQgJiYgc3RyaW5ncy5sZW5ndGggPT09IDE7XG4gICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgIHN0eWxlU2hlZXQgPSBjc3NUYWdDYWNoZS5nZXQoc3RyaW5ncyk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICh0aGlzLl9zdHlsZVNoZWV0ID0gc3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCkpLnJlcGxhY2VTeW5jKFxuICAgICAgICAgIHRoaXMuY3NzVGV4dFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgY3NzVGFnQ2FjaGUuc2V0KHN0cmluZ3MsIHN0eWxlU2hlZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVNoZWV0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jc3NUZXh0O1xuICB9XG59XG5cbnR5cGUgQ29uc3RydWN0YWJsZUNTU1Jlc3VsdCA9IENTU1Jlc3VsdCAmIHtcbiAgbmV3IChcbiAgICBjc3NUZXh0OiBzdHJpbmcsXG4gICAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCB1bmRlZmluZWQsXG4gICAgc2FmZVRva2VuOiBzeW1ib2xcbiAgKTogQ1NTUmVzdWx0O1xufTtcblxuY29uc3QgdGV4dEZyb21DU1NSZXN1bHQgPSAodmFsdWU6IENTU1Jlc3VsdEdyb3VwIHwgbnVtYmVyKSA9PiB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIGlmICgodmFsdWUgYXMgQ1NTUmVzdWx0KVsnXyRjc3NSZXN1bHQkJ10gPT09IHRydWUpIHtcbiAgICByZXR1cm4gKHZhbHVlIGFzIENTU1Jlc3VsdCkuY3NzVGV4dDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBWYWx1ZSBwYXNzZWQgdG8gJ2NzcycgZnVuY3Rpb24gbXVzdCBiZSBhICdjc3MnIGZ1bmN0aW9uIHJlc3VsdDogYCArXG4gICAgICAgIGAke3ZhbHVlfS4gVXNlICd1bnNhZmVDU1MnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQgdGFrZSBjYXJlIGAgK1xuICAgICAgICBgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogV3JhcCBhIHZhbHVlIGZvciBpbnRlcnBvbGF0aW9uIGluIGEge0BsaW5rY29kZSBjc3N9IHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgdW50cnVzdGVkIENTUyB0ZXh0IGNhbiBiZSB1c2VkIHRvIHBob25lIGhvbWVcbiAqIG9yIGV4ZmlsdHJhdGUgZGF0YSB0byBhbiBhdHRhY2tlciBjb250cm9sbGVkIHNpdGUuIFRha2UgY2FyZSB0byBvbmx5IHVzZVxuICogdGhpcyB3aXRoIHRydXN0ZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVDU1MgPSAodmFsdWU6IHVua25vd24pID0+XG4gIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIGNvbnN0cnVjdGlvblRva2VuXG4gICk7XG5cbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExpdEVsZW1lbnQnc1xuICoge0BsaW5rY29kZSBMaXRFbGVtZW50LnN0eWxlc30gcHJvcGVydHkgdG8gc2V0IGVsZW1lbnQgc3R5bGVzLlxuICpcbiAqIEZvciBzZWN1cml0eSByZWFzb25zLCBvbmx5IGxpdGVyYWwgc3RyaW5nIHZhbHVlcyBhbmQgbnVtYmVyIG1heSBiZSB1c2VkIGluXG4gKiBlbWJlZGRlZCBleHByZXNzaW9ucy4gVG8gaW5jb3Jwb3JhdGUgbm9uLWxpdGVyYWwgdmFsdWVzIHtAbGlua2NvZGUgdW5zYWZlQ1NTfVxuICogbWF5IGJlIHVzZWQgaW5zaWRlIGFuIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjc3MgPSAoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChDU1NSZXN1bHRHcm91cCB8IG51bWJlcilbXVxuKTogQ1NTUmVzdWx0ID0+IHtcbiAgY29uc3QgY3NzVGV4dCA9XG4gICAgc3RyaW5ncy5sZW5ndGggPT09IDFcbiAgICAgID8gc3RyaW5nc1swXVxuICAgICAgOiB2YWx1ZXMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHYsIGlkeCkgPT4gYWNjICsgdGV4dEZyb21DU1NSZXN1bHQodikgKyBzdHJpbmdzW2lkeCArIDFdLFxuICAgICAgICAgIHN0cmluZ3NbMF1cbiAgICAgICAgKTtcbiAgcmV0dXJuIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIGNzc1RleHQsXG4gICAgc3RyaW5ncyxcbiAgICBjb25zdHJ1Y3Rpb25Ub2tlblxuICApO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZXMgdG8gYSBgc2hhZG93Um9vdGAuIFdoZW4gU2hhZG93IERPTSBpc1xuICogYXZhaWxhYmxlIGJ1dCBgYWRvcHRlZFN0eWxlU2hlZXRzYCBpcyBub3QsIHN0eWxlcyBhcmUgYXBwZW5kZWQgdG8gdGhlXG4gKiBgc2hhZG93Um9vdGAgdG8gW21pbWljIHNwZWMgYmVoYXZpb3JdKGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29uc3RydWN0LXN0eWxlc2hlZXRzLyN1c2luZy1jb25zdHJ1Y3RlZC1zdHlsZXNoZWV0cykuXG4gKiBOb3RlLCB3aGVuIHNoaW1taW5nIGlzIHVzZWQsIGFueSBzdHlsZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IHBsYWNlZCBpbnRvXG4gKiB0aGUgc2hhZG93Um9vdCBzaG91bGQgYmUgcGxhY2VkICpiZWZvcmUqIGFueSBzaGltbWVkIGFkb3B0ZWQgc3R5bGVzLiBUaGlzXG4gKiB3aWxsIG1hdGNoIHNwZWMgYmVoYXZpb3IgdGhhdCBnaXZlcyBhZG9wdGVkIHNoZWV0cyBwcmVjZWRlbmNlIG92ZXIgc3R5bGVzIGluXG4gKiBzaGFkb3dSb290LlxuICovXG5leHBvcnQgY29uc3QgYWRvcHRTdHlsZXMgPSAoXG4gIHJlbmRlclJvb3Q6IFNoYWRvd1Jvb3QsXG4gIHN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+XG4pID0+IHtcbiAgaWYgKHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cykge1xuICAgIChyZW5kZXJSb290IGFzIFNoYWRvd1Jvb3QpLmFkb3B0ZWRTdHlsZVNoZWV0cyA9IHN0eWxlcy5tYXAoKHMpID0+XG4gICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHMgOiBzLnN0eWxlU2hlZXQhXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc3R5bGVzKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3Qgbm9uY2UgPSAoZ2xvYmFsIGFzIGFueSlbJ2xpdE5vbmNlJ107XG4gICAgICBpZiAobm9uY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICAgICAgfVxuICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSAocyBhcyBDU1NSZXN1bHQpLmNzc1RleHQ7XG4gICAgICByZW5kZXJSb290LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0ID0gKHNoZWV0OiBDU1NTdHlsZVNoZWV0KSA9PiB7XG4gIGxldCBjc3NUZXh0ID0gJyc7XG4gIGZvciAoY29uc3QgcnVsZSBvZiBzaGVldC5jc3NSdWxlcykge1xuICAgIGNzc1RleHQgKz0gcnVsZS5jc3NUZXh0O1xuICB9XG4gIHJldHVybiB1bnNhZmVDU1MoY3NzVGV4dCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29tcGF0aWJsZVN0eWxlID1cbiAgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIHx8XG4gIChOT0RFX01PREUgJiYgZ2xvYmFsLkNTU1N0eWxlU2hlZXQgPT09IHVuZGVmaW5lZClcbiAgICA/IChzOiBDU1NSZXN1bHRPck5hdGl2ZSkgPT4gc1xuICAgIDogKHM6IENTU1Jlc3VsdE9yTmF0aXZlKSA9PlxuICAgICAgICBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0KHMpIDogcztcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBVc2UgdGhpcyBtb2R1bGUgaWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIGJhc2UgY2xhc3MgZXh0ZW5kaW5nXG4gKiB7QGxpbmsgUmVhY3RpdmVFbGVtZW50fS5cbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbmltcG9ydCB7XG4gIGdldENvbXBhdGlibGVTdHlsZSxcbiAgYWRvcHRTdHlsZXMsXG4gIENTU1Jlc3VsdEdyb3VwLFxuICBDU1NSZXN1bHRPck5hdGl2ZSxcbn0gZnJvbSAnLi9jc3MtdGFnLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgUmVhY3RpdmVDb250cm9sbGVyLFxuICBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LFxufSBmcm9tICcuL3JlYWN0aXZlLWNvbnRyb2xsZXIuanMnO1xuXG4vLyBJbiB0aGUgTm9kZSBidWlsZCwgdGhpcyBpbXBvcnQgd2lsbCBiZSBpbmplY3RlZCBieSBSb2xsdXA6XG4vLyBpbXBvcnQge0hUTUxFbGVtZW50LCBjdXN0b21FbGVtZW50c30gZnJvbSAnQGxpdC1sYWJzL3Nzci1kb20tc2hpbSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY3NzLXRhZy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnLi9yZWFjdGl2ZS1jb250cm9sbGVyLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBgcmVhZG9ubHlgIG1vZGlmaWVyIGZyb20gcHJvcGVydGllcyBpbiB0aGUgdW5pb24gSy5cbiAqXG4gKiBUaGlzIGlzIGEgc2FmZXIgd2F5IHRvIGNhc3QgYSB2YWx1ZSB0byBhIHR5cGUgd2l0aCBhIG11dGFibGUgdmVyc2lvbiBvZiBhXG4gKiByZWFkb25seSBmaWVsZCwgdGhhbiBjYXN0aW5nIHRvIGFuIGludGVyZmFjZSB3aXRoIHRoZSBmaWVsZCByZS1kZWNsYXJlZFxuICogYmVjYXVzZSBpdCBwcmVzZXJ2ZXMgdGhlIHR5cGUgb2YgYWxsIHRoZSBmaWVsZHMgYW5kIHdhcm5zIG9uIHR5cG9zLlxuICovXG50eXBlIE11dGFibGU8VCwgSyBleHRlbmRzIGtleW9mIFQ+ID0gT21pdDxULCBLPiAmIHtcbiAgLXJlYWRvbmx5IFtQIGluIGtleW9mIFBpY2s8VCwgSz5dOiBQIGV4dGVuZHMgSyA/IFRbUF0gOiBuZXZlcjtcbn07XG5cbi8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBBZGQgYGhhc093bmAgaGVyZSB3aGVuIHdlIHNoaXAgRVMyMDIyXG5jb25zdCB7XG4gIGlzLFxuICBkZWZpbmVQcm9wZXJ0eSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gIGdldFByb3RvdHlwZU9mLFxufSA9IE9iamVjdDtcblxuY29uc3QgTk9ERV9NT0RFID0gZmFsc2U7XG5cbi8vIExldHMgYSBtaW5pZmllciByZXBsYWNlIGdsb2JhbFRoaXMgcmVmZXJlbmNlcyB3aXRoIGEgbWluaWZpZWQgbmFtZVxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblxuaWYgKE5PREVfTU9ERSkge1xuICBnbG9iYWwuY3VzdG9tRWxlbWVudHMgPz89IGN1c3RvbUVsZW1lbnRzO1xufVxuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuY29uc3QgdHJ1c3RlZFR5cGVzID0gKGdsb2JhbCBhcyB1bmtub3duIGFzIHt0cnVzdGVkVHlwZXM/OiB7ZW1wdHlTY3JpcHQ6ICcnfX0pXG4gIC50cnVzdGVkVHlwZXM7XG5cbi8vIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBodHRwczovL2NyYnVnLmNvbS85OTMyNjhcbi8vIEN1cnJlbnRseSwgYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIFwib25cIiBpcyBjb25zaWRlcmVkIHRvIGJlIGFcbi8vIFRydXN0ZWRTY3JpcHQgc291cmNlLiBTdWNoIGJvb2xlYW4gYXR0cmlidXRlcyBtdXN0IGJlIHNldCB0byB0aGUgZXF1aXZhbGVudFxuLy8gdHJ1c3RlZCBlbXB0eVNjcmlwdCB2YWx1ZS5cbmNvbnN0IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA9IHRydXN0ZWRUeXBlc1xuICA/ICh0cnVzdGVkVHlwZXMuZW1wdHlTY3JpcHQgYXMgdW5rbm93biBhcyAnJylcbiAgOiAnJztcblxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgPyBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPSAoZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PVxuICAgIG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG5cbiAgaXNzdWVXYXJuaW5nKFxuICAgICdkZXYtbW9kZScsXG4gICAgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWBcbiAgKTtcblxuICAvLyBJc3N1ZSBwb2x5ZmlsbCBzdXBwb3J0IHdhcm5pbmcuXG4gIGlmIChnbG9iYWwuU2hhZHlET00/LmluVXNlICYmIHBvbHlmaWxsU3VwcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaXNzdWVXYXJuaW5nKFxuICAgICAgJ3BvbHlmaWxsLXN1cHBvcnQtbWlzc2luZycsXG4gICAgICBgU2hhZG93IERPTSBpcyBiZWluZyBwb2x5ZmlsbGVkIHZpYSBcXGBTaGFkeURPTVxcYCBidXQgYCArXG4gICAgICAgIGB0aGUgXFxgcG9seWZpbGwtc3VwcG9ydFxcYCBtb2R1bGUgaGFzIG5vdCBiZWVuIGxvYWRlZC5gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgUmVhY3RpdmVVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPSBVcGRhdGU7XG4gICAgZXhwb3J0IGludGVyZmFjZSBVcGRhdGUge1xuICAgICAga2luZDogJ3VwZGF0ZSc7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBEZWJ1Z0xvZ2dpbmdXaW5kb3cge1xuICAvLyBFdmVuIGluIGRldiBtb2RlLCB3ZSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0byBlbWl0IHRoZXNlIGV2ZW50cywgYXMgdGhhdCdzXG4gIC8vIGFub3RoZXIgbGV2ZWwgb2YgY29zdCwgc28gb25seSBlbWl0IHRoZW0gd2hlbiBERVZfTU9ERSBpcyB0cnVlIF9hbmRfIHdoZW5cbiAgLy8gd2luZG93LmVtaXRMaXREZWJ1Z0V2ZW50cyBpcyB0cnVlLlxuICBlbWl0TGl0RGVidWdMb2dFdmVudHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFVzZWZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIGxvZ2dpbmcgaW5zaWdodHMgaW50byB3aGF0IHRoZSBMaXQgdGVtcGxhdGUgc3lzdGVtIGlzIGRvaW5nLlxuICpcbiAqIENvbXBpbGVkIG91dCBvZiBwcm9kIG1vZGUgYnVpbGRzLlxuICovXG5jb25zdCBkZWJ1Z0xvZ0V2ZW50ID0gREVWX01PREVcbiAgPyAoZXZlbnQ6IFJlYWN0aXZlVW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8UmVhY3RpdmVVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeT4oJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIDogdW5kZWZpbmVkO1xuXG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG4vKipcbiAqIENvbnZlcnRzIHByb3BlcnR5IHZhbHVlcyB0byBhbmQgZnJvbSBhdHRyaWJ1dGUgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlIHZhbHVlIHRvIGEgcHJvcGVydHlcbiAgICogdmFsdWUuXG4gICAqL1xuICBmcm9tQXR0cmlidXRlPyh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZT86IFR5cGVIaW50KTogVHlwZTtcblxuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEl0IHJldHVybnMgdW5rbm93biBpbnN0ZWFkIG9mIHN0cmluZywgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3RydXN0ZWQtdHlwZXMgKGFuZCBzaW1pbGFyIGVmZm9ydHMpLlxuICAgKi9cbiAgdG9BdHRyaWJ1dGU/KHZhbHVlOiBUeXBlLCB0eXBlPzogVHlwZUhpbnQpOiB1bmtub3duO1xufVxuXG50eXBlIEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlID0gdW5rbm93biwgVHlwZUhpbnQgPSB1bmtub3duPiA9XG4gIHwgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlPlxuICB8ICgodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU/OiBUeXBlSGludCkgPT4gVHlwZSk7XG5cbi8qKlxuICogRGVmaW5lcyBvcHRpb25zIGZvciBhIHByb3BlcnR5IGFjY2Vzc29yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5RGVjbGFyYXRpb248VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBpbmRpY2F0ZXMgdGhlIHByb3BlcnR5IGlzIGludGVybmFsIHByaXZhdGUgc3RhdGUuIFRoZVxuICAgKiBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHNldCBieSB1c2Vycy4gV2hlbiB1c2luZyBUeXBlU2NyaXB0LCB0aGlzIHByb3BlcnR5XG4gICAqIHNob3VsZCBiZSBtYXJrZWQgYXMgYHByaXZhdGVgIG9yIGBwcm90ZWN0ZWRgLCBhbmQgaXQgaXMgYWxzbyBhIGNvbW1vblxuICAgKiBwcmFjdGljZSB0byB1c2UgYSBsZWFkaW5nIGBfYCBpbiB0aGUgbmFtZS4gVGhlIHByb3BlcnR5IGlzIG5vdCBhZGRlZCB0b1xuICAgKiBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBhbmQgd2hldGhlciB0aGUgcHJvcGVydHkgYmVjb21lcyBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUuXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgcHJvcGVydHkgaXMgbm90IGFkZGVkIHRvIGBvYnNlcnZlZEF0dHJpYnV0ZXNgLlxuICAgKiBJZiB0cnVlIG9yIGFic2VudCwgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZSBpcyBvYnNlcnZlZCAoZS5nLiBgZm9vQmFyYFxuICAgKiBiZWNvbWVzIGBmb29iYXJgKS4gSWYgYSBzdHJpbmcsIHRoZSBzdHJpbmcgdmFsdWUgaXMgb2JzZXJ2ZWQgKGUuZ1xuICAgKiBgYXR0cmlidXRlOiAnZm9vLWJhcidgKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZT86IGJvb2xlYW4gfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgaXMgdXNlZCBvbmx5IGFzIGEgaGludCBmb3IgdGhlXG4gICAqIGBjb252ZXJ0ZXJgIHRvIGRldGVybWluZSBob3cgdG8gY29udmVydCB0aGUgYXR0cmlidXRlXG4gICAqIHRvL2Zyb20gYSBwcm9wZXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBUeXBlSGludDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgdG8vZnJvbSBhIHByb3BlcnR5LiBJZiB0aGlzIHZhbHVlXG4gICAqIGlzIGEgZnVuY3Rpb24sIGl0IGlzIHVzZWQgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIHZhbHVlIGEgdGhlIHByb3BlcnR5XG4gICAqIHZhbHVlLiBJZiBpdCdzIGFuIG9iamVjdCwgaXQgY2FuIGhhdmUga2V5cyBmb3IgYGZyb21BdHRyaWJ1dGVgIGFuZFxuICAgKiBgdG9BdHRyaWJ1dGVgLiBJZiBubyBgdG9BdHRyaWJ1dGVgIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFuZFxuICAgKiBgcmVmbGVjdGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCBkaXJlY3RseSB0byB0aGVcbiAgICogYXR0cmlidXRlLiBBIGRlZmF1bHQgYGNvbnZlcnRlcmAgaXMgdXNlZCBpZiBub25lIGlzIHByb3ZpZGVkOyBpdCBzdXBwb3J0c1xuICAgKiBgQm9vbGVhbmAsIGBTdHJpbmdgLCBgTnVtYmVyYCwgYE9iamVjdGAsIGFuZCBgQXJyYXlgLiBOb3RlLFxuICAgKiB3aGVuIGEgcHJvcGVydHkgY2hhbmdlcyBhbmQgdGhlIGNvbnZlcnRlciBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgYXR0cmlidXRlLFxuICAgKiB0aGUgcHJvcGVydHkgaXMgbmV2ZXIgdXBkYXRlZCBhZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGUgYXR0cmlidXRlIGNoYW5naW5nLFxuICAgKiBhbmQgdmljZSB2ZXJzYS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnZlcnRlcj86IEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlLCBUeXBlSGludD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIHJlZmxlY3QgdG8gYW4gYXR0cmlidXRlLlxuICAgKiBJZiBgdHJ1ZWAsIHdoZW4gdGhlIHByb3BlcnR5IGlzIHNldCwgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgdXNpbmcgdGhlXG4gICAqIGF0dHJpYnV0ZSBuYW1lIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIGBhdHRyaWJ1dGVgXG4gICAqIHByb3BlcnR5IG9wdGlvbiBhbmQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBjb252ZXJ0ZWQgdXNpbmcgdGhlIHJ1bGVzXG4gICAqIGZyb20gdGhlIGBjb252ZXJ0ZXJgIHByb3BlcnR5IG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmxlY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgaW5kaWNhdGVzIGlmIGEgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgY2hhbmdlZCB3aGVuXG4gICAqIGl0IGlzIHNldC4gVGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHRoZSBgbmV3VmFsdWVgIGFuZCBgb2xkVmFsdWVgIGFuZFxuICAgKiByZXR1cm4gYHRydWVgIGlmIGFuIHVwZGF0ZSBzaG91bGQgYmUgcmVxdWVzdGVkLlxuICAgKi9cbiAgaGFzQ2hhbmdlZD8odmFsdWU6IFR5cGUsIG9sZFZhbHVlOiBUeXBlKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHByb3BlcnR5LiBCeVxuICAgKiBkZWZhdWx0LCBhbiBhY2Nlc3NvciB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBwcm9wZXJ0eSB0aGF0IHJlcXVlc3RzIGFuXG4gICAqIHVwZGF0ZSB3aGVuIHNldC4gSWYgdGhpcyBmbGFnIGlzIGB0cnVlYCwgbm8gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkLCBhbmRcbiAgICogaXQgd2lsbCBiZSB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGxcbiAgICogYHRoaXMucmVxdWVzdFVwZGF0ZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlKWAgdG8gcmVxdWVzdCBhbiB1cGRhdGUgd2hlblxuICAgKiB0aGUgcHJvcGVydHkgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG5vQWNjZXNzb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JhcHBpbmcgYWNjZXNzb3JzLiBUaGlzIGlzIHNldCBieSBgQHByb3BlcnR5YFxuICAgKiB0byBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICB3cmFwcGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXAgb2YgcHJvcGVydGllcyB0byBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuIEZvciBlYWNoIHByb3BlcnR5IGFuXG4gKiBhY2Nlc3NvciBpcyBtYWRlLCBhbmQgdGhlIHByb3BlcnR5IGlzIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlEZWNsYXJhdGlvbnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURlY2xhcmF0aW9uO1xufVxuXG50eXBlIFByb3BlcnR5RGVjbGFyYXRpb25NYXAgPSBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+O1xuXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIFByb3BlcnR5S2V5PjtcblxuLyoqXG4gKiBBIE1hcCBvZiBwcm9wZXJ0eSBrZXlzIHRvIHZhbHVlcy5cbiAqXG4gKiBUYWtlcyBhbiBvcHRpb25hbCB0eXBlIHBhcmFtZXRlciBULCB3aGljaCB3aGVuIHNwZWNpZmllZCBhcyBhIG5vbi1hbnksXG4gKiBub24tdW5rbm93biB0eXBlLCB3aWxsIG1ha2UgdGhlIE1hcCBtb3JlIHN0cm9uZ2x5LXR5cGVkLCBhc3NvY2lhdGluZyB0aGUgbWFwXG4gKiBrZXlzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZSB0eXBlIG9uIFQuXG4gKlxuICogVXNlIGBQcm9wZXJ0eVZhbHVlczx0aGlzPmAgd2hlbiBvdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC51cGRhdGUoKSBhbmRcbiAqIG90aGVyIGxpZmVjeWNsZSBtZXRob2RzIGluIG9yZGVyIHRvIGdldCBzdHJvbmdlciB0eXBlLWNoZWNraW5nIG9uIGtleXNcbiAqIGFuZCB2YWx1ZXMuXG4gKi9cbi8vIFRoaXMgdHlwZSBpcyBjb25kaXRpb25hbCBzbyB0aGF0IGlmIHRoZSBwYXJhbWV0ZXIgVCBpcyBub3Qgc3BlY2lmaWVkLCBvclxuLy8gaXMgYGFueWAsIHRoZSB0eXBlIHdpbGwgaW5jbHVkZSBgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPmAuIFNpbmNlIFQgaXMgbm90XG4vLyBnaXZlbiBpbiB0aGUgdXNlcyBvZiBQcm9wZXJ0eVZhbHVlcyBpbiB0aGlzIGZpbGUsIGFsbCB1c2VzIGhlcmUgZmFsbGJhY2sgdG9cbi8vIG1lYW5pbmcgYE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj5gLCBidXQgaWYgYSBkZXZlbG9wZXIgdXNlc1xuLy8gYFByb3BlcnR5VmFsdWVzPHRoaXM+YCAob3IgYW55IG90aGVyIHZhbHVlIGZvciBUKSB0aGV5IHdpbGwgZ2V0IGFcbi8vIHN0cm9uZ2x5LXR5cGVkIE1hcCB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFByb3BlcnR5VmFsdWVzPFQgPSBhbnk+ID0gVCBleHRlbmRzIG9iamVjdFxuICA/IFByb3BlcnR5VmFsdWVNYXA8VD5cbiAgOiBNYXA8UHJvcGVydHlLZXksIHVua25vd24+O1xuXG4vKipcbiAqIERvIG5vdCB1c2UsIGluc3RlYWQgcHJlZmVyIHtAbGlua2NvZGUgUHJvcGVydHlWYWx1ZXN9LlxuICovXG4vLyBUaGlzIHR5cGUgbXVzdCBiZSBleHBvcnRlZCBzdWNoIHRoYXQgSmF2YVNjcmlwdCBnZW5lcmF0ZWQgYnkgdGhlIEdvb2dsZVxuLy8gQ2xvc3VyZSBDb21waWxlciBjYW4gaW1wb3J0IGEgdHlwZSByZWZlcmVuY2UuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5VmFsdWVNYXA8VD4gZXh0ZW5kcyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+IHtcbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogVFtLXSB8IHVuZGVmaW5lZDtcbiAgc2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIHZhbHVlOiBUW0tdKTogdGhpcztcbiAgaGFzPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbiAgZGVsZXRlPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIgPSB7XG4gIHRvQXR0cmlidXRlKHZhbHVlOiB1bmtub3duLCB0eXBlPzogdW5rbm93bik6IHVua25vd24ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID8gZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIDogbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9iamVjdDpcbiAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgcGFzcyB0aGlzIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWxsb3cgcmVtb3Zpbmcvbm8gY2hhbmdlIGJlaGF2aW9yLlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID09IG51bGwgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bikge1xuICAgIGxldCBmcm9tVmFsdWU6IHVua25vd24gPSB2YWx1ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgZnJvbVZhbHVlID0gdmFsdWUgIT09IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICBjYXNlIEFycmF5OlxuICAgICAgICAvLyBEbyAqbm90KiBnZW5lcmF0ZSBleGNlcHRpb24gd2hlbiBpbnZhbGlkIEpTT04gaXMgc2V0IGFzIGVsZW1lbnRzXG4gICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNvbXBsYWluIG9uIGJlaW5nIG1pcy1jb25maWd1cmVkLlxuICAgICAgICAvLyBUT0RPKHNvcnZlbGwpOiBEbyBnZW5lcmF0ZSBleGNlcHRpb24gaW4gKmRldiBtb2RlKi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBc3NlcnQgdG8gYWRoZXJlIHRvIEJhemVsJ3MgXCJtdXN0IHR5cGUgYXNzZXJ0IEpTT04gcGFyc2VcIiBydWxlLlxuICAgICAgICAgIGZyb21WYWx1ZSA9IEpTT04ucGFyc2UodmFsdWUhKSBhcyB1bmtub3duO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZnJvbVZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21WYWx1ZTtcbiAgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzQ2hhbmdlZCB7XG4gICh2YWx1ZTogdW5rbm93biwgb2xkOiB1bmtub3duKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBkaWZmZXJlbnQgZnJvbSBgb2xkVmFsdWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsOiBIYXNDaGFuZ2VkID0gKHZhbHVlOiB1bmtub3duLCBvbGQ6IHVua25vd24pOiBib29sZWFuID0+XG4gICFpcyh2YWx1ZSwgb2xkKTtcblxuY29uc3QgZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb246IFByb3BlcnR5RGVjbGFyYXRpb24gPSB7XG4gIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxuICBjb252ZXJ0ZXI6IGRlZmF1bHRDb252ZXJ0ZXIsXG4gIHJlZmxlY3Q6IGZhbHNlLFxuICBoYXNDaGFuZ2VkOiBub3RFcXVhbCxcbn07XG5cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRldiBtb2RlIHdhcm5pbmcgY2F0ZWdvcmllcy5cbiAqL1xuZXhwb3J0IHR5cGUgV2FybmluZ0tpbmQgPVxuICB8ICdjaGFuZ2UtaW4tdXBkYXRlJ1xuICB8ICdtaWdyYXRpb24nXG4gIHwgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJztcblxuZXhwb3J0IHR5cGUgSW5pdGlhbGl6ZXIgPSAoZWxlbWVudDogUmVhY3RpdmVFbGVtZW50KSA9PiB2b2lkO1xuXG4vLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFN5bWJvbENvbnN0cnVjdG9yIHtcbiAgICByZWFkb25seSBtZXRhZGF0YTogdW5pcXVlIHN5bWJvbDtcbiAgfVxufVxuXG4vLyBFbnN1cmUgbWV0YWRhdGEgaXMgZW5hYmxlZC4gVHlwZVNjcmlwdCBkb2VzIG5vdCBwb2x5ZmlsbFxuLy8gU3ltYm9sLm1ldGFkYXRhLCBzbyB3ZSBtdXN0IGVuc3VyZSB0aGF0IGl0IGV4aXN0cy5cbihTeW1ib2wgYXMge21ldGFkYXRhOiBzeW1ib2x9KS5tZXRhZGF0YSA/Pz0gU3ltYm9sKCdtZXRhZGF0YScpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoaXMgaXMgcHVibGljIGdsb2JhbCBBUEksIGRvIG5vdCBjaGFuZ2UhXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12YXJcbiAgdmFyIGxpdFByb3BlcnR5TWV0YWRhdGE6IFdlYWtNYXA8XG4gICAgb2JqZWN0LFxuICAgIE1hcDxQcm9wZXJ0eUtleSwgUHJvcGVydHlEZWNsYXJhdGlvbj5cbiAgPjtcbn1cblxuLy8gTWFwIGZyb20gYSBjbGFzcydzIG1ldGFkYXRhIG9iamVjdCB0byBwcm9wZXJ0eSBvcHRpb25zXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCB1c2UgbnVsbGlzaC1jb2FsZXNjaW5nIGFzc2lnbm1lbnQgc28gdGhhdCB3ZSBvbmx5IHVzZSBvbmVcbi8vIG1hcCBldmVuIGlmIHdlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS5cbmdsb2JhbC5saXRQcm9wZXJ0eU1ldGFkYXRhID8/PSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+XG4+KCk7XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHdoaWNoIG1hbmFnZXMgZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiBXaGVuXG4gKiBwcm9wZXJ0aWVzIGNoYW5nZSwgdGhlIGB1cGRhdGVgIG1ldGhvZCBpcyBhc3luY2hyb25vdXNseSBjYWxsZWQuIFRoaXMgbWV0aG9kXG4gKiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgc3ViY2xhc3NlcyB0byByZW5kZXIgdXBkYXRlcyBhcyBkZXNpcmVkLlxuICogQG5vSW5oZXJpdERvY1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVhY3RpdmVFbGVtZW50XG4gIC8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGBleHRlbmRzYCBjbGF1c2Ugd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoXG4gIC8vIGAoZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCA/PyBIVE1MRWxlbWVudClgLlxuICAvL1xuICAvLyBUaGlzIHdheSwgd2Ugd2lsbCBmaXJzdCBwcmVmZXIgYW55IGdsb2JhbCBgSFRNTEVsZW1lbnRgIHBvbHlmaWxsIHRoYXQgdGhlXG4gIC8vIHVzZXIgaGFzIGFzc2lnbmVkLCBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGBIVE1MRWxlbWVudGAgc2hpbSB3aGljaCBoYXNcbiAgLy8gYmVlbiBpbXBvcnRlZCAoc2VlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUgYWJvdXQgaG93IHRoaXMgaW1wb3J0IGlzXG4gIC8vIGdlbmVyYXRlZCBieSBSb2xsdXApLiBOb3RlIHRoYXQgdGhlIGBIVE1MRWxlbWVudGAgdmFyaWFibGUgaGFzIGJlZW5cbiAgLy8gc2hhZG93ZWQgYnkgdGhpcyBpbXBvcnQsIHNvIGl0IG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGdsb2JhbC5cbiAgZXh0ZW5kcyBIVE1MRWxlbWVudFxuICBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlckhvc3RcbntcbiAgLy8gTm90ZTogdGhlc2UgYXJlIHBhdGNoZWQgaW4gb25seSBpbiBERVZfTU9ERS5cbiAgLyoqXG4gICAqIFJlYWQgb3Igc2V0IGFsbCB0aGUgZW5hYmxlZCB3YXJuaW5nIGNhdGVnb3JpZXMgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIGluIGRldmVsb3BtZW50IGJ1aWxkcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGRldi1tb2RlXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlZFdhcm5pbmdzPzogV2FybmluZ0tpbmRbXTtcblxuICAvKipcbiAgICogRW5hYmxlIHRoZSBnaXZlbiB3YXJuaW5nIGNhdGVnb3J5IGZvciB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBpbiBkZXZlbG9wbWVudCBidWlsZHMsIHNvIGl0IHNob3VsZCBiZSBhY2Nlc3NlZFxuICAgKiB3aXRoIGEgZ3VhcmQgbGlrZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRW5hYmxlIGZvciBhbGwgUmVhY3RpdmVFbGVtZW50IHN1YmNsYXNzZXNcbiAgICogUmVhY3RpdmVFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIEVuYWJsZSBmb3Igb25seSBNeUVsZW1lbnQgYW5kIHN1YmNsYXNzZXNcbiAgICogTXlFbGVtZW50LmVuYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgZGV2LW1vZGVcbiAgICovXG4gIHN0YXRpYyBlbmFibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0aGUgZ2l2ZW4gd2FybmluZyBjYXRlZ29yeSBmb3IgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzLCBzbyBpdCBzaG91bGQgYmUgYWNjZXNzZWRcbiAgICogd2l0aCBhIGd1YXJkIGxpa2U6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERpc2FibGUgZm9yIGFsbCBSZWFjdGl2ZUVsZW1lbnQgc3ViY2xhc3Nlc1xuICAgKiBSZWFjdGl2ZUVsZW1lbnQuZGlzYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqXG4gICAqIC8vIERpc2FibGUgZm9yIG9ubHkgTXlFbGVtZW50IGFuZCBzdWJjbGFzc2VzXG4gICAqIE15RWxlbWVudC5kaXNhYmxlV2FybmluZz8uKCdtaWdyYXRpb24nKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBkZXYtbW9kZVxuICAgKi9cbiAgc3RhdGljIGRpc2FibGVXYXJuaW5nPzogKHdhcm5pbmdLaW5kOiBXYXJuaW5nS2luZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbml0aWFsaXplciBmdW5jdGlvbiB0byB0aGUgY2xhc3MgdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGluc3RhbmNlXG4gICAqIGNvbnN0cnVjdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBydW5zIGFnYWluc3QgYSBgUmVhY3RpdmVFbGVtZW50YFxuICAgKiBzdWJjbGFzcywgc3VjaCBhcyBhIGRlY29yYXRvciwgdGhhdCBuZWVkcyB0byBkbyB3b3JrIGZvciBlYWNoXG4gICAqIGluc3RhbmNlLCBzdWNoIGFzIHNldHRpbmcgdXAgYSBgUmVhY3RpdmVDb250cm9sbGVyYC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29uc3QgbXlEZWNvcmF0b3IgPSAodGFyZ2V0OiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LCBrZXk6IHN0cmluZykgPT4ge1xuICAgKiAgIHRhcmdldC5hZGRJbml0aWFsaXplcigoaW5zdGFuY2U6IFJlYWN0aXZlRWxlbWVudCkgPT4ge1xuICAgKiAgICAgLy8gVGhpcyBpcyBydW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgKiAgICAgbmV3IE15Q29udHJvbGxlcihpbnN0YW5jZSk7XG4gICAqICAgfSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIERlY29yYXRpbmcgYSBmaWVsZCB3aWxsIHRoZW4gY2F1c2UgZWFjaCBpbnN0YW5jZSB0byBydW4gYW4gaW5pdGlhbGl6ZXJcbiAgICogdGhhdCBhZGRzIGEgY29udHJvbGxlcjpcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgQG15RGVjb3JhdG9yIGZvbztcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogSW5pdGlhbGl6ZXJzIGFyZSBzdG9yZWQgcGVyLWNvbnN0cnVjdG9yLiBBZGRpbmcgYW4gaW5pdGlhbGl6ZXIgdG8gYVxuICAgKiBzdWJjbGFzcyBkb2VzIG5vdCBhZGQgaXQgdG8gYSBzdXBlcmNsYXNzLiBTaW5jZSBpbml0aWFsaXplcnMgYXJlIHJ1biBpblxuICAgKiBjb25zdHJ1Y3RvcnMsIGluaXRpYWxpemVycyB3aWxsIHJ1biBpbiBvcmRlciBvZiB0aGUgY2xhc3MgaGllcmFyY2h5LFxuICAgKiBzdGFydGluZyB3aXRoIHN1cGVyY2xhc3NlcyBhbmQgcHJvZ3Jlc3NpbmcgdG8gdGhlIGluc3RhbmNlJ3MgY2xhc3MuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAodGhpcy5faW5pdGlhbGl6ZXJzID8/PSBbXSkucHVzaChpbml0aWFsaXplcik7XG4gIH1cblxuICBzdGF0aWMgX2luaXRpYWxpemVycz86IEluaXRpYWxpemVyW107XG5cbiAgLypcbiAgICogRHVlIHRvIGNsb3N1cmUgY29tcGlsZXIgRVM2IGNvbXBpbGF0aW9uIGJ1Z3MsIEBub2NvbGxhcHNlIGlzIHJlcXVpcmVkIG9uXG4gICAqIGFsbCBzdGF0aWMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB3aXRoIGluaXRpYWxpemVycy4gIFJlZmVyZW5jZTpcbiAgICogLSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzE3NzZcbiAgICovXG5cbiAgLyoqXG4gICAqIE1hcHMgYXR0cmlidXRlIG5hbWVzIHRvIHByb3BlcnRpZXM7IGZvciBleGFtcGxlIGBmb29iYXJgIGF0dHJpYnV0ZSB0b1xuICAgKiBgZm9vQmFyYCBwcm9wZXJ0eS4gQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGVcbiAgICogY2xhc3MuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXA6IEF0dHJpYnV0ZU1hcDtcblxuICAvKipcbiAgICogTWFya3MgY2xhc3MgYXMgaGF2aW5nIGJlZW4gZmluYWxpemVkLCB3aGljaCBpbmNsdWRlcyBjcmVhdGluZyBwcm9wZXJ0aWVzXG4gICAqIGZyb20gYHN0YXRpYyBwcm9wZXJ0aWVzYCwgYnV0IGRvZXMgKm5vdCogaW5jbHVkZSBhbGwgcHJvcGVydGllcyBjcmVhdGVkXG4gICAqIGZyb20gZGVjb3JhdG9ycy5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVkOiB0cnVlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBNZW1vaXplZCBsaXN0IG9mIGFsbCBlbGVtZW50IHByb3BlcnRpZXMsIGluY2x1ZGluZyBhbnkgc3VwZXJjbGFzc1xuICAgKiBwcm9wZXJ0aWVzLiBDcmVhdGVkIGxhemlseSBvbiB1c2VyIHN1YmNsYXNzZXMgd2hlbiBmaW5hbGl6aW5nIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBlbGVtZW50UHJvcGVydGllczogUHJvcGVydHlEZWNsYXJhdGlvbk1hcDtcblxuICAvKipcbiAgICogVXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCBtYXBzIHByb3BlcnR5IG5hbWVzIHRvIGBQcm9wZXJ0eURlY2xhcmF0aW9uYFxuICAgKiBvYmplY3RzIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgcmVhY3RpdmUgcHJvcGVydGllcy4gV2hlblxuICAgKiBhIHJlYWN0aXZlIHByb3BlcnR5IGlzIHNldCB0aGUgZWxlbWVudCB3aWxsIHVwZGF0ZSBhbmQgcmVuZGVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHByb3BlcnRpZXMgYXJlIHB1YmxpYyBmaWVsZHMsIGFuZCBhcyBzdWNoLCB0aGV5IHNob3VsZCBiZVxuICAgKiBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLCBlaXRoZXIgdmlhIGF0dHJpYnV0ZSBvclxuICAgKiB0aGUgcHJvcGVydHkgaXRzZWxmLlxuICAgKlxuICAgKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICAgKiBwcm90ZWN0ZWQgZmllbGRzIGFuZCBzaG91bGQgdXNlIHRoZSBgc3RhdGU6IHRydWVgIG9wdGlvbi4gUHJvcGVydGllc1xuICAgKiBtYXJrZWQgYXMgYHN0YXRlYCBkbyBub3QgcmVmbGVjdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBIb3dldmVyLCBzb21ldGltZXMgZWxlbWVudCBjb2RlIGRvZXMgbmVlZCB0byBzZXQgYSBwdWJsaWMgcHJvcGVydHkuIFRoaXNcbiAgICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gICAqIHNob3VsZCBiZSBmaXJlZCBpbmZvcm1pbmcgdGhlIHVzZXI7IGZvciBleGFtcGxlLCBhIGNoZWNrYm94IHNldHMgaXRzXG4gICAqIGBjaGVja2VkYCBwcm9wZXJ0eSB3aGVuIGNsaWNrZWQgYW5kIGZpcmVzIGEgYGNoYW5nZWRgIGV2ZW50LiBNdXRhdGluZ1xuICAgKiBwdWJsaWMgcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3JcbiAgICogYXJyYXkpIHByb3BlcnRpZXMuIEluIG90aGVyIGNhc2VzIHdoZW4gYW4gZWxlbWVudCBuZWVkcyB0byBtYW5hZ2Ugc3RhdGUsIGFcbiAgICogcHJpdmF0ZSBwcm9wZXJ0eSBzZXQgd2l0aCB0aGUgYHN0YXRlOiB0cnVlYCBvcHRpb24gc2hvdWxkIGJlIHVzZWQuIFdoZW5cbiAgICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAgICogZmFjaWxpdGF0ZSBjb21wbGV4IGludGVyYWN0aW9ucy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9ucztcblxuICAvKipcbiAgICogTWVtb2l6ZWQgbGlzdCBvZiBhbGwgZWxlbWVudCBzdHlsZXMuXG4gICAqIENyZWF0ZWQgbGF6aWx5IG9uIHVzZXIgc3ViY2xhc3NlcyB3aGVuIGZpbmFsaXppbmcgdGhlIGNsYXNzLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAqL1xuICBzdGF0aWMgZWxlbWVudFN0eWxlczogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+ID0gW107XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHN0eWxlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudC4gVGhlIHN0eWxlcyBzaG91bGQgYmUgZGVmaW5lZFxuICAgKiB1c2luZyB0aGUge0BsaW5rY29kZSBjc3N9IHRhZyBmdW5jdGlvbiwgdmlhIGNvbnN0cnVjdGlibGUgc3R5bGVzaGVldHMsIG9yXG4gICAqIGltcG9ydGVkIGZyb20gbmF0aXZlIENTUyBtb2R1bGUgc2NyaXB0cy5cbiAgICpcbiAgICogTm90ZSBvbiBDb250ZW50IFNlY3VyaXR5IFBvbGljeTpcbiAgICpcbiAgICogRWxlbWVudCBzdHlsZXMgYXJlIGltcGxlbWVudGVkIHdpdGggYDxzdHlsZT5gIHRhZ3Mgd2hlbiB0aGUgYnJvd3NlciBkb2Vzbid0XG4gICAqIHN1cHBvcnQgYWRvcHRlZCBTdHlsZVNoZWV0cy4gVG8gdXNlIHN1Y2ggYDxzdHlsZT5gIHRhZ3Mgd2l0aCB0aGUgc3R5bGUtc3JjXG4gICAqIENTUCBkaXJlY3RpdmUsIHRoZSBzdHlsZS1zcmMgdmFsdWUgbXVzdCBlaXRoZXIgaW5jbHVkZSAndW5zYWZlLWlubGluZScgb3JcbiAgICogYG5vbmNlLTxiYXNlNjQtdmFsdWU+YCB3aXRoIGA8YmFzZTY0LXZhbHVlPmAgcmVwbGFjZWQgYmUgYSBzZXJ2ZXItZ2VuZXJhdGVkXG4gICAqIG5vbmNlLlxuICAgKlxuICAgKiBUbyBwcm92aWRlIGEgbm9uY2UgdG8gdXNlIG9uIGdlbmVyYXRlZCBgPHN0eWxlPmAgZWxlbWVudHMsIHNldFxuICAgKiBgd2luZG93LmxpdE5vbmNlYCB0byBhIHNlcnZlci1nZW5lcmF0ZWQgbm9uY2UgaW4geW91ciBwYWdlJ3MgSFRNTCwgYmVmb3JlXG4gICAqIGxvYWRpbmcgYXBwbGljYXRpb24gY29kZTpcbiAgICpcbiAgICogYGBgaHRtbFxuICAgKiA8c2NyaXB0PlxuICAgKiAgIC8vIEdlbmVyYXRlZCBhbmQgdW5pcXVlIHBlciByZXF1ZXN0OlxuICAgKiAgIHdpbmRvdy5saXROb25jZSA9ICdhMWIyYzNkNCc7XG4gICAqIDwvc2NyaXB0PlxuICAgKiBgYGBcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlcz86IENTU1Jlc3VsdEdyb3VwO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvcGVydGllcy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGF0dHJpYnV0ZXNcbiAgICovXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIC8vIEVuc3VyZSB3ZSd2ZSBjcmVhdGVkIGFsbCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIC8vIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGlzIG9ubHkgdW5kZWZpbmVkIGFmdGVyIGZpbmFsaXplKCkgaW5cbiAgICAvLyBSZWFjdGl2ZUVsZW1lbnQgaXRzZWxmLiBSZWFjdGl2ZUVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzIGlzIG9ubHlcbiAgICAvLyBhY2Nlc3NlZCB3aXRoIFJlYWN0aXZlRWxlbWVudCBhcyB0aGUgcmVjZWl2ZXIgd2hlbiBhIHN1YmNsYXNzIG9yIG1peGluXG4gICAgLy8gY2FsbHMgc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwICYmIFsuLi50aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5rZXlzKCldXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX19pbnN0YW5jZVByb3BlcnRpZXM/OiBQcm9wZXJ0eVZhbHVlcyA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHByb3BlcnR5IGFjY2Vzc29yIG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZSBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAgICogYW5kIHN0b3JlcyBhIHtAbGlua2NvZGUgUHJvcGVydHlEZWNsYXJhdGlvbn0gZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZVxuICAgKiBnaXZlbiBvcHRpb25zLiBUaGUgcHJvcGVydHkgc2V0dGVyIGNhbGxzIHRoZSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYFxuICAgKiBwcm9wZXJ0eSBvcHRpb24gb3IgdXNlcyBhIHN0cmljdCBpZGVudGl0eSBjaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3RcbiAgICogdG8gcmVxdWVzdCBhbiB1cGRhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBwcm9wZXJ0aWVzOyBob3dldmVyLFxuICAgKiB3aGVuIGRvaW5nIHNvLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlci5jcmVhdGVQcm9wZXJ0eWAgdG8gZW5zdXJlXG4gICAqIHRoZSBwcm9wZXJ0eSBpcyBzZXR1cCBjb3JyZWN0bHkuIFRoaXMgbWV0aG9kIGNhbGxzXG4gICAqIGBnZXRQcm9wZXJ0eURlc2NyaXB0b3JgIGludGVybmFsbHkgdG8gZ2V0IGEgZGVzY3JpcHRvciB0byBpbnN0YWxsLlxuICAgKiBUbyBjdXN0b21pemUgd2hhdCBwcm9wZXJ0aWVzIGRvIHdoZW4gdGhleSBhcmUgZ2V0IG9yIHNldCwgb3ZlcnJpZGVcbiAgICogYGdldFByb3BlcnR5RGVzY3JpcHRvcmAuIFRvIGN1c3RvbWl6ZSB0aGUgb3B0aW9ucyBmb3IgYSBwcm9wZXJ0eSxcbiAgICogaW1wbGVtZW50IGBjcmVhdGVQcm9wZXJ0eWAgbGlrZSB0aGlzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBzdGF0aWMgY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucykge1xuICAgKiAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtteU9wdGlvbjogdHJ1ZX0pO1xuICAgKiAgIHN1cGVyLmNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGUgcHJvcGVydHksIGZvcmNlIHRoZSBhdHRyaWJ1dGUgdG8gZmFsc2UuXG4gICAgaWYgKG9wdGlvbnMuc3RhdGUpIHtcbiAgICAgIChvcHRpb25zIGFzIE11dGFibGU8UHJvcGVydHlEZWNsYXJhdGlvbiwgJ2F0dHJpYnV0ZSc+KS5hdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldChuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMubm9BY2Nlc3Nvcikge1xuICAgICAgY29uc3Qga2V5ID0gREVWX01PREVcbiAgICAgICAgPyAvLyBVc2UgU3ltYm9sLmZvciBpbiBkZXYgbW9kZSB0byBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbiBzdGF0ZVxuICAgICAgICAgIC8vIHdoZW4gZG9pbmcgSE1SLlxuICAgICAgICAgIFN5bWJvbC5mb3IoYCR7U3RyaW5nKG5hbWUpfSAoQHByb3BlcnR5KCkgY2FjaGUpYClcbiAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGJlIGRlZmluZWQgb24gdGhlIGdpdmVuIG5hbWVkIHByb3BlcnR5LlxuICAgKiBJZiBubyBkZXNjcmlwdG9yIGlzIHJldHVybmVkLCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmVjb21lIGFuIGFjY2Vzc29yLlxuICAgKiBGb3IgZXhhbXBsZSxcbiAgICpcbiAgICogYGBgdHNcbiAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAqICAgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpIHtcbiAgICogICAgIGNvbnN0IGRlZmF1bHREZXNjcmlwdG9yID1cbiAgICogICAgICAgICBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKTtcbiAgICogICAgIGNvbnN0IHNldHRlciA9IGRlZmF1bHREZXNjcmlwdG9yLnNldDtcbiAgICogICAgIHJldHVybiB7XG4gICAqICAgICAgIGdldDogZGVmYXVsdERlc2NyaXB0b3IuZ2V0LFxuICAgKiAgICAgICBzZXQodmFsdWUpIHtcbiAgICogICAgICAgICBzZXR0ZXIuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAqICAgICAgICAgLy8gY3VzdG9tIGFjdGlvbi5cbiAgICogICAgICAgfSxcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHtnZXQsIHNldH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5wcm90b3R5cGUsIG5hbWUpID8/IHtcbiAgICAgIGdldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNba2V5IGFzIGtleW9mIHR5cGVvZiB0aGlzXTtcbiAgICAgIH0sXG4gICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiB1bmtub3duKSB7XG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW2tleV0gPSB2O1xuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChERVZfTU9ERSAmJiBnZXQgPT0gbnVsbCkge1xuICAgICAgaWYgKCd2YWx1ZScgaW4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge30pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICBgYnV0IGl0J3MgYWN0dWFsbHkgZGVjbGFyZWQgYXMgYSB2YWx1ZSBvbiB0aGUgcHJvdG90eXBlLiBgICtcbiAgICAgICAgICAgIGBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIHVzaW5nIEBwcm9wZXJ0eSBvciBAc3RhdGUgb24gYSBtZXRob2QuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAncmVhY3RpdmUtcHJvcGVydHktd2l0aG91dC1nZXR0ZXInLFxuICAgICAgICBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9IHdhcyBkZWNsYXJlZCBhcyBhIHJlYWN0aXZlIHByb3BlcnR5IGAgK1xuICAgICAgICAgIGBidXQgaXQgZG9lcyBub3QgaGF2ZSBhIGdldHRlci4gVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIGEgYCArXG4gICAgICAgICAgYGZ1dHVyZSB2ZXJzaW9uIG9mIExpdC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgICBzZXQhLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAqIFRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBhIGBQcm9wZXJ0eURlY2xhcmF0aW9uYCB2aWEgdGhlIGBwcm9wZXJ0aWVzYFxuICAgKiBvYmplY3Qgb3IgdGhlIGBAcHJvcGVydHlgIGRlY29yYXRvciBhbmQgYXJlIHJlZ2lzdGVyZWQgaW5cbiAgICogYGNyZWF0ZVByb3BlcnR5KC4uLilgLlxuICAgKlxuICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBcImZpbmFsXCIgYW5kIG5vdCBvdmVycmlkZGVuLiBUb1xuICAgKiBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gcHJvcGVydHksIG92ZXJyaWRlXG4gICAqIHtAbGlua2NvZGUgY3JlYXRlUHJvcGVydHl9LlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAZmluYWxcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnMobmFtZTogUHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQobmFtZSkgPz8gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb247XG4gIH1cblxuICAvLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbiAgZGVjbGFyZSBzdGF0aWMgW1N5bWJvbC5tZXRhZGF0YV06IG9iamVjdCAmIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHN0YXRpYyBvd24gcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgdXNlZCBpbiBib29ra2VlcGluZ1xuICAgKiBmb3IgZWxlbWVudCBwcm9wZXJ0aWVzLCBpbml0aWFsaXplcnMsIGV0Yy5cbiAgICpcbiAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSBjb2RlIHRoYXQgbmVlZHMgdG8gZW5zdXJlIHRoZXNlXG4gICAqIHByb3BlcnRpZXMgZXhpc3QgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN1cGVyY2xhc3MgaXMgZmluYWxpemVkIHNvIHRoYXQgaW5oZXJpdGVkXG4gICAqIHByb3BlcnR5IG1ldGFkYXRhIGNhbiBiZSBjb3BpZWQgZG93bi5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fcHJlcGFyZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgdGhpcykpXG4gICAgKSB7XG4gICAgICAvLyBBbHJlYWR5IHByZXBhcmVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbmFsaXplIGFueSBzdXBlcmNsYXNzZXNcbiAgICBjb25zdCBzdXBlckN0b3IgPSBnZXRQcm90b3R5cGVPZih0aGlzKSBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIG93biBzZXQgb2YgaW5pdGlhbGl6ZXJzIGZvciB0aGlzIGNsYXNzIGlmIGFueSBleGlzdCBvbiB0aGVcbiAgICAvLyBzdXBlcmNsYXNzIGFuZCBjb3B5IHRoZW0gZG93bi4gTm90ZSwgZm9yIGEgc21hbGwgcGVyZiBib29zdCwgYXZvaWRcbiAgICAvLyBjcmVhdGluZyBpbml0aWFsaXplcnMgdW5sZXNzIG5lZWRlZC5cbiAgICBpZiAoc3VwZXJDdG9yLl9pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gWy4uLnN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzXTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50UHJvcGVydGllcyBmcm9tIHRoZSBzdXBlcmNsYXNzXG4gICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG5ldyBNYXAoc3VwZXJDdG9yLmVsZW1lbnRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyBzZXR0aW5nIHVwIHRoZSBjbGFzcyBzbyB0aGF0IGl0J3MgcmVhZHkgdG8gYmUgcmVnaXN0ZXJlZFxuICAgKiBhcyBhIGN1c3RvbSBlbGVtZW50IGFuZCBpbnN0YW50aWF0ZWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIuXG4gICAqIElmIHlvdSBvdmVycmlkZSB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlciwgeW91IG11c3QgZWl0aGVyIGNhbGxcbiAgICogc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHRvIHRyaWdnZXIgZmluYWxpemF0aW9uLCBvciBjYWxsIGZpbmFsaXplKClcbiAgICogeW91cnNlbGYuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsaXplKCkge1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIHRoaXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHN0YXRpYyBwcm9wZXJ0aWVzIGJsb2NrOlxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgcHJvcEtleXMgPSBbXG4gICAgICAgIC4uLmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLFxuICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcHMpLFxuICAgICAgXSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgcHJvcHM+O1xuICAgICAgZm9yIChjb25zdCBwIG9mIHByb3BLZXlzKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHkocCwgcHJvcHNbcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gc3RhbmRhcmQgZGVjb3JhdG9yIG1ldGFkYXRhOlxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpc1tTeW1ib2wubWV0YWRhdGFdO1xuICAgIGlmIChtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHAsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUtdG8tcHJvcGVydHkgbWFwXG4gICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgdGhpcy5lbGVtZW50UHJvcGVydGllcykge1xuICAgICAgY29uc3QgYXR0ciA9IHRoaXMuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocCwgb3B0aW9ucyk7XG4gICAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChhdHRyLCBwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTtcblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZVByb3BlcnR5JykpIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICduby1vdmVycmlkZS1jcmVhdGUtcHJvcGVydHknLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5jcmVhdGVQcm9wZXJ0eSgpIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFByb3BlcnR5RGVzY3JpcHRvcicpKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAnbm8tb3ZlcnJpZGUtZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3InLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB1c2VkIHdoZW4gY2FsbGluZyBgYXR0YWNoU2hhZG93YC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gY3VzdG9taXplXG4gICAqIHRoZSBvcHRpb25zIGZvciB0aGUgc2hhZG93Um9vdDsgZm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNsb3NlZFxuICAgKiBzaGFkb3dSb290OiBge21vZGU6ICdjbG9zZWQnfWAuXG4gICAqXG4gICAqIE5vdGUsIHRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgaW4gYGNyZWF0ZVJlbmRlclJvb3RgLiBJZiB0aGlzIG1ldGhvZFxuICAgKiBpcyBjdXN0b21pemVkLCBvcHRpb25zIHNob3VsZCBiZSByZXNwZWN0ZWQgaWYgcG9zc2libGUuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7bW9kZTogJ29wZW4nfTtcblxuICAvKipcbiAgICogVGFrZXMgdGhlIHN0eWxlcyB0aGUgdXNlciBzdXBwbGllZCB2aWEgdGhlIGBzdGF0aWMgc3R5bGVzYCBwcm9wZXJ0eSBhbmRcbiAgICogcmV0dXJucyB0aGUgYXJyYXkgb2Ygc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbnRlZ3JhdGUgaW50byBhIHN0eWxlIG1hbmFnZW1lbnQgc3lzdGVtLlxuICAgKlxuICAgKiBTdHlsZXMgYXJlIGRlZHVwbGljYXRlZCBwcmVzZXJ2aW5nIHRoZSBfbGFzdF8gaW5zdGFuY2UgaW4gdGhlIGxpc3QuIFRoaXNcbiAgICogaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gYXZvaWQgZHVwbGljYXRlZCBzdHlsZXMgdGhhdCBjYW4gb2NjdXJcbiAgICogZXNwZWNpYWxseSB3aGVuIGNvbXBvc2luZyB2aWEgc3ViY2xhc3NpbmcuIFRoZSBsYXN0IGl0ZW0gaXMga2VwdCB0byB0cnlcbiAgICogdG8gcHJlc2VydmUgdGhlIGNhc2NhZGUgb3JkZXIgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MgbW9zdCBpbXBvcnRhbnRcbiAgICogdGhhdCBsYXN0IGFkZGVkIHN0eWxlcyBvdmVycmlkZSBwcmV2aW91cyBzdHlsZXMuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVTdHlsZXMoXG4gICAgc3R5bGVzPzogQ1NTUmVzdWx0R3JvdXBcbiAgKTogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+IHtcbiAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuICAgICAgLy8gRGVkdXBlIHRoZSBmbGF0dGVuZWQgYXJyYXkgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgbGFzdCBpdGVtcy5cbiAgICAgIC8vIENhc3RpbmcgdG8gQXJyYXk8dW5rbm93bj4gd29ya3MgYXJvdW5kIFRTIGVycm9yIHRoYXRcbiAgICAgIC8vIGFwcGVhcnMgdG8gY29tZSBmcm9tIHRyeWluZyB0byBmbGF0dGVuIGEgdHlwZSBDU1NSZXN1bHRBcnJheS5cbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKHN0eWxlcyBhcyBBcnJheTx1bmtub3duPikuZmxhdChJbmZpbml0eSkucmV2ZXJzZSgpKTtcbiAgICAgIC8vIFRoZW4gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgYnkgYWRkaW5nIHRoZSBzZXQgaXRlbXMgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXQpIHtcbiAgICAgICAgZWxlbWVudFN0eWxlcy51bnNoaWZ0KGdldENvbXBhdGlibGVTdHlsZShzIGFzIENTU1Jlc3VsdE9yTmF0aXZlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxlbWVudFN0eWxlcy5wdXNoKGdldENvbXBhdGlibGVTdHlsZShzdHlsZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRTdHlsZXM7XG4gIH1cblxuICAvKipcbiAgICogTm9kZSBvciBTaGFkb3dSb290IGludG8gd2hpY2ggZWxlbWVudCBET00gc2hvdWxkIGJlIHJlbmRlcmVkLiBEZWZhdWx0c1xuICAgKiB0byBhbiBvcGVuIHNoYWRvd1Jvb3QuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlclJvb3QhOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgYG5hbWVgLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZTtcbiAgICByZXR1cm4gYXR0cmlidXRlID09PSBmYWxzZVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ3N0cmluZydcbiAgICAgID8gYXR0cmlidXRlXG4gICAgICA6IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJ1xuICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSB0byBhbiB1bnJlc29sdmVkIFByb21pc2Ugc28gd2UgY2FuIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBoYXNcbiAgLy8gY29ubmVjdGVkIGJlZm9yZSBmaXJzdCB1cGRhdGUuXG4gIHByaXZhdGUgX191cGRhdGVQcm9taXNlITogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgdXBkYXRlIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgYHJlcXVlc3RVcGRhdGUoKWAuXG4gICAqIFNob3VsZCBvbmx5IGJlIHJlYWQuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBpc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogSXMgc2V0IHRvIGB0cnVlYCBhZnRlciB0aGUgZmlyc3QgdXBkYXRlLiBUaGUgZWxlbWVudCBjb2RlIGNhbm5vdCBhc3N1bWVcbiAgICogdGhhdCBgcmVuZGVyUm9vdGAgZXhpc3RzIGJlZm9yZSB0aGUgZWxlbWVudCBgaGFzVXBkYXRlZGAuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBoYXNVcGRhdGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcCB3aXRoIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0XG4gICAqIHVwZGF0ZSBjeWNsZSB3aXRoIHByZXZpb3VzIHZhbHVlcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJGNoYW5nZWRQcm9wZXJ0aWVzITogUHJvcGVydHlWYWx1ZXM7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIHdoZW4gdXBkYXRlZC5cbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydGllcz86IFNldDxQcm9wZXJ0eUtleT47XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgY3VycmVudGx5IHJlZmxlY3RpbmcgcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgX19yZWZsZWN0aW5nUHJvcGVydHk6IFByb3BlcnR5S2V5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBjb250cm9sbGVycy5cbiAgICovXG4gIHByaXZhdGUgX19jb250cm9sbGVycz86IFNldDxSZWFjdGl2ZUNvbnRyb2xsZXI+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fX2luaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBvbmx5IG92ZXJyaWRlIHBvaW50IGZvciBjdXN0b21pemluZyB3b3JrIGRvbmUgd2hlbiBlbGVtZW50c1xuICAgKiBhcmUgY29uc3RydWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9faW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KFxuICAgICAgKHJlcykgPT4gKHRoaXMuZW5hYmxlVXBkYXRpbmcgPSByZXMpXG4gICAgKTtcbiAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gVGhpcyBlbnF1ZXVlcyBhIG1pY3JvdGFzayB0aGF0IHVzdCBydW4gYmVmb3JlIHRoZSBmaXJzdCB1cGRhdGUsIHNvIGl0XG4gICAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlcXVlc3RVcGRhdGUoKVxuICAgIHRoaXMuX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCk7XG4gICAgLy8gZW5zdXJlcyBmaXJzdCB1cGRhdGUgd2lsbCBiZSBjYXVnaHQgYnkgYW4gZWFybHkgYWNjZXNzIG9mXG4gICAgLy8gYHVwZGF0ZUNvbXBsZXRlYFxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLl9pbml0aWFsaXplcnM/LmZvckVhY2goKGkpID0+XG4gICAgICBpKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZWxlbWVudCdzIHJlYWN0aXZlXG4gICAqIHVwZGF0ZSBjeWNsZS4gVGhlIGVsZW1lbnQgYXV0b21hdGljYWxseSBjYWxscyBpbnRvIGFueSByZWdpc3RlcmVkXG4gICAqIGNvbnRyb2xsZXJzIGR1cmluZyBpdHMgbGlmZWN5Y2xlIGNhbGxiYWNrcy5cbiAgICpcbiAgICogSWYgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHdoZW4gYGFkZENvbnRyb2xsZXIoKWAgaXMgY2FsbGVkLCB0aGVcbiAgICogY29udHJvbGxlcidzIGBob3N0Q29ubmVjdGVkKClgIGNhbGxiYWNrIHdpbGwgYmUgaW1tZWRpYXRlbHkgY2FsbGVkLlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgKHRoaXMuX19jb250cm9sbGVycyA/Pz0gbmV3IFNldCgpKS5hZGQoY29udHJvbGxlcik7XG4gICAgLy8gSWYgYSBjb250cm9sbGVyIGlzIGFkZGVkIGFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGNvbm5lY3RlZCxcbiAgICAvLyBjYWxsIGhvc3RDb25uZWN0ZWQuIE5vdGUsIHJlLXVzaW5nIGV4aXN0ZW5jZSBvZiBgcmVuZGVyUm9vdGAgaGVyZVxuICAgIC8vICh3aGljaCBpcyBzZXQgaW4gY29ubmVjdGVkQ2FsbGJhY2spIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFcbiAgICAvLyBmaXJzdCBjb25uZWN0ZWQgc3RhdGUuXG4gICAgaWYgKHRoaXMucmVuZGVyUm9vdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuaG9zdENvbm5lY3RlZD8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCBmcm9tIHRoZSBlbGVtZW50LlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIHJlbW92ZUNvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5kZWxldGUoY29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogRml4ZXMgYW55IHByb3BlcnRpZXMgc2V0IG9uIHRoZSBpbnN0YW5jZSBiZWZvcmUgdXBncmFkZSB0aW1lLlxuICAgKiBPdGhlcndpc2UgdGhlc2Ugd291bGQgc2hhZG93IHRoZSBhY2Nlc3NvciBhbmQgYnJlYWsgdGhlc2UgcHJvcGVydGllcy5cbiAgICogVGhlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBpbiBhIE1hcCB3aGljaCBpcyBwbGF5ZWQgYmFjayBhZnRlciB0aGVcbiAgICogY29uc3RydWN0b3IgcnVucy4gTm90ZSwgb24gdmVyeSBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpICg8PTkpIG9yIENocm9tZVxuICAgKiAoPD00MSksIHByb3BlcnRpZXMgY3JlYXRlZCBmb3IgbmF0aXZlIHBsYXRmb3JtIHByb3BlcnRpZXMgbGlrZSAoYGlkYCBvclxuICAgKiBgbmFtZWApIG1heSBub3QgaGF2ZSBkZWZhdWx0IHZhbHVlcyBzZXQgaW4gdGhlIGVsZW1lbnQgY29uc3RydWN0b3IuIE9uXG4gICAqIHRoZXNlIGJyb3dzZXJzIG5hdGl2ZSBwcm9wZXJ0aWVzIGFwcGVhciBvbiBpbnN0YW5jZXMgYW5kIHRoZXJlZm9yZSB0aGVpclxuICAgKiBkZWZhdWx0IHZhbHVlIHdpbGwgb3ZlcndyaXRlIGFueSBlbGVtZW50IGRlZmF1bHQgKGUuZy4gaWYgdGhlIGVsZW1lbnQgc2V0c1xuICAgKiB0aGlzLmlkID0gJ2lkJyBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSAnaWQnIHdpbGwgYmVjb21lICcnIHNpbmNlIHRoaXMgaXNcbiAgICogdGhlIG5hdGl2ZSBwbGF0Zm9ybSBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KCk7XG4gICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KVxuICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgIGZvciAoY29uc3QgcCBvZiBlbGVtZW50UHJvcGVydGllcy5rZXlzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxrZXlvZiB0aGlzPikge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgaW5zdGFuY2VQcm9wZXJ0aWVzLnNldChwLCB0aGlzW3BdKTtcbiAgICAgICAgZGVsZXRlIHRoaXNbcF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZVByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSBpbnN0YW5jZVByb3BlcnRpZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vZGUgaW50byB3aGljaCB0aGUgZWxlbWVudCBzaG91bGQgcmVuZGVyIGFuZCBieSBkZWZhdWx0XG4gICAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYW4gb3BlbiBzaGFkb3dSb290LiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHdoZXJlIHRoZVxuICAgKiBlbGVtZW50J3MgRE9NIGlzIHJlbmRlcmVkLiBGb3IgZXhhbXBsZSwgdG8gcmVuZGVyIGludG8gdGhlIGVsZW1lbnQnc1xuICAgKiBjaGlsZE5vZGVzLCByZXR1cm4gYHRoaXNgLlxuICAgKlxuICAgKiBAcmV0dXJuIFJldHVybnMgYSBub2RlIGludG8gd2hpY2ggdG8gcmVuZGVyLlxuICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPVxuICAgICAgdGhpcy5zaGFkb3dSb290ID8/XG4gICAgICB0aGlzLmF0dGFjaFNoYWRvdyhcbiAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuc2hhZG93Um9vdE9wdGlvbnNcbiAgICAgICk7XG4gICAgYWRvcHRTdHlsZXMoXG4gICAgICByZW5kZXJSb290LFxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZWxlbWVudFN0eWxlc1xuICAgICk7XG4gICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgY29ubmVjdGlvbiwgY3JlYXRlcyB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QsIHNldHMgdXBcbiAgICogZWxlbWVudCBzdHlsaW5nLCBhbmQgZW5hYmxlcyB1cGRhdGluZy5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGNvbnRyb2xsZXJzIGBob3N0Q29ubmVjdGVkYFxuICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB0aGlzLmVuYWJsZVVwZGF0aW5nKHRydWUpO1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0Q29ubmVjdGVkPy4oKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmluYWwgYW5kIG5vdCBvdmVycmlkZGVuLiBJdCBpc1xuICAgKiBvdmVycmlkZGVuIG9uIHRoZSBlbGVtZW50IGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSBmaXJzdFxuICAgKiB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5hYmxlVXBkYXRpbmcoX3JlcXVlc3RlZFVwZGF0ZTogYm9vbGVhbikge31cblxuICAvKipcbiAgICogQWxsb3dzIGZvciBgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgaW4gZXh0ZW5zaW9ucyB3aGlsZVxuICAgKiByZXNlcnZpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIG1ha2luZyBub24tYnJlYWtpbmcgZmVhdHVyZSBhZGRpdGlvbnNcbiAgICogd2hlbiBkaXNjb25uZWN0aW5nIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3REaXNjb25uZWN0ZWQ/LigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgcHJvcGVydHkgdmFsdWVzIHdoZW4gYXR0cmlidXRlcyBjaGFuZ2UuXG4gICAqXG4gICAqIFNwZWNpZmljYWxseSwgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBzZXQuXG4gICAqIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2suIElmIHRoaXMgbWV0aG9kIGlzXG4gICAqIG92ZXJyaWRkZW4sIGBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgX29sZCwgdmFsdWUpYCBtdXN0IGJlXG4gICAqIGNhbGxlZC5cbiAgICpcbiAgICogU2VlIFt1c2luZyB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvV2ViX0NvbXBvbmVudHMvVXNpbmdfY3VzdG9tX2VsZW1lbnRzI3VzaW5nX3RoZV9saWZlY3ljbGVfY2FsbGJhY2tzKVxuICAgKiBvbiBNRE4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLlxuICAgKiBAY2F0ZWdvcnkgYXR0cmlidXRlc1xuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsXG4gICkge1xuICAgIHRoaXMuXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX19wcm9wZXJ0eVRvQXR0cmlidXRlKG5hbWU6IFByb3BlcnR5S2V5LCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IGVsZW1Qcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9uTWFwID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5lbGVtZW50UHJvcGVydGllcztcbiAgICBjb25zdCBvcHRpb25zID0gZWxlbVByb3BlcnRpZXMuZ2V0KG5hbWUpITtcbiAgICBjb25zdCBhdHRyID0gKFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgKS5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucmVmbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgY29udmVydGVyID1cbiAgICAgICAgKG9wdGlvbnMuY29udmVydGVyIGFzIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIpPy50b0F0dHJpYnV0ZSAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgPyAob3B0aW9ucy5jb252ZXJ0ZXIgYXMgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcilcbiAgICAgICAgICA6IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICBjb25zdCBhdHRyVmFsdWUgPSBjb252ZXJ0ZXIudG9BdHRyaWJ1dGUhKHZhbHVlLCBvcHRpb25zLnR5cGUpO1xuICAgICAgaWYgKFxuICAgICAgICBERVZfTU9ERSAmJlxuICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KS5lbmFibGVkV2FybmluZ3MhLmluY2x1ZGVzKFxuICAgICAgICAgICdtaWdyYXRpb24nXG4gICAgICAgICkgJiZcbiAgICAgICAgYXR0clZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJ3VuZGVmaW5lZC1hdHRyaWJ1dGUtdmFsdWUnLFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlIHZhbHVlIGZvciB0aGUgJHtuYW1lIGFzIHN0cmluZ30gcHJvcGVydHkgaXMgYCArXG4gICAgICAgICAgICBgdW5kZWZpbmVkIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0uIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBgICtcbiAgICAgICAgICAgIGByZW1vdmVkLCBidXQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgXFxgUmVhY3RpdmVFbGVtZW50XFxgLCBgICtcbiAgICAgICAgICAgIGB0aGUgYXR0cmlidXRlIHdvdWxkIG5vdCBoYXZlIGNoYW5nZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVHJhY2sgaWYgdGhlIHByb3BlcnR5IGlzIGJlaW5nIHJlZmxlY3RlZCB0byBhdm9pZFxuICAgICAgLy8gc2V0dGluZyB0aGUgcHJvcGVydHkgYWdhaW4gdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLiBOb3RlOlxuICAgICAgLy8gMS4gdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY2FsbGJhY2sgaXMgc3luY2hyb25vdXMuXG4gICAgICAvLyAyLiB3aWxsIGJlaGF2ZSBpbmNvcnJlY3RseSBpZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBpbiB0aGUgcmVhY3Rpb25cbiAgICAgIC8vIHN0YWNrIGF0IHRpbWUgb2YgY2FsbGluZy4gSG93ZXZlciwgc2luY2Ugd2UgcHJvY2VzcyBhdHRyaWJ1dGVzXG4gICAgICAvLyBpbiBgdXBkYXRlYCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUgKG9yIGFuIGV4dHJlbWUgY29ybmVyIGNhc2VcbiAgICAgIC8vIHRoYXQgd2UnZCBsaWtlIHRvIGRpc2NvdmVyKS5cbiAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG5hbWU7XG4gICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyVmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIC8vIE5vdGUsIGhpbnQgdGhpcyBhcyBhbiBgQXR0cmlidXRlTWFwYCBzbyBjbG9zdXJlIGNsZWFybHkgdW5kZXJzdGFuZHNcbiAgICAvLyB0aGUgdHlwZTsgaXQgaGFzIGlzc3VlcyB3aXRoIHRyYWNraW5nIHR5cGVzIHRocm91Z2ggc3RhdGljc1xuICAgIGNvbnN0IHByb3BOYW1lID0gKGN0b3IuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGFzIEF0dHJpYnV0ZU1hcCkuZ2V0KG5hbWUpO1xuICAgIC8vIFVzZSB0cmFja2luZyBpbmZvIHRvIGF2b2lkIHJlZmxlY3RpbmcgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICAvLyBpZiBpdCB3YXMganVzdCBzZXQgYmVjYXVzZSB0aGUgYXR0cmlidXRlIGNoYW5nZWQuXG4gICAgaWYgKHByb3BOYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gcHJvcE5hbWUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhwcm9wTmFtZSk7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPVxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5jb252ZXJ0ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHtmcm9tQXR0cmlidXRlOiBvcHRpb25zLmNvbnZlcnRlcn1cbiAgICAgICAgICA6IG9wdGlvbnMuY29udmVydGVyPy5mcm9tQXR0cmlidXRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gcHJvcE5hbWU7XG4gICAgICB0aGlzW3Byb3BOYW1lIGFzIGtleW9mIHRoaXNdID0gY29udmVydGVyLmZyb21BdHRyaWJ1dGUhKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3B0aW9ucy50eXBlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICApIGFzIGFueTtcbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbiB1cGRhdGUgd2hpY2ggaXMgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcbiAgICogd2hlbiBhbiBlbGVtZW50IHNob3VsZCB1cGRhdGUgYmFzZWQgb24gc29tZSBzdGF0ZSBub3QgdHJpZ2dlcmVkIGJ5IHNldHRpbmdcbiAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlLCBwYXNzIG5vIGFyZ3VtZW50cy4gSXQgc2hvdWxkIGFsc28gYmVcbiAgICogY2FsbGVkIHdoZW4gbWFudWFsbHkgaW1wbGVtZW50aW5nIGEgcHJvcGVydHkgc2V0dGVyLiBJbiB0aGlzIGNhc2UsIHBhc3MgdGhlXG4gICAqIHByb3BlcnR5IGBuYW1lYCBhbmQgYG9sZFZhbHVlYCB0byBlbnN1cmUgdGhhdCBhbnkgY29uZmlndXJlZCBwcm9wZXJ0eVxuICAgKiBvcHRpb25zIGFyZSBob25vcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHJlcXVlc3RpbmcgcHJvcGVydHlcbiAgICogQHBhcmFtIG9sZFZhbHVlIG9sZCB2YWx1ZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAqIEBwYXJhbSBvcHRpb25zIHByb3BlcnR5IG9wdGlvbnMgdG8gdXNlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzbHlcbiAgICogICAgIGNvbmZpZ3VyZWQgb3B0aW9uc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwcm9wZXJ0eSBrZXksIHBlcmZvcm0gcHJvcGVydHkgdXBkYXRlIHN0ZXBzLlxuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChERVZfTU9ERSAmJiAobmFtZSBhcyB1bmtub3duKSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICBgYCxcbiAgICAgICAgICBgVGhlIHJlcXVlc3RVcGRhdGUoKSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGFuIEV2ZW50IGFzIHRoZSBwcm9wZXJ0eSBuYW1lLiBUaGlzIGlzIHByb2JhYmx5IGEgbWlzdGFrZSBjYXVzZWQgYnkgYmluZGluZyB0aGlzLnJlcXVlc3RVcGRhdGUgYXMgYW4gZXZlbnQgbGlzdGVuZXIuIEluc3RlYWQgYmluZCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzOiAoKSA9PiB0aGlzLnJlcXVlc3RVcGRhdGUoKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPz89IChcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50XG4gICAgICApLmdldFByb3BlcnR5T3B0aW9ucyhuYW1lKTtcbiAgICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBvcHRpb25zLmhhc0NoYW5nZWQgPz8gbm90RXF1YWw7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNbbmFtZSBhcyBrZXlvZiB0aGlzXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFib3J0IHRoZSByZXF1ZXN0IGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY2hhbmdlZC5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pc1VwZGF0ZVBlbmRpbmcgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IHRoaXMuX19lbnF1ZXVlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRjaGFuZ2VQcm9wZXJ0eShcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZTogdW5rbm93bixcbiAgICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICkge1xuICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBDcmVhdGUgYSBiZW5jaG1hcmsgb2YgTWFwLmhhcygpICsgTWFwLnNldChcbiAgICAvLyB2cyBqdXN0IE1hcC5zZXQoKVxuICAgIGlmICghdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLnNldChuYW1lLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIC8vIEFkZCB0byByZWZsZWN0aW5nIHByb3BlcnRpZXMgc2V0LlxuICAgIC8vIE5vdGUsIGl0J3MgaW1wb3J0YW50IHRoYXQgZXZlcnkgY2hhbmdlIGhhcyBhIGNoYW5jZSB0byBhZGQgdGhlXG4gICAgLy8gcHJvcGVydHkgdG8gYF9fcmVmbGVjdGluZ1Byb3BlcnRpZXNgLiBUaGlzIGVuc3VyZXMgc2V0dGluZ1xuICAgIC8vIGF0dHJpYnV0ZSArIHByb3BlcnR5IHJlZmxlY3RzIGNvcnJlY3RseS5cbiAgICBpZiAob3B0aW9ucy5yZWZsZWN0ID09PSB0cnVlICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IG5hbWUpIHtcbiAgICAgICh0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgPz89IG5ldyBTZXQ8UHJvcGVydHlLZXk+KCkpLmFkZChuYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSB1cGRhdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9fZW5xdWV1ZVVwZGF0ZSgpIHtcbiAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBhbnkgcHJldmlvdXMgdXBkYXRlIGhhcyByZXNvbHZlZCBiZWZvcmUgdXBkYXRpbmcuXG4gICAgICAvLyBUaGlzIGBhd2FpdGAgYWxzbyBlbnN1cmVzIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBhcmUgYmF0Y2hlZC5cbiAgICAgIGF3YWl0IHRoaXMuX191cGRhdGVQcm9taXNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFJlZmlyZSBhbnkgcHJldmlvdXMgZXJyb3JzIGFzeW5jIHNvIHRoZXkgZG8gbm90IGRpc3J1cHQgdGhlIHVwZGF0ZVxuICAgICAgLy8gY3ljbGUuIEVycm9ycyBhcmUgcmVmaXJlZCBzbyBkZXZlbG9wZXJzIGhhdmUgYSBjaGFuY2UgdG8gb2JzZXJ2ZVxuICAgICAgLy8gdGhlbSwgYW5kIHRoaXMgY2FuIGJlIGRvbmUgYnkgaW1wbGVtZW50aW5nXG4gICAgICAvLyBgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uYC5cbiAgICAgIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgLy8gSWYgYHNjaGVkdWxlVXBkYXRlYCByZXR1cm5zIGEgUHJvbWlzZSwgd2UgYXdhaXQgaXQuIFRoaXMgaXMgZG9uZSB0b1xuICAgIC8vIGVuYWJsZSBjb29yZGluYXRpbmcgdXBkYXRlcyB3aXRoIGEgc2NoZWR1bGVyLiBOb3RlLCB0aGUgcmVzdWx0IGlzXG4gICAgLy8gY2hlY2tlZCB0byBhdm9pZCBkZWxheWluZyBhbiBhZGRpdGlvbmFsIG1pY3JvdGFzayB1bmxlc3Mgd2UgbmVlZCB0by5cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzVXBkYXRlUGVuZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZXMgYW4gZWxlbWVudCB1cGRhdGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZVxuICAgKiB0aW1pbmcgb2YgdXBkYXRlcyBieSByZXR1cm5pbmcgYSBQcm9taXNlLiBUaGUgdXBkYXRlIHdpbGwgYXdhaXQgdGhlXG4gICAqIHJldHVybmVkIFByb21pc2UsIGFuZCB5b3Ugc2hvdWxkIHJlc29sdmUgdGhlIFByb21pc2UgdG8gYWxsb3cgdGhlIHVwZGF0ZVxuICAgKiB0byBwcm9jZWVkLiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCBgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKWBcbiAgICogbXVzdCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgdG8gc2NoZWR1bGUgdXBkYXRlcyB0byBvY2N1ciBqdXN0IGJlZm9yZSB0aGUgbmV4dCBmcmFtZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogb3ZlcnJpZGUgcHJvdGVjdGVkIGFzeW5jIHNjaGVkdWxlVXBkYXRlKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgKiAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAqICAgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHwgUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gICAgaWYgKFxuICAgICAgREVWX01PREUgJiZcbiAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMoXG4gICAgICAgICdhc3luYy1wZXJmb3JtLXVwZGF0ZSdcbiAgICAgICkgJiZcbiAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHVua25vd24gYXMgUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCk/LnRoZW4gPT09XG4gICAgICAgICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gcmV0dXJuZWQgYSBQcm9taXNlIGZyb20gcGVyZm9ybVVwZGF0ZSgpLiBgICtcbiAgICAgICAgICBgVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYCArXG4gICAgICAgICAgYHZlcnNpb24gb2YgUmVhY3RpdmVFbGVtZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gZWxlbWVudCB1cGRhdGUuIE5vdGUsIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHRoZVxuICAgKiB1cGRhdGUsIGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgKlxuICAgKiBDYWxsIGBwZXJmb3JtVXBkYXRlKClgIHRvIGltbWVkaWF0ZWx5IHByb2Nlc3MgYSBwZW5kaW5nIHVwZGF0ZS4gVGhpcyBzaG91bGRcbiAgICogZ2VuZXJhbGx5IG5vdCBiZSBuZWVkZWQsIGJ1dCBpdCBjYW4gYmUgZG9uZSBpbiByYXJlIGNhc2VzIHdoZW4geW91IG5lZWQgdG9cbiAgICogdXBkYXRlIHN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcGVyZm9ybVVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBBYm9ydCBhbnkgdXBkYXRlIGlmIG9uZSBpcyBub3QgcGVuZGluZyB3aGVuIHRoaXMgaXMgY2FsbGVkLlxuICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGVyZm9ybVVwZGF0ZWAgaXMgY2FsbGVkIGVhcmx5IHRvIFwiZmx1c2hcIlxuICAgIC8vIHRoZSB1cGRhdGUuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRlUGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Z0xvZ0V2ZW50Py4oe2tpbmQ6ICd1cGRhdGUnfSk7XG4gICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIC8vIENyZWF0ZSByZW5kZXJSb290IGJlZm9yZSBmaXJzdCB1cGRhdGUuIFRoaXMgb2NjdXJzIGluIGBjb25uZWN0ZWRDYWxsYmFja2BcbiAgICAgIC8vIGJ1dCBpcyBkb25lIGhlcmUgdG8gc3VwcG9ydCBvdXQgb2YgdHJlZSBjYWxscyB0byBgZW5hYmxlVXBkYXRpbmdgL2BwZXJmb3JtVXBkYXRlYC5cbiAgICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgIC8vIFByb2R1Y2Ugd2FybmluZyBpZiBhbnkgcmVhY3RpdmUgcHJvcGVydGllcyBvbiB0aGUgcHJvdG90eXBlIGFyZVxuICAgICAgICAvLyBzaGFkb3dlZCBieSBjbGFzcyBmaWVsZHMuIEluc3RhbmNlIGZpZWxkcyBzZXQgYmVmb3JlIHVwZ3JhZGUgYXJlXG4gICAgICAgIC8vIGRlbGV0ZWQgYnkgdGhpcyBwb2ludCwgc28gYW55IG93biBwcm9wZXJ0eSBpcyBjYXVzZWQgYnkgY2xhc3MgZmllbGRcbiAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzaGFkb3dlZFByb3BlcnRpZXMgPSBbLi4uY3Rvci5lbGVtZW50UHJvcGVydGllcy5rZXlzKCldLmZpbHRlcihcbiAgICAgICAgICAocCkgPT4gdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSAmJiBwIGluIGdldFByb3RvdHlwZU9mKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzaGFkb3dlZFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHdpbGwgbm90IGAgK1xuICAgICAgICAgICAgICBgdHJpZ2dlciB1cGRhdGVzIGFzIGV4cGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgc2V0IHVzaW5nIGNsYXNzIGAgK1xuICAgICAgICAgICAgICBgZmllbGRzOiAke3NoYWRvd2VkUHJvcGVydGllcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgICAgIGBOYXRpdmUgY2xhc3MgZmllbGRzIGFuZCBzb21lIGNvbXBpbGVkIG91dHB1dCB3aWxsIG92ZXJ3cml0ZSBgICtcbiAgICAgICAgICAgICAgYGFjY2Vzc29ycyB1c2VkIGZvciBkZXRlY3RpbmcgY2hhbmdlcy4gU2VlIGAgK1xuICAgICAgICAgICAgICBgaHR0cHM6Ly9saXQuZGV2L21zZy9jbGFzcy1maWVsZC1zaGFkb3dpbmcgYCArXG4gICAgICAgICAgICAgIGBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWl4aW4gaW5zdGFuY2UgcHJvcGVydGllcyBvbmNlLCBpZiB0aGV5IGV4aXN0LlxuICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHNob3VsZCB3ZSB1c2UgdGhlIHN0b3JlZCB2YWx1ZT8gQ291bGQgYSBuZXcgdmFsdWVcbiAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBzaW5jZSB3ZSBzdG9yZWQgdGhlIG93biBwcm9wZXJ0eSB2YWx1ZT9cbiAgICAgICAgZm9yIChjb25zdCBbcCwgdmFsdWVdIG9mIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICB0aGlzW3AgYXMga2V5b2YgdGhpc10gPSB2YWx1ZSBhcyB0aGlzW2tleW9mIHRoaXNdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgdmFsdWUgcmVmbGVjdGlvbiBhbmQgcG9wdWxhdGUgdGhlIGluaXRpYWxcbiAgICAgIC8vIGNoYW5nZWRQcm9wZXJ0aWVzIG1hcCwgYnV0IG9ubHkgZm9yIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbFxuICAgICAgLy8gZGVjb3JhdG9ycyBvbiBhY2Nlc3NvcnMsIHdoaWNoIHdpbGwgbm90IGhhdmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlXG4gICAgICAvLyBjaGFuZ2VkUHJvcGVydGllcyBtYXAuIFdlIGNhbid0IGtub3cgaWYgdGhlc2UgYWNjZXNzb3JzIGhhZFxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBzbyB3ZSBqdXN0IHNldCB0aGVtIGFueXdheSAtIGEgZGlmZmVyZW5jZSBmcm9tXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMgYW5kIHN0YW5kYXJkIGRlY29yYXRvcnMgb25cbiAgICAgIC8vIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gRm9yIGNvbnRleHQgd2h5IGV4cGVyaW1lbnRhbERlY29yYXRvcnMgd2l0aCBhdXRvIGFjY2Vzc29ycyBhcmUgaGFuZGxlZFxuICAgICAgLy8gc3BlY2lmaWNhbGx5IGFsc28gc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvcHVsbC80MTgzI2lzc3VlY29tbWVudC0xNzExOTU5NjM1XG4gICAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpXG4gICAgICAgIC5lbGVtZW50UHJvcGVydGllcztcbiAgICAgIGlmIChlbGVtZW50UHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBlbGVtZW50UHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG9wdGlvbnMud3JhcHBlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgIXRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5oYXMocCkgJiZcbiAgICAgICAgICAgIHRoaXNbcCBhcyBrZXlvZiB0aGlzXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkocCwgdGhpc1twIGFzIGtleW9mIHRoaXNdLCBvcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZWRQcm9wZXJ0aWVzID0gdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzO1xuICAgIHRyeSB7XG4gICAgICBzaG91bGRVcGRhdGUgPSB0aGlzLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgIHRoaXMud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlPy4oKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFByZXZlbnQgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCBmcm9tIHJ1bm5pbmcgd2hlbiB0aGVyZSdzIGFuXG4gICAgICAvLyB1cGRhdGUgZXhjZXB0aW9uLlxuICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAvLyBFbnN1cmUgZWxlbWVudCBjYW4gYWNjZXB0IGFkZGl0aW9uYWwgdXBkYXRlcyBhZnRlciBhbiBleGNlcHRpb24uXG4gICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIFRoZSB1cGRhdGUgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgcGVuZGluZyBhbmQgZnVydGhlciB1cGRhdGVzIGFyZSBub3cgYWxsb3dlZC5cbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLl8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCBiZWZvcmUgYHVwZGF0ZSgpYCB0byBjb21wdXRlIHZhbHVlcyBuZWVkZWQgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIEltcGxlbWVudCBgd2lsbFVwZGF0ZWAgdG8gY29tcHV0ZSBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gb3RoZXJcbiAgICogcHJvcGVydGllcyBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAqICAgLy8gb25seSBuZWVkIHRvIGNoZWNrIGNoYW5nZWQgcHJvcGVydGllcyBmb3IgYW4gZXhwZW5zaXZlIGNvbXB1dGF0aW9uLlxuICAgKiAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2ZpcnN0TmFtZScpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGFzdE5hbWUnKSkge1xuICAgKiAgICAgdGhpcy5zaGEgPSBjb21wdXRlU0hBKGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHJlbmRlcigpIHtcbiAgICogICByZXR1cm4gaHRtbGBTSEE6ICR7dGhpcy5zaGF9YDtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB3aWxsVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHt9XG5cbiAgLy8gTm90ZSwgdGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcG9seWZpbGwtc3VwcG9ydC5cbiAgLy8gQGludGVybmFsXG4gIF8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlZD8uKCkpO1xuICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLmhhc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgIERFVl9NT0RFICYmXG4gICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJlxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyhcbiAgICAgICAgJ2NoYW5nZS1pbi11cGRhdGUnXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gc2NoZWR1bGVkIGFuIHVwZGF0ZSBgICtcbiAgICAgICAgICBgKGdlbmVyYWxseSBiZWNhdXNlIGEgcHJvcGVydHkgd2FzIHNldCkgYCArXG4gICAgICAgICAgYGFmdGVyIGFuIHVwZGF0ZSBjb21wbGV0ZWQsIGNhdXNpbmcgYSBuZXcgdXBkYXRlIHRvIGJlIHNjaGVkdWxlZC4gYCArXG4gICAgICAgICAgYFRoaXMgaXMgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgbmV4dCB1cGRhdGUgYCArXG4gICAgICAgICAgYGNhbiBvbmx5IGJlIHNjaGVkdWxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyB1cGRhdGUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fbWFya1VwZGF0ZWQoKSB7XG4gICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcuXG4gICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb21wbGV0ZWQgdGhlXG4gICAqIHVwZGF0ZSB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuIFRoZSBQcm9taXNlIHJlc3VsdCBpcyBgZmFsc2VgIGlmXG4gICAqIGEgcHJvcGVydHkgd2FzIHNldCBpbnNpZGUgYHVwZGF0ZWQoKWAuIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBhblxuICAgKiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICpcbiAgICogVG8gYXdhaXQgYWRkaXRpb25hbCBhc3luY2hyb25vdXMgd29yaywgb3ZlcnJpZGUgdGhlIGBnZXRVcGRhdGVDb21wbGV0ZWBcbiAgICogbWV0aG9kLiBGb3IgZXhhbXBsZSwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBhd2FpdCBhIHJlbmRlcmVkIGVsZW1lbnRcbiAgICogYmVmb3JlIGZ1bGZpbGxpbmcgdGhpcyBQcm9taXNlLiBUbyBkbyB0aGlzLCBmaXJzdCBhd2FpdFxuICAgKiBgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKWAsIHRoZW4gYW55IHN1YnNlcXVlbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIGdldCB1cGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHBvaW50IGZvciB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBwcm9taXNlLlxuICAgKlxuICAgKiBJdCBpcyBub3Qgc2FmZSB0byBvdmVycmlkZSB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBnZXR0ZXIgZGlyZWN0bHkgZHVlIHRvIGFcbiAgICogbGltaXRhdGlvbiBpbiBUeXBlU2NyaXB0IHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGFcbiAgICogc3VwZXJjbGFzcyBnZXR0ZXIgKGUuZy4gYHN1cGVyLnVwZGF0ZUNvbXBsZXRlLnRoZW4oLi4uKWApIHdoZW4gdGhlIHRhcmdldFxuICAgKiBsYW5ndWFnZSBpcyBFUzUgKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzM4KS5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW5zdGVhZC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgKiAgIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICogICAgIGF3YWl0IHRoaXMuX215Q2hpbGQudXBkYXRlQ29tcGxldGU7XG4gICAqICAgICByZXR1cm4gcmVzdWx0O1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXBkYXRlIGNvbXBsZXRlZFxuICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVwZGF0ZUNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBgdXBkYXRlKClgIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCByZXF1ZXN0c1xuICAgKiBhbiB1cGRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGB0cnVlYCwgYnV0IHRoaXMgY2FuIGJlXG4gICAqIGN1c3RvbWl6ZWQgdG8gY29udHJvbCB3aGVuIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHNob3VsZFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXMuXG4gICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHJlbmRlciBhbmQga2VlcCB1cGRhdGVkIGVsZW1lbnQgRE9NLlxuICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiBhbm90aGVyIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7XG4gICAgLy8gVGhlIGZvckVhY2goKSBleHByZXNzaW9uIHdpbGwgb25seSBydW4gd2hlbiB3aGVuIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgaXNcbiAgICAvLyBkZWZpbmVkLCBhbmQgaXQgcmV0dXJucyB1bmRlZmluZWQsIHNldHRpbmcgX19yZWZsZWN0aW5nUHJvcGVydGllcyB0b1xuICAgIC8vIHVuZGVmaW5lZFxuICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyAmJj0gdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzLmZvckVhY2goKHApID0+XG4gICAgICB0aGlzLl9fcHJvcGVydHlUb0F0dHJpYnV0ZShwLCB0aGlzW3AgYXMga2V5b2YgdGhpc10pXG4gICAgKSBhcyB1bmRlZmluZWQ7XG4gICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuZXZlciB0aGUgZWxlbWVudCBpcyB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybVxuICAgKiBwb3N0LXVwZGF0aW5nIHRhc2tzIHZpYSBET00gQVBJcywgZm9yIGV4YW1wbGUsIGZvY3VzaW5nIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICAgKiBhZ2FpbiBhZnRlciB0aGlzIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHt9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBmaXJzdCB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybSBvbmUgdGltZVxuICAgKiB3b3JrIG9uIHRoZSBlbGVtZW50IGFmdGVyIHVwZGF0ZS5cbiAgICpcbiAgICogYGBgdHNcbiAgICogZmlyc3RVcGRhdGVkKCkge1xuICAgKiAgIHRoaXMucmVuZGVyUm9vdC5nZXRFbGVtZW50QnlJZCgnbXktdGV4dC1hcmVhJykuZm9jdXMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAqIGFnYWluIGFmdGVyIHRoaXMgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7fVxufVxuLy8gQXNzaWduZWQgaGVyZSB0byB3b3JrIGFyb3VuZCBhIGpzY29tcGlsZXIgYnVnIHdpdGggc3RhdGljIGZpZWxkc1xuLy8gd2hlbiBjb21waWxpbmcgdG8gRVM1LlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMTc3XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbGVtZW50UHJvcGVydGllcycsIFJlYWN0aXZlRWxlbWVudClcbl0gPSBuZXcgTWFwKCk7XG4oUmVhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBSZWFjdGl2ZUVsZW1lbnQpXG5dID0gbmV3IE1hcCgpO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5wb2x5ZmlsbFN1cHBvcnQ/Lih7UmVhY3RpdmVFbGVtZW50fSk7XG5cbi8vIERldiBtb2RlIHdhcm5pbmdzLi4uXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRGVmYXVsdCB3YXJuaW5nIHNldC5cbiAgUmVhY3RpdmVFbGVtZW50LmVuYWJsZWRXYXJuaW5ncyA9IFtcbiAgICAnY2hhbmdlLWluLXVwZGF0ZScsXG4gICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgXTtcbiAgY29uc3QgZW5zdXJlT3duV2FybmluZ3MgPSBmdW5jdGlvbiAoY3RvcjogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkge1xuICAgIGlmIChcbiAgICAgICFjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VuYWJsZWRXYXJuaW5ncycsIGN0b3IpKVxuICAgICkge1xuICAgICAgY3Rvci5lbmFibGVkV2FybmluZ3MgPSBjdG9yLmVuYWJsZWRXYXJuaW5ncyEuc2xpY2UoKTtcbiAgICB9XG4gIH07XG4gIFJlYWN0aXZlRWxlbWVudC5lbmFibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMod2FybmluZykpIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5wdXNoKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbiAgUmVhY3RpdmVFbGVtZW50LmRpc2FibGVXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsXG4gICAgd2FybmluZzogV2FybmluZ0tpbmRcbiAgKSB7XG4gICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgY29uc3QgaSA9IHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5pbmRleE9mKHdhcm5pbmcpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzIS5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIFJlYWN0aXZlRWxlbWVudCB1c2FnZS5cbihnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCcyLjAuNCcpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJTVBPUlRBTlQ6IHRoZXNlIGltcG9ydHMgbXVzdCBiZSB0eXBlLW9ubHlcbmltcG9ydCB0eXBlIHtEaXJlY3RpdmUsIERpcmVjdGl2ZVJlc3VsdCwgUGFydEluZm99IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmltcG9ydCB0eXBlIHtUcnVzdGVkSFRNTCwgVHJ1c3RlZFR5cGVzV2luZG93fSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYic7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyA9IHRydWU7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgTGl0VW5zdGFibGUge1xuICAvKipcbiAgICogV2hlbiBMaXQgaXMgcnVubmluZyBpbiBkZXYgbW9kZSBhbmQgYHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHNgIGlzIHRydWUsXG4gICAqIHdlIHdpbGwgZW1pdCAnbGl0LWRlYnVnJyBldmVudHMgdG8gd2luZG93LCB3aXRoIGxpdmUgZGV0YWlscyBhYm91dCB0aGUgdXBkYXRlIGFuZCByZW5kZXJcbiAgICogbGlmZWN5Y2xlLiBUaGVzZSBjYW4gYmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYnVnIHRvb2xpbmcgYW5kIHZpc3VhbGl6YXRpb25zLlxuICAgKlxuICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBydW5uaW5nIHdpdGggd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsXG4gICAqIG1ha2luZyBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgdmVyeSBjaGVhcCAobGlrZSBhIG5vLW9wIHJlbmRlcikgbXVjaCBzbG93ZXIsXG4gICAqIGJlY2F1c2Ugd2UgbXVzdCBjb3B5IGRhdGEgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgRGVidWdMb2cge1xuICAgIGV4cG9ydCB0eXBlIEVudHJ5ID1cbiAgICAgIHwgVGVtcGxhdGVQcmVwXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkQW5kVXBkYXRlZFxuICAgICAgfCBUZW1wbGF0ZVVwZGF0aW5nXG4gICAgICB8IEJlZ2luUmVuZGVyXG4gICAgICB8IEVuZFJlbmRlclxuICAgICAgfCBDb21taXRQYXJ0RW50cnlcbiAgICAgIHwgU2V0UGFydFZhbHVlO1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVQcmVwIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBwcmVwJztcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICAgIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICAgICAgY2xvbmFibGVUZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudDtcbiAgICAgIHBhcnRzOiBUZW1wbGF0ZVBhcnRbXTtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBCZWdpblJlbmRlciB7XG4gICAgICBraW5kOiAnYmVnaW4gcmVuZGVyJztcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB2YWx1ZTogdW5rbm93bjtcbiAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBFbmRSZW5kZXIge1xuICAgICAga2luZDogJ2VuZCByZW5kZXInO1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgcGFydDogQ2hpbGRQYXJ0O1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5zdGFudGlhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVJbnN0YW50aWF0ZWRBbmRVcGRhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVVcGRhdGluZyB7XG4gICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPjtcbiAgICAgIHZhbHVlczogdW5rbm93bltdO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFBhcnRWYWx1ZSB7XG4gICAgICBraW5kOiAnc2V0IHBhcnQnO1xuICAgICAgcGFydDogUGFydDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgdmFsdWVJbmRleDogbnVtYmVyO1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgICB0ZW1wbGF0ZUluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIENvbW1pdFBhcnRFbnRyeSA9XG4gICAgICB8IENvbW1pdE5vdGhpbmdUb0NoaWxkRW50cnlcbiAgICAgIHwgQ29tbWl0VGV4dFxuICAgICAgfCBDb21taXROb2RlXG4gICAgICB8IENvbW1pdEF0dHJpYnV0ZVxuICAgICAgfCBDb21taXRQcm9wZXJ0eVxuICAgICAgfCBDb21taXRCb29sZWFuQXR0cmlidXRlXG4gICAgICB8IENvbW1pdEV2ZW50TGlzdGVuZXJcbiAgICAgIHwgQ29tbWl0VG9FbGVtZW50QmluZGluZztcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Tm90aGluZ1RvQ2hpbGRFbnRyeSB7XG4gICAgICBraW5kOiAnY29tbWl0IG5vdGhpbmcgdG8gY2hpbGQnO1xuICAgICAgc3RhcnQ6IENoaWxkTm9kZTtcbiAgICAgIGVuZDogQ2hpbGROb2RlIHwgbnVsbDtcbiAgICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUgfCB1bmRlZmluZWQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0VGV4dCB7XG4gICAgICBraW5kOiAnY29tbWl0IHRleHQnO1xuICAgICAgbm9kZTogVGV4dDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdE5vZGUge1xuICAgICAga2luZDogJ2NvbW1pdCBub2RlJztcbiAgICAgIHN0YXJ0OiBOb2RlO1xuICAgICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgICAgIHZhbHVlOiBOb2RlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdEF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0UHJvcGVydHkge1xuICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Qm9vbGVhbkF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJztcbiAgICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudExpc3RlbmVyIHtcbiAgICAgIGtpbmQ6ICdjb21taXQgZXZlbnQgbGlzdGVuZXInO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb2xkTGlzdGVuZXI6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSByZW1vdmluZyB0aGUgb2xkIGV2ZW50IGxpc3RlbmVyIChlLmcuIGJlY2F1c2Ugc2V0dGluZ3MgY2hhbmdlZCwgb3IgdmFsdWUgaXMgbm90aGluZylcbiAgICAgIHJlbW92ZUxpc3RlbmVyOiBib29sZWFuO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSBhZGRpbmcgYSBuZXcgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYmVjYXVzZSBmaXJzdCByZW5kZXIsIG9yIHNldHRpbmdzIGNoYW5nZWQpXG4gICAgICBhZGRMaXN0ZW5lcjogYm9vbGVhbjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdFRvRWxlbWVudEJpbmRpbmcge1xuICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIERlYnVnTG9nZ2luZ1dpbmRvdyB7XG4gIC8vIEV2ZW4gaW4gZGV2IG1vZGUsIHdlIGdlbmVyYWxseSBkb24ndCB3YW50IHRvIGVtaXQgdGhlc2UgZXZlbnRzLCBhcyB0aGF0J3NcbiAgLy8gYW5vdGhlciBsZXZlbCBvZiBjb3N0LCBzbyBvbmx5IGVtaXQgdGhlbSB3aGVuIERFVl9NT0RFIGlzIHRydWUgX2FuZF8gd2hlblxuICAvLyB3aW5kb3cuZW1pdExpdERlYnVnRXZlbnRzIGlzIHRydWUuXG4gIGVtaXRMaXREZWJ1Z0xvZ0V2ZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICA/IChldmVudDogTGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8TGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnk+KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICA6IHVuZGVmaW5lZDtcbi8vIFVzZWQgZm9yIGNvbm5lY3RpbmcgYmVnaW5SZW5kZXIgYW5kIGVuZFJlbmRlciBldmVudHMgd2hlbiB0aGVyZSBhcmUgbmVzdGVkXG4vLyByZW5kZXJzIHdoZW4gZXJyb3JzIGFyZSB0aHJvd24gcHJldmVudGluZyBhbiBlbmRSZW5kZXIgZXZlbnQgZnJvbSBiZWluZ1xuLy8gY2FsbGVkLlxubGV0IGRlYnVnTG9nUmVuZGVySWQgPSAwO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBjb2RlXG4gICAgICA/IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICA6ICcnO1xuICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcblxuICBpc3N1ZVdhcm5pbmcoXG4gICAgJ2Rldi1tb2RlJyxcbiAgICBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYFxuICApO1xufVxuXG5jb25zdCB3cmFwID1cbiAgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggJiZcbiAgZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJlxuICBnbG9iYWwuU2hhZHlET00/Lm5vUGF0Y2ggPT09IHRydWVcbiAgICA/IChnbG9iYWwuU2hhZHlET00hLndyYXAgYXMgPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBUKVxuICAgIDogPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBub2RlO1xuXG5jb25zdCB0cnVzdGVkVHlwZXMgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgVHJ1c3RlZFR5cGVzV2luZG93KS50cnVzdGVkVHlwZXM7XG5cbi8qKlxuICogT3VyIFRydXN0ZWRUeXBlUG9saWN5IGZvciBIVE1MIHdoaWNoIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBodG1sIHRlbXBsYXRlXG4gKiB0YWcgZnVuY3Rpb24uXG4gKlxuICogVGhhdCBIVE1MIGlzIGEgZGV2ZWxvcGVyLWF1dGhvcmVkIGNvbnN0YW50LCBhbmQgaXMgcGFyc2VkIHdpdGggaW5uZXJIVE1MXG4gKiBiZWZvcmUgYW55IHVudHJ1c3RlZCBleHByZXNzaW9ucyBoYXZlIGJlZW4gbWl4ZWQgaW4uIFRoZXJlZm9yIGl0IGlzXG4gKiBjb25zaWRlcmVkIHNhZmUgYnkgY29uc3RydWN0aW9uLlxuICovXG5jb25zdCBwb2xpY3kgPSB0cnVzdGVkVHlwZXNcbiAgPyB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdsaXQtaHRtbCcsIHtcbiAgICAgIGNyZWF0ZUhUTUw6IChzKSA9PiBzLFxuICAgIH0pXG4gIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFVzZWQgdG8gc2FuaXRpemUgYW55IHZhbHVlIGJlZm9yZSBpdCBpcyB3cml0dGVuIGludG8gdGhlIERPTS4gVGhpcyBjYW4gYmVcbiAqIHVzZWQgdG8gaW1wbGVtZW50IGEgc2VjdXJpdHkgcG9saWN5IG9mIGFsbG93ZWQgYW5kIGRpc2FsbG93ZWQgdmFsdWVzIGluXG4gKiBvcmRlciB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLlxuICpcbiAqIE9uZSB3YXkgb2YgdXNpbmcgdGhpcyBjYWxsYmFjayB3b3VsZCBiZSB0byBjaGVjayBhdHRyaWJ1dGVzIGFuZCBwcm9wZXJ0aWVzXG4gKiBhZ2FpbnN0IGEgbGlzdCBvZiBoaWdoIHJpc2sgZmllbGRzLCBhbmQgcmVxdWlyZSB0aGF0IHZhbHVlcyB3cml0dGVuIHRvIHN1Y2hcbiAqIGZpZWxkcyBiZSBpbnN0YW5jZXMgb2YgYSBjbGFzcyB3aGljaCBpcyBzYWZlIGJ5IGNvbnN0cnVjdGlvbi4gQ2xvc3VyZSdzIFNhZmVcbiAqIEhUTUwgVHlwZXMgaXMgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlIChcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc2FmZS1odG1sLXR5cGVzL2Jsb2IvbWFzdGVyL2RvYy9zYWZlaHRtbC10eXBlcy5tZCkuXG4gKiBUaGUgVHJ1c3RlZFR5cGVzIHBvbHlmaWxsIGluIEFQSS1vbmx5IG1vZGUgY291bGQgYWxzbyBiZSB1c2VkIGFzIGEgYmFzaXNcbiAqIGZvciB0aGlzIHRlY2huaXF1ZSAoaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvdHJ1c3RlZC10eXBlcykuXG4gKlxuICogQHBhcmFtIG5vZGUgVGhlIEhUTUwgbm9kZSAodXN1YWxseSBlaXRoZXIgYSAjdGV4dCBub2RlIG9yIGFuIEVsZW1lbnQpIHRoYXRcbiAqICAgICBpcyBiZWluZyB3cml0dGVuIHRvLiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGFuIGV4ZW1wbGFyIG5vZGUsIHRoZSB3cml0ZVxuICogICAgIG1heSB0YWtlIHBsYWNlIGFnYWluc3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBvZiBub2RlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG9yIHByb3BlcnR5IChmb3IgZXhhbXBsZSwgJ2hyZWYnKS5cbiAqIEBwYXJhbSB0eXBlIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3cml0ZSB0aGF0J3MgYWJvdXQgdG8gYmUgcGVyZm9ybWVkIHdpbGxcbiAqICAgICBiZSB0byBhIHByb3BlcnR5IG9yIGEgbm9kZS5cbiAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHdpbGwgc2FuaXRpemUgdGhpcyBjbGFzcyBvZiB3cml0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhbml0aXplckZhY3RvcnkgPSAoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWU6IHN0cmluZyxcbiAgdHlwZTogJ3Byb3BlcnR5JyB8ICdhdHRyaWJ1dGUnXG4pID0+IFZhbHVlU2FuaXRpemVyO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggY2FuIHNhbml0aXplIHZhbHVlcyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNwZWNpZmljIGtpbmRcbiAqIG9mIERPTSBzaW5rLlxuICpcbiAqIFNlZSBTYW5pdGl6ZXJGYWN0b3J5LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2FuaXRpemUuIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBwYXNzZWQgaW50b1xuICogICAgIHRoZSBsaXQtaHRtbCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyB0aGlzIGNvdWxkIGJlIG9mIGFueSB0eXBlLlxuICogQHJldHVybiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIERPTS4gVXN1YWxseSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgdmFsdWUsXG4gKiAgICAgdW5sZXNzIHNhbml0aXphdGlvbiBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFZhbHVlU2FuaXRpemVyID0gKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5jb25zdCBpZGVudGl0eUZ1bmN0aW9uOiBWYWx1ZVNhbml0aXplciA9ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWU7XG5jb25zdCBub29wU2FuaXRpemVyOiBTYW5pdGl6ZXJGYWN0b3J5ID0gKFxuICBfbm9kZTogTm9kZSxcbiAgX25hbWU6IHN0cmluZyxcbiAgX3R5cGU6ICdwcm9wZXJ0eScgfCAnYXR0cmlidXRlJ1xuKSA9PiBpZGVudGl0eUZ1bmN0aW9uO1xuXG4vKiogU2V0cyB0aGUgZ2xvYmFsIHNhbml0aXplciBmYWN0b3J5LiAqL1xuY29uc3Qgc2V0U2FuaXRpemVyID0gKG5ld1Nhbml0aXplcjogU2FuaXRpemVyRmFjdG9yeSkgPT4ge1xuICBpZiAoIUVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF0dGVtcHRlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgbGl0LWh0bWwgc2VjdXJpdHkgcG9saWN5LmAgK1xuICAgICAgICBgIHNldFNhbml0aXplRE9NVmFsdWVGYWN0b3J5IHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLmBcbiAgICApO1xuICB9XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5ld1Nhbml0aXplcjtcbn07XG5cbi8qKlxuICogT25seSB1c2VkIGluIGludGVybmFsIHRlc3RzLCBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICovXG5jb25zdCBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPSAoKSA9PiB7XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5vb3BTYW5pdGl6ZXI7XG59O1xuXG5jb25zdCBjcmVhdGVTYW5pdGl6ZXI6IFNhbml0aXplckZhY3RvcnkgPSAobm9kZSwgbmFtZSwgdHlwZSkgPT4ge1xuICByZXR1cm4gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKG5vZGUsIG5hbWUsIHR5cGUpO1xufTtcblxuLy8gQWRkZWQgdG8gYW4gYXR0cmlidXRlIG5hbWUgdG8gbWFyayB0aGUgYXR0cmlidXRlIGFzIGJvdW5kIHNvIHdlIGNhbiBmaW5kXG4vLyBpdCBlYXNpbHkuXG5jb25zdCBib3VuZEF0dHJpYnV0ZVN1ZmZpeCA9ICckbGl0JCc7XG5cbi8vIFRoaXMgbWFya2VyIGlzIHVzZWQgaW4gbWFueSBzeW50YWN0aWMgcG9zaXRpb25zIGluIEhUTUwsIHNvIGl0IG11c3QgYmVcbi8vIGEgdmFsaWQgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZS4gV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIG5hbWVzICh5ZXQpXG4vLyBidXQgdGhpcyBhdCBsZWFzdCBlbnN1cmVzIHRoYXQgdGhlIHBhcnNlIHRyZWUgaXMgY2xvc2VyIHRvIHRoZSB0ZW1wbGF0ZVxuLy8gaW50ZW50aW9uLlxuY29uc3QgbWFya2VyID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYDtcblxuLy8gU3RyaW5nIHVzZWQgdG8gdGVsbCBpZiBhIGNvbW1lbnQgaXMgYSBtYXJrZXIgY29tbWVudFxuY29uc3QgbWFya2VyTWF0Y2ggPSAnPycgKyBtYXJrZXI7XG5cbi8vIFRleHQgdXNlZCB0byBpbnNlcnQgYSBjb21tZW50IG1hcmtlciBub2RlLiBXZSB1c2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvblxuLy8gc3ludGF4IGJlY2F1c2UgaXQncyBzbGlnaHRseSBzbWFsbGVyLCBidXQgcGFyc2VzIGFzIGEgY29tbWVudCBub2RlLlxuY29uc3Qgbm9kZU1hcmtlciA9IGA8JHttYXJrZXJNYXRjaH0+YDtcblxuY29uc3QgZCA9XG4gIE5PREVfTU9ERSAmJiBnbG9iYWwuZG9jdW1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gKHtcbiAgICAgICAgY3JlYXRlVHJlZVdhbGtlcigpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgRG9jdW1lbnQpXG4gICAgOiBkb2N1bWVudDtcblxuLy8gQ3JlYXRlcyBhIGR5bmFtaWMgbWFya2VyLiBXZSBuZXZlciBoYXZlIHRvIHNlYXJjaCBmb3IgdGhlc2UgaW4gdGhlIERPTS5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGQuY3JlYXRlQ29tbWVudCgnJyk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCB8IGJpZ2ludDtcbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlID0+XG4gIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc0l0ZXJhYmxlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSXRlcmFibGU8dW5rbm93bj4gPT5cbiAgaXNBcnJheSh2YWx1ZSkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgU1BBQ0VfQ0hBUiA9IGBbIFxcdFxcblxcZlxccl1gO1xuY29uc3QgQVRUUl9WQUxVRV9DSEFSID0gYFteIFxcdFxcblxcZlxcclwiJ1xcYDw+PV1gO1xuY29uc3QgTkFNRV9DSEFSID0gYFteXFxcXHNcIic+PS9dYDtcblxuLy8gVGhlc2UgcmVnZXhlcyByZXByZXNlbnQgdGhlIGZpdmUgcGFyc2luZyBzdGF0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0IGluIHRoZVxuLy8gVGVtcGxhdGUncyBIVE1MIHNjYW5uZXIuIFRoZXkgbWF0Y2ggdGhlICplbmQqIG9mIHRoZSBzdGF0ZSB0aGV5J3JlIG5hbWVkXG4vLyBhZnRlci5cbi8vIERlcGVuZGluZyBvbiB0aGUgbWF0Y2gsIHdlIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUuIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsXG4vLyB3ZSBzdGF5IGluIHRoZSBzYW1lIHN0YXRlLlxuLy8gTm90ZSB0aGF0IHRoZSByZWdleGVzIGFyZSBzdGF0ZWZ1bC4gV2UgdXRpbGl6ZSBsYXN0SW5kZXggYW5kIHN5bmMgaXRcbi8vIGFjcm9zcyB0aGUgbXVsdGlwbGUgcmVnZXhlcyB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZml2ZSByZWdleGVzIGJlbG93XG4vLyB3ZSBhbHNvIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHJlZ2V4IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVuZCB0YWdzIGZvciByYXdcbi8vIHRleHQgZWxlbWVudHMuXG5cbi8qKlxuICogRW5kIG9mIHRleHQgaXM6IGA8YCBmb2xsb3dlZCBieTpcbiAqICAgKGNvbW1lbnQgc3RhcnQpIG9yICh0YWcpIG9yIChkeW5hbWljIHRhZyBiaW5kaW5nKVxuICovXG5jb25zdCB0ZXh0RW5kUmVnZXggPSAvPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2c7XG5jb25zdCBDT01NRU5UX1NUQVJUID0gMTtcbmNvbnN0IFRBR19OQU1FID0gMjtcbmNvbnN0IERZTkFNSUNfVEFHX05BTUUgPSAzO1xuXG5jb25zdCBjb21tZW50RW5kUmVnZXggPSAvLS0+L2c7XG4vKipcbiAqIENvbW1lbnRzIG5vdCBzdGFydGVkIHdpdGggPCEtLSwgbGlrZSA8L3ssIGNhbiBiZSBlbmRlZCBieSBhIHNpbmdsZSBgPmBcbiAqL1xuY29uc3QgY29tbWVudDJFbmRSZWdleCA9IC8+L2c7XG5cbi8qKlxuICogVGhlIHRhZ0VuZCByZWdleCBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIFwiaW5zaWRlIGFuIG9wZW5pbmdcIiB0YWcgc3ludGF4XG4gKiBwb3NpdGlvbi4gSXQgZWl0aGVyIG1hdGNoZXMgYSBgPmAsIGFuIGF0dHJpYnV0ZS1saWtlIHNlcXVlbmNlLCBvciB0aGUgZW5kXG4gKiBvZiB0aGUgc3RyaW5nIGFmdGVyIGEgc3BhY2UgKGF0dHJpYnV0ZS1uYW1lIHBvc2l0aW9uIGVuZGluZykuXG4gKlxuICogU2VlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50cy1hdHRyaWJ1dGVzXG4gKlxuICogXCIgXFx0XFxuXFxmXFxyXCIgYXJlIEhUTUwgc3BhY2UgY2hhcmFjdGVyczpcbiAqIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKlxuICogU28gYW4gYXR0cmlidXRlIGlzOlxuICogICogVGhlIG5hbWU6IGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIChcIiksICgnKSwgXCI+XCIsXG4gKiAgICBcIj1cIiwgb3IgXCIvXCIuIE5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIEhUTUwgc3BlYyB3aGljaCBhbHNvIGV4Y2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycy5cbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieSBcIj1cIlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5OlxuICogICAgKiBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBzcGFjZSwgKCcpLCAoXCIpLCBcIjxcIiwgXCI+XCIsIFwiPVwiLCAoYCksIG9yXG4gKiAgICAqIChcIikgdGhlbiBhbnkgbm9uLShcIiksIG9yXG4gKiAgICAqICgnKSB0aGVuIGFueSBub24tKCcpXG4gKi9cbmNvbnN0IHRhZ0VuZFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgYD58JHtTUEFDRV9DSEFSfSg/Oigke05BTUVfQ0hBUn0rKSgke1NQQUNFX0NIQVJ9Kj0ke1NQQUNFX0NIQVJ9Kig/OiR7QVRUUl9WQUxVRV9DSEFSfXwoXCJ8Jyl8KSl8JClgLFxuICAnZydcbik7XG5jb25zdCBFTlRJUkVfTUFUQ0ggPSAwO1xuY29uc3QgQVRUUklCVVRFX05BTUUgPSAxO1xuY29uc3QgU1BBQ0VTX0FORF9FUVVBTFMgPSAyO1xuY29uc3QgUVVPVEVfQ0hBUiA9IDM7XG5cbmNvbnN0IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gLycvZztcbmNvbnN0IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gL1wiL2c7XG4vKipcbiAqIE1hdGNoZXMgdGhlIHJhdyB0ZXh0IGVsZW1lbnRzLlxuICpcbiAqIENvbW1lbnRzIGFyZSBub3QgcGFyc2VkIHdpdGhpbiByYXcgdGV4dCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlaXJcbiAqIHRleHQgY29udGVudCBmb3IgbWFya2VyIHN0cmluZ3MuXG4gKi9cbmNvbnN0IHJhd1RleHRFbGVtZW50ID0gL14oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGUpJC9pO1xuXG4vKiogVGVtcGxhdGVSZXN1bHQgdHlwZXMgKi9cbmNvbnN0IEhUTUxfUkVTVUxUID0gMTtcbmNvbnN0IFNWR19SRVNVTFQgPSAyO1xuY29uc3QgTUFUSE1MX1JFU1VMVCA9IDM7XG5cbnR5cGUgUmVzdWx0VHlwZSA9IHR5cGVvZiBIVE1MX1JFU1VMVCB8IHR5cGVvZiBTVkdfUkVTVUxUIHwgdHlwZW9mIE1BVEhNTF9SRVNVTFQ7XG5cbi8vIFRlbXBsYXRlUGFydCB0eXBlc1xuLy8gSU1QT1JUQU5UOiB0aGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gUGFydFR5cGVcbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gMTtcbmNvbnN0IENISUxEX1BBUlQgPSAyO1xuY29uc3QgUFJPUEVSVFlfUEFSVCA9IDM7XG5jb25zdCBCT09MRUFOX0FUVFJJQlVURV9QQVJUID0gNDtcbmNvbnN0IEVWRU5UX1BBUlQgPSA1O1xuY29uc3QgRUxFTUVOVF9QQVJUID0gNjtcbmNvbnN0IENPTU1FTlRfUEFSVCA9IDc7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSB0YWcgZnVuY3Rpb25zLCB7QGxpbmtjb2RlIGh0bWx9IGFuZFxuICoge0BsaW5rY29kZSBzdmd9IHdoZW4gaXQgaGFzbid0IGJlZW4gY29tcGlsZWQgYnkgQGxpdC1sYWJzL2NvbXBpbGVyLlxuICpcbiAqIEEgYFRlbXBsYXRlUmVzdWx0YCBvYmplY3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRlbXBsYXRlXG4gKiBleHByZXNzaW9uIHJlcXVpcmVkIHRvIHJlbmRlciBpdDogdGhlIHRlbXBsYXRlIHN0cmluZ3MsIGV4cHJlc3Npb24gdmFsdWVzLFxuICogYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGh0bWwgb3Igc3ZnKS5cbiAqXG4gKiBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdHMgZG8gbm90IGNyZWF0ZSBhbnkgRE9NIG9uIHRoZWlyIG93bi4gVG8gY3JlYXRlIG9yXG4gKiB1cGRhdGUgRE9NIHlvdSBuZWVkIHRvIHJlbmRlciB0aGUgYFRlbXBsYXRlUmVzdWx0YC4gU2VlXG4gKiBbUmVuZGVyaW5nXShodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb25lbnRzL3JlbmRlcmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICovXG5leHBvcnQgdHlwZSBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IFQ7XG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICB2YWx1ZXM6IHVua25vd25bXTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIHRlbXBsYXRlIHJlc3VsdCB0aGF0IG1heSBiZSBlaXRoZXIgdW5jb21waWxlZCBvciBjb21waWxlZC5cbiAqXG4gKiBJbiB0aGUgZnV0dXJlLCBUZW1wbGF0ZVJlc3VsdCB3aWxsIGJlIHRoaXMgdHlwZS4gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseVxuICogbm90ZSB0aGF0IGEgdGVtcGxhdGUgcmVzdWx0IGlzIHBvdGVudGlhbGx5IGNvbXBpbGVkLCB5b3UgY2FuIHJlZmVyZW5jZSB0aGlzXG4gKiB0eXBlIGFuZCBpdCB3aWxsIGNvbnRpbnVlIHRvIGJlaGF2ZSB0aGUgc2FtZSB0aHJvdWdoIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbiAqIG9mIExpdC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjb2RlIHRoYXQgd2FudHMgdG8gcHJlcGFyZSBmb3IgdGhlIG5leHRcbiAqIG1ham9yIHZlcnNpb24gb2YgTGl0LlxuICovXG5leHBvcnQgdHlwZSBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9XG4gIHwgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+XG4gIHwgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdDtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHRlbXBsYXRlIHRhZyBmdW5jdGlvbnMsIHtAbGlua2NvZGUgaHRtbH0gYW5kXG4gKiB7QGxpbmtjb2RlIHN2Z30uXG4gKlxuICogQSBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdCBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgdGVtcGxhdGVcbiAqIGV4cHJlc3Npb24gcmVxdWlyZWQgdG8gcmVuZGVyIGl0OiB0aGUgdGVtcGxhdGUgc3RyaW5ncywgZXhwcmVzc2lvbiB2YWx1ZXMsXG4gKiBhbmQgdHlwZSBvZiB0ZW1wbGF0ZSAoaHRtbCBvciBzdmcpLlxuICpcbiAqIGBUZW1wbGF0ZVJlc3VsdGAgb2JqZWN0cyBkbyBub3QgY3JlYXRlIGFueSBET00gb24gdGhlaXIgb3duLiBUbyBjcmVhdGUgb3JcbiAqIHVwZGF0ZSBET00geW91IG5lZWQgdG8gcmVuZGVyIHRoZSBgVGVtcGxhdGVSZXN1bHRgLiBTZWVcbiAqIFtSZW5kZXJpbmddKGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvbmVudHMvcmVuZGVyaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBJbiBMaXQgNCwgdGhpcyB0eXBlIHdpbGwgYmUgYW4gYWxpYXMgb2ZcbiAqIE1heWJlQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCwgc28gdGhhdCBjb2RlIHdpbGwgZ2V0IHR5cGUgZXJyb3JzIGlmIGl0IGFzc3VtZXNcbiAqIHRoYXQgTGl0IHRlbXBsYXRlcyBhcmUgbm90IGNvbXBpbGVkLiBXaGVuIGRlbGliZXJhdGVseSB3b3JraW5nIHdpdGggb25seVxuICogb25lLCB1c2UgZWl0aGVyIHtAbGlua2NvZGUgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdH0gb3JcbiAqIHtAbGlua2NvZGUgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0fSBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVJlc3VsdDxUIGV4dGVuZHMgUmVzdWx0VHlwZSA9IFJlc3VsdFR5cGU+ID1cbiAgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+O1xuXG5leHBvcnQgdHlwZSBIVE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgSFRNTF9SRVNVTFQ+O1xuXG5leHBvcnQgdHlwZSBTVkdUZW1wbGF0ZVJlc3VsdCA9IFRlbXBsYXRlUmVzdWx0PHR5cGVvZiBTVkdfUkVTVUxUPjtcblxuZXhwb3J0IHR5cGUgTWF0aE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgTUFUSE1MX1JFU1VMVD47XG5cbi8qKlxuICogQSBUZW1wbGF0ZVJlc3VsdCB0aGF0IGhhcyBiZWVuIGNvbXBpbGVkIGJ5IEBsaXQtbGFicy9jb21waWxlciwgc2tpcHBpbmcgdGhlXG4gKiBwcmVwYXJlIHN0ZXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCB7XG4gIC8vIFRoaXMgaXMgYSBmYWN0b3J5IGluIG9yZGVyIHRvIG1ha2UgdGVtcGxhdGUgaW5pdGlhbGl6YXRpb24gbGF6eVxuICAvLyBhbmQgYWxsb3cgU2hhZHlSZW5kZXJPcHRpb25zIHNjb3BlIHRvIGJlIHBhc3NlZCBpbi5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IENvbXBpbGVkVGVtcGxhdGU7XG4gIHZhbHVlczogdW5rbm93bltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkVGVtcGxhdGUgZXh0ZW5kcyBPbWl0PFRlbXBsYXRlLCAnZWwnPiB7XG4gIC8vIGVsIGlzIG92ZXJyaWRkZW4gdG8gYmUgb3B0aW9uYWwuIFdlIGluaXRpYWxpemUgaXQgb24gZmlyc3QgcmVuZGVyXG4gIGVsPzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvLyBUaGUgcHJlcGFyZWQgSFRNTCBzdHJpbmcgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBmcm9tLlxuICAvLyBUaGUgdHlwZSBpcyBhIFRlbXBsYXRlU3RyaW5nc0FycmF5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSBjYW1lIGZyb21cbiAgLy8gc291cmNlIGNvZGUsIHByZXZlbnRpbmcgYSBKU09OIGluamVjdGlvbiBhdHRhY2suXG4gIGg6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFRlbXBsYXRlUmVzdWx0IHdpdGhcbiAqIHRoZSBnaXZlbiByZXN1bHQgdHlwZS5cbiAqL1xuY29uc3QgdGFnID1cbiAgPFQgZXh0ZW5kcyBSZXN1bHRUeXBlPih0eXBlOiBUKSA9PlxuICAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogdW5rbm93bltdKTogVGVtcGxhdGVSZXN1bHQ8VD4gPT4ge1xuICAgIC8vIFdhcm4gYWdhaW5zdCB0ZW1wbGF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlc1xuICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiByZW5kZXIgc28gdGhhdCB0aGUgd2FybmluZyBpcyBjbG9zZXIgdG8gdGhlXG4gICAgLy8gdGVtcGxhdGUgZGVmaW5pdGlvbi5cbiAgICBpZiAoREVWX01PREUgJiYgc3RyaW5ncy5zb21lKChzKSA9PiBzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdTb21lIHRlbXBsYXRlIHN0cmluZ3MgYXJlIHVuZGVmaW5lZC5cXG4nICtcbiAgICAgICAgICAnVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgaWxsZWdhbCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSW1wb3J0IHN0YXRpYy1odG1sLmpzIHJlc3VsdHMgaW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIGczIGRvZXNuJ3RcbiAgICAgIC8vIGhhbmRsZS4gSW5zdGVhZCB3ZSBrbm93IHRoYXQgc3RhdGljIHZhbHVlcyBtdXN0IGhhdmUgdGhlIGZpZWxkXG4gICAgICAvLyBgXyRsaXRTdGF0aWMkYC5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWVzLnNvbWUoKHZhbCkgPT4gKHZhbCBhcyB7XyRsaXRTdGF0aWMkOiB1bmtub3dufSk/LlsnXyRsaXRTdGF0aWMkJ10pXG4gICAgICApIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGBTdGF0aWMgdmFsdWVzICdsaXRlcmFsJyBvciAndW5zYWZlU3RhdGljJyBjYW5ub3QgYmUgdXNlZCBhcyB2YWx1ZXMgdG8gbm9uLXN0YXRpYyB0ZW1wbGF0ZXMuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0aGUgc3RhdGljICdodG1sJyB0YWcgZnVuY3Rpb24uIFNlZSBodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI3N0YXRpYy1leHByZXNzaW9uc2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICBbJ18kbGl0VHlwZSQnXTogdHlwZSxcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXMsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBIVE1MIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaGVhZGVyID0gKHRpdGxlOiBzdHJpbmcpID0+IGh0bWxgPGgxPiR7dGl0bGV9PC9oMT5gO1xuICogYGBgXG4gKlxuICogVGhlIGBodG1sYCB0YWcgcmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBET00gdG8gcmVuZGVyIGFzIGEgdmFsdWUuIEl0IGlzXG4gKiBsYXp5LCBtZWFuaW5nIG5vIHdvcmsgaXMgZG9uZSB1bnRpbCB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFdoZW4gcmVuZGVyaW5nLFxuICogaWYgYSB0ZW1wbGF0ZSBjb21lcyBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYXMgYSBwcmV2aW91c2x5IHJlbmRlcmVkIHJlc3VsdCxcbiAqIGl0J3MgZWZmaWNpZW50bHkgdXBkYXRlZCBpbnN0ZWFkIG9mIHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IHRhZyhIVE1MX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gU1ZHIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVjdCA9IHN2Z2A8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIj48L3JlY3Q+YDtcbiAqXG4gKiBjb25zdCBteUltYWdlID0gaHRtbGBcbiAqICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICogICAgICR7cmVjdH1cbiAqICAgPC9zdmc+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgc3ZnYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBTVkcgZnJhZ21lbnRzLCBvciBlbGVtZW50c1xuICogdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhbiBgPHN2Zz5gIEhUTUwgZWxlbWVudC4gQSBjb21tb24gZXJyb3IgaXNcbiAqIHBsYWNpbmcgYW4gYDxzdmc+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYHN2Z2AgdGFnXG4gKiBmdW5jdGlvbi4gVGhlIGA8c3ZnPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhXG4gKiB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBTVkcgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgU1ZHIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZWxlbWVudCdzXG4gKiBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhbiBgPHN2Zz5gIEhUTUxcbiAqIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdmcgPSB0YWcoU1ZHX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgTWF0aE1MIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgbnVtID0gbWF0aG1sYDxtbj4xPC9tbj5gO1xuICpcbiAqIGNvbnN0IGVxID0gaHRtbGBcbiAqICAgPG1hdGg+XG4gKiAgICAgJHtudW19XG4gKiAgIDwvbWF0aD5gO1xuICogYGBgXG4gKlxuICogVGhlIGBtYXRobWxgICp0YWcgZnVuY3Rpb24qIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIE1hdGhNTCBmcmFnbWVudHMsIG9yXG4gKiBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGNvbnRhaW5lZCAqKmluc2lkZSoqIGEgYDxtYXRoPmAgSFRNTCBlbGVtZW50LiBBIGNvbW1vblxuICogZXJyb3IgaXMgcGxhY2luZyBhIGA8bWF0aD5gICplbGVtZW50KiBpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSBgbWF0aG1sYFxuICogdGFnIGZ1bmN0aW9uLiBUaGUgYDxtYXRoPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkXG4gKiB3aXRoaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBNYXRoTUwgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgTWF0aE1MIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGVcbiAqIGVsZW1lbnQncyBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhIGA8bWF0aD5gXG4gKiBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXRobWwgPSB0YWcoTUFUSE1MX1JFU1VMVCk7XG5cbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgdGhhdCBhIHZhbHVlIHdhcyBoYW5kbGVkIGJ5IGEgZGlyZWN0aXZlIGFuZFxuICogc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG4gKi9cbmV4cG9ydCBjb25zdCBub0NoYW5nZSA9IFN5bWJvbC5mb3IoJ2xpdC1ub0NoYW5nZScpO1xuXG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIGEgQ2hpbGRQYXJ0IHRvIGZ1bGx5IGNsZWFyIGl0cyBjb250ZW50LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBidXR0b24gPSBodG1sYCR7XG4gKiAgdXNlci5pc0FkbWluXG4gKiAgICA/IGh0bWxgPGJ1dHRvbj5ERUxFVEU8L2J1dHRvbj5gXG4gKiAgICA6IG5vdGhpbmdcbiAqIH1gO1xuICogYGBgXG4gKlxuICogUHJlZmVyIHVzaW5nIGBub3RoaW5nYCBvdmVyIG90aGVyIGZhbHN5IHZhbHVlcyBhcyBpdCBwcm92aWRlcyBhIGNvbnNpc3RlbnRcbiAqIGJlaGF2aW9yIGJldHdlZW4gdmFyaW91cyBleHByZXNzaW9uIGJpbmRpbmcgY29udGV4dHMuXG4gKlxuICogSW4gY2hpbGQgZXhwcmVzc2lvbnMsIGB1bmRlZmluZWRgLCBgbnVsbGAsIGAnJ2AsIGFuZCBgbm90aGluZ2AgYWxsIGJlaGF2ZSB0aGVcbiAqIHNhbWUgYW5kIHJlbmRlciBubyBub2Rlcy4gSW4gYXR0cmlidXRlIGV4cHJlc3Npb25zLCBgbm90aGluZ2AgX3JlbW92ZXNfIHRoZVxuICogYXR0cmlidXRlLCB3aGlsZSBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHdpbGwgcmVuZGVyIGFuIGVtcHR5IHN0cmluZy4gSW5cbiAqIHByb3BlcnR5IGV4cHJlc3Npb25zIGBub3RoaW5nYCBiZWNvbWVzIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IFN5bWJvbC5mb3IoJ2xpdC1ub3RoaW5nJyk7XG5cbi8qKlxuICogVGhlIGNhY2hlIG9mIHByZXBhcmVkIHRlbXBsYXRlcywga2V5ZWQgYnkgdGhlIHRhZ2dlZCBUZW1wbGF0ZVN0cmluZ3NBcnJheVxuICogYW5kIF9ub3RfIGFjY291bnRpbmcgZm9yIHRoZSBzcGVjaWZpYyB0ZW1wbGF0ZSB0YWcgdXNlZC4gVGhpcyBtZWFucyB0aGF0XG4gKiB0ZW1wbGF0ZSB0YWdzIGNhbm5vdCBiZSBkeW5hbWljIC0gdGhleSBtdXN0IHN0YXRpY2FsbHkgYmUgb25lIG9mIGh0bWwsIHN2ZyxcbiAqIG9yIGF0dHIuIFRoaXMgcmVzdHJpY3Rpb24gc2ltcGxpZmllcyB0aGUgY2FjaGUgbG9va3VwLCB3aGljaCBpcyBvbiB0aGUgaG90XG4gKiBwYXRoIGZvciByZW5kZXJpbmcuXG4gKi9cbmNvbnN0IHRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxUZW1wbGF0ZVN0cmluZ3NBcnJheSwgVGVtcGxhdGU+KCk7XG5cbi8qKlxuICogT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgbGl0LWh0bWwgcmVuZGVyaW5nLiBOb3RlIHRoYXRcbiAqIHdoaWxlIGByZW5kZXJgIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgYGNvbnRhaW5lcmAgKGFuZFxuICogYHJlbmRlckJlZm9yZWAgcmVmZXJlbmNlIG5vZGUpIHRvIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgY29udGVudCxcbiAqIG9ubHkgdGhlIG9wdGlvbnMgcGFzc2VkIGluIGR1cmluZyB0aGUgZmlyc3QgcmVuZGVyIGFyZSByZXNwZWN0ZWQgZHVyaW5nXG4gKiB0aGUgbGlmZXRpbWUgb2YgcmVuZGVycyB0byB0aGF0IHVuaXF1ZSBgY29udGFpbmVyYCArIGByZW5kZXJCZWZvcmVgXG4gKiBjb21iaW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0byB1c2UgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBJdCdzIG9mdGVuXG4gICAqIHVzZWZ1bCB0byBzZXQgdGhpcyB0byB0aGUgaG9zdCBjb21wb25lbnQgcmVuZGVyaW5nIGEgdGVtcGxhdGUuXG4gICAqL1xuICBob3N0Pzogb2JqZWN0O1xuICAvKipcbiAgICogQSBET00gbm9kZSBiZWZvcmUgd2hpY2ggdG8gcmVuZGVyIGNvbnRlbnQgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHJlbmRlckJlZm9yZT86IENoaWxkTm9kZSB8IG51bGw7XG4gIC8qKlxuICAgKiBOb2RlIHVzZWQgZm9yIGNsb25pbmcgdGhlIHRlbXBsYXRlIChgaW1wb3J0Tm9kZWAgd2lsbCBiZSBjYWxsZWQgb24gdGhpc1xuICAgKiBub2RlKS4gVGhpcyBjb250cm9scyB0aGUgYG93bmVyRG9jdW1lbnRgIG9mIHRoZSByZW5kZXJlZCBET00sIGFsb25nIHdpdGhcbiAgICogYW55IGluaGVyaXRlZCBjb250ZXh0LiBEZWZhdWx0cyB0byB0aGUgZ2xvYmFsIGBkb2N1bWVudGAuXG4gICAqL1xuICBjcmVhdGlvblNjb3BlPzoge2ltcG9ydE5vZGUobm9kZTogTm9kZSwgZGVlcD86IGJvb2xlYW4pOiBOb2RlfTtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGNvbm5lY3RlZCBzdGF0ZSBmb3IgdGhlIHRvcC1sZXZlbCBwYXJ0IGJlaW5nIHJlbmRlcmVkLiBJZiBub1xuICAgKiBgaXNDb25uZWN0ZWRgIG9wdGlvbiBpcyBzZXQsIGBBc3luY0RpcmVjdGl2ZWBzIHdpbGwgYmUgY29ubmVjdGVkIGJ5XG4gICAqIGRlZmF1bHQuIFNldCB0byBgZmFsc2VgIGlmIHRoZSBpbml0aWFsIHJlbmRlciBvY2N1cnMgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZVxuICAgKiBhbmQgYEFzeW5jRGlyZWN0aXZlYHMgc2hvdWxkIHNlZSBgaXNDb25uZWN0ZWQgPT09IGZhbHNlYCBmb3IgdGhlaXIgaW5pdGlhbFxuICAgKiByZW5kZXIuIFRoZSBgcGFydC5zZXRDb25uZWN0ZWQoKWAgbWV0aG9kIG11c3QgYmUgdXNlZCBzdWJzZXF1ZW50IHRvIGluaXRpYWxcbiAgICogcmVuZGVyIHRvIGNoYW5nZSB0aGUgY29ubmVjdGVkIHN0YXRlIG9mIHRoZSBwYXJ0LlxuICAgKi9cbiAgaXNDb25uZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCB3YWxrZXIgPSBkLmNyZWF0ZVRyZWVXYWxrZXIoXG4gIGQsXG4gIDEyOSAvKiBOb2RlRmlsdGVyLlNIT1dfe0VMRU1FTlR8Q09NTUVOVH0gKi9cbik7XG5cbmxldCBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWw6IFNhbml0aXplckZhY3RvcnkgPSBub29wU2FuaXRpemVyO1xuXG4vL1xuLy8gQ2xhc3NlcyBvbmx5IGJlbG93IGhlcmUsIGNvbnN0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvbmx5IGFib3ZlIGhlcmUuLi5cbi8vXG4vLyBLZWVwaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhbmQgY2xhc3NlcyB0b2dldGhlciBpbXByb3ZlcyBtaW5pZmljYXRpb24uXG4vLyBJbnRlcmZhY2VzIGFuZCB0eXBlIGFsaWFzZXMgY2FuIGJlIGludGVybGVhdmVkIGZyZWVseS5cbi8vXG5cbi8vIFR5cGUgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIGEgYF9kaXJlY3RpdmVgIG9yIGBfZGlyZWN0aXZlc1tdYCBmaWVsZCwgdXNlZCBieVxuLy8gYHJlc29sdmVEaXJlY3RpdmVgXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVBhcmVudCB7XG4gIF8kcGFyZW50PzogRGlyZWN0aXZlUGFyZW50O1xuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcbiAgX19kaXJlY3RpdmVzPzogQXJyYXk8RGlyZWN0aXZlIHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcoXG4gIHRzYTogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIHN0cmluZ0Zyb21UU0E6IHN0cmluZ1xuKTogVHJ1c3RlZEhUTUwge1xuICAvLyBBIHNlY3VyaXR5IGNoZWNrIHRvIHByZXZlbnQgc3Bvb2Zpbmcgb2YgTGl0IHRlbXBsYXRlIHJlc3VsdHMuXG4gIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyB3aXRoIEFycmF5LmlzVGVtcGxhdGVPYmplY3QsXG4gIC8vIHRob3VnaCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhhdCBjaGVjayBpbnNpZGUgb2YgdGhlIGh0bWwgYW5kIHN2Z1xuICAvLyBmdW5jdGlvbnMsIGJlY2F1c2UgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGRvbid0IGNvbWUgaW4gYXNcbiAgLy8gVGVtcGxhdGVTdHJpbmdBcnJheSBvYmplY3RzLlxuICBpZiAoIWlzQXJyYXkodHNhKSB8fCAhdHNhLmhhc093blByb3BlcnR5KCdyYXcnKSkge1xuICAgIGxldCBtZXNzYWdlID0gJ2ludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSc7XG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICBtZXNzYWdlID0gYFxuICAgICAgICAgIEludGVybmFsIEVycm9yOiBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGJlIGFuIGFycmF5XG4gICAgICAgICAgd2l0aCBhICdyYXcnIGZpZWxkLiBGYWtpbmcgYSB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5IGJ5XG4gICAgICAgICAgY2FsbGluZyBodG1sIG9yIHN2ZyBsaWtlIGFuIG9yZGluYXJ5IGZ1bmN0aW9uIGlzIGVmZmVjdGl2ZWx5XG4gICAgICAgICAgdGhlIHNhbWUgYXMgY2FsbGluZyB1bnNhZmVIdG1sIGFuZCBjYW4gbGVhZCB0byBtYWpvciBzZWN1cml0eVxuICAgICAgICAgIGlzc3VlcywgZS5nLiBvcGVuaW5nIHlvdXIgY29kZSB1cCB0byBYU1MgYXR0YWNrcy5cbiAgICAgICAgICBJZiB5b3UncmUgdXNpbmcgdGhlIGh0bWwgb3Igc3ZnIHRhZ2dlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgbm9ybWFsbHlcbiAgICAgICAgICBhbmQgc3RpbGwgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGEgYnVnIGF0XG4gICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWdfcmVwb3J0Lm1kXG4gICAgICAgICAgYW5kIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBidWlsZCB0b29saW5nLCBpZiBhbnkuXG4gICAgICAgIGBcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAucmVwbGFjZSgvXFxuICovZywgJ1xcbicpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIHBvbGljeSAhPT0gdW5kZWZpbmVkXG4gICAgPyBwb2xpY3kuY3JlYXRlSFRNTChzdHJpbmdGcm9tVFNBKVxuICAgIDogKHN0cmluZ0Zyb21UU0EgYXMgdW5rbm93biBhcyBUcnVzdGVkSFRNTCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyBmb3IgdGhlIGdpdmVuIFRlbXBsYXRlU3RyaW5nc0FycmF5IGFuZCByZXN1bHQgdHlwZVxuICogKEhUTUwgb3IgU1ZHKSwgYWxvbmcgd2l0aCB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluXG4gKiB0ZW1wbGF0ZSBvcmRlci4gVGhlIEhUTUwgY29udGFpbnMgY29tbWVudCBtYXJrZXJzIGRlbm90aW5nIHRoZSBgQ2hpbGRQYXJ0YHNcbiAqIGFuZCBzdWZmaXhlcyBvbiBib3VuZCBhdHRyaWJ1dGVzIGRlbm90aW5nIHRoZSBgQXR0cmlidXRlUGFydHNgLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXlcbiAqIEBwYXJhbSB0eXBlIEhUTUwgb3IgU1ZHXG4gKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmcgYFtodG1sLCBhdHRyTmFtZXNdYCAoYXJyYXkgcmV0dXJuZWQgZm9yIHRlcnNlbmVzcyxcbiAqICAgICB0byBhdm9pZCBvYmplY3QgZmllbGRzIHNpbmNlIHRoaXMgY29kZSBpcyBzaGFyZWQgd2l0aCBub24tbWluaWZpZWQgU1NSXG4gKiAgICAgY29kZSlcbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVIdG1sID0gKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgdHlwZTogUmVzdWx0VHlwZVxuKTogW1RydXN0ZWRIVE1MLCBBcnJheTxzdHJpbmc+XSA9PiB7XG4gIC8vIEluc2VydCBtYWtlcnMgaW50byB0aGUgdGVtcGxhdGUgSFRNTCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mXG4gIC8vIGJpbmRpbmdzLiBUaGUgZm9sbG93aW5nIGNvZGUgc2NhbnMgdGhlIHRlbXBsYXRlIHN0cmluZ3MgdG8gZGV0ZXJtaW5lIHRoZVxuICAvLyBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGJpbmRpbmdzLiBUaGV5IGNhbiBiZSBpbiB0ZXh0IHBvc2l0aW9uLCB3aGVyZVxuICAvLyB3ZSBpbnNlcnQgYW4gSFRNTCBjb21tZW50LCBhdHRyaWJ1dGUgdmFsdWUgcG9zaXRpb24sIHdoZXJlIHdlIGluc2VydCBhXG4gIC8vIHNlbnRpbmVsIHN0cmluZyBhbmQgcmUtd3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBvciBpbnNpZGUgYSB0YWcgd2hlcmVcbiAgLy8gd2UgaW5zZXJ0IHRoZSBzZW50aW5lbCBzdHJpbmcuXG4gIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gIC8vIFN0b3JlcyB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluIHRoZSBvcmRlciBvZiB0aGVpclxuICAvLyBwYXJ0cy4gRWxlbWVudFBhcnRzIGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGlzIGFycmF5IGFzIHVuZGVmaW5lZFxuICAvLyByYXRoZXIgdGhhbiBhIHN0cmluZywgdG8gZGlzYW1iaWd1YXRlIGZyb20gYXR0cmlidXRlIGJpbmRpbmdzLlxuICBjb25zdCBhdHRyTmFtZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgbGV0IGh0bWwgPVxuICAgIHR5cGUgPT09IFNWR19SRVNVTFQgPyAnPHN2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8bWF0aD4nIDogJyc7XG5cbiAgLy8gV2hlbiB3ZSdyZSBpbnNpZGUgYSByYXcgdGV4dCB0YWcgKG5vdCBpdCdzIHRleHQgY29udGVudCksIHRoZSByZWdleFxuICAvLyB3aWxsIHN0aWxsIGJlIHRhZ1JlZ2V4IHNvIHdlIGNhbiBmaW5kIGF0dHJpYnV0ZXMsIGJ1dCB3aWxsIHN3aXRjaCB0b1xuICAvLyB0aGlzIHJlZ2V4IHdoZW4gdGhlIHRhZyBlbmRzLlxuICBsZXQgcmF3VGV4dEVuZFJlZ2V4OiBSZWdFeHAgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgcmVwcmVzZW50ZWQgYXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZVxuICAvLyByZWdleGVzXG4gIGxldCByZWdleCA9IHRleHRFbmRSZWdleDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHMgPSBzdHJpbmdzW2ldO1xuICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBuYW1lLiBXaGVuIHRoaXMgaXNcbiAgICAvLyBwb3NpdGl2ZSBhdCBlbmQgb2YgYSBzdHJpbmcsIGl0IG1lYW5zIHdlJ3JlIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIC8vIHBvc2l0aW9uIGFuZCBuZWVkIHRvIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgIC8vIFdlIGFsc28gdXNlIGEgc3BlY2lhbCB2YWx1ZSBvZiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgLy8gdGhlIGVuZCBvZiBhIHN0cmluZyBpbiBhdHRyaWJ1dGUgbmFtZSBwb3NpdGlvbi5cbiAgICBsZXQgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgIGxldCBhdHRyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaCE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG5cbiAgICAvLyBUaGUgY29uZGl0aW9ucyBpbiB0aGlzIGxvb3AgaGFuZGxlIHRoZSBjdXJyZW50IHBhcnNlIHN0YXRlLCBhbmQgdGhlXG4gICAgLy8gYXNzaWdubWVudHMgdG8gdGhlIGByZWdleGAgdmFyaWFibGUgYXJlIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucy5cbiAgICB3aGlsZSAobGFzdEluZGV4IDwgcy5sZW5ndGgpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aGVyZSB3ZSBwcmV2aW91c2x5IGxlZnQgb2ZmXG4gICAgICByZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsYXN0SW5kZXggPSByZWdleC5sYXN0SW5kZXg7XG4gICAgICBpZiAocmVnZXggPT09IHRleHRFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gPT09ICchLS0nKSB7XG4gICAgICAgICAgcmVnZXggPSBjb21tZW50RW5kUmVnZXg7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdlIHN0YXJ0ZWQgYSB3ZWlyZCBjb21tZW50LCBsaWtlIDwve1xuICAgICAgICAgIHJlZ2V4ID0gY29tbWVudDJFbmRSZWdleDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFtUQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KG1hdGNoW1RBR19OQU1FXSkpIHtcbiAgICAgICAgICAgIC8vIFJlY29yZCBpZiB3ZSBlbmNvdW50ZXIgYSByYXctdGV4dCBlbGVtZW50LiBXZSdsbCBzd2l0Y2ggdG9cbiAgICAgICAgICAgIC8vIHRoaXMgcmVnZXggYXQgdGhlIGVuZCBvZiB0aGUgdGFnLlxuICAgICAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gbmV3IFJlZ0V4cChgPC8ke21hdGNoW1RBR19OQU1FXX1gLCAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoW0RZTkFNSUNfVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0JpbmRpbmdzIGluIHRhZyBuYW1lcyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBzdGF0aWMgdGVtcGxhdGVzIGluc3RlYWQuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ID09PSB0YWdFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbRU5USVJFX01BVENIXSA9PT0gJz4nKSB7XG4gICAgICAgICAgLy8gRW5kIG9mIGEgdGFnLiBJZiB3ZSBoYWQgc3RhcnRlZCBhIHJhdy10ZXh0IGVsZW1lbnQsIHVzZSB0aGF0XG4gICAgICAgICAgLy8gcmVnZXhcbiAgICAgICAgICByZWdleCA9IHJhd1RleHRFbmRSZWdleCA/PyB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgLy8gV2UgbWF5IGJlIGVuZGluZyBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUsIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAgIC8vIGNsZWFyIGFueSBwZW5kaW5nIGF0dHJOYW1lRW5kSW5kZXhcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQVRUUklCVVRFX05BTUVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBdHRyaWJ1dGUgbmFtZSBwb3NpdGlvblxuICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gcmVnZXgubGFzdEluZGV4IC0gbWF0Y2hbU1BBQ0VTX0FORF9FUVVBTFNdLmxlbmd0aDtcbiAgICAgICAgICBhdHRyTmFtZSA9IG1hdGNoW0FUVFJJQlVURV9OQU1FXTtcbiAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICBtYXRjaFtRVU9URV9DSEFSXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gdGFnRW5kUmVnZXhcbiAgICAgICAgICAgICAgOiBtYXRjaFtRVU9URV9DSEFSXSA9PT0gJ1wiJ1xuICAgICAgICAgICAgICAgID8gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXhcbiAgICAgICAgICAgICAgICA6IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4XG4gICAgICApIHtcbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggPT09IGNvbW1lbnRFbmRSZWdleCB8fCByZWdleCA9PT0gY29tbWVudDJFbmRSZWdleCkge1xuICAgICAgICByZWdleCA9IHRleHRFbmRSZWdleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBvbmUgb2YgdGhlIGZpdmUgc3RhdGUgcmVnZXhlcywgc28gaXQgbXVzdCBiZSB0aGUgZHluYW1pY2FsbHlcbiAgICAgICAgLy8gY3JlYXRlZCByYXcgdGV4dCByZWdleCBhbmQgd2UncmUgYXQgdGhlIGNsb3NlIG9mIHRoYXQgZWxlbWVudC5cbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGF0dHJOYW1lRW5kSW5kZXgsIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAgICAgLy8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIGFzc2VydCB0aGF0IHdlJ3JlIGluIGEgdmFsaWQgYXR0cmlidXRlXG4gICAgICAvLyBwb3NpdGlvbiAtIGVpdGhlciBpbiBhIHRhZywgb3IgYSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgcmVnZXggPT09IHRhZ0VuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4LFxuICAgICAgICAndW5leHBlY3RlZCBwYXJzZSBzdGF0ZSBCJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIGZvdXIgY2FzZXM6XG4gICAgLy8gIDEuIFdlJ3JlIGluIHRleHQgcG9zaXRpb24sIGFuZCBub3QgaW4gYSByYXcgdGV4dCBlbGVtZW50XG4gICAgLy8gICAgIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KTogaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIuXG4gICAgLy8gIDIuIFdlIGhhdmUgYSBub24tbmVnYXRpdmUgYXR0ck5hbWVFbmRJbmRleCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvXG4gICAgLy8gICAgIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZCBhIGJvdW5kIGF0dHJpYnV0ZSBzdWZmaXguXG4gICAgLy8gIDMuIFdlJ3JlIGF0IHRoZSBub24tZmlyc3QgYmluZGluZyBpbiBhIG11bHRpLWJpbmRpbmcgYXR0cmlidXRlLCB1c2UgYVxuICAgIC8vICAgICBwbGFpbiBtYXJrZXIuXG4gICAgLy8gIDQuIFdlJ3JlIHNvbWV3aGVyZSBlbHNlIGluc2lkZSB0aGUgdGFnLiBJZiB3ZSdyZSBpbiBhdHRyaWJ1dGUgbmFtZVxuICAgIC8vICAgICBwb3NpdGlvbiAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIpLCBhZGQgYSBzZXF1ZW50aWFsIHN1ZmZpeCB0b1xuICAgIC8vICAgICBnZW5lcmF0ZSBhIHVuaXF1ZSBhdHRyaWJ1dGUgbmFtZS5cblxuICAgIC8vIERldGVjdCBhIGJpbmRpbmcgbmV4dCB0byBzZWxmLWNsb3NpbmcgdGFnIGVuZCBhbmQgaW5zZXJ0IGEgc3BhY2UgdG9cbiAgICAvLyBzZXBhcmF0ZSB0aGUgbWFya2VyIGZyb20gdGhlIHRhZyBlbmQ6XG4gICAgY29uc3QgZW5kID1cbiAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCAmJiBzdHJpbmdzW2kgKyAxXS5zdGFydHNXaXRoKCcvPicpID8gJyAnIDogJyc7XG4gICAgaHRtbCArPVxuICAgICAgcmVnZXggPT09IHRleHRFbmRSZWdleFxuICAgICAgICA/IHMgKyBub2RlTWFya2VyXG4gICAgICAgIDogYXR0ck5hbWVFbmRJbmRleCA+PSAwXG4gICAgICAgICAgPyAoYXR0ck5hbWVzLnB1c2goYXR0ck5hbWUhKSxcbiAgICAgICAgICAgIHMuc2xpY2UoMCwgYXR0ck5hbWVFbmRJbmRleCkgK1xuICAgICAgICAgICAgICBib3VuZEF0dHJpYnV0ZVN1ZmZpeCArXG4gICAgICAgICAgICAgIHMuc2xpY2UoYXR0ck5hbWVFbmRJbmRleCkpICtcbiAgICAgICAgICAgIG1hcmtlciArXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICA6IHMgKyBtYXJrZXIgKyAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIgPyBpIDogZW5kKTtcbiAgfVxuXG4gIGNvbnN0IGh0bWxSZXN1bHQ6IHN0cmluZyB8IFRydXN0ZWRIVE1MID1cbiAgICBodG1sICtcbiAgICAoc3RyaW5nc1tsXSB8fCAnPD8+JykgK1xuICAgICh0eXBlID09PSBTVkdfUkVTVUxUID8gJzwvc3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzwvbWF0aD4nIDogJycpO1xuXG4gIC8vIFJldHVybmVkIGFzIGFuIGFycmF5IGZvciB0ZXJzZW5lc3NcbiAgcmV0dXJuIFt0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyhzdHJpbmdzLCBodG1sUmVzdWx0KSwgYXR0ck5hbWVzXTtcbn07XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCB0eXBlIHtUZW1wbGF0ZX07XG5jbGFzcyBUZW1wbGF0ZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZWwhOiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIHBhcnRzOiBBcnJheTxUZW1wbGF0ZVBhcnQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB7c3RyaW5ncywgWydfJGxpdFR5cGUkJ106IHR5cGV9OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gICAgb3B0aW9ucz86IFJlbmRlck9wdGlvbnNcbiAgKSB7XG4gICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBhdHRyTmFtZUluZGV4ID0gMDtcbiAgICBjb25zdCBwYXJ0Q291bnQgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzO1xuXG4gICAgLy8gQ3JlYXRlIHRlbXBsYXRlIGVsZW1lbnRcbiAgICBjb25zdCBbaHRtbCwgYXR0ck5hbWVzXSA9IGdldFRlbXBsYXRlSHRtbChzdHJpbmdzLCB0eXBlKTtcbiAgICB0aGlzLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChodG1sLCBvcHRpb25zKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSB0aGlzLmVsLmNvbnRlbnQ7XG5cbiAgICAvLyBSZS1wYXJlbnQgU1ZHIG9yIE1hdGhNTCBub2RlcyBpbnRvIHRlbXBsYXRlIHJvb3RcbiAgICBpZiAodHlwZSA9PT0gU1ZHX1JFU1VMVCB8fCB0eXBlID09PSBNQVRITUxfUkVTVUxUKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQhO1xuICAgICAgd3JhcHBlci5yZXBsYWNlV2l0aCguLi53cmFwcGVyLmNoaWxkTm9kZXMpO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhlIHRlbXBsYXRlIHRvIGZpbmQgYmluZGluZyBtYXJrZXJzIGFuZCBjcmVhdGUgVGVtcGxhdGVQYXJ0c1xuICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgIGNvbnN0IHRhZyA9IChub2RlIGFzIEVsZW1lbnQpLmxvY2FsTmFtZTtcbiAgICAgICAgICAvLyBXYXJuIGlmIGB0ZXh0YXJlYWAgaW5jbHVkZXMgYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3cgaWYgYHRlbXBsYXRlYFxuICAgICAgICAgIC8vIGRvZXMgc2luY2UgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQuIFdlIGRvIHRoaXMgYnkgY2hlY2tpbmdcbiAgICAgICAgICAvLyBpbm5lckhUTUwgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIG1hcmtlci4gVGhpcyBjYXRjaGVzXG4gICAgICAgICAgLy8gY2FzZXMgbGlrZSBiaW5kaW5ncyBpbiB0ZXh0YXJlYSB0aGVyZSBtYXJrZXJzIHR1cm4gaW50byB0ZXh0IG5vZGVzLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC9eKD86dGV4dGFyZWF8dGVtcGxhdGUpJC9pIS50ZXN0KHRhZykgJiZcbiAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmlubmVySFRNTC5pbmNsdWRlcyhtYXJrZXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtID1cbiAgICAgICAgICAgICAgYEV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBcXGAke3RhZ31cXGAgYCArXG4gICAgICAgICAgICAgIGBlbGVtZW50cy4gU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvZXhwcmVzc2lvbi1pbi0ke3RhZ30gZm9yIG1vcmUgYCArXG4gICAgICAgICAgICAgIGBpbmZvcm1hdGlvbi5gO1xuICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobSk7XG4gICAgICAgICAgICB9IGVsc2UgaXNzdWVXYXJuaW5nKCcnLCBtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGZvciBhdHRlbXB0ZWQgZHluYW1pYyB0YWcgbmFtZXMsIHdlIGRvbid0XG4gICAgICAgIC8vIGluY3JlbWVudCB0aGUgYmluZGluZ0luZGV4LCBhbmQgaXQnbGwgYmUgb2ZmIGJ5IDEgaW4gdGhlIGVsZW1lbnRcbiAgICAgICAgLy8gYW5kIG9mZiBieSB0d28gYWZ0ZXIgaXQuXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoYm91bmRBdHRyaWJ1dGVTdWZmaXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxOYW1lID0gYXR0ck5hbWVzW2F0dHJOYW1lSW5kZXgrK107XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKG5hbWUpITtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGljcyA9IHZhbHVlLnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgIGNvbnN0IG0gPSAvKFsuP0BdKT8oLiopLy5leGVjKHJlYWxOYW1lKSE7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEFUVFJJQlVURV9QQVJULFxuICAgICAgICAgICAgICAgIGluZGV4OiBub2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgbmFtZTogbVsyXSxcbiAgICAgICAgICAgICAgICBzdHJpbmdzOiBzdGF0aWNzLFxuICAgICAgICAgICAgICAgIGN0b3I6XG4gICAgICAgICAgICAgICAgICBtWzFdID09PSAnLidcbiAgICAgICAgICAgICAgICAgICAgPyBQcm9wZXJ0eVBhcnRcbiAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnPydcbiAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gRXZlbnRQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IEF0dHJpYnV0ZVBhcnQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChtYXJrZXIpKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEVMRU1FTlRfUEFSVCxcbiAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogYmVuY2htYXJrIHRoZSByZWdleCBhZ2FpbnN0IHRlc3RpbmcgZm9yIGVhY2hcbiAgICAgICAgLy8gb2YgdGhlIDMgcmF3IHRleHQgZWxlbWVudCBuYW1lcy5cbiAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3QoKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSkpIHtcbiAgICAgICAgICAvLyBGb3IgcmF3IHRleHQgZWxlbWVudHMgd2UgbmVlZCB0byBzcGxpdCB0aGUgdGV4dCBjb250ZW50IG9uXG4gICAgICAgICAgLy8gbWFya2VycywgY3JlYXRlIGEgVGV4dCBub2RlIGZvciBlYWNoIHNlZ21lbnQsIGFuZCBjcmVhdGVcbiAgICAgICAgICAvLyBhIFRlbXBsYXRlUGFydCBmb3IgZWFjaCBtYXJrZXIuXG4gICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50IS5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkge1xuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkudGV4dENvbnRlbnQgPSB0cnVzdGVkVHlwZXNcbiAgICAgICAgICAgICAgPyAodHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0IGFzIHVua25vd24gYXMgJycpXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIGVhY2ggbGl0ZXJhbCBzZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBub2RlcyBhcmUgYWxzbyB1c2VkIGFzIHRoZSBtYXJrZXJzIGZvciBub2RlIHBhcnRzXG4gICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgZW1wdHkgdGV4dCBub2RlcyBhcyBtYXJrZXJzIGJlY2F1c2UgdGhleSdyZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXplZCB3aGVuIGNsb25pbmcgaW4gSUUgKGNvdWxkIHNpbXBsaWZ5IHdoZW5cbiAgICAgICAgICAgIC8vIElFIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmFwcGVuZChzdHJpbmdzW2ldLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgICAgIC8vIFdhbGsgcGFzdCB0aGUgbWFya2VyIG5vZGUgd2UganVzdCBhZGRlZFxuICAgICAgICAgICAgICB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgICAgcGFydHMucHVzaCh7dHlwZTogQ0hJTERfUEFSVCwgaW5kZXg6ICsrbm9kZUluZGV4fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RlIGJlY2F1c2UgdGhpcyBtYXJrZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIHdhbGtlcidzIGN1cnJlbnRcbiAgICAgICAgICAgIC8vIG5vZGUsIGl0IHdpbGwgYmUgd2Fsa2VkIHRvIGluIHRoZSBvdXRlciBsb29wIChhbmQgaWdub3JlZCksIHNvXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBub2RlSW5kZXggaGVyZVxuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkuYXBwZW5kKHN0cmluZ3NbbGFzdEluZGV4XSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhO1xuICAgICAgICBpZiAoZGF0YSA9PT0gbWFya2VyTWF0Y2gpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDSElMRF9QQVJULCBpbmRleDogbm9kZUluZGV4fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSAtMTtcbiAgICAgICAgICB3aGlsZSAoKGkgPSAobm9kZSBhcyBDb21tZW50KS5kYXRhLmluZGV4T2YobWFya2VyLCBpICsgMSkpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gQ29tbWVudCBub2RlIGhhcyBhIGJpbmRpbmcgbWFya2VyIGluc2lkZSwgbWFrZSBhbiBpbmFjdGl2ZSBwYXJ0XG4gICAgICAgICAgICAvLyBUaGUgYmluZGluZyB3b24ndCB3b3JrLCBidXQgc3Vic2VxdWVudCBiaW5kaW5ncyB3aWxsXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDT01NRU5UX1BBUlQsIGluZGV4OiBub2RlSW5kZXh9KTtcbiAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIGkgKz0gbWFya2VyLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlSW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgb24gYSB0YWcsIHRoZW4gd2hlbiB0aGUgdGFnIGlzXG4gICAgICAvLyBwYXJzZWQgaW50byBhbiBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgZ2V0cyBkZS1kdXBsaWNhdGVkLiBXZSBjYW4gZGV0ZWN0XG4gICAgICAvLyB0aGlzIG1pc21hdGNoIGlmIHdlIGhhdmVuJ3QgcHJlY2lzZWx5IGNvbnN1bWVkIGV2ZXJ5IGF0dHJpYnV0ZSBuYW1lXG4gICAgICAvLyB3aGVuIHByZXBhcmluZyB0aGUgdGVtcGxhdGUuIFRoaXMgd29ya3MgYmVjYXVzZSBgYXR0ck5hbWVzYCBpcyBidWlsdFxuICAgICAgLy8gZnJvbSB0aGUgdGVtcGxhdGUgc3RyaW5nIGFuZCBgYXR0ck5hbWVJbmRleGAgY29tZXMgZnJvbSBwcm9jZXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0aW5nIERPTS5cbiAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoICE9PSBhdHRyTmFtZUluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRGV0ZWN0ZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBiaW5kaW5ncy4gVGhpcyBvY2N1cnMgaWYgeW91ciB0ZW1wbGF0ZSBgICtcbiAgICAgICAgICAgIGBoYXMgZHVwbGljYXRlIGF0dHJpYnV0ZXMgb24gYW4gZWxlbWVudCB0YWcuIEZvciBleGFtcGxlIGAgK1xuICAgICAgICAgICAgYFwiPGlucHV0ID9kaXNhYmxlZD1cXCR7dHJ1ZX0gP2Rpc2FibGVkPVxcJHtmYWxzZX0+XCIgY29udGFpbnMgYSBgICtcbiAgICAgICAgICAgIGBkdXBsaWNhdGUgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZS4gVGhlIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBgICtcbiAgICAgICAgICAgIGB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiBcXG5gICtcbiAgICAgICAgICAgICdgJyArXG4gICAgICAgICAgICBzdHJpbmdzLmpvaW4oJyR7Li4ufScpICtcbiAgICAgICAgICAgICdgJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGNvdWxkIHNldCB3YWxrZXIuY3VycmVudE5vZGUgdG8gYW5vdGhlciBub2RlIGhlcmUgdG8gcHJldmVudCBhIG1lbW9yeVxuICAgIC8vIGxlYWssIGJ1dCBldmVyeSB0aW1lIHdlIHByZXBhcmUgYSB0ZW1wbGF0ZSwgd2UgaW1tZWRpYXRlbHkgcmVuZGVyIGl0XG4gICAgLy8gYW5kIHJlLXVzZSB0aGUgd2Fsa2VyIGluIG5ldyBUZW1wbGF0ZUluc3RhbmNlLl9jbG9uZSgpLlxuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAndGVtcGxhdGUgcHJlcCcsXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLFxuICAgICAgICBjbG9uYWJsZVRlbXBsYXRlOiB0aGlzLmVsLFxuICAgICAgICBwYXJ0czogdGhpcy5wYXJ0cyxcbiAgICAgICAgc3RyaW5ncyxcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGRlbiB2aWEgYGxpdEh0bWxQb2x5ZmlsbFN1cHBvcnRgIHRvIHByb3ZpZGUgcGxhdGZvcm0gc3VwcG9ydC5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWw6IFRydXN0ZWRIVE1MLCBfb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpIHtcbiAgICBjb25zdCBlbCA9IGQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICBlbC5pbm5lckhUTUwgPSBodG1sIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgIHJldHVybiBlbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2Nvbm5lY3RhYmxlIHtcbiAgXyRwYXJlbnQ/OiBEaXNjb25uZWN0YWJsZTtcbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPjtcbiAgLy8gUmF0aGVyIHRoYW4gaG9sZCBjb25uZWN0aW9uIHN0YXRlIG9uIGluc3RhbmNlcywgRGlzY29ubmVjdGFibGVzIHJlY3Vyc2l2ZWx5XG4gIC8vIGZldGNoIHRoZSBjb25uZWN0aW9uIHN0YXRlIGZyb20gdGhlIFJvb3RQYXJ0IHRoZXkgYXJlIGNvbm5lY3RlZCBpbiB2aWFcbiAgLy8gZ2V0dGVycyB1cCB0aGUgRGlzY29ubmVjdGFibGUgdHJlZSB2aWEgXyRwYXJlbnQgcmVmZXJlbmNlcy4gVGhpcyBwdXNoZXMgdGhlXG4gIC8vIGNvc3Qgb2YgdHJhY2tpbmcgdGhlIGlzQ29ubmVjdGVkIHN0YXRlIHRvIGBBc3luY0RpcmVjdGl2ZXNgLCBhbmQgYXZvaWRzXG4gIC8vIG5lZWRpbmcgdG8gcGFzcyBhbGwgRGlzY29ubmVjdGFibGVzIChwYXJ0cywgdGVtcGxhdGUgaW5zdGFuY2VzLCBhbmRcbiAgLy8gZGlyZWN0aXZlcykgdGhlaXIgY29ubmVjdGlvbiBzdGF0ZSBlYWNoIHRpbWUgaXQgY2hhbmdlcywgd2hpY2ggd291bGQgYmVcbiAgLy8gY29zdGx5IGZvciB0cmVlcyB0aGF0IGhhdmUgbm8gQXN5bmNEaXJlY3RpdmVzLlxuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKFxuICBwYXJ0OiBDaGlsZFBhcnQgfCBBdHRyaWJ1dGVQYXJ0IHwgRWxlbWVudFBhcnQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBwYXJlbnQ6IERpcmVjdGl2ZVBhcmVudCA9IHBhcnQsXG4gIGF0dHJpYnV0ZUluZGV4PzogbnVtYmVyXG4pOiB1bmtub3duIHtcbiAgLy8gQmFpbCBlYXJseSBpZiB0aGUgdmFsdWUgaXMgZXhwbGljaXRseSBub0NoYW5nZS4gTm90ZSwgdGhpcyBtZWFucyBhbnlcbiAgLy8gbmVzdGVkIGRpcmVjdGl2ZSBpcyBzdGlsbCBhdHRhY2hlZCBhbmQgaXMgbm90IHJ1bi5cbiAgaWYgKHZhbHVlID09PSBub0NoYW5nZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBsZXQgY3VycmVudERpcmVjdGl2ZSA9XG4gICAgYXR0cmlidXRlSW5kZXggIT09IHVuZGVmaW5lZFxuICAgICAgPyAocGFyZW50IGFzIEF0dHJpYnV0ZVBhcnQpLl9fZGlyZWN0aXZlcz8uW2F0dHJpYnV0ZUluZGV4XVxuICAgICAgOiAocGFyZW50IGFzIENoaWxkUGFydCB8IEVsZW1lbnRQYXJ0IHwgRGlyZWN0aXZlKS5fX2RpcmVjdGl2ZTtcbiAgY29uc3QgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID0gaXNQcmltaXRpdmUodmFsdWUpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAodmFsdWUgYXMgRGlyZWN0aXZlUmVzdWx0KVsnXyRsaXREaXJlY3RpdmUkJ107XG4gIGlmIChjdXJyZW50RGlyZWN0aXZlPy5jb25zdHJ1Y3RvciAhPT0gbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKSB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjdXJyZW50RGlyZWN0aXZlPy5bJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8uKGZhbHNlKTtcbiAgICBpZiAobmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSBuZXcgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKHBhcnQgYXMgUGFydEluZm8pO1xuICAgICAgY3VycmVudERpcmVjdGl2ZS5fJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAoKHBhcmVudCBhcyBBdHRyaWJ1dGVQYXJ0KS5fX2RpcmVjdGl2ZXMgPz89IFtdKVthdHRyaWJ1dGVJbmRleF0gPVxuICAgICAgICBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocGFyZW50IGFzIENoaWxkUGFydCB8IERpcmVjdGl2ZSkuX19kaXJlY3RpdmUgPSBjdXJyZW50RGlyZWN0aXZlO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudERpcmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKFxuICAgICAgcGFydCxcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUuXyRyZXNvbHZlKHBhcnQsICh2YWx1ZSBhcyBEaXJlY3RpdmVSZXN1bHQpLnZhbHVlcyksXG4gICAgICBjdXJyZW50RGlyZWN0aXZlLFxuICAgICAgYXR0cmlidXRlSW5kZXhcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUge1RlbXBsYXRlSW5zdGFuY2V9O1xuLyoqXG4gKiBBbiB1cGRhdGVhYmxlIGluc3RhbmNlIG9mIGEgVGVtcGxhdGUuIEhvbGRzIHJlZmVyZW5jZXMgdG8gdGhlIFBhcnRzIHVzZWQgdG9cbiAqIHVwZGF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2UuXG4gKi9cbmNsYXNzIFRlbXBsYXRlSW5zdGFuY2UgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIF8kdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBfJHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPiA9IFtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IENoaWxkUGFydDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBUZW1wbGF0ZSwgcGFyZW50OiBDaGlsZFBhcnQpIHtcbiAgICB0aGlzLl8kdGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IENoaWxkUGFydCBwYXJlbnROb2RlIGdldHRlclxuICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5wYXJlbnROb2RlO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGUgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiBhXG4gIC8vIERvY3VtZW50RnJhZ21lbnQgYW5kIHdlIGRvbid0IHdhbnQgdG8gaG9sZCBvbnRvIGl0IHdpdGggYW4gaW5zdGFuY2UgZmllbGQuXG4gIF9jbG9uZShvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWw6IHtjb250ZW50fSxcbiAgICAgIHBhcnRzOiBwYXJ0cyxcbiAgICB9ID0gdGhpcy5fJHRlbXBsYXRlO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gKG9wdGlvbnM/LmNyZWF0aW9uU2NvcGUgPz8gZCkuaW1wb3J0Tm9kZShjb250ZW50LCB0cnVlKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBmcmFnbWVudDtcblxuICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBwYXJ0SW5kZXggPSAwO1xuICAgIGxldCB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1swXTtcblxuICAgIHdoaWxlICh0ZW1wbGF0ZVBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG5vZGVJbmRleCA9PT0gdGVtcGxhdGVQYXJ0LmluZGV4KSB7XG4gICAgICAgIGxldCBwYXJ0OiBQYXJ0IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IENISUxEX1BBUlQpIHtcbiAgICAgICAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIG5vZGUgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICBub2RlLm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBBVFRSSUJVVEVfUEFSVCkge1xuICAgICAgICAgIHBhcnQgPSBuZXcgdGVtcGxhdGVQYXJ0LmN0b3IoXG4gICAgICAgICAgICBub2RlIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgdGVtcGxhdGVQYXJ0Lm5hbWUsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhcnQuc3RyaW5ncyxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gRUxFTUVOVF9QQVJUKSB7XG4gICAgICAgICAgcGFydCA9IG5ldyBFbGVtZW50UGFydChub2RlIGFzIEhUTUxFbGVtZW50LCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgdGVtcGxhdGVQYXJ0ID0gcGFydHNbKytwYXJ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGVJbmRleCAhPT0gdGVtcGxhdGVQYXJ0Py5pbmRleCkge1xuICAgICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCkhO1xuICAgICAgICBub2RlSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIGN1cnJlbnROb2RlIGF3YXkgZnJvbSB0aGUgY2xvbmVkIHRyZWUgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IGhvbGQgb250byB0aGUgdHJlZSBldmVuIGlmIHRoZSB0cmVlIGlzIGRldGFjaGVkIGFuZCBzaG91bGQgYmVcbiAgICAvLyBmcmVlZC5cbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBkO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIF91cGRhdGUodmFsdWVzOiBBcnJheTx1bmtub3duPikge1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgdGhpcy5fJHBhcnRzKSB7XG4gICAgICBpZiAocGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdzZXQgcGFydCcsXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlc1tpXSxcbiAgICAgICAgICAgIHZhbHVlSW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB0ZW1wbGF0ZUluc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuc3RyaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuXyRzZXRWYWx1ZSh2YWx1ZXMsIHBhcnQgYXMgQXR0cmlidXRlUGFydCwgaSk7XG4gICAgICAgICAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgdGhlIHBhcnQgY29uc3VtZXMgaXMgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDFcbiAgICAgICAgICAvLyBzaW5jZSB2YWx1ZXMgYXJlIGluIGJldHdlZW4gdGVtcGxhdGUgc3BhbnMuIFdlIGluY3JlbWVudCBpIGJ5IDFcbiAgICAgICAgICAvLyBsYXRlciBpbiB0aGUgbG9vcCwgc28gaW5jcmVtZW50IGl0IGJ5IHBhcnQuc3RyaW5ncy5sZW5ndGggLSAyIGhlcmVcbiAgICAgICAgICBpICs9IChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnQpLnN0cmluZ3MhLmxlbmd0aCAtIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydC5fJHNldFZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gIH1cbn1cblxuLypcbiAqIFBhcnRzXG4gKi9cbnR5cGUgQXR0cmlidXRlVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY3RvcjogdHlwZW9mIEF0dHJpYnV0ZVBhcnQ7XG4gIHJlYWRvbmx5IHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbn07XG50eXBlIENoaWxkVGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbn07XG50eXBlIEVsZW1lbnRUZW1wbGF0ZVBhcnQgPSB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBFTEVNRU5UX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59O1xudHlwZSBDb21tZW50VGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgQ09NTUVOVF9QQVJUO1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIFRlbXBsYXRlUGFydCByZXByZXNlbnRzIGEgZHluYW1pYyBwYXJ0IGluIGEgdGVtcGxhdGUsIGJlZm9yZSB0aGUgdGVtcGxhdGVcbiAqIGlzIGluc3RhbnRpYXRlZC4gV2hlbiBhIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCBQYXJ0cyBhcmUgY3JlYXRlZCBmcm9tXG4gKiBUZW1wbGF0ZVBhcnRzLlxuICovXG50eXBlIFRlbXBsYXRlUGFydCA9XG4gIHwgQ2hpbGRUZW1wbGF0ZVBhcnRcbiAgfCBBdHRyaWJ1dGVUZW1wbGF0ZVBhcnRcbiAgfCBFbGVtZW50VGVtcGxhdGVQYXJ0XG4gIHwgQ29tbWVudFRlbXBsYXRlUGFydDtcblxuZXhwb3J0IHR5cGUgUGFydCA9XG4gIHwgQ2hpbGRQYXJ0XG4gIHwgQXR0cmlidXRlUGFydFxuICB8IFByb3BlcnR5UGFydFxuICB8IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gIHwgRWxlbWVudFBhcnRcbiAgfCBFdmVudFBhcnQ7XG5cbmV4cG9ydCB0eXBlIHtDaGlsZFBhcnR9O1xuY2xhc3MgQ2hpbGRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gQ0hJTERfUEFSVDtcbiAgcmVhZG9ubHkgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5rbm93biA9IG5vdGhpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRzdGFydE5vZGU6IENoaWxkTm9kZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGVuZE5vZGU6IENoaWxkTm9kZSB8IG51bGw7XG4gIHByaXZhdGUgX3RleHRTYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIENvbm5lY3Rpb24gc3RhdGUgZm9yIFJvb3RQYXJ0cyBvbmx5IChpLmUuIENoaWxkUGFydCB3aXRob3V0IF8kcGFyZW50XG4gICAqIHJldHVybmVkIGZyb20gdG9wLWxldmVsIGByZW5kZXJgKS4gVGhpcyBmaWVsZCBpcyB1bnVzZWQgb3RoZXJ3aXNlLiBUaGVcbiAgICogaW50ZW50aW9uIHdvdWxkIGJlIGNsZWFyZXIgaWYgd2UgbWFkZSBgUm9vdFBhcnRgIGEgc3ViY2xhc3Mgb2YgYENoaWxkUGFydGBcbiAgICogd2l0aCB0aGlzIGZpZWxkIChhbmQgYSBkaWZmZXJlbnQgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIpLCBidXQgdGhlIHN1YmNsYXNzXG4gICAqIGNhdXNlZCBhIHBlcmYgcmVncmVzc2lvbiwgcG9zc2libHkgZHVlIHRvIG1ha2luZyBjYWxsIHNpdGVzIHBvbHltb3JwaGljLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9faXNDb25uZWN0ZWQ6IGJvb2xlYW47XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAvLyBDaGlsZFBhcnRzIHRoYXQgYXJlIG5vdCBhdCB0aGUgcm9vdCBzaG91bGQgYWx3YXlzIGJlIGNyZWF0ZWQgd2l0aCBhXG4gICAgLy8gcGFyZW50OyBvbmx5IFJvb3RDaGlsZE5vZGUncyB3b24ndCwgc28gdGhleSByZXR1cm4gdGhlIGxvY2FsIGlzQ29ubmVjdGVkXG4gICAgLy8gc3RhdGVcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudD8uXyRpc0Nvbm5lY3RlZCA/PyB0aGlzLl9faXNDb25uZWN0ZWQ7XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyB3aWxsIGJlIHBhdGNoZWQgb250byBDaGlsZFBhcnRzIHdoZW4gcmVxdWlyZWQgYnlcbiAgLy8gQXN5bmNEaXJlY3RpdmVcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/KFxuICAgIGlzQ29ubmVjdGVkOiBib29sZWFuLFxuICAgIHJlbW92ZUZyb21QYXJlbnQ/OiBib29sZWFuLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKTogdm9pZDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzPyhwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlKTogdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGFydE5vZGU6IENoaWxkTm9kZSxcbiAgICBlbmROb2RlOiBDaGlsZE5vZGUgfCBudWxsLFxuICAgIHBhcmVudDogVGVtcGxhdGVJbnN0YW5jZSB8IENoaWxkUGFydCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuXyRzdGFydE5vZGUgPSBzdGFydE5vZGU7XG4gICAgdGhpcy5fJGVuZE5vZGUgPSBlbmROb2RlO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBOb3RlIF9faXNDb25uZWN0ZWQgaXMgb25seSBldmVyIGFjY2Vzc2VkIG9uIFJvb3RQYXJ0cyAoaS5lLiB3aGVuIHRoZXJlIGlzXG4gICAgLy8gbm8gXyRwYXJlbnQpOyB0aGUgdmFsdWUgb24gYSBub24tcm9vdC1wYXJ0IGlzIFwiZG9uJ3QgY2FyZVwiLCBidXQgY2hlY2tpbmdcbiAgICAvLyBmb3IgcGFyZW50IHdvdWxkIGJlIG1vcmUgY29kZVxuICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IG9wdGlvbnM/LmlzQ29ubmVjdGVkID8/IHRydWU7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgLy8gRXhwbGljaXRseSBpbml0aWFsaXplIGZvciBjb25zaXN0ZW50IGNsYXNzIHNoYXBlLlxuICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmVudCBub2RlIGludG8gd2hpY2ggdGhlIHBhcnQgcmVuZGVycyBpdHMgY29udGVudC5cbiAgICpcbiAgICogQSBDaGlsZFBhcnQncyBjb250ZW50IGNvbnNpc3RzIG9mIGEgcmFuZ2Ugb2YgYWRqYWNlbnQgY2hpbGQgbm9kZXMgb2ZcbiAgICogYC5wYXJlbnROb2RlYCwgcG9zc2libHkgYm9yZGVyZWQgYnkgJ21hcmtlciBub2RlcycgKGAuc3RhcnROb2RlYCBhbmRcbiAgICogYC5lbmROb2RlYCkuXG4gICAqXG4gICAqIC0gSWYgYm90aCBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAgYXJlIG5vbi1udWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgKiBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgYmV0d2VlbiBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAsIGV4Y2x1c2l2ZWx5LlxuICAgKlxuICAgKiAtIElmIGAuc3RhcnROb2RlYCBpcyBub24tbnVsbCBidXQgYC5lbmROb2RlYCBpcyBudWxsLCB0aGVuIHRoZSBwYXJ0J3NcbiAgICogY29udGVudCBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgZm9sbG93aW5nIGAuc3RhcnROb2RlYCwgdXAgdG8gYW5kXG4gICAqIGluY2x1ZGluZyB0aGUgbGFzdCBjaGlsZCBvZiBgLnBhcmVudE5vZGVgLiBJZiBgLmVuZE5vZGVgIGlzIG5vbi1udWxsLCB0aGVuXG4gICAqIGAuc3RhcnROb2RlYCB3aWxsIGFsd2F5cyBiZSBub24tbnVsbC5cbiAgICpcbiAgICogLSBJZiBib3RoIGAuZW5kTm9kZWAgYW5kIGAuc3RhcnROb2RlYCBhcmUgbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICogY29uc2lzdHMgb2YgYWxsIGNoaWxkIG5vZGVzIG9mIGAucGFyZW50Tm9kZWAuXG4gICAqL1xuICBnZXQgcGFyZW50Tm9kZSgpOiBOb2RlIHtcbiAgICBsZXQgcGFyZW50Tm9kZTogTm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZSE7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fJHBhcmVudDtcbiAgICBpZiAoXG4gICAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyZW50Tm9kZT8ubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlQgKi9cbiAgICApIHtcbiAgICAgIC8vIElmIHRoZSBwYXJlbnROb2RlIGlzIGEgRG9jdW1lbnRGcmFnbWVudCwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIERPTSBpc1xuICAgICAgLy8gc3RpbGwgaW4gdGhlIGNsb25lZCBmcmFnbWVudCBkdXJpbmcgaW5pdGlhbCByZW5kZXI7IGlmIHNvLCBnZXQgdGhlIHJlYWxcbiAgICAgIC8vIHBhcmVudE5vZGUgdGhlIHBhcnQgd2lsbCBiZSBjb21taXR0ZWQgaW50byBieSBhc2tpbmcgdGhlIHBhcmVudC5cbiAgICAgIHBhcmVudE5vZGUgPSAocGFyZW50IGFzIENoaWxkUGFydCB8IFRlbXBsYXRlSW5zdGFuY2UpLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgbGVhZGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgKiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGdldCBzdGFydE5vZGUoKTogTm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl8kc3RhcnROb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0J3MgdHJhaWxpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICogaW5mb3JtYXRpb24uXG4gICAqL1xuICBnZXQgZW5kTm9kZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuXyRlbmROb2RlO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93biwgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzKTogdm9pZCB7XG4gICAgaWYgKERFVl9NT0RFICYmIHRoaXMucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhpcyBcXGBDaGlsZFBhcnRcXGAgaGFzIG5vIFxcYHBhcmVudE5vZGVcXGAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYWNjZXB0IGEgdmFsdWUuIFRoaXMgbGlrZWx5IG1lYW5zIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHBhcnQgd2FzIG1hbmlwdWxhdGVkIGluIGFuIHVuc3VwcG9ydGVkIHdheSBvdXRzaWRlIG9mIExpdCdzIGNvbnRyb2wgc3VjaCB0aGF0IHRoZSBwYXJ0J3MgbWFya2VyIG5vZGVzIHdlcmUgZWplY3RlZCBmcm9tIERPTS4gRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGVsZW1lbnQncyBcXGBpbm5lckhUTUxcXGAgb3IgXFxgdGV4dENvbnRlbnRcXGAgY2FuIGRvIHRoaXMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIE5vbi1yZW5kZXJpbmcgY2hpbGQgdmFsdWVzLiBJdCdzIGltcG9ydGFudCB0aGF0IHRoZXNlIGRvIG5vdCByZW5kZXJcbiAgICAgIC8vIGVtcHR5IHRleHQgbm9kZXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggcHJldmVudGluZyBkZWZhdWx0IDxzbG90PlxuICAgICAgLy8gZmFsbGJhY2sgY29udGVudC5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nKSB7XG4gICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm90aGluZyB0byBjaGlsZCcsXG4gICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgICAgICBlbmQ6IHRoaXMuXyRlbmROb2RlLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB9IGVsc2UgaWYgKCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdClbJ18kbGl0VHlwZSQnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jb21taXRUZW1wbGF0ZVJlc3VsdCh2YWx1ZSBhcyBUZW1wbGF0ZVJlc3VsdCk7XG4gICAgfSBlbHNlIGlmICgodmFsdWUgYXMgTm9kZSkubm9kZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMub3B0aW9ucz8uaG9zdCA9PT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0VGV4dChcbiAgICAgICAgICBgW3Byb2JhYmxlIG1pc3Rha2U6IHJlbmRlcmVkIGEgdGVtcGxhdGUncyBob3N0IGluIGl0c2VsZiBgICtcbiAgICAgICAgICAgIGAoY29tbW9ubHkgY2F1c2VkIGJ5IHdyaXRpbmcgXFwke3RoaXN9IGluIGEgdGVtcGxhdGVdYFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEF0dGVtcHRlZCB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGhvc3RgLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGBpbnNpZGUgaXRzZWxmLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgYSBtaXN0YWtlLCBhbmQgaW4gZGV2IG1vZGUgYCxcbiAgICAgICAgICBgd2UgcmVuZGVyIHNvbWUgd2FybmluZyB0ZXh0LiBJbiBwcm9kdWN0aW9uIGhvd2V2ZXIsIHdlJ2xsIGAsXG4gICAgICAgICAgYHJlbmRlciBpdCwgd2hpY2ggd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhbiBlcnJvciwgYW5kIHNvbWV0aW1lcyBgLFxuICAgICAgICAgIGBpbiB0aGUgZWxlbWVudCBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgRE9NLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29tbWl0Tm9kZSh2YWx1ZSBhcyBOb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9jb21taXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrLCB3aWxsIHJlbmRlciB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICB0aGlzLl9jb21taXRUZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnQ8VCBleHRlbmRzIE5vZGU+KG5vZGU6IFQpIHtcbiAgICByZXR1cm4gd3JhcCh3cmFwKHRoaXMuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhKS5pbnNlcnRCZWZvcmUoXG4gICAgICBub2RlLFxuICAgICAgdGhpcy5fJGVuZE5vZGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0Tm9kZSh2YWx1ZTogTm9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgIGlmIChcbiAgICAgICAgRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTICYmXG4gICAgICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplclxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGVOYW1lID0gdGhpcy5fJHN0YXJ0Tm9kZS5wYXJlbnROb2RlPy5ub2RlTmFtZTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnIHx8IHBhcmVudE5vZGVOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICAgIGxldCBtZXNzYWdlID0gJ0ZvcmJpZGRlbic7XG4gICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHN0eWxlIG5vZGVzLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIHN0eWxlIGluamVjdGlvbiBhdHRhY2tzIGNhbiBgICtcbiAgICAgICAgICAgICAgICBgZXhmaWx0cmF0ZSBkYXRhIGFuZCBzcG9vZiBVSXMuIGAgK1xuICAgICAgICAgICAgICAgIGBDb25zaWRlciBpbnN0ZWFkIHVzaW5nIGNzc1xcYC4uLlxcYCBsaXRlcmFscyBgICtcbiAgICAgICAgICAgICAgICBgdG8gY29tcG9zZSBzdHlsZXMsIGFuZCBkbyBkeW5hbWljIHN0eWxpbmcgd2l0aCBgICtcbiAgICAgICAgICAgICAgICBgY3NzIGN1c3RvbSBwcm9wZXJ0aWVzLCA6OnBhcnRzLCA8c2xvdD5zLCBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGJ5IG11dGF0aW5nIHRoZSBET00gcmF0aGVyIHRoYW4gc3R5bGVzaGVldHMuYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzY3JpcHQgbm9kZXMuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzaywgYXMgaXQgY291bGQgYWxsb3cgYXJiaXRyYXJ5IGAgK1xuICAgICAgICAgICAgICAgIGBjb2RlIGV4ZWN1dGlvbi5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ2NvbW1pdCBub2RlJyxcbiAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB0aGlzLl9pbnNlcnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbW1pdFRleHQodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgY29tbWl0dGVkIHZhbHVlIGlzIGEgcHJpbWl0aXZlIGl0IG1lYW5zIHdlIGNhbGxlZCBfY29tbWl0VGV4dCBvblxuICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIsIGFuZCB3ZSBrbm93IHRoYXQgdGhpcy5fJHN0YXJ0Tm9kZS5uZXh0U2libGluZyBpcyBhXG4gICAgLy8gVGV4dCBub2RlLiBXZSBjYW4gbm93IGp1c3QgcmVwbGFjZSB0aGUgdGV4dCBjb250ZW50ICguZGF0YSkgb2YgdGhlIG5vZGUuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nICYmXG4gICAgICBpc1ByaW1pdGl2ZSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpXG4gICAgKSB7XG4gICAgICBjb25zdCBub2RlID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0O1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fdGV4dFNhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcihub2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKG5vZGUgYXMgVGV4dCkuZGF0YSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgICB0aGlzLl9jb21taXROb2RlKHRleHROb2RlKTtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIHRleHQgY29udGVudCwgZm9yIHNlY3VyaXR5IHB1cnBvc2VzIGl0IG1hdHRlcnMgYSBsb3RcbiAgICAgICAgLy8gd2hhdCB0aGUgcGFyZW50IGlzLiBGb3IgZXhhbXBsZSwgPHN0eWxlPiBhbmQgPHNjcmlwdD4gbmVlZCB0byBiZVxuICAgICAgICAvLyBoYW5kbGVkIHdpdGggY2FyZSwgd2hpbGUgPHNwYW4+IGRvZXMgbm90LiBTbyBmaXJzdCB3ZSBuZWVkIHRvIHB1dCBhXG4gICAgICAgIC8vIHRleHQgbm9kZSBpbnRvIHRoZSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gc2FuaXRpemUgaXRzIGNvbnRlbnQuXG4gICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKHRleHROb2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICBub2RlOiB0ZXh0Tm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB0ZXh0Tm9kZS5kYXRhID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29tbWl0Tm9kZShkLmNyZWF0ZVRleHROb2RlKHZhbHVlIGFzIHN0cmluZykpO1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgbm9kZTogd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyBhcyBUZXh0LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0VGVtcGxhdGVSZXN1bHQoXG4gICAgcmVzdWx0OiBUZW1wbGF0ZVJlc3VsdCB8IENvbXBpbGVkVGVtcGxhdGVSZXN1bHRcbiAgKTogdm9pZCB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBjb25zdCB7dmFsdWVzLCBbJ18kbGl0VHlwZSQnXTogdHlwZX0gPSByZXN1bHQ7XG4gICAgLy8gSWYgJGxpdFR5cGUkIGlzIGEgbnVtYmVyLCByZXN1bHQgaXMgYSBwbGFpbiBUZW1wbGF0ZVJlc3VsdCBhbmQgd2UgZ2V0XG4gICAgLy8gdGhlIHRlbXBsYXRlIGZyb20gdGhlIHRlbXBsYXRlIGNhY2hlLiBJZiBub3QsIHJlc3VsdCBpcyBhXG4gICAgLy8gQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCBhbmQgXyRsaXRUeXBlJCBpcyBhIENvbXBpbGVkVGVtcGxhdGUgYW5kIHdlIG5lZWRcbiAgICAvLyB0byBjcmVhdGUgdGhlIDx0ZW1wbGF0ZT4gZWxlbWVudCB0aGUgZmlyc3QgdGltZSB3ZSBzZWUgaXQuXG4gICAgY29uc3QgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZSA9XG4gICAgICB0eXBlb2YgdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aGlzLl8kZ2V0VGVtcGxhdGUocmVzdWx0IGFzIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdClcbiAgICAgICAgOiAodHlwZS5lbCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAodHlwZS5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHR5cGUuaCwgdHlwZS5oWzBdKSxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICB0eXBlKTtcblxuICAgIGlmICgodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIFRlbXBsYXRlSW5zdGFuY2UpPy5fJHRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgVGVtcGxhdGVJbnN0YW5jZSxcbiAgICAgICAgICBwYXJ0czogKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRlbXBsYXRlSW5zdGFuY2UodGVtcGxhdGUgYXMgVGVtcGxhdGUsIHRoaXMpO1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBpbnN0YW5jZS5fY2xvbmUodGhpcy5vcHRpb25zKTtcbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCcsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFydHM6IGluc3RhbmNlLl8kcGFydHMsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgfSk7XG4gICAgICBpbnN0YW5jZS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHBhcnRzOiBpbnN0YW5jZS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5fY29tbWl0Tm9kZShmcmFnbWVudCk7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH1cblxuICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAvKiogQGludGVybmFsICovXG4gIF8kZ2V0VGVtcGxhdGUocmVzdWx0OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpIHtcbiAgICBsZXQgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNhY2hlLmdldChyZXN1bHQuc3RyaW5ncyk7XG4gICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlQ2FjaGUuc2V0KHJlc3VsdC5zdHJpbmdzLCAodGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVzdWx0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIF9jb21taXRJdGVyYWJsZSh2YWx1ZTogSXRlcmFibGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyBGb3IgYW4gSXRlcmFibGUsIHdlIGNyZWF0ZSBhIG5ldyBJbnN0YW5jZVBhcnQgcGVyIGl0ZW0sIHRoZW4gc2V0IGl0c1xuICAgIC8vIHZhbHVlIHRvIHRoZSBpdGVtLiBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBvdmVyaGVhZCBmb3IgZXZlcnkgaXRlbSBpblxuICAgIC8vIGFuIEl0ZXJhYmxlLCBidXQgaXQgbGV0cyB1cyByZWN1cnNlIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgdXBkYXRlIEFycmF5c1xuICAgIC8vIG9mIFRlbXBsYXRlUmVzdWx0cyB0aGF0IHdpbGwgYmUgY29tbW9ubHkgcmV0dXJuZWQgZnJvbSBleHByZXNzaW9ucyBsaWtlOlxuICAgIC8vIGFycmF5Lm1hcCgoaSkgPT4gaHRtbGAke2l9YCksIGJ5IHJldXNpbmcgZXhpc3RpbmcgVGVtcGxhdGVJbnN0YW5jZXMuXG5cbiAgICAvLyBJZiB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlbiB0aGUgcHJldmlvdXMgcmVuZGVyIHdhcyBvZiBhblxuICAgIC8vIGl0ZXJhYmxlIGFuZCB2YWx1ZSB3aWxsIGNvbnRhaW4gdGhlIENoaWxkUGFydHMgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIElmIHZhbHVlIGlzIG5vdCBhbiBhcnJheSwgY2xlYXIgdGhpcyBwYXJ0IGFuZCBtYWtlIGEgbmV3XG4gICAgLy8gYXJyYXkgZm9yIENoaWxkUGFydHMuXG4gICAgaWYgKCFpc0FycmF5KHRoaXMuXyRjb21taXR0ZWRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IFtdO1xuICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gTGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zIHdlIHN0YW1wZWQgc28gd2UgY2FuIGNsZWFyIGxlZnRvdmVyXG4gICAgLy8gaXRlbXMgZnJvbSBhIHByZXZpb3VzIHJlbmRlclxuICAgIGNvbnN0IGl0ZW1QYXJ0cyA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBDaGlsZFBhcnRbXTtcbiAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICBsZXQgaXRlbVBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgaWYgKHBhcnRJbmRleCA9PT0gaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAvLyBJZiBubyBleGlzdGluZyBwYXJ0LCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiB0ZXN0IHBlcmYgaW1wYWN0IG9mIGFsd2F5cyBjcmVhdGluZyB0d28gcGFydHNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiBzaGFyaW5nIHBhcnRzIGJldHdlZW4gbm9kZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzEyNjZcbiAgICAgICAgaXRlbVBhcnRzLnB1c2goXG4gICAgICAgICAgKGl0ZW1QYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgICAgICAgIHRoaXMuX2luc2VydChjcmVhdGVNYXJrZXIoKSksXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICkpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXVzZSBhbiBleGlzdGluZyBwYXJ0XG4gICAgICAgIGl0ZW1QYXJ0ID0gaXRlbVBhcnRzW3BhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBpdGVtUGFydC5fJHNldFZhbHVlKGl0ZW0pO1xuICAgICAgcGFydEluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRJbmRleCA8IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8vIGl0ZW1QYXJ0cyBhbHdheXMgaGF2ZSBlbmQgbm9kZXNcbiAgICAgIHRoaXMuXyRjbGVhcihcbiAgICAgICAgaXRlbVBhcnQgJiYgd3JhcChpdGVtUGFydC5fJGVuZE5vZGUhKS5uZXh0U2libGluZyxcbiAgICAgICAgcGFydEluZGV4XG4gICAgICApO1xuICAgICAgLy8gVHJ1bmNhdGUgdGhlIHBhcnRzIGFycmF5IHNvIF92YWx1ZSByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgaXRlbVBhcnRzLmxlbmd0aCA9IHBhcnRJbmRleDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbm9kZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFBhcnQgZnJvbSB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgbm9kZSB0byBjbGVhciBmcm9tLCBmb3IgY2xlYXJpbmcgYSBzdWJzZXQgb2YgdGhlIHBhcnQnc1xuICAgKiAgICAgRE9NICh1c2VkIHdoZW4gdHJ1bmNhdGluZyBpdGVyYWJsZXMpXG4gICAqIEBwYXJhbSBmcm9tICBXaGVuIGBzdGFydGAgaXMgc3BlY2lmaWVkLCB0aGUgaW5kZXggd2l0aGluIHRoZSBpdGVyYWJsZSBmcm9tXG4gICAqICAgICB3aGljaCBDaGlsZFBhcnRzIGFyZSBiZWluZyByZW1vdmVkLCB1c2VkIGZvciBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXMgaW5cbiAgICogICAgIHRob3NlIFBhcnRzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF8kY2xlYXIoXG4gICAgc3RhcnQ6IENoaWxkTm9kZSB8IG51bGwgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nLFxuICAgIGZyb20/OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oZmFsc2UsIHRydWUsIGZyb20pO1xuICAgIHdoaWxlIChzdGFydCAmJiBzdGFydCAhPT0gdGhpcy5fJGVuZE5vZGUpIHtcbiAgICAgIGNvbnN0IG4gPSB3cmFwKHN0YXJ0ISkubmV4dFNpYmxpbmc7XG4gICAgICAod3JhcChzdGFydCEpIGFzIEVsZW1lbnQpLnJlbW92ZSgpO1xuICAgICAgc3RhcnQgPSBuO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgUm9vdFBhcnQncyBgaXNDb25uZWN0ZWRgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2RcbiAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGBSb290UGFydGBzICh0aGUgYENoaWxkUGFydGAgcmV0dXJuZWQgZnJvbSBhXG4gICAqIHRvcC1sZXZlbCBgcmVuZGVyKClgIGNhbGwpLiBJdCBoYXMgbm8gZWZmZWN0IG9uIG5vbi1yb290IENoaWxkUGFydHMuXG4gICAqIEBwYXJhbSBpc0Nvbm5lY3RlZCBXaGV0aGVyIHRvIHNldFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHNldENvbm5lY3RlZChpc0Nvbm5lY3RlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl8kcGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkO1xuICAgICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oaXNDb25uZWN0ZWQpO1xuICAgIH0gZWxzZSBpZiAoREVWX01PREUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3BhcnQuc2V0Q29ubmVjdGVkKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgJyArXG4gICAgICAgICAgJ1Jvb3RQYXJ0IHJldHVybmVkIGZyb20gcmVuZGVyKCkuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHRvcC1sZXZlbCBgQ2hpbGRQYXJ0YCByZXR1cm5lZCBmcm9tIGByZW5kZXJgIHRoYXQgbWFuYWdlcyB0aGUgY29ubmVjdGVkXG4gKiBzdGF0ZSBvZiBgQXN5bmNEaXJlY3RpdmVgcyBjcmVhdGVkIHRocm91Z2hvdXQgdGhlIHRyZWUgYmVsb3cgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFBhcnQgZXh0ZW5kcyBDaGlsZFBhcnQge1xuICAvKipcbiAgICogU2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBmb3IgYEFzeW5jRGlyZWN0aXZlYHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHJvb3RcbiAgICogQ2hpbGRQYXJ0LlxuICAgKlxuICAgKiBsaXQtaHRtbCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IG1vbml0b3IgdGhlIGNvbm5lY3RlZG5lc3Mgb2YgRE9NIHJlbmRlcmVkO1xuICAgKiBhcyBzdWNoLCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBgcmVuZGVyYCB0byBlbnN1cmUgdGhhdFxuICAgKiBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYXJ0IG9iamVjdCBpcyBwb3RlbnRpYWxseVxuICAgKiBkaXNjYXJkZWQsIHRvIGVuc3VyZSB0aGF0IGBBc3luY0RpcmVjdGl2ZWBzIGhhdmUgYSBjaGFuY2UgdG8gZGlzcG9zZSBvZlxuICAgKiBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQuIElmIGEgYFJvb3RQYXJ0YCB0aGF0IHdhcyBwcmV2aW91c2x5XG4gICAqIGRpc2Nvbm5lY3RlZCBpcyBzdWJzZXF1ZW50bHkgcmUtY29ubmVjdGVkIChhbmQgaXRzIGBBc3luY0RpcmVjdGl2ZWBzIHNob3VsZFxuICAgKiByZS1jb25uZWN0KSwgYHNldENvbm5lY3RlZCh0cnVlKWAgc2hvdWxkIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGlzQ29ubmVjdGVkIFdoZXRoZXIgZGlyZWN0aXZlcyB3aXRoaW4gdGhpcyB0cmVlIHNob3VsZCBiZSBjb25uZWN0ZWRcbiAgICogb3Igbm90XG4gICAqL1xuICBzZXRDb25uZWN0ZWQoaXNDb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSB7QXR0cmlidXRlUGFydH07XG5jbGFzcyBBdHRyaWJ1dGVQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlOlxuICAgIHwgdHlwZW9mIEFUVFJJQlVURV9QQVJUXG4gICAgfCB0eXBlb2YgUFJPUEVSVFlfUEFSVFxuICAgIHwgdHlwZW9mIEJPT0xFQU5fQVRUUklCVVRFX1BBUlRcbiAgICB8IHR5cGVvZiBFVkVOVF9QQVJUID0gQVRUUklCVVRFX1BBUlQ7XG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgYXR0cmlidXRlIHBhcnQgcmVwcmVzZW50cyBhbiBpbnRlcnBvbGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZVxuICAgKiBzdGF0aWMgc3RyaW5ncyBvZiB0aGUgaW50ZXJwb2xhdGlvbi4gRm9yIHNpbmdsZS12YWx1ZSwgY29tcGxldGUgYmluZGluZ3MsXG4gICAqIHRoaXMgaXMgdW5kZWZpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5ncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGNvbW1pdHRlZFZhbHVlOiB1bmtub3duIHwgQXJyYXk8dW5rbm93bj4gPSBub3RoaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIF9fZGlyZWN0aXZlcz86IEFycmF5PERpcmVjdGl2ZSB8IHVuZGVmaW5lZD47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlO1xuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIF9zYW5pdGl6ZXI6IFZhbHVlU2FuaXRpemVyIHwgdW5kZWZpbmVkO1xuXG4gIGdldCB0YWdOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFnTmFtZTtcbiAgfVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMiB8fCBzdHJpbmdzWzBdICE9PSAnJyB8fCBzdHJpbmdzWzFdICE9PSAnJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3IEFycmF5KHN0cmluZ3MubGVuZ3RoIC0gMSkuZmlsbChuZXcgU3RyaW5nKCkpO1xuICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICB9XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgdGhpcy5fc2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhcnQgYnkgcmVzb2x2aW5nIHRoZSB2YWx1ZSBmcm9tIHBvc3NpYmx5IG11bHRpcGxlXG4gICAqIHZhbHVlcyBhbmQgc3RhdGljIHN0cmluZ3MgYW5kIGNvbW1pdHRpbmcgaXQgdG8gdGhlIERPTS5cbiAgICogSWYgdGhpcyBwYXJ0IGlzIHNpbmdsZS12YWx1ZWQsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIHVuZGVmaW5lZCwgYW5kIHRoZVxuICAgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSB2YWx1ZSBhcmd1bWVudC4gSWYgdGhpcyBwYXJ0IGlzXG4gICAqIG11bHRpLXZhbHVlLCBgdGhpcy5fc3RyaW5nc2Agd2lsbCBiZSBkZWZpbmVkLCBhbmQgdGhlIG1ldGhvZCBpcyBjYWxsZWRcbiAgICogd2l0aCB0aGUgdmFsdWUgYXJyYXkgb2YgdGhlIHBhcnQncyBvd25pbmcgVGVtcGxhdGVJbnN0YW5jZSwgYW5kIGFuIG9mZnNldFxuICAgKiBpbnRvIHRoZSB2YWx1ZSBhcnJheSBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHJlYWQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyB3YXkgdG8gZWxpbWluYXRlIHNob3J0LWxpdmVkIGFycmF5IHNsaWNlc1xuICAgKiBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdmFsdWVzLCBhbmQgYWxsb3cgYSBmYXN0LXBhdGggZm9yIHNpbmdsZS12YWx1ZWRcbiAgICogcGFydHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcGFydCB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciBtdWx0aS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIHZhbHVlSW5kZXggdGhlIGluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgdmFsdWVzIGZyb20uIGB1bmRlZmluZWRgIGZvclxuICAgKiAgIHNpbmdsZS12YWx1ZWQgcGFydHNcbiAgICogQHBhcmFtIG5vQ29tbWl0IGNhdXNlcyB0aGUgcGFydCB0byBub3QgY29tbWl0IGl0cyB2YWx1ZSB0byB0aGUgRE9NLiBVc2VkXG4gICAqICAgaW4gaHlkcmF0aW9uIHRvIHByaW1lIGF0dHJpYnV0ZSBwYXJ0cyB3aXRoIHRoZWlyIGZpcnN0LXJlbmRlcmVkIHZhbHVlLFxuICAgKiAgIGJ1dCBub3Qgc2V0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiBTU1IgdG8gbm8tb3AgdGhlIERPTSBvcGVyYXRpb24gYW5kXG4gICAqICAgY2FwdHVyZSB0aGUgdmFsdWUgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRzZXRWYWx1ZShcbiAgICB2YWx1ZTogdW5rbm93biB8IEFycmF5PHVua25vd24+LFxuICAgIGRpcmVjdGl2ZVBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gdGhpcyxcbiAgICB2YWx1ZUluZGV4PzogbnVtYmVyLFxuICAgIG5vQ29tbWl0PzogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBzdHJpbmdzID0gdGhpcy5zdHJpbmdzO1xuXG4gICAgLy8gV2hldGhlciBhbnkgb2YgdGhlIHZhbHVlcyBoYXMgY2hhbmdlZCwgZm9yIGRpcnR5LWNoZWNraW5nXG4gICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuXG4gICAgaWYgKHN0cmluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2luZ2xlLXZhbHVlIGJpbmRpbmcgY2FzZVxuICAgICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQsIDApO1xuICAgICAgY2hhbmdlID1cbiAgICAgICAgIWlzUHJpbWl0aXZlKHZhbHVlKSB8fFxuICAgICAgICAodmFsdWUgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAmJiB2YWx1ZSAhPT0gbm9DaGFuZ2UpO1xuICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJwb2xhdGlvbiBjYXNlXG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZSBhcyBBcnJheTx1bmtub3duPjtcbiAgICAgIHZhbHVlID0gc3RyaW5nc1swXTtcblxuICAgICAgbGV0IGksIHY7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdiA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWVzW3ZhbHVlSW5kZXghICsgaV0sIGRpcmVjdGl2ZVBhcmVudCwgaSk7XG5cbiAgICAgICAgaWYgKHYgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHVzZXItcHJvdmlkZWQgdmFsdWUgaXMgYG5vQ2hhbmdlYCwgdXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgIHYgPSAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEFycmF5PHVua25vd24+KVtpXTtcbiAgICAgICAgfVxuICAgICAgICBjaGFuZ2UgfHw9XG4gICAgICAgICAgIWlzUHJpbWl0aXZlKHYpIHx8IHYgIT09ICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldO1xuICAgICAgICBpZiAodiA9PT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlID0gbm90aGluZztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbm90aGluZykge1xuICAgICAgICAgIHZhbHVlICs9ICh2ID8/ICcnKSArIHN0cmluZ3NbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGFsd2F5cyByZWNvcmQgZWFjaCB2YWx1ZSwgZXZlbiBpZiBvbmUgaXMgYG5vdGhpbmdgLCBmb3IgZnV0dXJlXG4gICAgICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldID0gdjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZSAmJiAhbm9Db21taXQpIHtcbiAgICAgIHRoaXMuX2NvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZykge1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgICAnYXR0cmlidXRlJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZXIodmFsdWUgPz8gJycpO1xuICAgICAgfVxuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZScsXG4gICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgKHZhbHVlID8/ICcnKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtQcm9wZXJ0eVBhcnR9O1xuY2xhc3MgUHJvcGVydHlQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHR5cGUgPSBQUk9QRVJUWV9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb3ZlcnJpZGUgX2NvbW1pdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgaWYgKHRoaXMuX3Nhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICdwcm9wZXJ0eSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlKTtcbiAgICB9XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgIGtpbmQ6ICdjb21taXQgcHJvcGVydHknLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHRoaXMuZWxlbWVudCBhcyBhbnkpW3RoaXMubmFtZV0gPSB2YWx1ZSA9PT0gbm90aGluZyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtCb29sZWFuQXR0cmlidXRlUGFydH07XG5jbGFzcyBCb29sZWFuQXR0cmlidXRlUGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICBvdmVycmlkZSByZWFkb25seSB0eXBlID0gQk9PTEVBTl9BVFRSSUJVVEVfUEFSVDtcblxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJyxcbiAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHZhbHVlOiAhISh2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZyksXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICh3cmFwKHRoaXMuZWxlbWVudCkgYXMgRWxlbWVudCkudG9nZ2xlQXR0cmlidXRlKFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgISF2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZ1xuICAgICk7XG4gIH1cbn1cblxudHlwZSBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgPSBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0ICZcbiAgUGFydGlhbDxBZGRFdmVudExpc3RlbmVyT3B0aW9ucz47XG5cbi8qKlxuICogQW4gQXR0cmlidXRlUGFydCB0aGF0IG1hbmFnZXMgYW4gZXZlbnQgbGlzdGVuZXIgdmlhIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyLlxuICpcbiAqIFRoaXMgcGFydCB3b3JrcyBieSBhZGRpbmcgaXRzZWxmIGFzIHRoZSBldmVudCBsaXN0ZW5lciBvbiBhbiBlbGVtZW50LCB0aGVuXG4gKiBkZWxlZ2F0aW5nIHRvIHRoZSB2YWx1ZSBwYXNzZWQgdG8gaXQuIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvXG4gKiBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lciBpZiB0aGUgbGlzdGVuZXIgY2hhbmdlcyBmcmVxdWVudGx5LCBzdWNoIGFzIHdoZW4gYW5cbiAqIGlubGluZSBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgbGlzdGVuZXIuXG4gKlxuICogQmVjYXVzZSBldmVudCBvcHRpb25zIGFyZSBwYXNzZWQgd2hlbiBhZGRpbmcgbGlzdGVuZXJzLCB3ZSBtdXN0IHRha2UgY2FzZVxuICogdG8gYWRkIGFuZCByZW1vdmUgdGhlIHBhcnQgYXMgYSBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBvcHRpb25zIGNoYW5nZS5cbiAqL1xuZXhwb3J0IHR5cGUge0V2ZW50UGFydH07XG5jbGFzcyBFdmVudFBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgdHlwZSA9IEVWRU5UX1BBUlQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKTtcblxuICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQSBcXGA8JHtlbGVtZW50LmxvY2FsTmFtZX0+XFxgIGhhcyBhIFxcYEAke25hbWV9PS4uLlxcYCBsaXN0ZW5lciB3aXRoIGAgK1xuICAgICAgICAgICdpbnZhbGlkIGNvbnRlbnQuIEV2ZW50IGxpc3RlbmVycyBpbiB0ZW1wbGF0ZXMgbXVzdCBoYXZlIGV4YWN0bHkgJyArXG4gICAgICAgICAgJ29uZSBleHByZXNzaW9uIGFuZCBubyBzdXJyb3VuZGluZyB0ZXh0LidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlbnRQYXJ0IGRvZXMgbm90IHVzZSB0aGUgYmFzZSBfJHNldFZhbHVlL19yZXNvbHZlVmFsdWUgaW1wbGVtZW50YXRpb25cbiAgLy8gc2luY2UgdGhlIGRpcnR5IGNoZWNraW5nIGlzIG1vcmUgY29tcGxleFxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF8kc2V0VmFsdWUoXG4gICAgbmV3TGlzdGVuZXI6IHVua25vd24sXG4gICAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzXG4gICkge1xuICAgIG5ld0xpc3RlbmVyID1cbiAgICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgbmV3TGlzdGVuZXIsIGRpcmVjdGl2ZVBhcmVudCwgMCkgPz8gbm90aGluZztcbiAgICBpZiAobmV3TGlzdGVuZXIgPT09IG5vQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9sZExpc3RlbmVyID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuXG4gICAgLy8gSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3RoaW5nIG9yIGFueSBvcHRpb25zIGNoYW5nZSB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVcbiAgICAvLyBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkUmVtb3ZlTGlzdGVuZXIgPVxuICAgICAgKG5ld0xpc3RlbmVyID09PSBub3RoaW5nICYmIG9sZExpc3RlbmVyICE9PSBub3RoaW5nKSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykuY2FwdHVyZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykub25jZSB8fFxuICAgICAgKG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZSAhPT1cbiAgICAgICAgKG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucykucGFzc2l2ZTtcblxuICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IG5vdGhpbmcgYW5kIHdlIHJlbW92ZWQgdGhlIGxpc3RlbmVyLCB3ZSBoYXZlXG4gICAgLy8gdG8gYWRkIHRoZSBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgY29uc3Qgc2hvdWxkQWRkTGlzdGVuZXIgPVxuICAgICAgbmV3TGlzdGVuZXIgIT09IG5vdGhpbmcgJiZcbiAgICAgIChvbGRMaXN0ZW5lciA9PT0gbm90aGluZyB8fCBzaG91bGRSZW1vdmVMaXN0ZW5lcik7XG5cbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ2NvbW1pdCBldmVudCBsaXN0ZW5lcicsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB2YWx1ZTogbmV3TGlzdGVuZXIsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IHNob3VsZFJlbW92ZUxpc3RlbmVyLFxuICAgICAgICBhZGRMaXN0ZW5lcjogc2hvdWxkQWRkTGlzdGVuZXIsXG4gICAgICAgIG9sZExpc3RlbmVyLFxuICAgICAgfSk7XG4gICAgaWYgKHNob3VsZFJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLFxuICAgICAgICBvbGRMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcikge1xuICAgICAgLy8gQmV3YXJlOiBJRTExIGFuZCBDaHJvbWUgNDEgZG9uJ3QgbGlrZSB1c2luZyB0aGUgbGlzdGVuZXIgYXMgdGhlXG4gICAgICAvLyBvcHRpb25zIG9iamVjdC4gRmlndXJlIG91dCBob3cgdG8gZGVhbCB3LyB0aGlzIGluIElFMTEgLSBtYXliZVxuICAgICAgLy8gcGF0Y2ggYWRkRXZlbnRMaXN0ZW5lcj9cbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3TGlzdGVuZXI7XG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmNhbGwodGhpcy5vcHRpb25zPy5ob3N0ID8/IHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEV2ZW50TGlzdGVuZXJPYmplY3QpLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUge0VsZW1lbnRQYXJ0fTtcbmNsYXNzIEVsZW1lbnRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gRUxFTUVOVF9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG5cbiAgLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBldmVyeSBQYXJ0IGhhcyBhIF8kY29tbWl0dGVkVmFsdWVcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5kZWZpbmVkO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQhOiBEaXNjb25uZWN0YWJsZTtcblxuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IHRvIGVsZW1lbnQgYmluZGluZycsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzIG1hbmdsZWQgaW4gdGhlXG4gKiBjbGllbnQgc2lkZSBjb2RlLCB3ZSBleHBvcnQgYSBfJExIIG9iamVjdCBjb250YWluaW5nIHRob3NlIG1lbWJlcnMgKG9yXG4gKiBoZWxwZXIgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgZmllbGRzIG9mIHRob3NlIG1lbWJlcnMpLCBhbmQgdGhlblxuICogcmUtZXhwb3J0IHRoZW0gZm9yIHVzZSBpbiBsaXQtc3NyLiBUaGlzIGtlZXBzIGxpdC1zc3IgYWdub3N0aWMgdG8gd2hldGhlciB0aGVcbiAqIGNsaWVudC1zaWRlIGNvZGUgaXMgYmVpbmcgdXNlZCBpbiBgZGV2YCBtb2RlIG9yIGBwcm9kYCBtb2RlLlxuICpcbiAqIFRoaXMgaGFzIGEgdW5pcXVlIG5hbWUsIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHByaXZhdGUgZXhwb3J0cyBpblxuICogbGl0LWVsZW1lbnQsIHdoaWNoIHJlLWV4cG9ydHMgYWxsIG9mIGxpdC1odG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfJExIID0ge1xuICAvLyBVc2VkIGluIGxpdC1zc3JcbiAgX2JvdW5kQXR0cmlidXRlU3VmZml4OiBib3VuZEF0dHJpYnV0ZVN1ZmZpeCxcbiAgX21hcmtlcjogbWFya2VyLFxuICBfbWFya2VyTWF0Y2g6IG1hcmtlck1hdGNoLFxuICBfSFRNTF9SRVNVTFQ6IEhUTUxfUkVTVUxULFxuICBfZ2V0VGVtcGxhdGVIdG1sOiBnZXRUZW1wbGF0ZUh0bWwsXG4gIC8vIFVzZWQgaW4gdGVzdHMgYW5kIHByaXZhdGUtc3NyLXN1cHBvcnRcbiAgX1RlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2UsXG4gIF9pc0l0ZXJhYmxlOiBpc0l0ZXJhYmxlLFxuICBfcmVzb2x2ZURpcmVjdGl2ZTogcmVzb2x2ZURpcmVjdGl2ZSxcbiAgX0NoaWxkUGFydDogQ2hpbGRQYXJ0LFxuICBfQXR0cmlidXRlUGFydDogQXR0cmlidXRlUGFydCxcbiAgX0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0OiBCb29sZWFuQXR0cmlidXRlUGFydCxcbiAgX0V2ZW50UGFydDogRXZlbnRQYXJ0LFxuICBfUHJvcGVydHlQYXJ0OiBQcm9wZXJ0eVBhcnQsXG4gIF9FbGVtZW50UGFydDogRWxlbWVudFBhcnQsXG59O1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oVGVtcGxhdGUsIENoaWxkUGFydCk7XG5cbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgbGl0LWh0bWwgdXNhZ2UuXG4oZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzMuMi4xJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gYCArXG4gICAgICBgTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB2YWx1ZSwgdXN1YWxseSBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0LCB0byB0aGUgY29udGFpbmVyLlxuICpcbiAqIFRoaXMgZXhhbXBsZSByZW5kZXJzIHRoZSB0ZXh0IFwiSGVsbG8sIFpvZSFcIiBpbnNpZGUgYSBwYXJhZ3JhcGggdGFnLCBhcHBlbmRpbmdcbiAqIGl0IHRvIHRoZSBjb250YWluZXIgYGRvY3VtZW50LmJvZHlgLlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2h0bWwsIHJlbmRlcn0gZnJvbSAnbGl0JztcbiAqXG4gKiBjb25zdCBuYW1lID0gXCJab2VcIjtcbiAqIHJlbmRlcihodG1sYDxwPkhlbGxvLCAke25hbWV9ITwvcD5gLCBkb2N1bWVudC5ib2R5KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBBbnkgW3JlbmRlcmFibGVcbiAqICAgdmFsdWVdKGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jY2hpbGQtZXhwcmVzc2lvbnMpLFxuICogICB0eXBpY2FsbHkgYSB7QGxpbmtjb2RlIFRlbXBsYXRlUmVzdWx0fSBjcmVhdGVkIGJ5IGV2YWx1YXRpbmcgYSB0ZW1wbGF0ZSB0YWdcbiAqICAgbGlrZSB7QGxpbmtjb2RlIGh0bWx9IG9yIHtAbGlua2NvZGUgc3ZnfS5cbiAqIEBwYXJhbSBjb250YWluZXIgQSBET00gY29udGFpbmVyIHRvIHJlbmRlciB0by4gVGhlIGZpcnN0IHJlbmRlciB3aWxsIGFwcGVuZFxuICogICB0aGUgcmVuZGVyZWQgdmFsdWUgdG8gdGhlIGNvbnRhaW5lciwgYW5kIHN1YnNlcXVlbnQgcmVuZGVycyB3aWxsXG4gKiAgIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgdmFsdWUgaWYgdGhlIHNhbWUgcmVzdWx0IHR5cGUgd2FzXG4gKiAgIHByZXZpb3VzbHkgcmVuZGVyZWQgdGhlcmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWUge0BsaW5rY29kZSBSZW5kZXJPcHRpb25zfSBmb3Igb3B0aW9ucyBkb2N1bWVudGF0aW9uLlxuICogQHNlZVxuICoge0BsaW5rIGh0dHBzOi8vbGl0LmRldi9kb2NzL2xpYnJhcmllcy9zdGFuZGFsb25lLXRlbXBsYXRlcy8jcmVuZGVyaW5nLWxpdC1odG1sLXRlbXBsYXRlc3wgUmVuZGVyaW5nIExpdCBIVE1MIFRlbXBsYXRlc31cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LFxuICBvcHRpb25zPzogUmVuZGVyT3B0aW9uc1xuKTogUm9vdFBhcnQgPT4ge1xuICBpZiAoREVWX01PREUgJiYgY29udGFpbmVyID09IG51bGwpIHtcbiAgICAvLyBHaXZlIGEgY2xlYXJlciBlcnJvciBtZXNzYWdlIHRoYW5cbiAgICAvLyAgICAgVW5jYXVnaHQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIG51bGwgKHJlYWRpbmdcbiAgICAvLyAgICAgJ18kbGl0UGFydCQnKVxuICAgIC8vIHdoaWNoIHJlYWRzIGxpa2UgYW4gaW50ZXJuYWwgTGl0IGVycm9yLlxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBjb250YWluZXIgdG8gcmVuZGVyIGludG8gbWF5IG5vdCBiZSAke2NvbnRhaW5lcn1gKTtcbiAgfVxuICBjb25zdCByZW5kZXJJZCA9IERFVl9NT0RFID8gZGVidWdMb2dSZW5kZXJJZCsrIDogMDtcbiAgY29uc3QgcGFydE93bmVyTm9kZSA9IG9wdGlvbnM/LnJlbmRlckJlZm9yZSA/PyBjb250YWluZXI7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGxldCBwYXJ0OiBDaGlsZFBhcnQgPSAocGFydE93bmVyTm9kZSBhcyBhbnkpWydfJGxpdFBhcnQkJ107XG4gIGRlYnVnTG9nRXZlbnQgJiZcbiAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgIGtpbmQ6ICdiZWdpbiByZW5kZXInLFxuICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgdmFsdWUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcHRpb25zLFxuICAgICAgcGFydCxcbiAgICB9KTtcbiAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGVuZE5vZGUgPSBvcHRpb25zPy5yZW5kZXJCZWZvcmUgPz8gbnVsbDtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHBhcnRPd25lck5vZGUgYXMgYW55KVsnXyRsaXRQYXJ0JCddID0gcGFydCA9IG5ldyBDaGlsZFBhcnQoXG4gICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCBlbmROb2RlKSxcbiAgICAgIGVuZE5vZGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBvcHRpb25zID8/IHt9XG4gICAgKTtcbiAgfVxuICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWUpO1xuICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgZGVidWdMb2dFdmVudCh7XG4gICAgICBraW5kOiAnZW5kIHJlbmRlcicsXG4gICAgICBpZDogcmVuZGVySWQsXG4gICAgICB2YWx1ZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9wdGlvbnMsXG4gICAgICBwYXJ0LFxuICAgIH0pO1xuICByZXR1cm4gcGFydCBhcyBSb290UGFydDtcbn07XG5cbmlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgcmVuZGVyLnNldFNhbml0aXplciA9IHNldFNhbml0aXplcjtcbiAgcmVuZGVyLmNyZWF0ZVNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcjtcbiAgaWYgKERFVl9NT0RFKSB7XG4gICAgcmVuZGVyLl90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZSA9XG4gICAgICBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFpbiBMaXRFbGVtZW50IG1vZHVsZSwgd2hpY2ggZGVmaW5lcyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50fSBiYXNlXG4gKiBjbGFzcyBhbmQgcmVsYXRlZCBBUElzLlxuICpcbiAqIExpdEVsZW1lbnQgY29tcG9uZW50cyBjYW4gZGVmaW5lIGEgdGVtcGxhdGUgYW5kIGEgc2V0IG9mIG9ic2VydmVkXG4gKiBwcm9wZXJ0aWVzLiBDaGFuZ2luZyBhbiBvYnNlcnZlZCBwcm9wZXJ0eSB0cmlnZ2VycyBhIHJlLXJlbmRlciBvZiB0aGVcbiAqIGVsZW1lbnQuXG4gKlxuICogSW1wb3J0IHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYW5kIHtAbGlua2NvZGUgaHRtbH0gZnJvbSB0aGlzIG1vZHVsZSB0b1xuICogY3JlYXRlIGEgY29tcG9uZW50OlxuICpcbiAqICBgYGBqc1xuICogaW1wb3J0IHtMaXRFbGVtZW50LCBodG1sfSBmcm9tICdsaXQtZWxlbWVudCc7XG4gKlxuICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gKlxuICogICAvLyBEZWNsYXJlIG9ic2VydmVkIHByb3BlcnRpZXNcbiAqICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICBhZGplY3RpdmU6IHt9XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICB0aGlzLmFkamVjdGl2ZSA9ICdhd2Vzb21lJztcbiAqICAgfVxuICpcbiAqICAgLy8gRGVmaW5lIHRoZSBlbGVtZW50J3MgdGVtcGxhdGVcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYDxwPnlvdXIgJHthZGplY3RpdmV9IHRlbXBsYXRlIGhlcmU8L3A+YDtcbiAqICAgfVxuICogfVxuICpcbiAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnbXktZWxlbWVudCcsIE15RWxlbWVudCk7XG4gKiBgYGBcbiAqXG4gKiBgTGl0RWxlbWVudGAgZXh0ZW5kcyB7QGxpbmtjb2RlIFJlYWN0aXZlRWxlbWVudH0gYW5kIGFkZHMgbGl0LWh0bWxcbiAqIHRlbXBsYXRpbmcuIFRoZSBgUmVhY3RpdmVFbGVtZW50YCBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdXNlcnMgdGhhdCB3YW50IHRvXG4gKiBidWlsZCB0aGVpciBvd24gY3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlIGxpdC1odG1sLlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5pbXBvcnQge1Byb3BlcnR5VmFsdWVzLCBSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQge3JlbmRlciwgUmVuZGVyT3B0aW9ucywgbm9DaGFuZ2UsIFJvb3RQYXJ0fSBmcm9tICdsaXQtaHRtbCc7XG5leHBvcnQgKiBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnbGl0LWh0bWwnO1xuXG5pbXBvcnQge0xpdFVuc3RhYmxlfSBmcm9tICdsaXQtaHRtbCc7XG5pbXBvcnQge1JlYWN0aXZlVW5zdGFibGV9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5cbi8qKlxuICogQ29udGFpbnMgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdW5zdGFibGUgZGVidWcgQVBJLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaW4gdGhpcyBBUEkgaXMgbm90IHN0YWJsZSBhbmQgbWF5IGNoYW5nZSBvciBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsXG4gKiBldmVuIG9uIHBhdGNoIHJlbGVhc2VzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPVxuICAgICAgfCBMaXRVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeVxuICAgICAgfCBSZWFjdGl2ZVVuc3RhYmxlLkRlYnVnTG9nLkVudHJ5O1xuICB9XG59XG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuaWYgKERFVl9NT0RFKSB7XG4gIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gIC8vIGFyZSBsb2FkZWQuXG4gIGNvbnN0IGlzc3VlZFdhcm5pbmdzOiBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPiA9XG4gICAgKGdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKSk7XG5cbiAgLy8gSXNzdWUgYSB3YXJuaW5nLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHRoYXQgbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMsIGFuZFxuICogcmVuZGVycyBhIGxpdC1odG1sIHRlbXBsYXRlLlxuICpcbiAqIFRvIGRlZmluZSBhIGNvbXBvbmVudCwgc3ViY2xhc3MgYExpdEVsZW1lbnRgIGFuZCBpbXBsZW1lbnQgYVxuICogYHJlbmRlcmAgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlLiBEZWZpbmUgcHJvcGVydGllc1xuICogdXNpbmcgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudC5wcm9wZXJ0aWVzIHByb3BlcnRpZXN9IHByb3BlcnR5IG9yIHRoZVxuICoge0BsaW5rY29kZSBwcm9wZXJ0eX0gZGVjb3JhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgTGl0RWxlbWVudCBleHRlbmRzIFJlYWN0aXZlRWxlbWVudCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIHN0YXRpYyBbJ18kbGl0RWxlbWVudCQnXSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck9wdGlvbnM6IFJlbmRlck9wdGlvbnMgPSB7aG9zdDogdGhpc307XG5cbiAgcHJpdmF0ZSBfX2NoaWxkUGFydDogUm9vdFBhcnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVSZW5kZXJSb290KCkge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gV2hlbiBhZG9wdGVkU3R5bGVTaGVldHMgYXJlIHNoaW1tZWQsIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlXG4gICAgLy8gc2hhZG93Um9vdCBieSBjcmVhdGVSZW5kZXJSb290LiBBZGp1c3QgdGhlIHJlbmRlckJlZm9yZSBub2RlIHNvIHRoYXRcbiAgICAvLyBhbnkgc3R5bGVzIGluIExpdCBjb250ZW50IHJlbmRlciBiZWZvcmUgYWRvcHRlZFN0eWxlU2hlZXRzLiBUaGlzIGlzXG4gICAgLy8gaW1wb3J0YW50IHNvIHRoYXQgYWRvcHRlZFN0eWxlU2hlZXRzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICAgIC8vIHRoZSBzaGFkb3dSb290LlxuICAgIHRoaXMucmVuZGVyT3B0aW9ucy5yZW5kZXJCZWZvcmUgPz89IHJlbmRlclJvb3QhLmZpcnN0Q2hpbGQgYXMgQ2hpbGROb2RlO1xuICAgIHJldHVybiByZW5kZXJSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzXG4gICAqIGFuZCBjYWxscyBgcmVuZGVyYCB0byByZW5kZXIgRE9NIHZpYSBsaXQtaHRtbC4gU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZVxuICAgKiB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXIgYW5vdGhlciB1cGRhdGUuXG4gICAqIEBwYXJhbSBjaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHtcbiAgICAvLyBTZXR0aW5nIHByb3BlcnRpZXMgaW4gYHJlbmRlcmAgc2hvdWxkIG5vdCB0cmlnZ2VyIGFuIHVwZGF0ZS4gU2luY2VcbiAgICAvLyB1cGRhdGVzIGFyZSBhbGxvd2VkIGFmdGVyIHN1cGVyLnVwZGF0ZSwgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgcmVuZGVyYFxuICAgIC8vIGJlZm9yZSB0aGF0LlxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZW5kZXIoKTtcbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLmlzQ29ubmVjdGVkID0gdGhpcy5pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgc3VwZXIudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gcmVuZGVyKHZhbHVlLCB0aGlzLnJlbmRlclJvb3QsIHRoaXMucmVuZGVyT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWRkZWQgdG8gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBJbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgeW91IHNob3VsZCBzZXR1cCB0YXNrcyB0aGF0IHNob3VsZCBvbmx5IG9jY3VyIHdoZW5cbiAgICogdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBkb2N1bWVudC4gVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlIGlzXG4gICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMgdG8gbm9kZXMgZXh0ZXJuYWwgdG8gdGhlIGVsZW1lbnQsIGxpa2UgYSBrZXlkb3duXG4gICAqIGV2ZW50IGhhbmRsZXIgYWRkZWQgdG8gdGhlIHdpbmRvdy5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAqICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICogICBhZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFR5cGljYWxseSwgYW55dGhpbmcgZG9uZSBpbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGJlIHVuZG9uZSB3aGVuIHRoZVxuICAgKiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCwgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAqL1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRoZSBtYWluIHNpZ25hbCB0byB0aGUgZWxlbWVudCB0aGF0IGl0IG1heSBubyBsb25nZXIgYmVcbiAgICogdXNlZC4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBlbnN1cmUgdGhhdCBub3RoaW5nIGlzIGhvbGRpbmcgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgKHN1Y2ggYXMgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIHRvIG5vZGVzIGV4dGVybmFsXG4gICAqIHRvIHRoZSBlbGVtZW50KSwgc28gdGhhdCBpdCBpcyBmcmVlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICogICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgKiAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEFuIGVsZW1lbnQgbWF5IGJlIHJlLWNvbm5lY3RlZCBhZnRlciBiZWluZyBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICovXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uIGVhY2ggdXBkYXRlIHRvIHBlcmZvcm0gcmVuZGVyaW5nIHRhc2tzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuXG4gICAqIGFueSB2YWx1ZSByZW5kZXJhYmxlIGJ5IGxpdC1odG1sJ3MgYENoaWxkUGFydGAgLSB0eXBpY2FsbHkgYVxuICAgKiBgVGVtcGxhdGVSZXN1bHRgLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiB0aGUgZWxlbWVudCB0byB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXIoKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIHRoaXMgY2xhc3MgaXMgbWFya2VkIGFzIGBmaW5hbGl6ZWRgIGFzIGFuIG9wdGltaXphdGlvbiBlbnN1cmluZ1xuICogaXQgd2lsbCBub3QgbmVlZGxlc3NseSB0cnkgdG8gYGZpbmFsaXplYC5cbiAqXG4gKiBOb3RlIHRoaXMgcHJvcGVydHkgbmFtZSBpcyBhIHN0cmluZyB0byBwcmV2ZW50IGJyZWFraW5nIENsb3N1cmUgSlMgQ29tcGlsZXJcbiAqIG9wdGltaXphdGlvbnMuIFNlZSBAbGl0L3JlYWN0aXZlLWVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbihMaXRFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBMaXRFbGVtZW50KVxuXSA9IHRydWU7XG5cbi8vIEluc3RhbGwgaHlkcmF0aW9uIGlmIGF2YWlsYWJsZVxuZ2xvYmFsVGhpcy5saXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbFRoaXMubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgOiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5wb2x5ZmlsbFN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyAgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEUgb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtaHRtbCwgc2luY2UgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEUgPSB7XG4gIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eTogKFxuICAgIGVsOiBMaXRFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbFxuICApID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAoZWwgYXMgYW55KS5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgXyRjaGFuZ2VkUHJvcGVydGllczogKGVsOiBMaXRFbGVtZW50KSA9PiAoZWwgYXMgYW55KS5fJGNoYW5nZWRQcm9wZXJ0aWVzLFxufTtcblxuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBMaXRFbGVtZW50IHVzYWdlLlxuKGdsb2JhbFRoaXMubGl0RWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgnNC4xLjEnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWxUaGlzLmxpdEVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIGlzc3VlV2FybmluZyEoXG4gICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKlxuICogSU1QT1JUQU5UOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRzaWNrbGUgYW5kIHRoZSBDbG9zdXJlIEpTIGNvbXBpbGVyLCBhbGxcbiAqIHByb3BlcnR5IGRlY29yYXRvcnMgKGJ1dCBub3QgY2xhc3MgZGVjb3JhdG9ycykgaW4gdGhpcyBmaWxlIHRoYXQgaGF2ZVxuICogYW4gQEV4cG9ydERlY29yYXRlZEl0ZW1zIGFubm90YXRpb24gbXVzdCBiZSBkZWZpbmVkIGFzIGEgcmVndWxhciBmdW5jdGlvbixcbiAqIG5vdCBhbiBhcnJvdyBmdW5jdGlvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7Q29uc3RydWN0b3J9IGZyb20gJy4vYmFzZS5qcyc7XG5cbi8qKlxuICogQWxsb3cgZm9yIGN1c3RvbSBlbGVtZW50IGNsYXNzZXMgd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9yc1xuICovXG50eXBlIEN1c3RvbUVsZW1lbnRDbGFzcyA9IE9taXQ8dHlwZW9mIEhUTUxFbGVtZW50LCAnbmV3Jz47XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoY2xzOiBDdXN0b21FbGVtZW50Q2xhc3MpOiB2b2lkO1xuXG4gIC8vIHN0YW5kYXJkXG4gIChcbiAgICB0YXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyxcbiAgICBjb250ZXh0OiBDbGFzc0RlY29yYXRvckNvbnRleHQ8Q29uc3RydWN0b3I8SFRNTEVsZW1lbnQ+PlxuICApOiB2b2lkO1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGRlZmluZXMgdGhlIGRlY29yYXRlZCBjbGFzcyBhcyBhIGN1c3RvbSBlbGVtZW50LlxuICpcbiAqIGBgYGpzXG4gKiBAY3VzdG9tRWxlbWVudCgnbXktZWxlbWVudCcpXG4gKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYGA7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICogQHBhcmFtIHRhZ05hbWUgVGhlIHRhZyBuYW1lIG9mIHRoZSBjdXN0b20gZWxlbWVudCB0byBkZWZpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21FbGVtZW50ID1cbiAgKHRhZ05hbWU6IHN0cmluZyk6IEN1c3RvbUVsZW1lbnREZWNvcmF0b3IgPT5cbiAgKFxuICAgIGNsYXNzT3JUYXJnZXQ6IEN1c3RvbUVsZW1lbnRDbGFzcyB8IENvbnN0cnVjdG9yPEhUTUxFbGVtZW50PixcbiAgICBjb250ZXh0PzogQ2xhc3NEZWNvcmF0b3JDb250ZXh0PENvbnN0cnVjdG9yPEhUTUxFbGVtZW50Pj5cbiAgKSA9PiB7XG4gICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcigoKSA9PiB7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIGNsYXNzT3JUYXJnZXQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yKTtcbiAgICB9XG4gIH07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qXG4gKiBJTVBPUlRBTlQ6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggdHNpY2tsZSBhbmQgdGhlIENsb3N1cmUgSlMgY29tcGlsZXIsIGFsbFxuICogcHJvcGVydHkgZGVjb3JhdG9ycyAoYnV0IG5vdCBjbGFzcyBkZWNvcmF0b3JzKSBpbiB0aGlzIGZpbGUgdGhhdCBoYXZlXG4gKiBhbiBARXhwb3J0RGVjb3JhdGVkSXRlbXMgYW5ub3RhdGlvbiBtdXN0IGJlIGRlZmluZWQgYXMgYSByZWd1bGFyIGZ1bmN0aW9uLFxuICogbm90IGFuIGFycm93IGZ1bmN0aW9uLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBSZWFjdGl2ZUVsZW1lbnQsXG4gIGRlZmF1bHRDb252ZXJ0ZXIsXG4gIG5vdEVxdWFsLFxufSBmcm9tICcuLi9yZWFjdGl2ZS1lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHtJbnRlcmZhY2V9IGZyb20gJy4vYmFzZS5qcyc7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcblxubGV0IGlzc3VlV2FybmluZzogKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB2b2lkO1xuXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgLy8gYXJlIGxvYWRlZC5cbiAgY29uc3QgaXNzdWVkV2FybmluZ3M6IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+ID1cbiAgICAoZ2xvYmFsVGhpcy5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpKTtcblxuICAvLyBJc3N1ZSBhIHdhcm5pbmcsIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS5cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYDtcbiAgICBpZiAoIWlzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSkge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgaXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gT3ZlcmxvYWRzIGZvciBwcm9wZXJ0eSBkZWNvcmF0b3Igc28gdGhhdCBUeXBlU2NyaXB0IGNhbiBpbmZlciB0aGUgY29ycmVjdFxuLy8gcmV0dXJuIHR5cGUgd2hlbiBhIGRlY29yYXRvciBpcyB1c2VkIGFzIGFuIGFjY2Vzc29yIGRlY29yYXRvciBvciBhIHNldHRlclxuLy8gZGVjb3JhdG9yLlxuZXhwb3J0IHR5cGUgUHJvcGVydHlEZWNvcmF0b3IgPSB7XG4gIC8vIGFjY2Vzc29yIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG5cbiAgLy8gc2V0dGVyIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiAodmFsdWU6IFYpID0+IHZvaWQsXG4gICAgY29udGV4dDogQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6ICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcblxuICAvLyBsZWdhY3kgZGVjb3JhdG9yIHNpZ25hdHVyZVxuICAoXG4gICAgcHJvdG9PckRlc2NyaXB0b3I6IE9iamVjdCxcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55O1xufTtcblxuY29uc3QgbGVnYWN5UHJvcGVydHkgPSAoXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gfCB1bmRlZmluZWQsXG4gIHByb3RvOiBPYmplY3QsXG4gIG5hbWU6IFByb3BlcnR5S2V5XG4pID0+IHtcbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgKHByb3RvLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmNyZWF0ZVByb3BlcnR5KFxuICAgIG5hbWUsXG4gICAgaGFzT3duUHJvcGVydHkgPyB7Li4ub3B0aW9ucywgd3JhcHBlZDogdHJ1ZX0gOiBvcHRpb25zXG4gICk7XG4gIC8vIEZvciBhY2Nlc3NvcnMgKHdoaWNoIGhhdmUgYSBkZXNjcmlwdG9yIG9uIHRoZSBwcm90b3R5cGUpIHdlIG5lZWQgdG9cbiAgLy8gcmV0dXJuIGEgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIFR5cGVTY3JpcHQgb3ZlcndyaXRlcyB0aGUgZGVzY3JpcHRvciB3ZVxuICAvLyBkZWZpbmUgaW4gY3JlYXRlUHJvcGVydHkoKSB3aXRoIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yLiBXZSBkb24ndCBkbyB0aGlzXG4gIC8vIGZvciBmaWVsZHMsIHdoaWNoIGRvbid0IGhhdmUgYSBkZXNjcmlwdG9yLCBiZWNhdXNlIHRoaXMgY291bGQgb3ZlcndyaXRlXG4gIC8vIGRlc2NyaXB0b3IgZGVmaW5lZCBieSBvdGhlciBkZWNvcmF0b3JzLlxuICByZXR1cm4gaGFzT3duUHJvcGVydHlcbiAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpXG4gICAgOiB1bmRlZmluZWQ7XG59O1xuXG4vLyBUaGlzIGlzIGR1cGxpY2F0ZWQgZnJvbSBhIHNpbWlsYXIgdmFyaWFibGUgaW4gcmVhY3RpdmUtZWxlbWVudC50cywgYnV0XG4vLyBhY3R1YWxseSBtYWtlcyBzZW5zZSB0byBoYXZlIHRoaXMgZGVmYXVsdCBkZWZpbmVkIHdpdGggdGhlIGRlY29yYXRvciwgc29cbi8vIHRoYXQgZGlmZmVyZW50IGRlY29yYXRvcnMgY291bGQgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdHMuXG5jb25zdCBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbjogUHJvcGVydHlEZWNsYXJhdGlvbiA9IHtcbiAgYXR0cmlidXRlOiB0cnVlLFxuICB0eXBlOiBTdHJpbmcsXG4gIGNvbnZlcnRlcjogZGVmYXVsdENvbnZlcnRlcixcbiAgcmVmbGVjdDogZmFsc2UsXG4gIGhhc0NoYW5nZWQ6IG5vdEVxdWFsLFxufTtcblxuLy8gVGVtcG9yYXJ5IHR5cGUsIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbnR5cGUgU3RhbmRhcmRQcm9wZXJ0eUNvbnRleHQ8QywgVj4gPSAoXG4gIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgfCBDbGFzc1NldHRlckRlY29yYXRvckNvbnRleHQ8QywgVj5cbikgJiB7bWV0YWRhdGE6IG9iamVjdH07XG5cbi8qKlxuICogV3JhcHMgYSBjbGFzcyBhY2Nlc3NvciBvciBzZXR0ZXIgc28gdGhhdCBgcmVxdWVzdFVwZGF0ZSgpYCBpcyBjYWxsZWQgd2l0aCB0aGVcbiAqIHByb3BlcnR5IG5hbWUgYW5kIG9sZCB2YWx1ZSB3aGVuIHRoZSBhY2Nlc3NvciBpcyBzZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFuZGFyZFByb3BlcnR5ID0gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+IHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gIGNvbnRleHQ6IFN0YW5kYXJkUHJvcGVydHlDb250ZXh0PEMsIFY+XG4pOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yUmVzdWx0PEMsIFY+IHwgKCh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZCkgPT4ge1xuICBjb25zdCB7a2luZCwgbWV0YWRhdGF9ID0gY29udGV4dDtcblxuICBpZiAoREVWX01PREUgJiYgbWV0YWRhdGEgPT0gbnVsbCkge1xuICAgIGlzc3VlV2FybmluZyhcbiAgICAgICdtaXNzaW5nLWNsYXNzLW1ldGFkYXRhJyxcbiAgICAgIGBUaGUgY2xhc3MgJHt0YXJnZXR9IGlzIG1pc3NpbmcgZGVjb3JhdG9yIG1ldGFkYXRhLiBUaGlzIGAgK1xuICAgICAgICBgY291bGQgbWVhbiB0aGF0IHlvdSdyZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgZGVjb3JhdG9ycyBgICtcbiAgICAgICAgYGJ1dCBkb2Vzbid0IHN1cHBvcnQgZGVjb3JhdG9yIG1ldGFkYXRhLCBzdWNoIGFzIFR5cGVTY3JpcHQgNS4xLiBgICtcbiAgICAgICAgYFBsZWFzZSB1cGRhdGUgeW91ciBjb21waWxlci5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3JlIHRoZSBwcm9wZXJ0eSBvcHRpb25zXG4gIGxldCBwcm9wZXJ0aWVzID0gZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLmdldChtZXRhZGF0YSk7XG4gIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuc2V0KG1ldGFkYXRhLCAocHJvcGVydGllcyA9IG5ldyBNYXAoKSkpO1xuICB9XG4gIHByb3BlcnRpZXMuc2V0KGNvbnRleHQubmFtZSwgb3B0aW9ucyk7XG5cbiAgaWYgKGtpbmQgPT09ICdhY2Nlc3NvcicpIHtcbiAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGNhbm5vdCBkeW5hbWljYWxseSBtb2RpZnkgdGhlIGNsYXNzLCBzbyB3ZSBjYW4ndFxuICAgIC8vIHJlcGxhY2UgYSBmaWVsZCB3aXRoIGFjY2Vzc29ycy4gVGhlIHVzZXIgbXVzdCB1c2UgdGhlIG5ldyBgYWNjZXNzb3JgXG4gICAgLy8ga2V5d29yZCBpbnN0ZWFkLlxuICAgIGNvbnN0IHtuYW1lfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHY6IFYpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSAoXG4gICAgICAgICAgdGFyZ2V0IGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgICAgKS5nZXQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgQyk7XG4gICAgICAgICh0YXJnZXQgYXMgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPikuc2V0LmNhbGwoXG4gICAgICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEMsXG4gICAgICAgICAgdlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGluaXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiBWKTogViB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkobmFtZSwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3NldHRlcicpIHtcbiAgICBjb25zdCB7bmFtZX0gPSBjb250ZXh0O1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzW25hbWUgYXMga2V5b2YgUmVhY3RpdmVFbGVtZW50XTtcbiAgICAgICh0YXJnZXQgYXMgKHZhbHVlOiBWKSA9PiB2b2lkKS5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgfSBhcyB1bmtub3duIGFzICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRlY29yYXRvciBsb2NhdGlvbjogJHtraW5kfWApO1xufTtcblxuLyoqXG4gKiBBIGNsYXNzIGZpZWxkIG9yIGFjY2Vzc29yIGRlY29yYXRvciB3aGljaCBjcmVhdGVzIGEgcmVhY3RpdmUgcHJvcGVydHkgdGhhdFxuICogcmVmbGVjdHMgYSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZS4gV2hlbiBhIGRlY29yYXRlZCBwcm9wZXJ0eSBpcyBzZXRcbiAqIHRoZSBlbGVtZW50IHdpbGwgdXBkYXRlIGFuZCByZW5kZXIuIEEge0BsaW5rY29kZSBQcm9wZXJ0eURlY2xhcmF0aW9ufSBtYXlcbiAqIG9wdGlvbmFsbHkgYmUgc3VwcGxpZWQgdG8gY29uZmlndXJlIHByb3BlcnR5IGZlYXR1cmVzLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHB1YmxpYyBmaWVsZHMuIEFzIHB1YmxpYyBmaWVsZHMsXG4gKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLFxuICogZWl0aGVyIHZpYSBhdHRyaWJ1dGUgb3IgdGhlIHByb3BlcnR5IGl0c2VsZi5cbiAqXG4gKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICogcHJvdGVjdGVkIGZpZWxkcyBhbmQgc2hvdWxkIHVzZSB0aGUge0BsaW5rY29kZSBzdGF0ZX0gZGVjb3JhdG9yLlxuICpcbiAqIEhvd2V2ZXIsIHNvbWV0aW1lcyBlbGVtZW50IGNvZGUgZG9lcyBuZWVkIHRvIHNldCBhIHB1YmxpYyBwcm9wZXJ0eS4gVGhpc1xuICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gKiBzaG91bGQgYmUgZmlyZWQgaW5mb3JtaW5nIHRoZSB1c2VyOyBmb3IgZXhhbXBsZSwgYSBjaGVja2JveCBzZXRzIGl0c1xuICogYGNoZWNrZWRgIHByb3BlcnR5IHdoZW4gY2xpY2tlZCBhbmQgZmlyZXMgYSBgY2hhbmdlZGAgZXZlbnQuIE11dGF0aW5nIHB1YmxpY1xuICogcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3IgYXJyYXkpXG4gKiBwcm9wZXJ0aWVzLiBJbiBvdGhlciBjYXNlcyB3aGVuIGFuIGVsZW1lbnQgbmVlZHMgdG8gbWFuYWdlIHN0YXRlLCBhIHByaXZhdGVcbiAqIHByb3BlcnR5IGRlY29yYXRlZCB2aWEgdGhlIHtAbGlua2NvZGUgc3RhdGV9IGRlY29yYXRvciBzaG91bGQgYmUgdXNlZC4gV2hlblxuICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAqIGZhY2lsaXRhdGUgY29tcGxleCBpbnRlcmFjdGlvbnMuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAqICAgY2xpY2tlZCA9IGZhbHNlO1xuICogfVxuICogYGBgXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yXG4gKiBARXhwb3J0RGVjb3JhdGVkSXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgcHJvdG9PclRhcmdldDpcbiAgICAgIHwgb2JqZWN0XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgIHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gICAgbmFtZU9yQ29udGV4dDpcbiAgICAgIHwgUHJvcGVydHlLZXlcbiAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgICAgIHwgQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55ID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgID8gc3RhbmRhcmRQcm9wZXJ0eTxDLCBWPihcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzXG4gICAgICAgICAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPlxuICAgICAgICAgICAgICB8ICgodmFsdWU6IFYpID0+IHZvaWQpLFxuICAgICAgICAgICAgbmFtZU9yQ29udGV4dCBhcyBTdGFuZGFyZFByb3BlcnR5Q29udGV4dDxDLCBWPlxuICAgICAgICAgIClcbiAgICAgICAgOiBsZWdhY3lQcm9wZXJ0eShcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzIE9iamVjdCxcbiAgICAgICAgICAgIG5hbWVPckNvbnRleHQgYXMgUHJvcGVydHlLZXlcbiAgICAgICAgICApXG4gICAgKSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHtwcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVEZWNsYXJhdGlvbjxUeXBlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGluZGljYXRlcyBpZiBhIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGNoYW5nZWQgd2hlblxuICAgKiBpdCBpcyBzZXQuIFRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSB0aGUgYG5ld1ZhbHVlYCBhbmQgYG9sZFZhbHVlYCBhbmRcbiAgICogcmV0dXJuIGB0cnVlYCBpZiBhbiB1cGRhdGUgc2hvdWxkIGJlIHJlcXVlc3RlZC5cbiAgICovXG4gIGhhc0NoYW5nZWQ/KHZhbHVlOiBUeXBlLCBvbGRWYWx1ZTogVHlwZSk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0YXRlRGVjbGFyYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJuYWxQcm9wZXJ0eURlY2xhcmF0aW9uPFR5cGUgPSB1bmtub3duPiA9XG4gIFN0YXRlRGVjbGFyYXRpb248VHlwZT47XG5cbi8qKlxuICogRGVjbGFyZXMgYSBwcml2YXRlIG9yIHByb3RlY3RlZCByZWFjdGl2ZSBwcm9wZXJ0eSB0aGF0IHN0aWxsIHRyaWdnZXJzXG4gKiB1cGRhdGVzIHRvIHRoZSBlbGVtZW50IHdoZW4gaXQgY2hhbmdlcy4gSXQgZG9lcyBub3QgcmVmbGVjdCBmcm9tIHRoZVxuICogY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUuXG4gKlxuICogUHJvcGVydGllcyBkZWNsYXJlZCB0aGlzIHdheSBtdXN0IG5vdCBiZSB1c2VkIGZyb20gSFRNTCBvciBIVE1MIHRlbXBsYXRpbmdcbiAqIHN5c3RlbXMsIHRoZXkncmUgc29sZWx5IGZvciBwcm9wZXJ0aWVzIGludGVybmFsIHRvIHRoZSBlbGVtZW50LiBUaGVzZVxuICogcHJvcGVydGllcyBtYXkgYmUgcmVuYW1lZCBieSBvcHRpbWl6YXRpb24gdG9vbHMgbGlrZSBjbG9zdXJlIGNvbXBpbGVyLlxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGUob3B0aW9ucz86IFN0YXRlRGVjbGFyYXRpb24pIHtcbiAgcmV0dXJuIHByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIC8vIEFkZCBib3RoIGBzdGF0ZWAgYW5kIGBhdHRyaWJ1dGVgIGJlY2F1c2Ugd2UgZm91bmQgYSB0aGlyZCBwYXJ0eVxuICAgIC8vIGNvbnRyb2xsZXIgdGhhdCBpcyBrZXlpbmcgb2ZmIG9mIFByb3BlcnR5T3B0aW9ucy5zdGF0ZSB0byBkZXRlcm1pbmVcbiAgICAvLyB3aGV0aGVyIGEgZmllbGQgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IG9yIG5vdC5cbiAgICBzdGF0ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGU6IGZhbHNlLFxuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwdWJsaWMgaW50ZXJmYWNlIHR5cGUgdGhhdCByZW1vdmVzIHByaXZhdGUgYW5kIHByb3RlY3RlZCBmaWVsZHMuXG4gKiBUaGlzIGFsbG93cyBhY2NlcHRpbmcgb3RoZXJ3aXNlIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgdHlwZSAoZS5nLiBmcm9tXG4gKiBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2FnZSBpbiBgbm9kZV9tb2R1bGVzYCkuXG4gKi9cbmV4cG9ydCB0eXBlIEludGVyZmFjZTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUPiA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQ7XG59O1xuXG4vKipcbiAqIFdyYXBzIHVwIGEgZmV3IGJlc3QgcHJhY3RpY2VzIHdoZW4gcmV0dXJuaW5nIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIGFcbiAqIGRlY29yYXRvci5cbiAqXG4gKiBNYXJrcyB0aGUgZGVmaW5lZCBwcm9wZXJ0eSBhcyBjb25maWd1cmFibGUsIGFuZCBlbnVtZXJhYmxlLCBhbmQgaGFuZGxlc1xuICogdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIGJ1c3RlZCBSZWZsZWN0LmRlY29yYXRlIHpvbWJpZWZpbGwgKGUuZy4gaW4gQW5ndWxhclxuICogYXBwcykuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkZXNjID0gKFxuICBvYmo6IG9iamVjdCxcbiAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPixcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4pID0+IHtcbiAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBrZWVwIHRoZW0gY29uZmlndXJhYmxlIGFuZCBlbnVtZXJhYmxlLlxuICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIGlmIChcbiAgICAvLyBXZSBjaGVjayBmb3IgUmVmbGVjdC5kZWNvcmF0ZSBlYWNoIHRpbWUsIGluIGNhc2UgdGhlIHpvbWJpZWZpbGxcbiAgICAvLyBpcyBhcHBsaWVkIHZpYSBsYXp5IGxvYWRpbmcgc29tZSBBbmd1bGFyIGNvZGUuXG4gICAgKFJlZmxlY3QgYXMgdHlwZW9mIFJlZmxlY3QgJiB7ZGVjb3JhdGU/OiB1bmtub3dufSkuZGVjb3JhdGUgJiZcbiAgICB0eXBlb2YgbmFtZSAhPT0gJ29iamVjdCdcbiAgKSB7XG4gICAgLy8gSWYgd2UncmUgY2FsbGVkIGFzIGEgbGVnYWN5IGRlY29yYXRvciwgYW5kIFJlZmxlY3QuZGVjb3JhdGUgaXMgcHJlc2VudFxuICAgIC8vIHRoZW4gd2UgaGF2ZSBubyBndWFyYW50ZWVzIHRoYXQgdGhlIHJldHVybmVkIGRlc2NyaXB0b3Igd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgb24gdGhlIGNsYXNzLCBzbyB3ZSBtdXN0IGFwcGx5IGl0IGRpcmVjdGx5IG91cnNlbHZlcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBkZXNjcmlwdG9yO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cbmltcG9ydCB0eXBlIHtSZWFjdGl2ZUVsZW1lbnR9IGZyb20gJy4uL3JlYWN0aXZlLWVsZW1lbnQuanMnO1xuaW1wb3J0IHtkZXNjLCB0eXBlIEludGVyZmFjZX0gZnJvbSAnLi9iYXNlLmpzJztcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBjb25zdCBpc3N1ZWRXYXJuaW5nczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4gPVxuICAgIChnbG9iYWxUaGlzLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCkpO1xuXG4gIC8vIElzc3VlIGEgd2FybmluZywgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LlxuICBpc3N1ZVdhcm5pbmcgPSAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHtcbiAgICB3YXJuaW5nICs9IGNvZGVcbiAgICAgID8gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgIDogJyc7XG4gICAgaWYgKCFpc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGlzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RGVjb3JhdG9yID0ge1xuICAvLyBsZWdhY3lcbiAgKFxuICAgIHByb3RvOiBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PixcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gTm90ZSBUeXBlU2NyaXB0IHJlcXVpcmVzIHRoZSByZXR1cm4gdHlwZSB0byBiZSBgdm9pZHxhbnlgXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogdm9pZCB8IGFueTtcblxuICAvLyBzdGFuZGFyZFxuICA8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHZhbHVlOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG59O1xuXG4vKipcbiAqIEEgcHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgY29udmVydHMgYSBjbGFzcyBwcm9wZXJ0eSBpbnRvIGEgZ2V0dGVyIHRoYXRcbiAqIGV4ZWN1dGVzIGEgcXVlcnlTZWxlY3RvciBvbiB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QuXG4gKlxuICogQHBhcmFtIHNlbGVjdG9yIEEgRE9NU3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgc2VsZWN0b3JzIHRvIG1hdGNoLlxuICogQHBhcmFtIGNhY2hlIEFuIG9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggd2hlbiB0cnVlIHBlcmZvcm1zIHRoZSBET00gcXVlcnkgb25seVxuICogICAgIG9uY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L3F1ZXJ5U2VsZWN0b3JcbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgTXlFbGVtZW50IHtcbiAqICAgQHF1ZXJ5KCcjZmlyc3QnKVxuICogICBmaXJzdDogSFRNTERpdkVsZW1lbnQ7XG4gKlxuICogICByZW5kZXIoKSB7XG4gKiAgICAgcmV0dXJuIGh0bWxgXG4gKiAgICAgICA8ZGl2IGlkPVwiZmlyc3RcIj48L2Rpdj5cbiAqICAgICAgIDxkaXYgaWQ9XCJzZWNvbmRcIj48L2Rpdj5cbiAqICAgICBgO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5KHNlbGVjdG9yOiBzdHJpbmcsIGNhY2hlPzogYm9vbGVhbik6IFF1ZXJ5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICg8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWIGV4dGVuZHMgRWxlbWVudCB8IG51bGw+KFxuICAgIHByb3RvT3JUYXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgbmFtZU9yQ29udGV4dDogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPixcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGNvbnN0IGRvUXVlcnkgPSAoZWw6IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+KTogViA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSAoZWwucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgPz8gbnVsbCkgYXMgVjtcbiAgICAgIGlmIChERVZfTU9ERSAmJiByZXN1bHQgPT09IG51bGwgJiYgY2FjaGUgJiYgIWVsLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IG5hbWVPckNvbnRleHQubmFtZVxuICAgICAgICAgICAgOiBuYW1lT3JDb250ZXh0O1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYEBxdWVyeSdkIGZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gd2l0aCB0aGUgJ2NhY2hlJyBgICtcbiAgICAgICAgICAgIGBmbGFnIHNldCBmb3Igc2VsZWN0b3IgJyR7c2VsZWN0b3J9JyBoYXMgYmVlbiBhY2Nlc3NlZCBiZWZvcmUgYCArXG4gICAgICAgICAgICBgdGhlIGZpcnN0IHVwZGF0ZSBhbmQgcmV0dXJuZWQgbnVsbC4gVGhpcyBpcyBleHBlY3RlZCBpZiB0aGUgYCArXG4gICAgICAgICAgICBgcmVuZGVyUm9vdCB0cmVlIGhhcyBub3QgYmVlbiBwcm92aWRlZCBiZWZvcmVoYW5kIChlLmcuIHZpYSBgICtcbiAgICAgICAgICAgIGBEZWNsYXJhdGl2ZSBTaGFkb3cgRE9NKS4gVGhlcmVmb3JlIHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBjYWNoZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogaWYgd2Ugd2FudCB0byBhbGxvdyB1c2VycyB0byBhc3NlcnQgdGhhdCB0aGUgcXVlcnkgd2lsbCBuZXZlclxuICAgICAgLy8gcmV0dXJuIG51bGwsIHdlIG5lZWQgYSBuZXcgb3B0aW9uIGFuZCB0byB0aHJvdyBoZXJlIGlmIHRoZSByZXN1bHRcbiAgICAgIC8vIGlzIG51bGwuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAvLyBBY2Nlc3NvcnMgdG8gd3JhcCBmcm9tIGVpdGhlcjpcbiAgICAgIC8vICAgMS4gVGhlIGRlY29yYXRvciB0YXJnZXQsIGluIHRoZSBjYXNlIG9mIHN0YW5kYXJkIGRlY29yYXRvcnNcbiAgICAgIC8vICAgMi4gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IsIGluIHRoZSBjYXNlIG9mIGV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzXG4gICAgICAvLyAgICAgIG9uIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gICAzLiBGdW5jdGlvbnMgdGhhdCBhY2Nlc3Mgb3VyIG93biBjYWNoZS1rZXkgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlLFxuICAgICAgLy8gICAgICBpbiB0aGUgY2FzZSBvZiBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMuXG4gICAgICBjb25zdCB7Z2V0LCBzZXR9ID1cbiAgICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBwcm90b09yVGFyZ2V0XG4gICAgICAgICAgOiBkZXNjcmlwdG9yID8/XG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBrZXkgPSBERVZfTU9ERVxuICAgICAgICAgICAgICAgID8gU3ltYm9sKGAke1N0cmluZyhuYW1lT3JDb250ZXh0KX0gKEBxdWVyeSgpIGNhY2hlKWApXG4gICAgICAgICAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgICAgICAgICAgdHlwZSBXaXRoQ2FjaGUgPSBSZWFjdGl2ZUVsZW1lbnQgJiB7XG4gICAgICAgICAgICAgICAgW2tleTogc3ltYm9sXTogRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzIGFzIFdpdGhDYWNoZSlba2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldCh2KSB7XG4gICAgICAgICAgICAgICAgICAodGhpcyBhcyBXaXRoQ2FjaGUpW2tleV0gPSB2O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgcmV0dXJuIGRlc2MocHJvdG9PclRhcmdldCwgbmFtZU9yQ29udGV4dCwge1xuICAgICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KTogViB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogViA9IGdldCEuY2FsbCh0aGlzKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRvUXVlcnkodGhpcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsIHx8IHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICBzZXQhLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIG9iamVjdCB3b3JrcyBhcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGJvdGggc3RhbmRhcmQgYW5kXG4gICAgICAvLyBleHBlcmltZW50YWwgZGVjb3JhdG9ycy5cbiAgICAgIHJldHVybiBkZXNjKHByb3RvT3JUYXJnZXQsIG5hbWVPckNvbnRleHQsIHtcbiAgICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBkb1F1ZXJ5KHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9KSBhcyBRdWVyeURlY29yYXRvcjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUge1JlYWN0aXZlRWxlbWVudH0gZnJvbSAnLi4vcmVhY3RpdmUtZWxlbWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7UXVlcnlBc3NpZ25lZE5vZGVzT3B0aW9uc30gZnJvbSAnLi9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qcyc7XG5pbXBvcnQge2Rlc2MsIHR5cGUgSW50ZXJmYWNlfSBmcm9tICcuL2Jhc2UuanMnO1xuXG5leHBvcnQgdHlwZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3IgPSB7XG4gIC8vIGxlZ2FjeVxuICAoXG4gICAgcHJvdG86IEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgICAvLyBOb3RlIFR5cGVTY3JpcHQgcmVxdWlyZXMgdGhlIHJldHVybiB0eXBlIHRvIGJlIGB2b2lkfGFueWBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiB2b2lkIHwgYW55O1xuXG4gIC8vIHN0YW5kYXJkXG4gIDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgdmFsdWU6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4sXG4gICAgY29udGV4dDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgKTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclJlc3VsdDxDLCBWPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgcXVlcnlBc3NpZ25lZEVsZW1lbnRzfSBkZWNvcmF0b3IuIEV4dGVuZHMgdGhlXG4gKiBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvXG4gKiBbSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MU2xvdEVsZW1lbnQvYXNzaWduZWRFbGVtZW50cykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3NpZ25lZEVsZW1lbnRzT3B0aW9uc1xuICBleHRlbmRzIFF1ZXJ5QXNzaWduZWROb2Rlc09wdGlvbnMge1xuICAvKipcbiAgICogQ1NTIHNlbGVjdG9yIHVzZWQgdG8gZmlsdGVyIHRoZSBlbGVtZW50cyByZXR1cm5lZC4gRm9yIGV4YW1wbGUsIGEgc2VsZWN0b3JcbiAgICogb2YgYFwiLml0ZW1cImAgd2lsbCBvbmx5IGluY2x1ZGUgZWxlbWVudHMgd2l0aCB0aGUgYGl0ZW1gIGNsYXNzLlxuICAgKi9cbiAgc2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjb252ZXJ0cyBhIGNsYXNzIHByb3BlcnR5IGludG8gYSBnZXR0ZXIgdGhhdFxuICogcmV0dXJucyB0aGUgYGFzc2lnbmVkRWxlbWVudHNgIG9mIHRoZSBnaXZlbiBgc2xvdGAuIFByb3ZpZGVzIGEgZGVjbGFyYXRpdmVcbiAqIHdheSB0byB1c2VcbiAqIFtgSFRNTFNsb3RFbGVtZW50LmFzc2lnbmVkRWxlbWVudHNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTFNsb3RFbGVtZW50L2Fzc2lnbmVkRWxlbWVudHMpLlxuICpcbiAqIENhbiBiZSBwYXNzZWQgYW4gb3B0aW9uYWwge0BsaW5rY29kZSBRdWVyeUFzc2lnbmVkRWxlbWVudHNPcHRpb25zfSBvYmplY3QuXG4gKlxuICogRXhhbXBsZSB1c2FnZTpcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2xvdDogJ2xpc3QnIH0pXG4gKiAgIGxpc3RJdGVtcyE6IEFycmF5PEhUTUxFbGVtZW50PjtcbiAqICAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cygpXG4gKiAgIHVubmFtZWRTbG90RWxzITogQXJyYXk8SFRNTEVsZW1lbnQ+O1xuICpcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYFxuICogICAgICAgPHNsb3QgbmFtZT1cImxpc3RcIj48L3Nsb3Q+XG4gKiAgICAgICA8c2xvdD48L3Nsb3Q+XG4gKiAgICAgYDtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogTm90ZSwgdGhlIHR5cGUgb2YgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW5ub3RhdGVkIGFzIGBBcnJheTxIVE1MRWxlbWVudD5gLlxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5QXNzaWduZWRFbGVtZW50cyhcbiAgb3B0aW9ucz86IFF1ZXJ5QXNzaWduZWRFbGVtZW50c09wdGlvbnNcbik6IFF1ZXJ5QXNzaWduZWRFbGVtZW50c0RlY29yYXRvciB7XG4gIHJldHVybiAoPFYgZXh0ZW5kcyBBcnJheTxFbGVtZW50Pj4oXG4gICAgb2JqOiBvYmplY3QsXG4gICAgbmFtZTogUHJvcGVydHlLZXkgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDx1bmtub3duLCB1bmtub3duPlxuICApID0+IHtcbiAgICBjb25zdCB7c2xvdCwgc2VsZWN0b3J9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBzbG90U2VsZWN0b3IgPSBgc2xvdCR7c2xvdCA/IGBbbmFtZT0ke3Nsb3R9XWAgOiAnOm5vdChbbmFtZV0pJ31gO1xuICAgIHJldHVybiBkZXNjKG9iaiwgbmFtZSwge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCk6IFYge1xuICAgICAgICBjb25zdCBzbG90RWwgPVxuICAgICAgICAgIHRoaXMucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcjxIVE1MU2xvdEVsZW1lbnQ+KHNsb3RTZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2xvdEVsPy5hc3NpZ25lZEVsZW1lbnRzKG9wdGlvbnMpID8/IFtdO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNlbGVjdG9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gZWxlbWVudHNcbiAgICAgICAgICAgIDogZWxlbWVudHMuZmlsdGVyKChub2RlKSA9PiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpKVxuICAgICAgICApIGFzIFY7XG4gICAgICB9LFxuICAgIH0pO1xuICB9KSBhcyBRdWVyeUFzc2lnbmVkRWxlbWVudHNEZWNvcmF0b3I7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiBOb25VbmRlZmluZWQ8VFtLXT4gZXh0ZW5kcyBVcGRhdGVIYW5kbGVyID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuaW50ZXJmYWNlIFdhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbiAgd2FpdFVudGlsRmlyc3RVcGRhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJ1bnMgd2hlbiBvYnNlcnZlZCBwcm9wZXJ0aWVzIGNoYW5nZSwgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy4gVG8gd2FpdCBmb3IgYW5cbiAqIHVwZGF0ZSB0byBjb21wbGV0ZSBhZnRlciBhIGNoYW5nZSBvY2N1cnMsIHVzZSBgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZWAgaW4gdGhlIGhhbmRsZXIuIFRvIHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZVxuICogaW5pdGlhbCB1cGRhdGUvcmVuZGVyLCB1c2UgYHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfWAgb3IgYHRoaXMuaGFzVXBkYXRlZGAgaW4gdGhlIGhhbmRsZXIuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogQHdhdGNoKCdwcm9wTmFtZScpXG4gKiBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICogICAuLi5cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoKHByb3BlcnR5TmFtZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM/OiBXYXRjaE9wdGlvbnMpIHtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxXYXRjaE9wdGlvbnM+ID0ge1xuICAgIHdhaXRVbnRpbEZpcnN0VXBkYXRlOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4oXG4gICAgcHJvdG86IEVsZW1DbGFzcyxcbiAgICBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPiB8IGFueVxuICApID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gdXBkYXRlIGlzIGEgcHJvdGVjdGVkIHByb3BlcnR5XG4gICAgY29uc3QgeyB1cGRhdGUgfSA9IHByb3RvO1xuICAgIGNvbnN0IHdhdGNoZWRQcm9wZXJ0aWVzID0gQXJyYXkuaXNBcnJheShwcm9wZXJ0eU5hbWUpID8gcHJvcGVydHlOYW1lIDogW3Byb3BlcnR5TmFtZV07XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gdXBkYXRlIGlzIGEgcHJvdGVjdGVkIHByb3BlcnR5XG4gICAgcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcywgY2hhbmdlZFByb3BzOiBNYXA8a2V5b2YgRWxlbUNsYXNzLCBFbGVtQ2xhc3Nba2V5b2YgRWxlbUNsYXNzXT4pIHtcbiAgICAgIHdhdGNoZWRQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eSBhcyBrZXlvZiBFbGVtQ2xhc3M7XG4gICAgICAgIGlmIChjaGFuZ2VkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGNoYW5nZWRQcm9wcy5nZXQoa2V5KTtcbiAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghcmVzb2x2ZWRPcHRpb25zLndhaXRVbnRpbEZpcnN0VXBkYXRlIHx8IHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGUuY2FsbCh0aGlzLCBjaGFuZ2VkUHJvcHMpO1xuICAgIH07XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJdGVtQ29udGV4dCB7XG4gIGhyZWY/OiBzdHJpbmc7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgdmFyaWFibGVzOiBSZWFkb25seUFycmF5PFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+Pjtcbn1cblxuZXhwb3J0IGNvbnN0IGl0ZW1Db250ZXh0VmFyaWFibGVzID0gW1xuICB7XG4gICAgaWRlbnRpZmllcjogJ2NvbXBsZXRpb25TdGF0dXMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ3N0cmluZycsXG4gICAgdmFsdWU6ICd1bmtub3duJyxcbiAgICB0eXBlOiAnb3V0Y29tZSdcbiAgfSxcbiAge1xuICAgIGlkZW50aWZpZXI6ICdudW1BdHRlbXB0cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgdmFsdWU6ICcwJyxcbiAgICB0eXBlOiAncmVzcG9uc2UnXG4gIH1cbl0gYXMgVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXTtcblxuZXhwb3J0IGNvbnN0IGl0ZW1Db250ZXh0ID0gY3JlYXRlQ29udGV4dDxJdGVtQ29udGV4dD4oU3ltYm9sKCdpdGVtJykpO1xuIiwgImltcG9ydCB7IHByb3ZpZGUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHMsIE91dGNvbWVDaGFuZ2VkRGV0YWlscyB9IGZyb20gJy4uL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB0eXBlIHsgVmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVWYWx1ZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUsIFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHR5cGUgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2snO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFF0aVJlc3BvbnNlUHJvY2Vzc2luZyB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCwgaXRlbUNvbnRleHRWYXJpYWJsZXMgfSBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgUXRpUmVnaXN0ZXJWYXJpYWJsZSBmcm9tICcuLi9pbnRlcm5hbC9ldmVudHMvcXRpLXJlZ2lzdGVyLXZhcmlhYmxlJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgcXRpLWFzc2Vzc21lbnQtaXRlbSBlbGVtZW50IGNvbnRhaW5zIGFsbCB0aGUgb3RoZXIgUVRJIDMgaXRlbSBzdHJ1Y3R1cmVzLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5kbHRubmo4N2wweWpcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQGRlcGVuZGVuY3kgcXRpLWZlZWRiYWNrXG4gKiBAZGVwZW5kZW5jeSBxdGktcmVzcG9uc2Vwcm9jZXNzaW5nXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIGFsbCB0aGUgb3RoZXIgUVRJIDMgaXRlbSBzdHJ1Y3R1cmVzIGdvLlxuICpcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBpbnRlcmFjdGlvbiBpcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1vdXRjb21lLWNoYW5nZWQgLSBFbWl0dGVkIHdoZW4gYW4gb3V0Y29tZSBoYXMgY2hhbmdlZC5cbiAqIEBldmVudCBxdGktcmVzcG9uc2UtcHJvY2Vzc2luZyAtIEVtaXR0ZWQgd2hlbiByZXNwb25zZS1wcm9jZXNzaW5nIGlzIGNhbGxlZC5cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1pdGVtJylcbmV4cG9ydCBjbGFzcyBRdGlBc3Nlc3NtZW50SXRlbSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdGl0bGU6IHN0cmluZztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgYWRhcHRpdmU6ICd0cnVlJyB8ICdmYWxzZScgPSAnZmFsc2UnO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdGltZURlcGVuZGVudDogJ3RydWUnIHwgJ2ZhbHNlJyB8IG51bGwgPSBudWxsO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2guZGlzYWJsZWQgPSBkaXNhYmxlZCkpO1xuICB9O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHk6IGJvb2xlYW47XG4gIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChfOiBib29sZWFuLCByZWFkb25seTogYm9vbGVhbikgPT5cbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLnJlYWRvbmx5ID0gcmVhZG9ubHkpKTtcblxuICBAcHJvdmlkZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0IH0pXG4gIHByaXZhdGUgX2NvbnRleHQ6IEl0ZW1Db250ZXh0ID0ge1xuICAgIGlkZW50aWZpZXI6IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyksXG4gICAgdmFyaWFibGVzOiBpdGVtQ29udGV4dFZhcmlhYmxlc1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdmFyaWFibGVzKCk6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHtcbiAgICAgIGlkZW50aWZpZXI6IHYuaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB2LnZhbHVlLFxuICAgICAgdHlwZTogdi50eXBlLFxuICAgICAgLy8gYWRkIGV4dGVybmFsc2NvcmVkLCBhIGZpeGVkIHByb3AgdG8gdGhlIHRlc3QsIHNvIHRoZSB0ZXN0Y29udGV4dCBjYW4gcmVhZCBhbmQgZGVjaWRlIGhvdyB0byBzY29yZSB0aGlzIGl0ZW1cbiAgICAgIC4uLih2LnR5cGUgPT09ICdvdXRjb21lJyAmJiB2LmlkZW50aWZpZXIgPT09ICdTQ09SRSdcbiAgICAgICAgPyB7IGV4dGVybmFsU2NvcmVkOiAodiBhcyBPdXRjb21lVmFyaWFibGUpLmV4dGVybmFsU2NvcmVkIH1cbiAgICAgICAgOiB7fSlcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHZhcmlhYmxlcyh2YWx1ZTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLnNvbWUodiA9PiAhKCdpZGVudGlmaWVyJyBpbiB2KSkpIHtcbiAgICAgIGNvbnNvbGUud2FybigndmFyaWFibGVzIHByb3BlcnR5IHNob3VsZCBiZSBhbiBhcnJheSBvZiBWYXJpYWJsZURlY2xhcmF0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodmFyaWFibGUgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGluZ1ZhbHVlID0gdmFsdWUuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllcik7XG4gICAgICAgIGlmIChtYXRjaGluZ1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4udmFyaWFibGUsIC4uLm1hdGNoaW5nVmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICB9KVxuICAgIH07XG5cbiAgICB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAncmVzcG9uc2UnKSB7XG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uRWxlbWVudCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICAoZWw6IEludGVyYWN0aW9uKSA9PiBlbC5yZXNwb25zZUlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uRWxlbWVudCkge1xuICAgICAgICAgIGludGVyYWN0aW9uRWxlbWVudC52YWx1ZSA9IHZhcmlhYmxlLnZhbHVlIGFzIHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnb3V0Y29tZScpIHtcbiAgICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5mb3JFYWNoKGZlID0+IGZlLmNoZWNrU2hvd0ZlZWRiYWNrKHZhcmlhYmxlLmlkZW50aWZpZXIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxDb250ZXh0OiBSZWFkb25seTxJdGVtQ29udGV4dD4gPSB7IC4uLnRoaXMuX2NvbnRleHQsIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMgfTtcbiAgcHJpdmF0ZSBfZmVlZGJhY2tFbGVtZW50czogUXRpRmVlZGJhY2tbXSA9IFtdO1xuICBwcml2YXRlIF9pbnRlcmFjdGlvbkVsZW1lbnRzOiBJbnRlcmFjdGlvbltdID0gW107XG5cbiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgIHRoaXMuX2VtaXQ8eyBkZXRhaWw6IFF0aUFzc2Vzc21lbnRJdGVtIH0+KCdxdGktYXNzZXNzbWVudC1pdGVtLWNvbm5lY3RlZCcsIHRoaXMpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSB2YXJpYWJsZXMgcHJvcGVydHkgaW5zdGVhZCAqL1xuICBzZXQgcmVzcG9uc2VzKG15UmVzcG9uc2VzOiBSZXNwb25zZUludGVyYWN0aW9uW10pIHtcbiAgICBpZiAobXlSZXNwb25zZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgbXlSZXNwb25zZXMpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuZ2V0UmVzcG9uc2UocmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3BvbnNlVmFyaWFibGUocmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZS5yZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24gfCB1bmRlZmluZWQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgaSA9PiBpLmdldEF0dHJpYnV0ZSgncmVzcG9uc2UtaWRlbnRpZmllcicpID09PSByZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24udmFsdWUgPSByZXNwb25zZS5yZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCAoZTogUXRpUmVnaXN0ZXJWYXJpYWJsZSkgPT4ge1xuICAgICAgdGhpcy5fY29udGV4dCA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiBbLi4udGhpcy5fY29udGV4dC52YXJpYWJsZXMsIGUuZGV0YWlsLnZhcmlhYmxlXSB9O1xuICAgICAgdGhpcy5faW5pdGlhbENvbnRleHQgPSB0aGlzLl9jb250ZXh0O1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIChlOiBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4pID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBmZWVkYmFja0VsZW1lbnQgPSBlLmRldGFpbDtcbiAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMucHVzaChmZWVkYmFja0VsZW1lbnQpO1xuICAgICAgZmVlZGJhY2tFbGVtZW50LmNoZWNrU2hvd0ZlZWRiYWNrKGZlZWRiYWNrRWxlbWVudC5vdXRjb21lSWRlbnRpZmllcik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCAoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLnB1c2goZS50YXJnZXQgYXMgSW50ZXJhY3Rpb24pO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZW5kLWF0dGVtcHQnLCAoZTogQ3VzdG9tRXZlbnQ8eyByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZzsgY291bnRBdHRlbXB0OiBib29sZWFuIH0+KSA9PiB7XG4gICAgICBjb25zdCB7IHJlc3BvbnNlSWRlbnRpZmllciwgY291bnRBdHRlbXB0IH0gPSBlLmRldGFpbDtcbiAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZUlkZW50aWZpZXIsICd0cnVlJyk7XG4gICAgICB0aGlzLnByb2Nlc3NSZXNwb25zZShjb3VudEF0dGVtcHQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgLy8gd29yZHQgYWFuZ2Vyb2VwZW4gdmFudWl0IGRlIHByb2Nlc3Npbmd0ZW1wbGF0ZVxuICAgICAgJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsXG4gICAgICAoZTogQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4pID0+IHtcbiAgICAgICAgY29uc3QgeyBvdXRjb21lSWRlbnRpZmllciwgdmFsdWUgfSA9IGUuZGV0YWlsO1xuICAgICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZShvdXRjb21lSWRlbnRpZmllciwgdmFsdWUpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHRoaXMuaGFuZGxlVXBkYXRlUmVzcG9uc2VWYXJpYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0NvcnJlY3RSZXNwb25zZShzaG93OiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZXMgPSB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maWx0ZXIoXG4gICAgICAodmFyaTogUmVzcG9uc2VWYXJpYWJsZSB8IE91dGNvbWVWYXJpYWJsZSkgPT4gJ2NvcnJlY3RSZXNwb25zZScgaW4gdmFyaSAmJiB2YXJpLmNvcnJlY3RSZXNwb25zZVxuICAgICkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGNvbnN0IHJlc3BvbnNlcyA9IHJlc3BvbnNlVmFyaWFibGVzLm1hcChjciA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IGNyLmlkZW50aWZpZXIsXG4gICAgICAgIHJlc3BvbnNlOiBjci5jb3JyZWN0UmVzcG9uc2VcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCByZXNwb25zZSBvZiByZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgaSA9PiBpLmdldEF0dHJpYnV0ZSgncmVzcG9uc2UtaWRlbnRpZmllcicpID09PSByZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXJcbiAgICAgICk7XG4gICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgaW50ZXJhY3Rpb24uY29ycmVjdFJlc3BvbnNlID0gc2hvdyA/IHJlc3BvbnNlLnJlc3BvbnNlIDogJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb2Nlc3NSZXNwb25zZShjb3VudE51bUF0dGVtcHRzOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3BvbnNlUHJvY2Vzc29yID0gdGhpcy5xdWVyeVNlbGVjdG9yPFF0aVJlc3BvbnNlUHJvY2Vzc2luZz4oJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJyk7XG4gICAgaWYgKCFyZXNwb25zZVByb2Nlc3Nvcikge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSBwcm9jZXNzaW5nIHRlbXBsYXRlIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yLnByb2Nlc3MpIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnQ2xpZW50IHNpZGUgcmVzcG9uc2Ugd2ViY29tcG9uZW50cyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVzcG9uc2VQcm9jZXNzb3IucHJvY2VzcygpO1xuXG4gICAgaWYgKHRoaXMuYWRhcHRpdmUgPT09ICdmYWxzZScpIHtcbiAgICAgIC8vIGlmIGFkYXB0aXZlLCBjb21wbGV0aW9uU3RhdHVzIGlzIHNldCBieSB0aGUgcHJvY2Vzc2luZyB0ZW1wbGF0ZVxuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoJ2NvbXBsZXRpb25TdGF0dXMnLCB0aGlzLl9nZXRDb21wbGV0aW9uU3RhdHVzKCkpO1xuICAgIH1cblxuICAgIGlmIChjb3VudE51bUF0dGVtcHRzKSB7XG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZShcbiAgICAgICAgJ251bUF0dGVtcHRzJyxcbiAgICAgICAgKCt0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSAnbnVtQXR0ZW1wdHMnKT8udmFsdWUgKyAxKS50b1N0cmluZygpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX2VtaXQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzZWQnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFJlc3BvbnNlcygpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5faW5pdGlhbENvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzcG9uc2UoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8UmVzcG9uc2VWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3V0Y29tZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxPdXRjb21lVmFyaWFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gIH1cblxuICAvLyBzYXZpbmcgcHJpdmF0ZXMgaGVyZTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBoYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKGV2ZW50OiBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPikge1xuICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSZXNwb25zZVZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIgPyB2IDogeyAuLi52LCB2YWx1ZTogdmFsdWUgfSkpXG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXQ8SW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscz4oJ3F0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkJywge1xuICAgICAgaXRlbTogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgcmVzcG9uc2U6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcGF0aXZlLCBjb21wbGV0aW9uU3RhdHVzIGlzIHNldCBieSB0aGUgcHJvY2Vzc2luZyB0ZW1wbGF0ZVxuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoJ2NvbXBsZXRpb25TdGF0dXMnLCB0aGlzLl9nZXRDb21wbGV0aW9uU3RhdHVzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVPdXRjb21lVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmdldE91dGNvbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIW91dGNvbWVWYXJpYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGBDYW4gbm90IHNldCBxdGktb3V0Y29tZS1pZGVudGlmaWVyOiAke2lkZW50aWZpZXJ9LCBpdCBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+IHtcbiAgICAgICAgaWYgKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udixcbiAgICAgICAgICB2YWx1ZTogb3V0Y29tZVZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJyA/IHZhbHVlIDogWy4uLnYudmFsdWUsIHZhbHVlIGFzIHN0cmluZ11cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2soaWRlbnRpZmllcikpO1xuXG4gICAgdGhpcy5fZW1pdDxPdXRjb21lQ2hhbmdlZERldGFpbHM+KCdxdGktb3V0Y29tZS1jaGFuZ2VkJywge1xuICAgICAgaXRlbTogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgb3V0Y29tZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcik/LnZhbHVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb21wbGV0aW9uU3RhdHVzKCk6ICdjb21wbGV0ZWQnIHwgJ2luY29tcGxldGUnIHwgJ25vdF9hdHRlbXB0ZWQnIHwgJ3Vua25vd24nIHtcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5ldmVyeShpbnRlcmFjdGlvbkVsZW1lbnQgPT4gaW50ZXJhY3Rpb25FbGVtZW50LnZhbGlkYXRlKCkpKSByZXR1cm4gJ2NvbXBsZXRlZCc7XG4gICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuc29tZShpbnRlcmFjdGlvbkVsZW1lbnQgPT4gaW50ZXJhY3Rpb25FbGVtZW50LnZhbGlkYXRlKCkpKSByZXR1cm4gJ2luY29tcGxldGUnO1xuICAgIHJldHVybiAnbm90X2F0dGVtcHRlZCc7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0PFQ+KG5hbWUsIGRldGFpbCA9IG51bGwpIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8VD4obmFtZSwge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtaXRlbSc6IFF0aUFzc2Vzc21lbnRJdGVtO1xuICB9XG59XG4iLCAiY29uc3QgeG1sID0gU3RyaW5nLnJhdztcblxuLyogICA8IS0tIGNvbnZlcnQgQ0RBVEEgdG8gY29tbWVudHMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJ0ZXh0KClbY29udGFpbnMoLiwgJ0NEQVRBJyldXCI+XG4gIDx4c2w6Y29tbWVudD5cbiAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gIDwveHNsOmNvbW1lbnQ+XG48L3hzbDp0ZW1wbGF0ZT5cbiovXG5cbi8qXG4gIDwhLS0gcmVtb3ZlIHhtbCBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cImNvbW1lbnQoKVwiIC8+XG4gICovXG5cbmNvbnN0IHhtbFRvSFRNTCA9IHhtbGA8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj1cIjEuMFwiIHhtbG5zOnhzbD1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybVwiPlxuPHhzbDpvdXRwdXQgbWV0aG9kPVwiaHRtbFwiIHZlcnNpb249XCI1LjBcIiBlbmNvZGluZz1cIlVURi04XCIgaW5kZW50PVwieWVzXCIgLz5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIkAqfG5vZGUoKVwiPlxuICAgIDx4c2w6Y29weT5cbiAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD1cIkAqfG5vZGUoKVwiLz5cbiAgICA8L3hzbDpjb3B5PlxuICA8L3hzbDp0ZW1wbGF0ZT5cblxuICA8IS0tIHJlbW92ZSBleGlzdGluZyBuYW1lc3BhY2VzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiKlwiPlxuICAgIDwhLS0gcmVtb3ZlIGVsZW1lbnQgcHJlZml4IC0tPlxuICAgIDx4c2w6ZWxlbWVudCBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgIDwhLS0gcHJvY2VzcyBhdHRyaWJ1dGVzIC0tPlxuICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9XCJAKlwiPlxuICAgICAgICA8IS0tIHJlbW92ZSBhdHRyaWJ1dGUgcHJlZml4IC0tPlxuICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gICAgICAgIDwveHNsOmF0dHJpYnV0ZT5cbiAgICAgIDwveHNsOmZvci1lYWNoPlxuICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz5cbiAgPC94c2w6ZWxlbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuPC94c2w6c3R5bGVzaGVldD5gO1xuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgZWxlbWVudHMgd2l0aCBhIHNwZWNpZmljIHRhZyBuYW1lIGJ5IGFkZGluZyBhbiBleHRlbnNpb24gc3VmZml4XG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCB0YWdOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFnTmFtZSkuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7dGFnTmFtZX0tJHtleHRlbnNpb259YDtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gIH0pO1xufVxuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgYW55IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIGNsYXNzIHBhdHRlcm4gKGUuZy4sIFwiZXh0ZW5kOnN1ZmZpeFwiKVxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCwgY2xhc3NOYW1lUGF0dGVybjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIGlmIChjbGFzc0xpc3QpIHtcbiAgICAgIGNsYXNzTGlzdC5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7XG4gICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChgJHtjbGFzc05hbWVQYXR0ZXJufTpgKSkge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNsYXNzTmFtZS5zbGljZShgJHtjbGFzc05hbWVQYXR0ZXJufTpgLmxlbmd0aCk7XG4gICAgICAgICAgY29uc3QgbmV3VGFnTmFtZSA9IGAke2VsZW1lbnQubm9kZU5hbWV9LSR7c3VmZml4fWA7XG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKTtcbiAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVsZW1lbnQgd2l0aCBhIG5ldyB0YWcgbmFtZSBhbmQgY29weSBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpIHtcbiAgY29uc3QgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnTmFtZSk7XG4gIC8vIENvcHkgYXR0cmlidXRlc1xuICBmb3IgKGNvbnN0IGF0dHIgb2YgZWxlbWVudC5hdHRyaWJ1dGVzKSB7XG4gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgfVxuICAvLyBDb3B5IGNoaWxkIG5vZGVzXG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVtc0Zyb21UZXN0KHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIGNvbnN0IGl0ZW1zOiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXSA9IFtdO1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzZXNzbWVudC1pdGVtLXJlZicpLmZvckVhY2goZWwgPT4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBocmVmID0gZWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2NhdGVnb3J5Jyk7XG4gICAgaXRlbXMucHVzaCh7IGlkZW50aWZpZXIsIGhyZWYsIGNhdGVnb3J5IH0pO1xuICB9KTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG5sZXQgY3VycmVudFJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkWE1MKHVybCwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpIHtcbiAgaWYgKGNhbmNlbFByZXZpb3VzUmVxdWVzdCAmJiBjdXJyZW50UmVxdWVzdCAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRSZXF1ZXN0LmFib3J0KCk7IC8vIEFib3J0IHRoZSBvbmdvaW5nIHJlcXVlc3QgaWYgdGhlcmUgaXMgb25lXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2U8WE1MRG9jdW1lbnQgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgY3VycmVudFJlcXVlc3QgPSB4aHI7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHJlcXVlc3RcblxuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnO1xuXG4gICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIHJlc29sdmUoeGhyLnJlc3BvbnNlWE1MKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICB9O1xuXG4gICAgeGhyLnNlbmQoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTCh4bWxEb2N1bWVudDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgeG1sRnJhZ21lbnQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbERvY3VtZW50LCAndGV4dC94bWwnKTtcbiAgcmV0dXJuIHhtbEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9IVE1MKHhtbEZyYWdtZW50OiBEb2N1bWVudCk6IERvY3VtZW50RnJhZ21lbnQge1xuICBjb25zdCBwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3NvcigpO1xuICBjb25zdCB4c2x0RG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbFRvSFRNTCwgJ3RleHQveG1sJyk7XG4gIHByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHhzbHREb2N1bWVudCk7XG4gIGNvbnN0IGl0ZW1IVE1MRnJhZ21lbnQgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9GcmFnbWVudCh4bWxGcmFnbWVudCwgZG9jdW1lbnQpO1xuICByZXR1cm4gaXRlbUhUTUxGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvY2F0aW9uKHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50LCBsb2NhdGlvbjogc3RyaW5nKSB7XG4gIGlmICghbG9jYXRpb24uZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvY2F0aW9uICs9ICcvJztcbiAgfVxuXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzcmNdLFtocmVmXSxbcHJpbWFyeS1wYXRoXScpLmZvckVhY2goZWxXaXRoU3JjID0+IHtcbiAgICBsZXQgYXR0cjogJ3NyYycgfCAnaHJlZicgfCAncHJpbWFyeS1wYXRoJyB8ICcnID0gJyc7XG5cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnc3JjJykpIHtcbiAgICAgIGF0dHIgPSAnc3JjJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgYXR0ciA9ICdocmVmJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpKSB7XG4gICAgICBhdHRyID0gJ3ByaW1hcnktcGF0aCc7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoYXR0cik/LnRyaW0oKTtcblxuICAgIGlmICghYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIWF0dHJWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgIGNvbnN0IG5ld1NyY1ZhbHVlID0gbG9jYXRpb24gKyBlbmNvZGVVUkkoYXR0clZhbHVlKTtcbiAgICAgIGVsV2l0aFNyYy5zZXRBdHRyaWJ1dGUoYXR0ciwgbmV3U3JjVmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgY2RhdGFFbGVtZW50cyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1jdXN0b20tb3BlcmF0b3JbY2xhc3M9XCJqcy5vcmdcIl0gPiBxdGktYmFzZS12YWx1ZScpO1xuICBjZGF0YUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY29tbWVudFRleHQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KGVsZW1lbnQudGV4dENvbnRlbnQpO1xuICAgIGVsZW1lbnQucmVwbGFjZUNoaWxkKGNvbW1lbnRUZXh0LCBlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwU3R5bGVTaGVldHMoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgLy8gcmVtb3ZlIHF0aS1zdHlsZXNoZWV0IHRhZ1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3R5bGVzaGVldCcpLmZvckVhY2goc3R5bGVzaGVldCA9PiBzdHlsZXNoZWV0LnJlbW92ZSgpKTtcbn1cbiIsICIvKipcbiAqIEJyb3dzZXIgYmFzZWQgUVRJLVhNTCB0byBIVE1MIHRyYW5zZm9ybWVyLlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSwgdHJhbnNmb3JtIGFuZCBzZXJpYWxpemUgUVRJIFhNTCBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdGlUcmFuc2Zvcm1lciA9IHF0aVRyYW5zZm9ybUl0ZW0oKTtcbiAqIGF3YWl0IHF0aVRyYW5zZm9ybWVyLmxvYWQoJ3BhdGgvdG8veG1sL2ZpbGUueG1sJyk7XG4gKiBxdGlUcmFuc2Zvcm1lci5wYXRoKCcvYXNzZXNzbWVudEl0ZW0vaXRlbUJvZHknKTtcbiAqIGNvbnN0IGh0bWwgPSBxdGlUcmFuc2Zvcm1lci5odG1sKCk7XG4gKiBjb25zdCB4bWwgPSBxdGlUcmFuc2Zvcm1lci54bWwoKTtcbiAqIGNvbnN0IGh0bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci5odG1sZG9jKCk7XG4gKiBjb25zdCB4bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci54bWxkb2MoKTtcbiAqXG4gKiBxdGlUcmFuc2Zvcm1JdGVtKCkucGFyc2Uoc3RvcnlYTUwpLmh0bWwoKVxuICovXG5cbmltcG9ydCB7XG4gIGNvbnZlcnRDREFUQXRvQ29tbWVudCxcbiAgZXh0ZW5kRWxlbWVudE5hbWUsXG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzLFxuICBsb2FkWE1MLFxuICBwYXJzZVhNTCxcbiAgc2V0TG9jYXRpb24sXG4gIHN0cmlwU3R5bGVTaGVldHMsXG4gIHRvSFRNTFxufSBmcm9tICcuL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG5leHBvcnQgdHlwZSB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICBsb2FkOiAodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdD86IGJvb2xlYW4pID0+IFByb21pc2U8dHJhbnNmb3JtSXRlbUFwaT47XG4gIHBhcnNlOiAoeG1sU3RyaW5nOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBwY2lIb29rczogKHVyaTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50TmFtZTogKGVsZW1lbnROYW1lOiBzdHJpbmcsIGV4dGVuZDogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50c1dpdGhDbGFzczogKHBhcmFtPzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjdXN0b21JbnRlcmFjdGlvbjogKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgY29udmVydENEQVRBdG9Db21tZW50OiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBzdHJpcFN0eWxlU2hlZXRzOiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gIHhtbDogKCkgPT4gc3RyaW5nO1xuICBodG1sRG9jOiAoKSA9PiBEb2N1bWVudEZyYWdtZW50O1xuICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IHF0aVRyYW5zZm9ybUl0ZW0gPSAoKSA9PiB7XG4gIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG5cbiAgY29uc3QgYXBpOiB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICAgIGFzeW5jIGxvYWQodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdCA9IGZhbHNlKTogUHJvbWlzZTx0eXBlb2YgYXBpPiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dHlwZW9mIGFwaT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsb2FkWE1MKHVyaSwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0KS50aGVuKHhtbCA9PiB7XG4gICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgLy8gc2V0IHRoZSBiYXNlIHBhdGggZm9yIGltYWdlcyBhbmQgb3RoZXIgcmVzb3VyY2VzLFxuICAgICAgICAgIC8vIHlvdSBwcm9iYWJseSB3YW50IHRvIHNldCB0aGUgYmFzZSBwYXRoIHRvIHRoZSBkb2N1bWVudCByb290IGVsc2UgeW91IGNhbiB1c2UgdGhlIHBhdGggbWV0aG9kIHRvIHNldCBpdFxuICAgICAgICAgIGFwaS5wYXRoKHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIHhtbEZyYWdtZW50ID0gcGFyc2VYTUwoeG1sU3RyaW5nKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBwYXRoOiAobG9jYXRpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQsIGxvY2F0aW9uKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBmbihmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCk6IHR5cGVvZiBhcGkge1xuICAgICAgZm4oeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBjaUhvb2tzKHVyaTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gWydob29rJywgJ21vZHVsZSddO1xuICAgICAgY29uc3QgZG9jdW1lbnRQYXRoID0gdXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IHNyY0F0dHJpYnV0ZXMgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGF0dHJpYnV0ZSArICddJyk7XG4gICAgICAgIHNyY0F0dHJpYnV0ZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBjb25zdCBzcmNWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkhO1xuICAgICAgICAgIGlmICghc3JjVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhc3JjVmFsdWUuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgICAvLyBKdXN0IHBhc3RlIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBzcmMgbG9jYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50cm9vdFBhdGhcbiAgICAgICAgICAgIC8vIG9sZCBwY2lzIGNhbiBoYXZlIGEgLmpzLCBuZXcgcGNpJ3MgZG9uJ3RcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdiYXNlLXVybCcsIHVyaSk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ21vZHVsZScsXG4gICAgICAgICAgICAgIGRvY3VtZW50UGF0aCArICcvJyArIGVuY29kZVVSSShzcmNWYWx1ZSArIChzcmNWYWx1ZS5lbmRzV2l0aCgnLmpzJykgPyAnJyA6ICcuanMnKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBleHRlbmRFbGVtZW50TmFtZTogKHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnROYW1lKHhtbEZyYWdtZW50LCB0YWdOYW1lLCBleHRlbnNpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW06IHN0cmluZyA9ICdleHRlbmQnKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyh4bWxGcmFnbWVudCwgcGFyYW0pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGN1c3RvbUludGVyYWN0aW9uKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgY29uc3QgcXRpQ3VzdG9tSW50ZXJhY3Rpb24gPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdxdGktY3VzdG9tLWludGVyYWN0aW9uJyk7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCA9IHF0aUN1c3RvbUludGVyYWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS1yZWYnLCBiYXNlUmVmKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLWl0ZW0nLCBiYXNlUmVmICsgYmFzZUl0ZW0pO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdkYXRhJykpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCd3aWR0aCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnd2lkdGgnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5yZW1vdmVDaGlsZChxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY29udmVydENEQVRBdG9Db21tZW50KCk6IHR5cGVvZiBhcGkge1xuICAgICAgY29udmVydENEQVRBdG9Db21tZW50KHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBzdHJpcFN0eWxlU2hlZXRzKCk6IHR5cGVvZiBhcGkge1xuICAgICAgc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgaHRtbCgpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgIH0sXG4gICAgeG1sKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICBodG1sRG9jKCkge1xuICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICB4bWxEb2MoKTogWE1MRG9jdW1lbnQge1xuICAgICAgcmV0dXJuIHhtbEZyYWdtZW50OyAvLyBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBhcGk7XG59O1xuIiwgImltcG9ydCB7IGxvYWRYTUwsIHBhcnNlWE1MIH0gZnJvbSBcIi4vcXRpLXRyYW5zZm9ybWVyc1wiO1xuXG5leHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtTWFuaWZlc3QgPSAoKToge1xuICAgIGxvYWQ6ICh1cmk6IHN0cmluZykgPT4gUHJvbWlzZTx0eXBlb2YgYXBpPjtcbiAgICBhc3Nlc3NtZW50VGVzdDogKCkgPT4geyBocmVmOiBzdHJpbmc7IGlkZW50aWZpZXI6IHN0cmluZyB9O1xuICB9ID0+IHtcbiAgICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuICBcbiAgICBjb25zdCBhcGkgPSB7XG4gICAgICBhc3luYyBsb2FkKHVyaSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dHlwZW9mIGFwaT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGxvYWRYTUwodXJpKS50aGVuKHhtbCA9PiB7XG4gICAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHBhcnNlKHhtbFN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIHhtbEZyYWdtZW50ID0gcGFyc2VYTUwoeG1sU3RyaW5nKTtcbiAgICAgIH0sXG4gICAgICBhc3Nlc3NtZW50VGVzdCgpIHtcbiAgICAgICAgY29uc3QgZWwgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdyZXNvdXJjZVt0eXBlPVwiaW1zcXRpX3Rlc3RfeG1sdjNwMFwiXScpO1xuICAgICAgICByZXR1cm4geyBocmVmOiBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSwgaWRlbnRpZmllcjogZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhcGk7XG4gIH07IiwgIlxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UgYW5kIHRyYW5zZm9ybSBRVEkgdGVzdHMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlIGFuZCB0cmFuc2Zvcm0gUVRJIHRlc3RzLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHF0aVRyYW5zZm9ybWVyID0gcXRpVHJhbnNmb3JtVGVzdCgpO1xuICogYXdhaXQgcXRpVHJhbnNmb3JtZXIubG9hZCgnaHR0cHM6Ly9leGFtcGxlLmNvbS90ZXN0LnhtbCcpO1xuICogY29uc3QgaXRlbXMgPSBxdGlUcmFuc2Zvcm1lci5pdGVtcygpO1xuICogY29uc3QgaHRtbCA9IHF0aVRyYW5zZm9ybWVyLmh0bWwoKTtcbiAqIGNvbnN0IHhtbCA9IHF0aVRyYW5zZm9ybWVyLnhtbCgpO1xuICovXG5cbmltcG9ydCB7IGl0ZW1zRnJvbVRlc3QsIGxvYWRYTUwsIHBhcnNlWE1MLCB0b0hUTUwgfSBmcm9tIFwiLi9xdGktdHJhbnNmb3JtZXJzXCI7XG5cbmV4cG9ydCB0eXBlIHRyYW5zZm9ybVRlc3RBcGkgPSB7XG4gICAgbG9hZDogKHVyaTogc3RyaW5nKSA9PiBQcm9taXNlPHRyYW5zZm9ybVRlc3RBcGk+O1xuICAgIHBhcnNlOiAoeG1sU3RyaW5nOiBzdHJpbmcpID0+IHRyYW5zZm9ybVRlc3RBcGk7XG4gICAgZm46IChmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCkgPT4gdHJhbnNmb3JtVGVzdEFwaTtcbiAgICBpdGVtczogKCkgPT4geyBpZGVudGlmaWVyOiBzdHJpbmc7IGhyZWY6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZyB9W107XG4gICAgaHRtbDogKCkgPT4gc3RyaW5nO1xuICAgIHhtbDogKCkgPT4gc3RyaW5nO1xuICAgIGh0bWxEb2M6ICgpID0+IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgeG1sRG9jOiAoKSA9PiBYTUxEb2N1bWVudDtcbiAgfVxuICBcbiAgZXhwb3J0IGNvbnN0IHF0aVRyYW5zZm9ybVRlc3QgPSAoKTogdHJhbnNmb3JtVGVzdEFwaSA9PiB7XG4gICAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcbiAgXG4gICAgY29uc3QgYXBpOnRyYW5zZm9ybVRlc3RBcGkgPSB7XG4gICAgICBhc3luYyBsb2FkKHVyaSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dHJhbnNmb3JtVGVzdEFwaT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGxvYWRYTUwodXJpKS50aGVuKHhtbCA9PiB7XG4gICAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHBhcnNlKHhtbFN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIHhtbEZyYWdtZW50ID0gcGFyc2VYTUwoeG1sU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG4gICAgICBmbihmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCkge1xuICAgICAgICBmbih4bWxGcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuICAgICAgaXRlbXMoKSB7XG4gICAgICAgIHJldHVybiBpdGVtc0Zyb21UZXN0KHhtbEZyYWdtZW50KTtcbiAgICAgIH0sXG4gICAgICBodG1sKCkge1xuICAgICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0b0hUTUwoeG1sRnJhZ21lbnQpKTtcbiAgICAgIH0sXG4gICAgICB4bWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgICAgfSxcbiAgICAgIGh0bWxEb2MoKSB7XG4gICAgICAgIHJldHVybiB0b0hUTUwoeG1sRnJhZ21lbnQpO1xuICAgICAgfSxcbiAgICAgIHhtbERvYygpOiBYTUxEb2N1bWVudCB7XG4gICAgICAgIHJldHVybiB4bWxGcmFnbWVudDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhcGk7XG4gIH07IiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1JdGVtIH0gZnJvbSAnLi4vLi4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGN1c3RvbSBlbGVtZW50IGZvciByZWZlcmVuY2luZyBhbiBhc3Nlc3NtZW50IHN0aW11bHVzLlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJylcbmV4cG9ydCBjbGFzcyBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWYgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBocmVmIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBocmVmID0gJyc7XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBET00uXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyBpZiB0aGUgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnIGV2ZW50IGlzIG5vdCBwcmV2ZW50ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJywgeyBjYW5jZWxhYmxlOiB0cnVlLCBidWJibGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGlzUHJldmVudGVkID0gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc1ByZXZlbnRlZCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpO1xuXG4gICAgICBjb25zdCBzdGltdWx1c1JlZiA9IGl0ZW0ucXVlcnlTZWxlY3RvcihgW2RhdGEtc3RpbXVsdXMtaWRyZWY9JHt0aGlzLmlkZW50aWZpZXJ9XWApO1xuICAgICAgaWYgKHN0aW11bHVzUmVmKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3RpbXVsdXNSZWYoc3RpbXVsdXNSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTdGltdWx1cyB3aXRoIGRhdGEtc3RpbXVsdXMtaWRyZWYgJHt0aGlzLmlkZW50aWZpZXJ9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgKiBAcGFyYW0gc3RpbXVsdXNSZWYgLSBUaGUgZWxlbWVudCB0byB3aGljaCB0aGUgc3RpbXVsdXMgd2lsbCBiZSBhcHBlbmRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZjogRWxlbWVudCkge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmhyZWYuc3Vic3RyaW5nKDAsIHRoaXMuaHJlZi5sYXN0SW5kZXhPZignLycpKTtcbiAgICBjb25zdCBzdGltdWx1cyA9IGF3YWl0IHF0aVRyYW5zZm9ybUl0ZW0oKVxuICAgICAgLmxvYWQodGhpcy5ocmVmKVxuICAgICAgLnRoZW4oYXBpID0+IGFwaS5odG1sRG9jKCkpO1xuICAgIGlmIChzdGltdWx1cykge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBzdGltdWx1cy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3RpbXVsdXMtYm9keSwgcXRpLXN0eWxlc2hlZXQnKTtcbiAgICAgIHN0aW11bHVzUmVmLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3RpbXVsdXNSZWYuYXBwZW5kKC4uLmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJzogUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlciwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydGVyIHRvIGhhbmRsZSBib29sZWFuIGF0dHJpYnV0ZXMgZm9yIEFSSUEgcHJvcGVydGllcyxcbiAqIGVuc3VyaW5nIHRoZXkgYXJlIHNldCBhcyAndHJ1ZScgb3IgJ2ZhbHNlJyBzdHJpbmdzLlxuICovXG5jb25zdCBhcmlhQm9vbGVhbkNvbnZlcnRlcjogQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxib29sZWFuLCBib29sZWFuPiA9IHtcbiAgdG9BdHRyaWJ1dGU6ICh2YWx1ZTogYm9vbGVhbikgPT4gKHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJyksXG4gIGZyb21BdHRyaWJ1dGU6ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdmFsdWUgPT09ICd0cnVlJ1xufTtcblxuLyoqXG4gKiBBIG1peGluIHRoYXQgYWRkcyBjaG9pY2UgZnVuY3Rpb25hbGl0eSB0byBhIExpdEVsZW1lbnQtYmFzZWQgY2xhc3MuXG4gKiBJdCBkaXNwYXRjaGVzIGV2ZW50cyB3aXRoIGEgY3VzdG9tIGB0eXBlYCBhbmQgaGFuZGxlcyBzZWxlY3Rpb24gbG9naWMuXG4gKlxuICogQHBhcmFtIEJhc2UgLSBUaGUgYmFzZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjaG9pY2UsIHVzZWQgaW4gZXZlbnQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIG5ldyBjbGFzcyBleHRlbmRpbmcgdGhlIGJhc2UgY2xhc3Mgd2l0aCBjaG9pY2UgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2Uge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHRhYkluZGV4OiBudW1iZXI7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICByZWFkb25seTogYm9vbGVhbjtcbiAgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBBY3RpdmVFbGVtZW50TWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihCYXNlOiBULCB0eXBlOiBzdHJpbmcpIHtcbiAgYWJzdHJhY3QgY2xhc3MgUXRpQ2hvaWNlIGV4dGVuZHMgQmFzZSB7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGlkZW50aWZpZXIgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAndGFiaW5kZXgnIH0pXG4gICAgcHVibGljIHRhYkluZGV4ID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZTogJ2FyaWEtZGlzYWJsZWQnLFxuICAgICAgY29udmVydGVyOiBhcmlhQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLXJlYWRvbmx5JyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyByZWFkb25seSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgaGFuZGxlRGlzYWJsZWRDaGFuZ2UoX29sZFZhbHVlOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgdGhpcy50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYmx1cigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9vbktleVVwKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHJlZ2lzdGVyLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudChgdW5yZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgaWYgKGV2ZW50LmFsdEtleSkgcmV0dXJuO1xuXG4gICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX29uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FjdGl2YXRlKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9PihgYWN0aXZhdGUtJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFF0aUNob2ljZSBhcyBDb25zdHJ1Y3RvcjxBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2U+ICYgVDtcbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWl0ZW0tYm9keS5zdHlsZXMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1pdGVtLWJvZHkgbm9kZSBjb250YWlucyB0aGUgdGV4dCwgZ3JhcGhpY3MsIG1lZGlhIG9iamVjdHMgYW5kIGludGVyYWN0aW9ucyB0aGF0IGRlc2NyaWJlIHRoZSBpdGVtJ3MgY29udGVudCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IGl0IGlzIHN0cnVjdHVyZWQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnNwaHBvNmx1NnpxaVxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAc2xvdCAtIGl0ZW0gYm9keSBjb250ZW50LlxuICogQHNsb3QgcXRpLXJ1YnJpYy1ibG9jayAtIHRoZSBxdGkgcnVicmljIGJsb2NrIGlzIHBsYWNlZCBhYm92ZSB0aGUgaXRlbVxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pdGVtLWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUl0ZW1Cb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicXRpLXJ1YnJpYy1ibG9ja1wiPjwvc2xvdD48c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbS1ib2R5JzogUXRpSXRlbUJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXByb21wdCcpXG5leHBvcnQgY2xhc3MgUXRpUHJvbXB0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIGlmIHByb21wdHMgYXJlIGluIGludGVyYWN0aW9ucyB0aGV5IHNob3VsZCBoYXZlIGEgc2xvdCwgc28gdGhlIHByb21wdCBoYXMgdG8gZ28gdGhlcmVcbiAgICAvLyBpZiBwcm9tcHQgaXMgaW4gdGhlIGJvZHksIHRoZW4ganVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgdGhlcmUuXG4gICAgLy8gQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUgdGhlIGxhdHRlciwgYnV0IG5vdCBjYW4ndCBnZXQgdGhyb3VnaCB0aGUgc2hhZG93cm9vdCB0byBmaW5kIHRoZSBzbG90XG4gICAgY29uc3QgaW5JbnRlcmFjdGlvbiA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lLmVuZHNXaXRoKCdJTlRFUkFDVElPTicpO1xuICAgIGlmIChpbkludGVyYWN0aW9uKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdwcm9tcHQnKTtcbiAgICB9XG4gICAgLy8gY29uc3QgcHJvbXB0U2xvdCA9IHRoaXMucGFyZW50RWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJbbmFtZT0ncHJvbXB0J11cIik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXByb21wdCc6IFF0aVByb21wdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zdHlsZXNoZWV0JylcbmV4cG9ydCBjbGFzcyBRdGlTdHlsZXNoZWV0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHByaXZhdGUgc3R5bGVFbGVtZW50OiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgaWYgKGxpbmsgIT09IG51bGwpIHtcbiAgICAgIC8vIEZldGNoIHRoZSBzdHlsZXNoZWV0IGNvbnRlbnRcbiAgICAgIGZldGNoKGxpbmspXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgLnRoZW4oY3NzQ29udGVudCA9PiB7XG4gICAgICAgICAgLy8gTWluaWZ5IHRoZSBDU1MgY29udGVudCBieSByZW1vdmluZyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50c1xuICAgICAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSA8c3R5bGU+IGVsZW1lbnQgd2l0aCBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIENTU1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gYEBzY29wZSB7JHttaW5pZmllZENzc319YDtcblxuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHBhcmVudCBlbGVtZW50IHRvIGFwcGVuZCB0aGUgc2NvcGVkIHN0eWxlc2hlZXQgdG8uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHN0eWxlc2hlZXQ6JywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXh0Q29udGVudCAhPT0gbnVsbCAmJiB0aGlzLnRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIC8vIE1pbmlmeSB0aGUgaW5saW5lIENTUyBjb250ZW50XG4gICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKHRoaXMudGV4dENvbnRlbnQpO1xuXG4gICAgICAvLyBEaXJlY3RseSBjcmVhdGUgYSA8c3R5bGU+IGVsZW1lbnQgd2l0aCB0aGUgQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBpbmxpbmUgc3R5bGVzXG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBgQHNjb3BlIHske21pbmlmaWVkQ3NzfX1gO1xuXG4gICAgICAvLyBBcHBlbmQgdGhlIHN0eWxlIGVsZW1lbnQgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50XG4gICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ05vIHBhcmVudCBlbGVtZW50IHRvIGFwcGVuZCB0aGUgc2NvcGVkIHN0eWxlc2hlZXQgdG8uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtaW5pZnlDc3MoY3NzQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgY29tbWVudHMsIHdoaXRlc3BhY2UsIGFuZCBuZXdsaW5lIGNoYXJhY3RlcnNcbiAgICByZXR1cm4gY3NzQ29udGVudFxuICAgICAgLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpIC8vIFJlbW92ZSBjb21tZW50c1xuICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKSAvLyBDb2xsYXBzZSB3aGl0ZXNwYWNlXG4gICAgICAucmVwbGFjZSgvXFxzKihbe306O10pXFxzKi9nLCAnJDEnKSAvLyBSZW1vdmUgc3BhY2VzIGFyb3VuZCB7fSwgOiwgO1xuICAgICAgLnRyaW0oKTsgLy8gVHJpbSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgcmVtb3ZlIHN0eWxlc2hlZXQ6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zdHlsZXNoZWV0JzogUXRpU3R5bGVzaGVldDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWYWx1ZXModmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPikge1xuICAgIGNvbnN0IGh0bWxWYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWRlZmF1bHQtdmFsdWUgPiBxdGktdmFsdWUnKSk7XG5cbiAgICBpZiAoaHRtbFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBodG1sVmFsdWVzLm1hcChuID0+IG4uaW5uZXJIVE1MLnRyaW0oKSk7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZXMubGVuZ3RoID4gMSB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlcztcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNbMF07XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nOiBRdGlWYXJpYWJsZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2V4dGVybmFsLXNjb3JlZCcgfSkgZXh0ZXJuYWxTY29yZWQ6ICdodW1hbicgfCAnZXh0ZXJuYWxNYWNoaW5lJyB8IG51bGwgPSBudWxsO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBnZXQgaW50ZXJwb2xhdGlvblRhYmxlKCk6IE1hcDxudW1iZXIsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVycG9sYXRpb24tdGFibGUnKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpKSB7XG4gICAgICAgIGlmICghZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBtaXNzaW5nIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKTtcbiAgICAgICAgaWYgKGlzTmFOKHNvdXJjZVZhbHVlKSB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG5vdCBhIG51bWJlciBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KHNvdXJjZVZhbHVlLCB0YXJnZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGU6IE91dGNvbWVWYXJpYWJsZSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5LFxuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICB0eXBlOiAnb3V0Y29tZScsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGludGVycG9sYXRpb25UYWJsZTogdGhpcy5pbnRlcnBvbGF0aW9uVGFibGUsXG4gICAgICBleHRlcm5hbFNjb3JlZDogdGhpcy5leHRlcm5hbFNjb3JlZFxuICAgIH07XG4gICAgb3V0Y29tZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKG91dGNvbWVWYXJpYWJsZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IG91dGNvbWVWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nOiBRdGlPdXRjb21lRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU1hcHBpbmcgfSBmcm9tICcuLi8uLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZyc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0ge1xuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IHRoaXMuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHkgfHwgJ3NpbmdsZScsXG4gICAgICBtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICBjYW5kaWRhdGVSZXNwb25zZTogbnVsbFxuICAgIH07XG4gICAgcmVzcG9uc2VWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhyZXNwb25zZVZhcmlhYmxlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiByZXNwb25zZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgY29uc3QgY29ycmVjdFJlc3BvbnNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktY29ycmVjdC1yZXNwb25zZScpO1xuICAgIGlmIChjb3JyZWN0UmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNvcnJlY3RSZXNwb25zZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktdmFsdWUnKTtcbiAgICAgIGlmICh0aGlzLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF0udGV4dENvbnRlbnQ7XG4gICAgICAgIHZhbHVlc1swXS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVzW2ldLnRleHRDb250ZW50KTtcbiAgICAgICAgICB2YWx1ZXNbaV0ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG1hcHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcigncXRpLW1hcHBpbmcnKSBhcyBRdGlNYXBwaW5nO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic6IFF0aVJlc3BvbnNlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJylcbmV4cG9ydCBjbGFzcyBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8vIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gIC8vICAgc2xvdCB7XG4gIC8vICAgICBkaXNwbGF5OiBoaWRkZW47XG4gIC8vICAgfVxuICAvLyBgO1xuICAvLyBvdmVycmlkZSByZW5kZXIoKSB7XG4gIC8vICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgLy8gfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJzogUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbztcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb250ZW50LWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUNvbnRlbnRCb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbnRlbnQtYm9keSc6IFF0aUNvbnRlbnRCb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWJyaWMtYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aVJ1YnJpY0Jsb2NrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBvdmVycmlkZSBpZDsgLy8gPVwicXRpQXNwZWN0SW5ob3VkUnVicmljQmxvY2tcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB1c2U6ICdpbnN0cnVjdGlvbnMnIHwgJ3Njb3JpbmcnIHwgJ25hdmlnYXRpb24nOyAvLyAgPSBcInNjb3JpbmdcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB2aWV3OiAnYXV0aG9yJyB8ICdjYW5kaWRhdGUnIHwgJ3Byb2N0b3InIHwgJ3Njb3JlcicgfCAndGVzdENvbnN0cnVjdG9yJyB8ICd0dXRvcic7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gdGhpcy5jbGFzc05hbWVzLnNwbGl0KCcgJyk7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1kaXNjcmV0aW9uYXJ5LXBsYWNlbWVudCc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWlubGluZSc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAnJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGJ5IGRlZmF1bHQgcHV0IHRoaXMgaW4gYSBzbG90IGluIHRoZSBpdGVtLWJvZHlcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1YnJpYy1ibG9jayc6IFF0aVJ1YnJpY0Jsb2NrO1xuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGRlY2ltYWxTZXBhcmF0b3IgPSAoKSA9PiB7XG4gIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoKS5mb3JtYXQoMC4xKS5yZXBsYWNlKC9cXGQvZywgJycpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0ID0gKG51bWJlcjogbnVtYmVyIHwgc3RyaW5nKSA9PiB7XG4gIC8vIGNoZWNrIGlmIHR5cGUgaXMgc3RyaW5nXG4gIGlmICh0eXBlb2YgbnVtYmVyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cbiAgY29uc3QgZFNlcCA9IGRlY2ltYWxTZXBhcmF0b3IoKTtcbiAgaWYgKGRTZXAgPT09ICcuJykge1xuICAgIHJldHVybiBudW1iZXIudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKGRTZXAsICcuJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBJc051bGxPclVuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJc051bGxPclVuZGVmaW5lZCB9IGZyb20gJy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IGl0ZW1Db250ZXh0LCBJdGVtQ29udGV4dCB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUZlZWRiYWNrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnc2hvdy1oaWRlJyB9KVxuICBwcm90ZWN0ZWQgc2hvd0hpZGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ291dGNvbWUtaWRlbnRpZmllcicgfSlcbiAgcHVibGljIG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHByb3RlY3RlZCBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzaG93U3RhdHVzOiBzdHJpbmc7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8UXRpRmVlZGJhY2s+KCdxdGktcmVnaXN0ZXItZmVlZGJhY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1Nob3dGZWVkYmFjayhvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nKSB7ICAgIFxuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IG91dGNvbWVJZGVudGlmaWVyKSB8fCBudWxsOztcblxuICAgIGlmICh0aGlzLm91dGNvbWVJZGVudGlmaWVyICE9PSBvdXRjb21lSWRlbnRpZmllciB8fCAhb3V0Y29tZVZhcmlhYmxlKSByZXR1cm47XG4gICAgbGV0IGlzRm91bmQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRjb21lVmFyaWFibGUudmFsdWUpKSB7XG4gICAgICBpc0ZvdW5kID0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlLmluY2x1ZGVzKHRoaXMuaWRlbnRpZmllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRm91bmQgPVxuICAgICAgICAoIUlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAhSXNOdWxsT3JVbmRlZmluZWQob3V0Y29tZVZhcmlhYmxlPy52YWx1ZSkgJiZcbiAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPT09IG91dGNvbWVWYXJpYWJsZS52YWx1ZSkgfHxcbiAgICAgICAgZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93RmVlZGJhY2soaXNGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dGZWVkYmFjayh2YWx1ZTogYm9vbGVhbikgeyAgICBcbiAgICB0aGlzLnNob3dTdGF0dXMgPSAodmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ3Nob3cnKSB8fCAoIXZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdoaWRlJykgPyAnb24nIDogJ29mZic7ICAgIFxuICB9XG59XG4iLCAiaW1wb3J0IHsgUHJvcGVydHlWYWx1ZU1hcCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2stYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrQmxvY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiZmVlZGJhY2sgJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrU2hvd0ZlZWRiYWNrKHRoaXMub3V0Y29tZUlkZW50aWZpZXIpO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2stYmxvY2snOiBRdGlGZWVkYmFja0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2staW5saW5lJylcbmV4cG9ydCBjbGFzcyBRdGlGZWVkYmFja0lubGluZSBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2staW5saW5lJzogUXRpRmVlZGJhY2tJbmxpbmU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tb2RhbC1mZWVkYmFjaycpXG5leHBvcnQgY2xhc3MgUXRpTW9kYWxGZWVkYmFjayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbW9kYWwtZmVlZGJhY2snOiBRdGlNb2RhbEZlZWRiYWNrO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7bm90aGluZ30gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuXG4vKipcbiAqIEZvciBBdHRyaWJ1dGVQYXJ0cywgc2V0cyB0aGUgYXR0cmlidXRlIGlmIHRoZSB2YWx1ZSBpcyBkZWZpbmVkIGFuZCByZW1vdmVzXG4gKiB0aGUgYXR0cmlidXRlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQuXG4gKlxuICogRm9yIG90aGVyIHBhcnQgdHlwZXMsIHRoaXMgZGlyZWN0aXZlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBjb25zdCBpZkRlZmluZWQgPSA8VD4odmFsdWU6IFQpID0+IHZhbHVlID8/IG5vdGhpbmc7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBJSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgZm9ybUFzc29jaWF0ZWQgPSB0cnVlOyAvLyBFbmFibGUgZm9ybSBhc3NvY2lhdGlvblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllciA9ICcnO1xuICAvKiogZGlzYWJsZWQgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiByZWFkb25seSBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIF9jb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG4gIHByb3RlY3RlZCBfaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgfVxuXG4gIGFic3RyYWN0IHZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMucmVwb3J0VmFsaWRpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW107XG4gIGFic3RyYWN0IHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKTtcblxuICBwdWJsaWMgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgfVxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgcmVzcG9uc2U6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcm93cyA9IDU7XG5cbiAgLyoqIGV4cGVjdGVkIGxlbmd0aCBpcyBtYXBwZWQgdG8gdGhlIHByb3BlcnR5IG1heGxlbmd0aCBvbiB0aGUgdGV4dGFyZWEgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgLyoqIHRleHQgYXBwZWFyaW5nIGluIHRoZSBleHRlbmRlZC10ZXh0LW50ZXJhY3Rpb24gaWYgaXQgaXMgZW1wdHkgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJylcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgbGV0IHJvd3NTZXQgPSBmYWxzZTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1oZWlnaHQtbGluZXMtJykpIHtcbiAgICAgICAgY29uc3QgbnJSb3dzID0gY2xhc3NOYW1lLnJlcGxhY2UoJ3F0aS1oZWlnaHQtbGluZXMtJywgJycpO1xuICAgICAgICB0aGlzLl9yb3dzID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgICAgcm93c1NldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gSWYgbm8gcXRpLWhlaWdodC1saW5lcyBjbGFzcyBpcyBzZXQsIGNhbGN1bGF0ZSByb3dzIGJhc2VkIG9uIGV4cGVjdGVkTGVuZ3RoXG4gICAgaWYgKCFyb3dzU2V0ICYmIHRoaXMuZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVzdGltYXRlZFJvd3MgPSBNYXRoLmNlaWwodGhpcy5leHBlY3RlZExlbmd0aCAvIDUwKTsgLy8gICc1MCcgYmFzZWQgb24gYW4gZXN0aW1hdGUgZm9yIGNoYXJhY3RlcnMgcGVyIHJvd1xuICAgICAgdGhpcy5fcm93cyA9IGVzdGltYXRlZFJvd3M7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgdmFsKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaW5pdGlhbGx5XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgY29uc3QgcGF0dGVyblNvdXJjZSA9XG4gICAgICAgIHRoaXMucGF0dGVybk1hc2suc3RhcnRzV2l0aCgnXicpICYmIHRoaXMucGF0dGVybk1hc2suZW5kc1dpdGgoJyQnKSA/IHRoaXMucGF0dGVybk1hc2sgOiBgXiR7dGhpcy5wYXR0ZXJuTWFza30kYDtcblxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVyblNvdXJjZSk7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpICYmIHBhdHRlcm4udGVzdCh0ZXh0YXJlYS52YWx1ZSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRleHRhcmVhLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgLyogUEs6IGRpc3BsYXkgaG9zdCBhcyBibG9jaywgZWxzZSBkZXNpZ24gd2lsbCBiZSBjb2xsYXBzZWQgKi9cbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHRleHRhcmVhIHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3RcbiAgICAgID48dGV4dGFyZWFcbiAgICAgICAgcGFydD1cInRleHRhcmVhXCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgbWF4bGVuZ3RoPVwiJHs1MDAwfVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgcm93cz1cIiR7dGhpcy5fcm93c31cIlxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAgIC52YWx1ZT0ke3RoaXMuX3ZhbHVlfVxuICAgICAgPjwvdGV4dGFyZWE+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic6IFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7XG4gIF8kTEgsXG4gIFBhcnQsXG4gIERpcmVjdGl2ZVBhcmVudCxcbiAgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCxcbiAgTWF5YmVDb21waWxlZFRlbXBsYXRlUmVzdWx0LFxuICBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG59IGZyb20gJy4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlUmVzdWx0LFxuICBEaXJlY3RpdmVDbGFzcyxcbiAgUGFydEluZm8sXG4gIEF0dHJpYnV0ZVBhcnRJbmZvLFxufSBmcm9tICcuL2RpcmVjdGl2ZS5qcyc7XG50eXBlIFByaW1pdGl2ZSA9IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgc3ltYm9sIHwgYmlnaW50O1xuXG5jb25zdCB7X0NoaWxkUGFydDogQ2hpbGRQYXJ0fSA9IF8kTEg7XG5cbnR5cGUgQ2hpbGRQYXJ0ID0gSW5zdGFuY2VUeXBlPHR5cGVvZiBDaGlsZFBhcnQ+O1xuXG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5cbmNvbnN0IHdyYXAgPVxuICBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCAmJlxuICB3aW5kb3cuU2hhZHlET00/LmluVXNlICYmXG4gIHdpbmRvdy5TaGFkeURPTT8ubm9QYXRjaCA9PT0gdHJ1ZVxuICAgID8gd2luZG93LlNoYWR5RE9NIS53cmFwXG4gICAgOiAobm9kZTogTm9kZSkgPT4gbm9kZTtcblxuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgcHJpbWl0aXZlIHZhbHVlLlxuICpcbiAqIFNlZSBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlb2Ytb3BlcmF0b3JcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlID0+XG4gIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuXG5leHBvcnQgY29uc3QgVGVtcGxhdGVSZXN1bHRUeXBlID0ge1xuICBIVE1MOiAxLFxuICBTVkc6IDIsXG4gIE1BVEhNTDogMyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlUmVzdWx0VHlwZSA9XG4gICh0eXBlb2YgVGVtcGxhdGVSZXN1bHRUeXBlKVtrZXlvZiB0eXBlb2YgVGVtcGxhdGVSZXN1bHRUeXBlXTtcblxudHlwZSBJc1RlbXBsYXRlUmVzdWx0ID0ge1xuICAodmFsOiB1bmtub3duKTogdmFsIGlzIE1heWJlQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdDtcbiAgPFQgZXh0ZW5kcyBUZW1wbGF0ZVJlc3VsdFR5cGU+KFxuICAgIHZhbDogdW5rbm93bixcbiAgICB0eXBlOiBUXG4gICk6IHZhbCBpcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VD47XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBUZW1wbGF0ZVJlc3VsdCBvciBhIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1RlbXBsYXRlUmVzdWx0OiBJc1RlbXBsYXRlUmVzdWx0ID0gKFxuICB2YWx1ZTogdW5rbm93bixcbiAgdHlwZT86IFRlbXBsYXRlUmVzdWx0VHlwZVxuKTogdmFsdWUgaXMgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0ID0+XG4gIHR5cGUgPT09IHVuZGVmaW5lZFxuICAgID8gLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICh2YWx1ZSBhcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpPy5bJ18kbGl0VHlwZSQnXSAhPT0gdW5kZWZpbmVkXG4gICAgOiAodmFsdWUgYXMgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0KT8uWydfJGxpdFR5cGUkJ10gPT09IHR5cGU7XG5cbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0NvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBDb21waWxlZFRlbXBsYXRlUmVzdWx0ID0+IHtcbiAgcmV0dXJuICh2YWx1ZSBhcyBDb21waWxlZFRlbXBsYXRlUmVzdWx0KT8uWydfJGxpdFR5cGUkJ10/LmggIT0gbnVsbDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIERpcmVjdGl2ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGlyZWN0aXZlUmVzdWx0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGlyZWN0aXZlUmVzdWx0ID0+XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICh2YWx1ZSBhcyBEaXJlY3RpdmVSZXN1bHQpPy5bJ18kbGl0RGlyZWN0aXZlJCddICE9PSB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBEaXJlY3RpdmUgY2xhc3MgZm9yIGEgRGlyZWN0aXZlUmVzdWx0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXREaXJlY3RpdmVDbGFzcyA9ICh2YWx1ZTogdW5rbm93bik6IERpcmVjdGl2ZUNsYXNzIHwgdW5kZWZpbmVkID0+XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICh2YWx1ZSBhcyBEaXJlY3RpdmVSZXN1bHQpPy5bJ18kbGl0RGlyZWN0aXZlJCddO1xuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBwYXJ0IGhhcyBvbmx5IGEgc2luZ2xlLWV4cHJlc3Npb24gd2l0aCBubyBzdHJpbmdzIHRvXG4gKiBpbnRlcnBvbGF0ZSBiZXR3ZWVuLlxuICpcbiAqIE9ubHkgQXR0cmlidXRlUGFydCBhbmQgUHJvcGVydHlQYXJ0IGNhbiBoYXZlIG11bHRpcGxlIGV4cHJlc3Npb25zLlxuICogTXVsdGktZXhwcmVzc2lvbiBwYXJ0cyBoYXZlIGEgYHN0cmluZ3NgIHByb3BlcnR5IGFuZCBzaW5nbGUtZXhwcmVzc2lvblxuICogcGFydHMgZG8gbm90LlxuICovXG5leHBvcnQgY29uc3QgaXNTaW5nbGVFeHByZXNzaW9uID0gKHBhcnQ6IFBhcnRJbmZvKSA9PlxuICAocGFydCBhcyBBdHRyaWJ1dGVQYXJ0SW5mbykuc3RyaW5ncyA9PT0gdW5kZWZpbmVkO1xuXG5jb25zdCBjcmVhdGVNYXJrZXIgPSAoKSA9PiBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcblxuLyoqXG4gKiBJbnNlcnRzIGEgQ2hpbGRQYXJ0IGludG8gdGhlIGdpdmVuIGNvbnRhaW5lciBDaGlsZFBhcnQncyBET00sIGVpdGhlciBhdCB0aGVcbiAqIGVuZCBvZiB0aGUgY29udGFpbmVyIENoaWxkUGFydCwgb3IgYmVmb3JlIHRoZSBvcHRpb25hbCBgcmVmUGFydGAuXG4gKlxuICogVGhpcyBkb2VzIG5vdCBhZGQgdGhlIHBhcnQgdG8gdGhlIGNvbnRhaW5lclBhcnQncyBjb21taXR0ZWQgdmFsdWUuIFRoYXQgbXVzdFxuICogYmUgZG9uZSBieSBjYWxsZXJzLlxuICpcbiAqIEBwYXJhbSBjb250YWluZXJQYXJ0IFBhcnQgd2l0aGluIHdoaWNoIHRvIGFkZCB0aGUgbmV3IENoaWxkUGFydFxuICogQHBhcmFtIHJlZlBhcnQgUGFydCBiZWZvcmUgd2hpY2ggdG8gYWRkIHRoZSBuZXcgQ2hpbGRQYXJ0OyB3aGVuIG9taXR0ZWQgdGhlXG4gKiAgICAgcGFydCBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBgY29udGFpbmVyUGFydGBcbiAqIEBwYXJhbSBwYXJ0IFBhcnQgdG8gaW5zZXJ0LCBvciB1bmRlZmluZWQgdG8gY3JlYXRlIGEgbmV3IHBhcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGluc2VydFBhcnQgPSAoXG4gIGNvbnRhaW5lclBhcnQ6IENoaWxkUGFydCxcbiAgcmVmUGFydD86IENoaWxkUGFydCxcbiAgcGFydD86IENoaWxkUGFydFxuKTogQ2hpbGRQYXJ0ID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gd3JhcChjb250YWluZXJQYXJ0Ll8kc3RhcnROb2RlKS5wYXJlbnROb2RlITtcblxuICBjb25zdCByZWZOb2RlID1cbiAgICByZWZQYXJ0ID09PSB1bmRlZmluZWQgPyBjb250YWluZXJQYXJ0Ll8kZW5kTm9kZSA6IHJlZlBhcnQuXyRzdGFydE5vZGU7XG5cbiAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIHJlZk5vZGUpO1xuICAgIGNvbnN0IGVuZE5vZGUgPSB3cmFwKGNvbnRhaW5lcikuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCByZWZOb2RlKTtcbiAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgIHN0YXJ0Tm9kZSxcbiAgICAgIGVuZE5vZGUsXG4gICAgICBjb250YWluZXJQYXJ0LFxuICAgICAgY29udGFpbmVyUGFydC5vcHRpb25zXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlbmROb2RlID0gd3JhcChwYXJ0Ll8kZW5kTm9kZSEpLm5leHRTaWJsaW5nO1xuICAgIGNvbnN0IG9sZFBhcmVudCA9IHBhcnQuXyRwYXJlbnQ7XG4gICAgY29uc3QgcGFyZW50Q2hhbmdlZCA9IG9sZFBhcmVudCAhPT0gY29udGFpbmVyUGFydDtcbiAgICBpZiAocGFyZW50Q2hhbmdlZCkge1xuICAgICAgcGFydC5fJHJlcGFyZW50RGlzY29ubmVjdGFibGVzPy4oY29udGFpbmVyUGFydCk7XG4gICAgICAvLyBOb3RlIHRoYXQgYWx0aG91Z2ggYF8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXNgIHVwZGF0ZXMgdGhlIHBhcnQnc1xuICAgICAgLy8gYF8kcGFyZW50YCByZWZlcmVuY2UgYWZ0ZXIgdW5saW5raW5nIGZyb20gaXRzIGN1cnJlbnQgcGFyZW50LCB0aGF0XG4gICAgICAvLyBtZXRob2Qgb25seSBleGlzdHMgaWYgRGlzY29ubmVjdGFibGVzIGFyZSBwcmVzZW50LCBzbyB3ZSBuZWVkIHRvXG4gICAgICAvLyB1bmNvbmRpdGlvbmFsbHkgc2V0IGl0IGhlcmVcbiAgICAgIHBhcnQuXyRwYXJlbnQgPSBjb250YWluZXJQYXJ0O1xuICAgICAgLy8gU2luY2UgdGhlIF8kaXNDb25uZWN0ZWQgZ2V0dGVyIGlzIHNvbWV3aGF0IGNvc3RseSwgb25seVxuICAgICAgLy8gcmVhZCBpdCBvbmNlIHdlIGtub3cgdGhlIHN1YnRyZWUgaGFzIGRpcmVjdGl2ZXMgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSBub3RpZmllZFxuICAgICAgbGV0IG5ld0Nvbm5lY3Rpb25TdGF0ZTtcbiAgICAgIGlmIChcbiAgICAgICAgcGFydC5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKG5ld0Nvbm5lY3Rpb25TdGF0ZSA9IGNvbnRhaW5lclBhcnQuXyRpc0Nvbm5lY3RlZCkgIT09XG4gICAgICAgICAgb2xkUGFyZW50IS5fJGlzQ29ubmVjdGVkXG4gICAgICApIHtcbiAgICAgICAgcGFydC5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKG5ld0Nvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmROb2RlICE9PSByZWZOb2RlIHx8IHBhcmVudENoYW5nZWQpIHtcbiAgICAgIGxldCBzdGFydDogTm9kZSB8IG51bGwgPSBwYXJ0Ll8kc3RhcnROb2RlO1xuICAgICAgd2hpbGUgKHN0YXJ0ICE9PSBlbmROb2RlKSB7XG4gICAgICAgIGNvbnN0IG46IE5vZGUgfCBudWxsID0gd3JhcChzdGFydCEpLm5leHRTaWJsaW5nO1xuICAgICAgICB3cmFwKGNvbnRhaW5lcikuaW5zZXJ0QmVmb3JlKHN0YXJ0ISwgcmVmTm9kZSk7XG4gICAgICAgIHN0YXJ0ID0gbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydDtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYSBQYXJ0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gc2V0L3VwZGF0ZSB0aGUgdmFsdWUgb2YgdXNlci1jcmVhdGVkXG4gKiBwYXJ0cyAoaS5lLiB0aG9zZSBjcmVhdGVkIHVzaW5nIGBpbnNlcnRQYXJ0YCk7IGl0IHNob3VsZCBub3QgYmUgdXNlZFxuICogYnkgZGlyZWN0aXZlcyB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBkaXJlY3RpdmUncyBjb250YWluZXIgcGFydC4gRGlyZWN0aXZlc1xuICogc2hvdWxkIHJldHVybiBhIHZhbHVlIGZyb20gYHVwZGF0ZWAvYHJlbmRlcmAgdG8gdXBkYXRlIHRoZWlyIHBhcnQgc3RhdGUuXG4gKlxuICogRm9yIGRpcmVjdGl2ZXMgdGhhdCByZXF1aXJlIHNldHRpbmcgdGhlaXIgcGFydCB2YWx1ZSBhc3luY2hyb25vdXNseSwgdGhleVxuICogc2hvdWxkIGV4dGVuZCBgQXN5bmNEaXJlY3RpdmVgIGFuZCBjYWxsIGB0aGlzLnNldFZhbHVlKClgLlxuICpcbiAqIEBwYXJhbSBwYXJ0IFBhcnQgdG8gc2V0XG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0XG4gKiBAcGFyYW0gaW5kZXggRm9yIGBBdHRyaWJ1dGVQYXJ0YHMsIHRoZSBpbmRleCB0byBzZXRcbiAqIEBwYXJhbSBkaXJlY3RpdmVQYXJlbnQgVXNlZCBpbnRlcm5hbGx5OyBzaG91bGQgbm90IGJlIHNldCBieSB1c2VyXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDaGlsZFBhcnRWYWx1ZSA9IDxUIGV4dGVuZHMgQ2hpbGRQYXJ0PihcbiAgcGFydDogVCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGRpcmVjdGl2ZVBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gcGFydFxuKTogVCA9PiB7XG4gIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZSwgZGlyZWN0aXZlUGFyZW50KTtcbiAgcmV0dXJuIHBhcnQ7XG59O1xuXG4vLyBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgY2FuIG5ldmVyIGFwcGVhciBhcyBhIHBhcnQgdmFsdWUgZXhjZXB0IHdoZW4gc2V0IGJ5XG4vLyBsaXZlKCkuIFVzZWQgdG8gZm9yY2UgYSBkaXJ0eS1jaGVjayB0byBmYWlsIGFuZCBjYXVzZSBhIHJlLXJlbmRlci5cbmNvbnN0IFJFU0VUX1ZBTFVFID0ge307XG5cbi8qKlxuICogU2V0cyB0aGUgY29tbWl0dGVkIHZhbHVlIG9mIGEgQ2hpbGRQYXJ0IGRpcmVjdGx5IHdpdGhvdXQgdHJpZ2dlcmluZyB0aGVcbiAqIGNvbW1pdCBzdGFnZSBvZiB0aGUgcGFydC5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSBhIGRpcmVjdGl2ZSBuZWVkcyB0byB1cGRhdGUgdGhlIHBhcnQgc3VjaFxuICogdGhhdCB0aGUgbmV4dCB1cGRhdGUgZGV0ZWN0cyBhIHZhbHVlIGNoYW5nZSBvciBub3QuIFdoZW4gdmFsdWUgaXMgb21pdHRlZCxcbiAqIHRoZSBuZXh0IHVwZGF0ZSB3aWxsIGJlIGd1YXJhbnRlZWQgdG8gYmUgZGV0ZWN0ZWQgYXMgYSBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIHBhcnRcbiAqIEBwYXJhbSB2YWx1ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0Q29tbWl0dGVkVmFsdWUgPSAocGFydDogUGFydCwgdmFsdWU6IHVua25vd24gPSBSRVNFVF9WQUxVRSkgPT5cbiAgKHBhcnQuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21taXR0ZWQgdmFsdWUgb2YgYSBDaGlsZFBhcnQuXG4gKlxuICogVGhlIGNvbW1pdHRlZCB2YWx1ZSBpcyB1c2VkIGZvciBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBlZmZpY2llbnQgdXBkYXRlcyBvZlxuICogdGhlIHBhcnQuIEl0IGNhbiBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgc2V0IGJ5IHRoZSB0ZW1wbGF0ZSBvciBkaXJlY3RpdmUgaW5cbiAqIGNhc2VzIHdoZXJlIHRoZSB0ZW1wbGF0ZSB2YWx1ZSBpcyB0cmFuc2Zvcm1lZCBiZWZvcmUgYmVpbmcgY29tbWl0dGVkLlxuICpcbiAqIC0gYFRlbXBsYXRlUmVzdWx0YHMgYXJlIGNvbW1pdHRlZCBhcyBhIGBUZW1wbGF0ZUluc3RhbmNlYFxuICogLSBJdGVyYWJsZXMgYXJlIGNvbW1pdHRlZCBhcyBgQXJyYXk8Q2hpbGRQYXJ0PmBcbiAqIC0gQWxsIG90aGVyIHR5cGVzIGFyZSBjb21taXR0ZWQgYXMgdGhlIHRlbXBsYXRlIHZhbHVlIG9yIHZhbHVlIHJldHVybmVkIG9yXG4gKiAgIHNldCBieSBhIGRpcmVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0gcGFydFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29tbWl0dGVkVmFsdWUgPSAocGFydDogQ2hpbGRQYXJ0KSA9PiBwYXJ0Ll8kY29tbWl0dGVkVmFsdWU7XG5cbi8qKlxuICogUmVtb3ZlcyBhIENoaWxkUGFydCBmcm9tIHRoZSBET00sIGluY2x1ZGluZyBhbnkgb2YgaXRzIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhcnQgVGhlIFBhcnQgdG8gcmVtb3ZlXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVQYXJ0ID0gKHBhcnQ6IENoaWxkUGFydCkgPT4ge1xuICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/LihmYWxzZSwgdHJ1ZSk7XG4gIGxldCBzdGFydDogQ2hpbGROb2RlIHwgbnVsbCA9IHBhcnQuXyRzdGFydE5vZGU7XG4gIGNvbnN0IGVuZDogQ2hpbGROb2RlIHwgbnVsbCA9IHdyYXAocGFydC5fJGVuZE5vZGUhKS5uZXh0U2libGluZztcbiAgd2hpbGUgKHN0YXJ0ICE9PSBlbmQpIHtcbiAgICBjb25zdCBuOiBDaGlsZE5vZGUgfCBudWxsID0gd3JhcChzdGFydCEpLm5leHRTaWJsaW5nO1xuICAgICh3cmFwKHN0YXJ0ISkgYXMgQ2hpbGROb2RlKS5yZW1vdmUoKTtcbiAgICBzdGFydCA9IG47XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjbGVhclBhcnQgPSAocGFydDogQ2hpbGRQYXJ0KSA9PiB7XG4gIHBhcnQuXyRjbGVhcigpO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtEaXNjb25uZWN0YWJsZSwgUGFydH0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5cbmV4cG9ydCB7XG4gIEF0dHJpYnV0ZVBhcnQsXG4gIEJvb2xlYW5BdHRyaWJ1dGVQYXJ0LFxuICBDaGlsZFBhcnQsXG4gIEVsZW1lbnRQYXJ0LFxuICBFdmVudFBhcnQsXG4gIFBhcnQsXG4gIFByb3BlcnR5UGFydCxcbn0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlQ2xhc3Mge1xuICBuZXcgKHBhcnQ6IFBhcnRJbmZvKTogRGlyZWN0aXZlO1xufVxuXG4vKipcbiAqIFRoaXMgdXRpbGl0eSB0eXBlIGV4dHJhY3RzIHRoZSBzaWduYXR1cmUgb2YgYSBkaXJlY3RpdmUgY2xhc3MncyByZW5kZXIoKVxuICogbWV0aG9kIHNvIHdlIGNhbiB1c2UgaXQgZm9yIHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgZGlyZWN0aXZlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBEaXJlY3RpdmVQYXJhbWV0ZXJzPEMgZXh0ZW5kcyBEaXJlY3RpdmU+ID0gUGFyYW1ldGVyczxDWydyZW5kZXInXT47XG5cbi8qKlxuICogQSBnZW5lcmF0ZWQgZGlyZWN0aXZlIGZ1bmN0aW9uIGRvZXNuJ3QgZXZhbHVhdGUgdGhlIGRpcmVjdGl2ZSwgYnV0IGp1c3RcbiAqIHJldHVybnMgYSBEaXJlY3RpdmVSZXN1bHQgb2JqZWN0IHRoYXQgY2FwdHVyZXMgdGhlIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVSZXN1bHQ8QyBleHRlbmRzIERpcmVjdGl2ZUNsYXNzID0gRGlyZWN0aXZlQ2xhc3M+IHtcbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgWydfJGxpdERpcmVjdGl2ZSQnXTogQztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICB2YWx1ZXM6IERpcmVjdGl2ZVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+Pjtcbn1cblxuZXhwb3J0IGNvbnN0IFBhcnRUeXBlID0ge1xuICBBVFRSSUJVVEU6IDEsXG4gIENISUxEOiAyLFxuICBQUk9QRVJUWTogMyxcbiAgQk9PTEVBTl9BVFRSSUJVVEU6IDQsXG4gIEVWRU5UOiA1LFxuICBFTEVNRU5UOiA2LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUGFydFR5cGUgPSAodHlwZW9mIFBhcnRUeXBlKVtrZXlvZiB0eXBlb2YgUGFydFR5cGVdO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkUGFydEluZm8ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgUGFydFR5cGUuQ0hJTEQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlUGFydEluZm8ge1xuICByZWFkb25seSB0eXBlOlxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLkFUVFJJQlVURVxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLlBST1BFUlRZXG4gICAgfCB0eXBlb2YgUGFydFR5cGUuQk9PTEVBTl9BVFRSSUJVVEVcbiAgICB8IHR5cGVvZiBQYXJ0VHlwZS5FVkVOVDtcbiAgcmVhZG9ubHkgc3RyaW5ncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0YWdOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFBhcnRJbmZvIHtcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIFBhcnRUeXBlLkVMRU1FTlQ7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnQgYSBkaXJlY3RpdmUgaXMgYm91bmQgdG8uXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIHRoYXQgYSBkaXJlY3RpdmUgaXMgYXR0YWNoZWQgdG8gYSB2YWxpZCBwYXJ0LFxuICogc3VjaCBhcyB3aXRoIGRpcmVjdGl2ZSB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgb24gYXR0cmlidXRlIGJpbmRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBQYXJ0SW5mbyA9IENoaWxkUGFydEluZm8gfCBBdHRyaWJ1dGVQYXJ0SW5mbyB8IEVsZW1lbnRQYXJ0SW5mbztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdXNlci1mYWNpbmcgZGlyZWN0aXZlIGZ1bmN0aW9uIGZyb20gYSBEaXJlY3RpdmUgY2xhc3MuIFRoaXNcbiAqIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBkaXJlY3RpdmUncyByZW5kZXIoKSBtZXRob2QuXG4gKi9cbmV4cG9ydCBjb25zdCBkaXJlY3RpdmUgPVxuICA8QyBleHRlbmRzIERpcmVjdGl2ZUNsYXNzPihjOiBDKSA9PlxuICAoLi4udmFsdWVzOiBEaXJlY3RpdmVQYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPj4pOiBEaXJlY3RpdmVSZXN1bHQ8Qz4gPT4gKHtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIFsnXyRsaXREaXJlY3RpdmUkJ106IGMsXG4gICAgdmFsdWVzLFxuICB9KTtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBjdXN0b20gZGlyZWN0aXZlcy4gVXNlcnMgc2hvdWxkIGV4dGVuZCB0aGlzIGNsYXNzLFxuICogaW1wbGVtZW50IGByZW5kZXJgIGFuZC9vciBgdXBkYXRlYCwgYW5kIHRoZW4gcGFzcyB0aGVpciBzdWJjbGFzcyB0b1xuICogYGRpcmVjdGl2ZWAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEaXJlY3RpdmUgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIC8vQGludGVybmFsXG4gIF9fcGFydCE6IFBhcnQ7XG4gIC8vQGludGVybmFsXG4gIF9fYXR0cmlidXRlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLy9AaW50ZXJuYWxcbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG5cbiAgLy9AaW50ZXJuYWxcbiAgXyRwYXJlbnQhOiBEaXNjb25uZWN0YWJsZTtcblxuICAvLyBUaGVzZSB3aWxsIG9ubHkgZXhpc3Qgb24gdGhlIEFzeW5jRGlyZWN0aXZlIHN1YmNsYXNzXG4gIC8vQGludGVybmFsXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT47XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIC8vQGludGVybmFsXG4gIFsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddPyhpc0Nvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoX3BhcnRJbmZvOiBQYXJ0SW5mbykge31cblxuICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF8kaW5pdGlhbGl6ZShcbiAgICBwYXJ0OiBQYXJ0LFxuICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUsXG4gICAgYXR0cmlidXRlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLl9fcGFydCA9IHBhcnQ7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLl9fYXR0cmlidXRlSW5kZXggPSBhdHRyaWJ1dGVJbmRleDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF8kcmVzb2x2ZShwYXJ0OiBQYXJ0LCBwcm9wczogQXJyYXk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGUocGFydCwgcHJvcHMpO1xuICB9XG5cbiAgYWJzdHJhY3QgcmVuZGVyKC4uLnByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd247XG5cbiAgdXBkYXRlKF9wYXJ0OiBQYXJ0LCBwcm9wczogQXJyYXk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXIoLi4ucHJvcHMpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogT3ZlcnZpZXc6XG4gKlxuICogVGhpcyBtb2R1bGUgaXMgZGVzaWduZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGFuIGFzeW5jIGBzZXRWYWx1ZWAgQVBJIGFuZFxuICogYGRpc2Nvbm5lY3RlZGAgY2FsbGJhY2sgdG8gZGlyZWN0aXZlcyB3aXRoIHRoZSBsZWFzdCBpbXBhY3Qgb24gdGhlIGNvcmVcbiAqIHJ1bnRpbWUgb3IgcGF5bG9hZCB3aGVuIHRoYXQgZmVhdHVyZSBpcyBub3QgdXNlZC5cbiAqXG4gKiBUaGUgc3RyYXRlZ3kgaXMgdG8gaW50cm9kdWNlIGEgYEFzeW5jRGlyZWN0aXZlYCBzdWJjbGFzcyBvZlxuICogYERpcmVjdGl2ZWAgdGhhdCBjbGltYnMgdGhlIFwicGFyZW50XCIgdHJlZSBpbiBpdHMgY29uc3RydWN0b3IgdG8gbm90ZSB3aGljaFxuICogYnJhbmNoZXMgb2YgbGl0LWh0bWwncyBcImxvZ2ljYWwgdHJlZVwiIG9mIGRhdGEgc3RydWN0dXJlcyBjb250YWluIHN1Y2hcbiAqIGRpcmVjdGl2ZXMgYW5kIHRodXMgbmVlZCB0byBiZSBjcmF3bGVkIHdoZW4gYSBzdWJ0cmVlIGlzIGJlaW5nIGNsZWFyZWQgKG9yXG4gKiBtYW51YWxseSBkaXNjb25uZWN0ZWQpIGluIG9yZGVyIHRvIHJ1biB0aGUgYGRpc2Nvbm5lY3RlZGAgY2FsbGJhY2suXG4gKlxuICogVGhlIFwibm9kZXNcIiBvZiB0aGUgbG9naWNhbCB0cmVlIGluY2x1ZGUgUGFydHMsIFRlbXBsYXRlSW5zdGFuY2VzIChmb3Igd2hlbiBhXG4gKiBUZW1wbGF0ZVJlc3VsdCBpcyBjb21taXR0ZWQgdG8gYSB2YWx1ZSBvZiBhIENoaWxkUGFydCksIGFuZCBEaXJlY3RpdmVzOyB0aGVzZVxuICogYWxsIGltcGxlbWVudCBhIGNvbW1vbiBpbnRlcmZhY2UgY2FsbGVkIGBEaXNjb25uZWN0YWJsZUNoaWxkYC4gRWFjaCBoYXMgYVxuICogYF8kcGFyZW50YCByZWZlcmVuY2Ugd2hpY2ggaXMgc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24gaW4gdGhlIGNvcmUgY29kZSwgYW5kIGFcbiAqIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIGZpZWxkIHdoaWNoIGlzIGluaXRpYWxseSB1bmRlZmluZWQuXG4gKlxuICogVGhlIHNwYXJzZSB0cmVlIGNyZWF0ZWQgYnkgbWVhbnMgb2YgdGhlIGBBc3luY0RpcmVjdGl2ZWAgY29uc3RydWN0b3JcbiAqIGNyYXdsaW5nIHVwIHRoZSBgXyRwYXJlbnRgIHRyZWUgYW5kIHBsYWNpbmcgYSBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCBTZXRcbiAqIG9uIGVhY2ggcGFyZW50IHRoYXQgaW5jbHVkZXMgZWFjaCBjaGlsZCB0aGF0IGNvbnRhaW5zIGFcbiAqIGBBc3luY0RpcmVjdGl2ZWAgZGlyZWN0bHkgb3IgdHJhbnNpdGl2ZWx5IHZpYSBpdHMgY2hpbGRyZW4uIEluIG9yZGVyIHRvXG4gKiBub3RpZnkgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VzIGFuZCBkaXNjb25uZWN0IChvciByZWNvbm5lY3QpIGEgdHJlZSwgdGhlXG4gKiBgXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZGAgQVBJIGlzIHBhdGNoZWQgb250byBDaGlsZFBhcnRzIGFzIGEgZGlyZWN0aXZlXG4gKiBjbGltYnMgdGhlIHBhcmVudCB0cmVlLCB3aGljaCBpcyBjYWxsZWQgYnkgdGhlIGNvcmUgd2hlbiBjbGVhcmluZyBhIHBhcnQgaWZcbiAqIGl0IGV4aXN0cy4gV2hlbiBjYWxsZWQsIHRoYXQgbWV0aG9kIGl0ZXJhdGVzIG92ZXIgdGhlIHNwYXJzZSB0cmVlIG9mXG4gKiBTZXQ8RGlzY29ubmVjdGFibGVDaGlsZHJlbj4gYnVpbHQgdXAgYnkgQXN5bmNEaXJlY3RpdmVzLCBhbmQgY2FsbHNcbiAqIGBfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkYCBvbiBhbnkgZGlyZWN0aXZlcyB0aGF0IGFyZSBlbmNvdW50ZXJlZFxuICogaW4gdGhhdCB0cmVlLCBydW5uaW5nIHRoZSByZXF1aXJlZCBjYWxsYmFja3MuXG4gKlxuICogQSBnaXZlbiBcImxvZ2ljYWwgdHJlZVwiIG9mIGxpdC1odG1sIGRhdGEtc3RydWN0dXJlcyBtaWdodCBsb29rIGxpa2UgdGhpczpcbiAqXG4gKiAgQ2hpbGRQYXJ0KE4xKSBfJGRDPVtEMixUM11cbiAqICAgLl9kaXJlY3RpdmVcbiAqICAgICBBc3luY0RpcmVjdGl2ZShEMilcbiAqICAgLl92YWx1ZSAvLyB1c2VyIHZhbHVlIHdhcyBUZW1wbGF0ZVJlc3VsdFxuICogICAgIFRlbXBsYXRlSW5zdGFuY2UoVDMpIF8kZEM9W0E0LEE2LE4xMCxOMTJdXG4gKiAgICAgIC5fJHBhcnRzW11cbiAqICAgICAgICBBdHRyaWJ1dGVQYXJ0KEE0KSBfJGRDPVtENV1cbiAqICAgICAgICAgLl9kaXJlY3RpdmVzW11cbiAqICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShENSlcbiAqICAgICAgICBBdHRyaWJ1dGVQYXJ0KEE2KSBfJGRDPVtENyxEOF1cbiAqICAgICAgICAgLl9kaXJlY3RpdmVzW11cbiAqICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShENylcbiAqICAgICAgICAgICBEaXJlY3RpdmUoRDgpIF8kZEM9W0Q5XVxuICogICAgICAgICAgICAuX2RpcmVjdGl2ZVxuICogICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQ5KVxuICogICAgICAgIENoaWxkUGFydChOMTApIF8kZEM9W0QxMV1cbiAqICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShEMTEpXG4gKiAgICAgICAgIC5fdmFsdWVcbiAqICAgICAgICAgICBzdHJpbmdcbiAqICAgICAgICBDaGlsZFBhcnQoTjEyKSBfJGRDPVtEMTMsTjE0LE4xNl1cbiAqICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShEMTMpXG4gKiAgICAgICAgIC5fdmFsdWUgLy8gdXNlciB2YWx1ZSB3YXMgaXRlcmFibGVcbiAqICAgICAgICAgICBBcnJheTxDaGlsZFBhcnQ+XG4gKiAgICAgICAgICAgICBDaGlsZFBhcnQoTjE0KSBfJGRDPVtEMTVdXG4gKiAgICAgICAgICAgICAgLl92YWx1ZVxuICogICAgICAgICAgICAgICAgc3RyaW5nXG4gKiAgICAgICAgICAgICBDaGlsZFBhcnQoTjE2KSBfJGRDPVtEMTcsVDE4XVxuICogICAgICAgICAgICAgIC5fZGlyZWN0aXZlXG4gKiAgICAgICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShEMTcpXG4gKiAgICAgICAgICAgICAgLl92YWx1ZSAvLyB1c2VyIHZhbHVlIHdhcyBUZW1wbGF0ZVJlc3VsdFxuICogICAgICAgICAgICAgICAgVGVtcGxhdGVJbnN0YW5jZShUMTgpIF8kZEM9W0ExOSxBMjEsTjI1XVxuICogICAgICAgICAgICAgICAgIC5fJHBhcnRzW11cbiAqICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhcnQoQTE5KSBfJGRDPVtEMjBdXG4gKiAgICAgICAgICAgICAgICAgICAgLl9kaXJlY3RpdmVzW11cbiAqICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQyMClcbiAqICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhcnQoQTIxKSBfJGRDPVsyMiwyM11cbiAqICAgICAgICAgICAgICAgICAgICAuX2RpcmVjdGl2ZXNbXVxuICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNEaXJlY3RpdmUoRDIyKVxuICogICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aXZlKEQyMykgXyRkQz1bRDI0XVxuICogICAgICAgICAgICAgICAgICAgICAgIC5fZGlyZWN0aXZlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0RpcmVjdGl2ZShEMjQpXG4gKiAgICAgICAgICAgICAgICAgICBDaGlsZFBhcnQoTjI1KSBfJGRDPVtEMjZdXG4gKiAgICAgICAgICAgICAgICAgICAgLl9kaXJlY3RpdmVcbiAqICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGlyZWN0aXZlKEQyNilcbiAqICAgICAgICAgICAgICAgICAgICAuX3ZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdcbiAqXG4gKiBFeGFtcGxlIDE6IFRoZSBkaXJlY3RpdmUgaW4gQ2hpbGRQYXJ0KE4xMikgdXBkYXRlcyBhbmQgcmV0dXJucyBgbm90aGluZ2AuIFRoZVxuICogQ2hpbGRQYXJ0IHdpbGwgX2NsZWFyKCkgaXRzZWxmLCBhbmQgc28gd2UgbmVlZCB0byBkaXNjb25uZWN0IHRoZSBcInZhbHVlXCIgb2ZcbiAqIHRoZSBDaGlsZFBhcnQgKGJ1dCBub3QgaXRzIGRpcmVjdGl2ZSkuIEluIHRoaXMgY2FzZSwgd2hlbiBgX2NsZWFyKClgIGNhbGxzXG4gKiBgXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCgpYCwgd2UgZG9uJ3QgaXRlcmF0ZSBhbGwgb2YgdGhlXG4gKiBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4sIHJhdGhlciB3ZSBkbyBhIHZhbHVlLXNwZWNpZmljIGRpc2Nvbm5lY3Rpb246IGkuZS5cbiAqIHNpbmNlIHRoZSBfdmFsdWUgd2FzIGFuIEFycmF5PENoaWxkUGFydD4gKGJlY2F1c2UgYW4gaXRlcmFibGUgaGFkIGJlZW5cbiAqIGNvbW1pdHRlZCksIHdlIGl0ZXJhdGUgdGhlIGFycmF5IG9mIENoaWxkUGFydHMgKE4xNCwgTjE2KSBhbmQgcnVuXG4gKiBgc2V0Q29ubmVjdGVkYCBvbiB0aGVtICh3aGljaCBkb2VzIHJlY3Vyc2UgZG93biB0aGUgZnVsbCB0cmVlIG9mXG4gKiBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCBiZWxvdyBpdCwgYW5kIGFsc28gcmVtb3ZlcyBOMTQgYW5kIE4xNiBmcm9tIE4xMidzXG4gKiBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCkuIE9uY2UgdGhlIHZhbHVlcyBoYXZlIGJlZW4gZGlzY29ubmVjdGVkLCB3ZSB0aGVuXG4gKiBjaGVjayB3aGV0aGVyIHRoZSBDaGlsZFBhcnQoTjEyKSdzIGxpc3Qgb2YgYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAgaXMgZW1wdHlcbiAqIChhbmQgd291bGQgcmVtb3ZlIGl0IGZyb20gaXRzIHBhcmVudCBUZW1wbGF0ZUluc3RhbmNlKFQzKSBpZiBzbyksIGJ1dCBzaW5jZVxuICogaXQgd291bGQgc3RpbGwgY29udGFpbiBpdHMgZGlyZWN0aXZlIEQxMywgaXQgc3RheXMgaW4gdGhlIGRpc2Nvbm5lY3RhYmxlXG4gKiB0cmVlLlxuICpcbiAqIEV4YW1wbGUgMjogSW4gdGhlIGNvdXJzZSBvZiBFeGFtcGxlIDEsIGBzZXRDb25uZWN0ZWRgIHdpbGwgcmVhY2hcbiAqIENoaWxkUGFydChOMTYpOyBpbiB0aGlzIGNhc2UgdGhlIGVudGlyZSBwYXJ0IGlzIGJlaW5nIGRpc2Nvbm5lY3RlZCwgc28gd2VcbiAqIHNpbXBseSBpdGVyYXRlIGFsbCBvZiBOMTYncyBgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuYCAoRDE3LFQxOCkgYW5kXG4gKiByZWN1cnNpdmVseSBydW4gYHNldENvbm5lY3RlZGAgb24gdGhlbS4gTm90ZSB0aGF0IHdlIG9ubHkgcmVtb3ZlIGNoaWxkcmVuXG4gKiBmcm9tIGBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5gIGZvciB0aGUgdG9wLWxldmVsIHZhbHVlcyBiZWluZyBkaXNjb25uZWN0ZWRcbiAqIG9uIGEgY2xlYXI7IGRvaW5nIHRoaXMgYm9va2tlZXBpbmcgbG93ZXIgaW4gdGhlIHRyZWUgaXMgd2FzdGVmdWwgc2luY2UgaXQnc1xuICogYWxsIGJlaW5nIHRocm93biBhd2F5LlxuICpcbiAqIEV4YW1wbGUgMzogSWYgdGhlIExpdEVsZW1lbnQgY29udGFpbmluZyB0aGUgZW50aXJlIHRyZWUgYWJvdmUgYmVjb21lc1xuICogZGlzY29ubmVjdGVkLCBpdCB3aWxsIHJ1biBgY2hpbGRQYXJ0LnNldENvbm5lY3RlZCgpYCAod2hpY2ggY2FsbHNcbiAqIGBjaGlsZFBhcnQuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCgpYCBpZiBpdCBleGlzdHMpOyBpbiB0aGlzIGNhc2UsIHdlXG4gKiByZWN1cnNpdmVseSBydW4gYHNldENvbm5lY3RlZCgpYCBvdmVyIHRoZSBlbnRpcmUgdHJlZSwgd2l0aG91dCByZW1vdmluZyBhbnlcbiAqIGNoaWxkcmVuIGZyb20gYF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbmAsIHNpbmNlIHRoaXMgdHJlZSBpcyByZXF1aXJlZCB0b1xuICogcmUtY29ubmVjdCB0aGUgdHJlZSwgd2hpY2ggZG9lcyB0aGUgc2FtZSBvcGVyYXRpb24sIHNpbXBseSBwYXNzaW5nXG4gKiBgaXNDb25uZWN0ZWQ6IHRydWVgIGRvd24gdGhlIHRyZWUsIHNpZ25hbGluZyB3aGljaCBjYWxsYmFjayB0byBydW4uXG4gKi9cblxuaW1wb3J0IHtBdHRyaWJ1dGVQYXJ0LCBDaGlsZFBhcnQsIERpc2Nvbm5lY3RhYmxlLCBQYXJ0fSBmcm9tICcuL2xpdC1odG1sLmpzJztcbmltcG9ydCB7aXNTaW5nbGVFeHByZXNzaW9ufSBmcm9tICcuL2RpcmVjdGl2ZS1oZWxwZXJzLmpzJztcbmltcG9ydCB7RGlyZWN0aXZlLCBQYXJ0SW5mbywgUGFydFR5cGV9IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0aXZlLmpzJztcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHdhbGtzIGRvd24gdGhlIHRyZWUgb2YgUGFydHMvVGVtcGxhdGVJbnN0YW5jZXMvRGlyZWN0aXZlcyB0byBzZXRcbiAqIHRoZSBjb25uZWN0ZWQgc3RhdGUgb2YgZGlyZWN0aXZlcyBhbmQgcnVuIGBkaXNjb25uZWN0ZWRgLyBgcmVjb25uZWN0ZWRgXG4gKiBjYWxsYmFja3MuXG4gKlxuICogQHJldHVybiBUcnVlIGlmIHRoZXJlIHdlcmUgY2hpbGRyZW4gdG8gZGlzY29ubmVjdDsgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmNvbnN0IG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCA9IChcbiAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgaXNDb25uZWN0ZWQ6IGJvb2xlYW5cbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3Qgb2JqIG9mIGNoaWxkcmVuKSB7XG4gICAgLy8gVGhlIGV4aXN0ZW5jZSBvZiBgXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZGAgaXMgdXNlZCBhcyBhIFwiYnJhbmRcIiB0b1xuICAgIC8vIGRpc2FtYmlndWF0ZSBBc3luY0RpcmVjdGl2ZXMgZnJvbSBvdGhlciBEaXNjb25uZWN0YWJsZUNoaWxkcmVuXG4gICAgLy8gKGFzIG9wcG9zZWQgdG8gdXNpbmcgYW4gaW5zdGFuY2VvZiBjaGVjayB0byBrbm93IHdoZW4gdG8gY2FsbCBpdCk7IHRoZVxuICAgIC8vIHJlZHVuZGFuY3kgb2YgXCJEaXJlY3RpdmVcIiBpbiB0aGUgQVBJIG5hbWUgaXMgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aFxuICAgIC8vIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkYCwgd2hpY2ggZXhpc3RzIGBDaGlsZFBhcnRzYCB3aGljaCBhcmUgYWxzbyBpblxuICAgIC8vIHRoaXMgbGlzdFxuICAgIC8vIERpc2Nvbm5lY3QgRGlyZWN0aXZlIChhbmQgYW55IG5lc3RlZCBkaXJlY3RpdmVzIGNvbnRhaW5lZCB3aXRoaW4pXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAob2JqIGFzIEFzeW5jRGlyZWN0aXZlKVsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddPy4oXG4gICAgICBpc0Nvbm5lY3RlZCxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICAvLyBEaXNjb25uZWN0IFBhcnQvVGVtcGxhdGVJbnN0YW5jZVxuICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZChvYmosIGlzQ29ubmVjdGVkKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY2hpbGQgZnJvbSBpdHMgcGFyZW50IGxpc3Qgb2YgZGlzY29ubmVjdGFibGUgY2hpbGRyZW4sIGFuZFxuICogaWYgdGhlIHBhcmVudCBsaXN0IGJlY29tZXMgZW1wdHkgYXMgYSByZXN1bHQsIHJlbW92ZXMgdGhlIHBhcmVudCBmcm9tIGl0c1xuICogcGFyZW50LCBhbmQgc28gZm9ydGggdXAgdGhlIHRyZWUgd2hlbiB0aGF0IGNhdXNlcyBzdWJzZXF1ZW50IHBhcmVudCBsaXN0cyB0b1xuICogYmVjb21lIGVtcHR5LlxuICovXG5jb25zdCByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQgPSAob2JqOiBEaXNjb25uZWN0YWJsZSkgPT4ge1xuICBsZXQgcGFyZW50LCBjaGlsZHJlbjtcbiAgZG8ge1xuICAgIGlmICgocGFyZW50ID0gb2JqLl8kcGFyZW50KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2hpbGRyZW4gPSBwYXJlbnQuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuITtcbiAgICBjaGlsZHJlbi5kZWxldGUob2JqKTtcbiAgICBvYmogPSBwYXJlbnQ7XG4gIH0gd2hpbGUgKGNoaWxkcmVuPy5zaXplID09PSAwKTtcbn07XG5cbmNvbnN0IGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQgPSAob2JqOiBEaXNjb25uZWN0YWJsZSkgPT4ge1xuICAvLyBDbGltYiB0aGUgcGFyZW50IHRyZWUsIGNyZWF0aW5nIGEgc3BhcnNlIHRyZWUgb2YgY2hpbGRyZW4gbmVlZGluZ1xuICAvLyBkaXNjb25uZWN0aW9uXG4gIGZvciAobGV0IHBhcmVudDsgKHBhcmVudCA9IG9iai5fJHBhcmVudCk7IG9iaiA9IHBhcmVudCkge1xuICAgIGxldCBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbiA9IG5ldyBTZXQoKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuLmhhcyhvYmopKSB7XG4gICAgICAvLyBPbmNlIHdlJ3ZlIHJlYWNoZWQgYSBwYXJlbnQgdGhhdCBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgY2hpbGQsIHdlXG4gICAgICAvLyBjYW4gc2hvcnQtY2lyY3VpdFxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNoaWxkcmVuLmFkZChvYmopO1xuICAgIGluc3RhbGxEaXNjb25uZWN0QVBJKHBhcmVudCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hhbmdlcyB0aGUgcGFyZW50IHJlZmVyZW5jZSBvZiB0aGUgQ2hpbGRQYXJ0LCBhbmQgdXBkYXRlcyB0aGUgc3BhcnNlIHRyZWUgb2ZcbiAqIERpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuIGFjY29yZGluZ2x5LlxuICpcbiAqIE5vdGUsIHRoaXMgbWV0aG9kIHdpbGwgYmUgcGF0Y2hlZCBvbnRvIENoaWxkUGFydCBpbnN0YW5jZXMgYW5kIGNhbGxlZCBmcm9tXG4gKiB0aGUgY29yZSBjb2RlIHdoZW4gcGFydHMgYXJlIG1vdmVkIGJldHdlZW4gZGlmZmVyZW50IHBhcmVudHMuXG4gKi9cbmZ1bmN0aW9uIHJlcGFyZW50RGlzY29ubmVjdGFibGVzKHRoaXM6IENoaWxkUGFydCwgbmV3UGFyZW50OiBEaXNjb25uZWN0YWJsZSkge1xuICBpZiAodGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh0aGlzKTtcbiAgICB0aGlzLl8kcGFyZW50ID0gbmV3UGFyZW50O1xuICAgIGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQodGhpcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fJHBhcmVudCA9IG5ld1BhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgdGhlIGNvbm5lY3RlZCBzdGF0ZSBvbiBhbnkgZGlyZWN0aXZlcyBjb250YWluZWQgd2l0aGluIHRoZSBjb21taXR0ZWRcbiAqIHZhbHVlIG9mIHRoaXMgcGFydCAoaS5lLiB3aXRoaW4gYSBUZW1wbGF0ZUluc3RhbmNlIG9yIGl0ZXJhYmxlIG9mXG4gKiBDaGlsZFBhcnRzKSBhbmQgcnVucyB0aGVpciBgZGlzY29ubmVjdGVkYC9gcmVjb25uZWN0ZWRgcywgYXMgd2VsbCBhcyB3aXRoaW5cbiAqIGFueSBkaXJlY3RpdmVzIHN0b3JlZCBvbiB0aGUgQ2hpbGRQYXJ0ICh3aGVuIGB2YWx1ZU9ubHlgIGlzIGZhbHNlKS5cbiAqXG4gKiBgaXNDbGVhcmluZ1ZhbHVlYCBzaG91bGQgYmUgcGFzc2VkIGFzIGB0cnVlYCBvbiBhIHRvcC1sZXZlbCBwYXJ0IHRoYXQgaXNcbiAqIGNsZWFyaW5nIGl0c2VsZiwgYW5kIG5vdCBhcyBhIHJlc3VsdCBvZiByZWN1cnNpdmVseSBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXNcbiAqIGFzIHBhcnQgb2YgYSBgY2xlYXJgIG9wZXJhdGlvbiBoaWdoZXIgdXAgdGhlIHRyZWUuIFRoaXMgYm90aCBlbnN1cmVzIHRoYXQgYW55XG4gKiBkaXJlY3RpdmUgb24gdGhpcyBDaGlsZFBhcnQgdGhhdCBwcm9kdWNlZCBhIHZhbHVlIHRoYXQgY2F1c2VkIHRoZSBjbGVhclxuICogb3BlcmF0aW9uIGlzIG5vdCBkaXNjb25uZWN0ZWQsIGFuZCBhbHNvIHNlcnZlcyBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICogdG8gYXZvaWQgbmVlZGxlc3MgYm9va2tlZXBpbmcgd2hlbiBhIHN1YnRyZWUgaXMgZ29pbmcgYXdheTsgd2hlbiBjbGVhcmluZyBhXG4gKiBzdWJ0cmVlLCBvbmx5IHRoZSB0b3AtbW9zdCBwYXJ0IG5lZWQgdG8gcmVtb3ZlIGl0c2VsZiBmcm9tIHRoZSBwYXJlbnQuXG4gKlxuICogYGZyb21QYXJ0SW5kZXhgIGlzIHBhc3NlZCBvbmx5IGluIHRoZSBjYXNlIG9mIGEgcGFydGlhbCBgX2NsZWFyYCBydW5uaW5nIGFzIGFcbiAqIHJlc3VsdCBvZiB0cnVuY2F0aW5nIGFuIGl0ZXJhYmxlLlxuICpcbiAqIE5vdGUsIHRoaXMgbWV0aG9kIHdpbGwgYmUgcGF0Y2hlZCBvbnRvIENoaWxkUGFydCBpbnN0YW5jZXMgYW5kIGNhbGxlZCBmcm9tIHRoZVxuICogY29yZSBjb2RlIHdoZW4gcGFydHMgYXJlIGNsZWFyZWQgb3IgdGhlIGNvbm5lY3Rpb24gc3RhdGUgaXMgY2hhbmdlZCBieSB0aGVcbiAqIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIG5vdGlmeUNoaWxkUGFydENvbm5lY3RlZENoYW5nZWQoXG4gIHRoaXM6IENoaWxkUGFydCxcbiAgaXNDb25uZWN0ZWQ6IGJvb2xlYW4sXG4gIGlzQ2xlYXJpbmdWYWx1ZSA9IGZhbHNlLFxuICBmcm9tUGFydEluZGV4ID0gMFxuKSB7XG4gIGNvbnN0IHZhbHVlID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuO1xuICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBjaGlsZHJlbi5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc0NsZWFyaW5nVmFsdWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIEl0ZXJhYmxlIGNhc2U6IEFueSBDaGlsZFBhcnRzIGNyZWF0ZWQgYnkgdGhlIGl0ZXJhYmxlIHNob3VsZCBiZVxuICAgICAgLy8gZGlzY29ubmVjdGVkIGFuZCByZW1vdmVkIGZyb20gdGhpcyBDaGlsZFBhcnQncyBkaXNjb25uZWN0YWJsZVxuICAgICAgLy8gY2hpbGRyZW4gKHN0YXJ0aW5nIGF0IGBmcm9tUGFydEluZGV4YCBpbiB0aGUgY2FzZSBvZiB0cnVuY2F0aW9uKVxuICAgICAgZm9yIChsZXQgaSA9IGZyb21QYXJ0SW5kZXg7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodmFsdWVbaV0sIGZhbHNlKTtcbiAgICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHZhbHVlW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIC8vIFRlbXBsYXRlSW5zdGFuY2UgY2FzZTogSWYgdGhlIHZhbHVlIGhhcyBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiAod2lsbFxuICAgICAgLy8gb25seSBiZSBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgVGVtcGxhdGVJbnN0YW5jZSksIHdlIGRpc2Nvbm5lY3QgaXRcbiAgICAgIC8vIGFuZCByZW1vdmUgaXQgZnJvbSB0aGlzIENoaWxkUGFydCdzIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuXG4gICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodmFsdWUgYXMgRGlzY29ubmVjdGFibGUsIGZhbHNlKTtcbiAgICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh2YWx1ZSBhcyBEaXNjb25uZWN0YWJsZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh0aGlzLCBpc0Nvbm5lY3RlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXRjaGVzIGRpc2Nvbm5lY3Rpb24gQVBJIG9udG8gQ2hpbGRQYXJ0cy5cbiAqL1xuY29uc3QgaW5zdGFsbERpc2Nvbm5lY3RBUEkgPSAob2JqOiBEaXNjb25uZWN0YWJsZSkgPT4ge1xuICBpZiAoKG9iaiBhcyBDaGlsZFBhcnQpLnR5cGUgPT0gUGFydFR5cGUuQ0hJTEQpIHtcbiAgICAob2JqIGFzIENoaWxkUGFydCkuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCA/Pz1cbiAgICAgIG5vdGlmeUNoaWxkUGFydENvbm5lY3RlZENoYW5nZWQ7XG4gICAgKG9iaiBhcyBDaGlsZFBhcnQpLl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMgPz89IHJlcGFyZW50RGlzY29ubmVjdGFibGVzO1xuICB9XG59O1xuXG4vKipcbiAqIEFuIGFic3RyYWN0IGBEaXJlY3RpdmVgIGJhc2UgY2xhc3Mgd2hvc2UgYGRpc2Nvbm5lY3RlZGAgbWV0aG9kIHdpbGwgYmVcbiAqIGNhbGxlZCB3aGVuIHRoZSBwYXJ0IGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZSBpcyBjbGVhcmVkIGFzIGEgcmVzdWx0IG9mXG4gKiByZS1yZW5kZXJpbmcsIG9yIHdoZW4gdGhlIHVzZXIgY2FsbHMgYHBhcnQuc2V0Q29ubmVjdGVkKGZhbHNlKWAgb25cbiAqIGEgcGFydCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZSAoYXMgaGFwcGVuc1xuICogd2hlbiBlLmcuIGEgTGl0RWxlbWVudCBkaXNjb25uZWN0cyBmcm9tIHRoZSBET00pLlxuICpcbiAqIElmIGBwYXJ0LnNldENvbm5lY3RlZCh0cnVlKWAgaXMgc3Vic2VxdWVudGx5IGNhbGxlZCBvbiBhXG4gKiBjb250YWluaW5nIHBhcnQsIHRoZSBkaXJlY3RpdmUncyBgcmVjb25uZWN0ZWRgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBwcmlvclxuICogdG8gaXRzIG5leHQgYHVwZGF0ZWAvYHJlbmRlcmAgY2FsbGJhY2tzLiBXaGVuIGltcGxlbWVudGluZyBgZGlzY29ubmVjdGVkYCxcbiAqIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHJlY29ubmVjdGlvbi5cbiAqXG4gKiBOb3RlIHRoYXQgdXBkYXRlcyBtYXkgb2NjdXIgd2hpbGUgdGhlIGRpcmVjdGl2ZSBpcyBkaXNjb25uZWN0ZWQuIEFzIHN1Y2gsXG4gKiBkaXJlY3RpdmVzIHNob3VsZCBnZW5lcmFsbHkgY2hlY2sgdGhlIGB0aGlzLmlzQ29ubmVjdGVkYCBmbGFnIGR1cmluZ1xuICogcmVuZGVyL3VwZGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBzYWZlIHRvIHN1YnNjcmliZSB0byByZXNvdXJjZXNcbiAqIHRoYXQgbWF5IHByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXN5bmNEaXJlY3RpdmUgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICAvLyBBcyBvcHBvc2VkIHRvIG90aGVyIERpc2Nvbm5lY3RhYmxlcywgQXN5bmNEaXJlY3RpdmVzIGFsd2F5cyBnZXQgbm90aWZpZWRcbiAgLy8gd2hlbiB0aGUgUm9vdFBhcnQgY29ubmVjdGlvbiBjaGFuZ2VzLCBzbyB0aGUgcHVibGljIGBpc0Nvbm5lY3RlZGBcbiAgLy8gaXMgYSBsb2NhbGx5IHN0b3JlZCB2YXJpYWJsZSBpbml0aWFsaXplZCB2aWEgaXRzIHBhcnQncyBnZXR0ZXIgYW5kIHN5bmNlZFxuICAvLyB2aWEgYF8kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWRgLiBUaGlzIGlzIGNoZWFwZXIgdGhhbiB1c2luZ1xuICAvLyB0aGUgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIsIHdoaWNoIGhhcyB0byBsb29rIGJhY2sgdXAgdGhlIHRyZWUgZWFjaCB0aW1lLlxuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb24gc3RhdGUgZm9yIHRoaXMgRGlyZWN0aXZlLlxuICAgKi9cbiAgaXNDb25uZWN0ZWQhOiBib29sZWFuO1xuXG4gIC8vIEBpbnRlcm5hbFxuICBvdmVycmlkZSBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgcGFydCB3aXRoIGludGVybmFsIGZpZWxkc1xuICAgKiBAcGFyYW0gcGFydFxuICAgKiBAcGFyYW0gcGFyZW50XG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVJbmRleFxuICAgKi9cbiAgb3ZlcnJpZGUgXyRpbml0aWFsaXplKFxuICAgIHBhcnQ6IFBhcnQsXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBhdHRyaWJ1dGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyLl8kaW5pdGlhbGl6ZShwYXJ0LCBwYXJlbnQsIGF0dHJpYnV0ZUluZGV4KTtcbiAgICBhZGREaXNjb25uZWN0YWJsZVRvUGFyZW50KHRoaXMpO1xuICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBwYXJ0Ll8kaXNDb25uZWN0ZWQ7XG4gIH1cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgLyoqXG4gICAqIENhbGxlZCBmcm9tIHRoZSBjb3JlIGNvZGUgd2hlbiBhIGRpcmVjdGl2ZSBpcyBnb2luZyBhd2F5IGZyb20gYSBwYXJ0IChpblxuICAgKiB3aGljaCBjYXNlIGBzaG91bGRSZW1vdmVGcm9tUGFyZW50YCBzaG91bGQgYmUgdHJ1ZSksIGFuZCBmcm9tIHRoZVxuICAgKiBgc2V0Q2hpbGRyZW5Db25uZWN0ZWRgIGhlbHBlciBmdW5jdGlvbiB3aGVuIHJlY3Vyc2l2ZWx5IGNoYW5naW5nIHRoZVxuICAgKiBjb25uZWN0aW9uIHN0YXRlIG9mIGEgdHJlZSAoaW4gd2hpY2ggY2FzZSBgc2hvdWxkUmVtb3ZlRnJvbVBhcmVudGAgc2hvdWxkXG4gICAqIGJlIGZhbHNlKS5cbiAgICpcbiAgICogQHBhcmFtIGlzQ29ubmVjdGVkXG4gICAqIEBwYXJhbSBpc0NsZWFyaW5nRGlyZWN0aXZlIC0gVHJ1ZSB3aGVuIHRoZSBkaXJlY3RpdmUgaXRzZWxmIGlzIGJlaW5nXG4gICAqICAgICByZW1vdmVkOyBmYWxzZSB3aGVuIHRoZSB0cmVlIGlzIGJlaW5nIGRpc2Nvbm5lY3RlZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG92ZXJyaWRlIFsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddKFxuICAgIGlzQ29ubmVjdGVkOiBib29sZWFuLFxuICAgIGlzQ2xlYXJpbmdEaXJlY3RpdmUgPSB0cnVlXG4gICkge1xuICAgIGlmIChpc0Nvbm5lY3RlZCAhPT0gdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkO1xuICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgIHRoaXMucmVjb25uZWN0ZWQ/LigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQ/LigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDbGVhcmluZ0RpcmVjdGl2ZSkge1xuICAgICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHRoaXMsIGlzQ29ubmVjdGVkKTtcbiAgICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRpcmVjdGl2ZSdzIFBhcnQgb3V0c2lkZSB0aGUgbm9ybWFsIGB1cGRhdGVgL2ByZW5kZXJgXG4gICAqIGxpZmVjeWNsZSBvZiBhIGRpcmVjdGl2ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgc3luY2hyb25vdXNseSBmcm9tIGEgZGlyZWN0aXZlJ3MgYHVwZGF0ZWBcbiAgICogb3IgYHJlbmRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3RpdmUgVGhlIGRpcmVjdGl2ZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXRcbiAgICovXG4gIHNldFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKGlzU2luZ2xlRXhwcmVzc2lvbih0aGlzLl9fcGFydCBhcyB1bmtub3duIGFzIFBhcnRJbmZvKSkge1xuICAgICAgdGhpcy5fX3BhcnQuXyRzZXRWYWx1ZSh2YWx1ZSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMuX19hdHRyaWJ1dGVJbmRleCB3aWxsIGJlIGRlZmluZWQgaW4gdGhpcyBjYXNlLCBidXRcbiAgICAgIC8vIGFzc2VydCBpdCBpbiBkZXYgbW9kZVxuICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMuX19hdHRyaWJ1dGVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGhpcy5fX2F0dHJpYnV0ZUluZGV4IHRvIGJlIGEgbnVtYmVyYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBbLi4uKHRoaXMuX19wYXJ0Ll8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pXTtcbiAgICAgIG5ld1ZhbHVlc1t0aGlzLl9fYXR0cmlidXRlSW5kZXghXSA9IHZhbHVlO1xuICAgICAgKHRoaXMuX19wYXJ0IGFzIEF0dHJpYnV0ZVBhcnQpLl8kc2V0VmFsdWUobmV3VmFsdWVzLCB0aGlzLCAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlciBjYWxsYmFja3MgZm9yIGltcGxlbWVudGluZyBsb2dpYyB0byByZWxlYXNlIGFueSByZXNvdXJjZXMvc3Vic2NyaXB0aW9uc1xuICAgKiB0aGF0IG1heSBoYXZlIGJlZW4gcmV0YWluZWQgYnkgdGhpcyBkaXJlY3RpdmUuIFNpbmNlIGRpcmVjdGl2ZXMgbWF5IGFsc28gYmVcbiAgICogcmUtY29ubmVjdGVkLCBgcmVjb25uZWN0ZWRgIHNob3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIHRvIHJlc3RvcmUgdGhlXG4gICAqIHdvcmtpbmcgc3RhdGUgb2YgdGhlIGRpcmVjdGl2ZSBwcmlvciB0byB0aGUgbmV4dCByZW5kZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGlzY29ubmVjdGVkKCkge31cbiAgcHJvdGVjdGVkIHJlY29ubmVjdGVkKCkge31cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmltcG9ydCB7bm90aGluZywgRWxlbWVudFBhcnR9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7ZGlyZWN0aXZlLCBBc3luY0RpcmVjdGl2ZX0gZnJvbSAnLi4vYXN5bmMtZGlyZWN0aXZlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFJlZiBvYmplY3QsIHdoaWNoIGlzIGNvbnRhaW5lciBmb3IgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZiA9IDxUID0gRWxlbWVudD4oKSA9PiBuZXcgUmVmPFQ+KCk7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgaG9sZHMgYSByZWYgdmFsdWUuXG4gKi9cbmNsYXNzIFJlZjxUID0gRWxlbWVudD4ge1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgRWxlbWVudCB2YWx1ZSBvZiB0aGUgcmVmLCBvciBlbHNlIGB1bmRlZmluZWRgIGlmIHRoZSByZWYgaXMgbm9cbiAgICogbG9uZ2VyIHJlbmRlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBUO1xufVxuXG5leHBvcnQgdHlwZSB7UmVmfTtcblxuaW50ZXJmYWNlIFJlZkludGVybmFsIHtcbiAgdmFsdWU6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG59XG5cbi8vIFdoZW4gY2FsbGJhY2tzIGFyZSB1c2VkIGZvciByZWZzLCB0aGlzIG1hcCB0cmFja3MgdGhlIGxhc3QgdmFsdWUgdGhlIGNhbGxiYWNrXG4vLyB3YXMgY2FsbGVkIHdpdGgsIGZvciBlbnN1cmluZyBhIGRpcmVjdGl2ZSBkb2Vzbid0IGNsZWFyIHRoZSByZWYgaWYgdGhlIHJlZlxuLy8gaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZCB0byBhIG5ldyBzcG90LiBJdCBpcyBkb3VibGUta2V5ZWQgb24gYm90aCB0aGVcbi8vIGNvbnRleHQgKGBvcHRpb25zLmhvc3RgKSBhbmQgdGhlIGNhbGxiYWNrLCBzaW5jZSB3ZSBhdXRvLWJpbmQgY2xhc3MgbWV0aG9kc1xuLy8gdG8gYG9wdGlvbnMuaG9zdGAuXG5jb25zdCBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjayA9IG5ldyBXZWFrTWFwPFxuICBvYmplY3QsXG4gIFdlYWtNYXA8RnVuY3Rpb24sIEVsZW1lbnQgfCB1bmRlZmluZWQ+XG4+KCk7XG5cbmV4cG9ydCB0eXBlIFJlZk9yQ2FsbGJhY2s8VCA9IEVsZW1lbnQ+ID0gUmVmPFQ+IHwgKChlbDogVCB8IHVuZGVmaW5lZCkgPT4gdm9pZCk7XG5cbmNsYXNzIFJlZkRpcmVjdGl2ZSBleHRlbmRzIEFzeW5jRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSBfZWxlbWVudD86IEVsZW1lbnQ7XG4gIHByaXZhdGUgX3JlZj86IFJlZk9yQ2FsbGJhY2s7XG4gIHByaXZhdGUgX2NvbnRleHQ/OiBvYmplY3Q7XG5cbiAgcmVuZGVyKF9yZWY/OiBSZWZPckNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG5vdGhpbmc7XG4gIH1cblxuICBvdmVycmlkZSB1cGRhdGUocGFydDogRWxlbWVudFBhcnQsIFtyZWZdOiBQYXJhbWV0ZXJzPHRoaXNbJ3JlbmRlciddPikge1xuICAgIGNvbnN0IHJlZkNoYW5nZWQgPSByZWYgIT09IHRoaXMuX3JlZjtcbiAgICBpZiAocmVmQ2hhbmdlZCAmJiB0aGlzLl9yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhlIHJlZiBwYXNzZWQgdG8gdGhlIGRpcmVjdGl2ZSBoYXMgY2hhbmdlZDtcbiAgICAgIC8vIHVuc2V0IHRoZSBwcmV2aW91cyByZWYncyB2YWx1ZVxuICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHJlZkNoYW5nZWQgfHwgdGhpcy5fbGFzdEVsZW1lbnRGb3JSZWYgIT09IHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIC8vIFdlIGVpdGhlciBnb3QgYSBuZXcgcmVmIG9yIHRoaXMgaXMgdGhlIGZpcnN0IHJlbmRlcjtcbiAgICAgIC8vIHN0b3JlIHRoZSByZWYvZWxlbWVudCAmIHVwZGF0ZSB0aGUgcmVmIHZhbHVlXG4gICAgICB0aGlzLl9yZWYgPSByZWY7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gcGFydC5vcHRpb25zPy5ob3N0O1xuICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUoKHRoaXMuX2VsZW1lbnQgPSBwYXJ0LmVsZW1lbnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vdGhpbmc7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZWZWYWx1ZShlbGVtZW50OiBFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICBlbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuX3JlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcmVmIHdhcyBjYWxsZWQgd2l0aCBhIHByZXZpb3VzIHZhbHVlLCBjYWxsIHdpdGhcbiAgICAgIC8vIGB1bmRlZmluZWRgOyBXZSBkbyB0aGlzIHRvIGVuc3VyZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBpbiBhIGNvbnNpc3RlbnRcbiAgICAgIC8vIHdheSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSByZWYgbWlnaHQgYmUgbW92aW5nIHVwIGluIHRoZSB0cmVlIChpblxuICAgICAgLy8gd2hpY2ggY2FzZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyB2YWx1ZSBiZWZvcmUgdGhlXG4gICAgICAvLyBwcmV2aW91cyBvbmUgdW5zZXRzIGl0KSBhbmQgZG93biBpbiB0aGUgdHJlZSAod2hlcmUgaXQgd291bGQgYmUgdW5zZXRcbiAgICAgIC8vIGJlZm9yZSBiZWluZyBzZXQpLiBOb3RlIHRoYXQgZWxlbWVudCBsb29rdXAgaXMga2V5ZWQgYnlcbiAgICAgIC8vIGJvdGggdGhlIGNvbnRleHQgYW5kIHRoZSBjYWxsYmFjaywgc2luY2Ugd2UgYWxsb3cgcGFzc2luZyB1bmJvdW5kXG4gICAgICAvLyBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIG9uIG9wdGlvbnMuaG9zdCwgYW5kIHdlIHdhbnQgdG8gdHJlYXRcbiAgICAgIC8vIHRoZXNlIGFzIHVuaXF1ZSBcImluc3RhbmNlc1wiIG9mIGEgZnVuY3Rpb24uXG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fY29udGV4dCA/PyBnbG9iYWxUaGlzO1xuICAgICAgbGV0IGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2sgPVxuICAgICAgICBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjay5nZXQoY29udGV4dCk7XG4gICAgICBpZiAobGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2sgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjay5zZXQoY29udGV4dCwgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEVsZW1lbnRGb3JDYWxsYmFjay5nZXQodGhpcy5fcmVmKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3JlZi5jYWxsKHRoaXMuX2NvbnRleHQsIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICBsYXN0RWxlbWVudEZvckNhbGxiYWNrLnNldCh0aGlzLl9yZWYsIGVsZW1lbnQpO1xuICAgICAgLy8gQ2FsbCB0aGUgcmVmIHdpdGggdGhlIG5ldyBlbGVtZW50IHZhbHVlXG4gICAgICBpZiAoZWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3JlZi5jYWxsKHRoaXMuX2NvbnRleHQsIGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fcmVmIGFzIFJlZkludGVybmFsKSEudmFsdWUgPSBlbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9sYXN0RWxlbWVudEZvclJlZigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuX3JlZiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFja1xuICAgICAgICAgIC5nZXQodGhpcy5fY29udGV4dCA/PyBnbG9iYWxUaGlzKVxuICAgICAgICAgID8uZ2V0KHRoaXMuX3JlZilcbiAgICAgIDogdGhpcy5fcmVmPy52YWx1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZCgpIHtcbiAgICAvLyBPbmx5IGNsZWFyIHRoZSBib3ggaWYgb3VyIGVsZW1lbnQgaXMgc3RpbGwgdGhlIG9uZSBpbiBpdCAoaS5lLiBhbm90aGVyXG4gICAgLy8gZGlyZWN0aXZlIGluc3RhbmNlIGhhc24ndCByZW5kZXJlZCBpdHMgZWxlbWVudCB0byBpdCBiZWZvcmUgdXMpOyB0aGF0XG4gICAgLy8gb25seSBoYXBwZW5zIGluIHRoZSBldmVudCBvZiB0aGUgZGlyZWN0aXZlIGJlaW5nIGNsZWFyZWQgKG5vdCB2aWEgbWFudWFsXG4gICAgLy8gZGlzY29ubmVjdGlvbilcbiAgICBpZiAodGhpcy5fbGFzdEVsZW1lbnRGb3JSZWYgPT09IHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVJlZlZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVjb25uZWN0ZWQoKSB7XG4gICAgLy8gSWYgd2Ugd2VyZSBtYW51YWxseSBkaXNjb25uZWN0ZWQsIHdlIGNhbiBzYWZlbHkgcHV0IG91ciBlbGVtZW50IGJhY2sgaW5cbiAgICAvLyB0aGUgYm94LCBzaW5jZSBubyByZW5kZXJpbmcgY291bGQgaGF2ZSBvY2N1cnJlZCB0byBjaGFuZ2UgaXRzIHN0YXRlXG4gICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodGhpcy5fZWxlbWVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFJlZiBvYmplY3Qgb3IgY2FsbHMgYSByZWYgY2FsbGJhY2sgd2l0aCB0aGUgZWxlbWVudCBpdCdzXG4gKiBib3VuZCB0by5cbiAqXG4gKiBBIFJlZiBvYmplY3QgYWN0cyBhcyBhIGNvbnRhaW5lciBmb3IgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC4gQSByZWZcbiAqIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlbGVtZW50IGFzIGl0cyBvbmx5IGFyZ3VtZW50LlxuICpcbiAqIFRoZSByZWYgZGlyZWN0aXZlIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBSZWYgb2JqZWN0IG9yIGNhbGxzIHRoZSByZWYgY2FsbGJhY2tcbiAqIGR1cmluZyByZW5kZXJpbmcsIGlmIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgY2hhbmdlZC5cbiAqXG4gKiBOb3RlOiBJZiBhIHJlZiBjYWxsYmFjayBpcyByZW5kZXJlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50IHBvc2l0aW9uIG9yIGlzXG4gKiByZW1vdmVkIGluIGEgc3Vic2VxdWVudCByZW5kZXIsIGl0IHdpbGwgZmlyc3QgYmUgY2FsbGVkIHdpdGggYHVuZGVmaW5lZGAsXG4gKiBmb2xsb3dlZCBieSBhbm90aGVyIGNhbGwgd2l0aCB0aGUgbmV3IGVsZW1lbnQgaXQgd2FzIHJlbmRlcmVkIHRvIChpZiBhbnkpLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBVc2luZyBSZWYgb2JqZWN0XG4gKiBjb25zdCBpbnB1dFJlZiA9IGNyZWF0ZVJlZigpO1xuICogcmVuZGVyKGh0bWxgPGlucHV0ICR7cmVmKGlucHV0UmVmKX0+YCwgY29udGFpbmVyKTtcbiAqIGlucHV0UmVmLnZhbHVlLmZvY3VzKCk7XG4gKlxuICogLy8gVXNpbmcgY2FsbGJhY2tcbiAqIGNvbnN0IGNhbGxiYWNrID0gKGlucHV0RWxlbWVudCkgPT4gaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gKiByZW5kZXIoaHRtbGA8aW5wdXQgJHtyZWYoY2FsbGJhY2spfT5gLCBjb250YWluZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCByZWYgPSBkaXJlY3RpdmUoUmVmRGlyZWN0aXZlKTtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgdGhhdCBwb3dlcnMgdGhpcyBkaXJlY3RpdmUuIE5lY2Vzc2FyeSBmb3IgbmFtaW5nIHRoZVxuICogZGlyZWN0aXZlJ3MgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIHtSZWZEaXJlY3RpdmV9O1xuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgfVxuICBbcGFydD0nY29ycmVjdCddIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEuMXJlbTtcbiAgICBtaW4td2lkdGg6IDEuMXJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyLjNyZW07XG4gICAgbWluLXdpZHRoOiAyLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMy4zcmVtO1xuICAgIG1pbi13aWR0aDogMy4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQuMnJlbTtcbiAgICBtaW4td2lkdGg6IDQuMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA2LjZyZW07XG4gICAgbWluLXdpZHRoOiA2LjZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDhyZW07XG4gICAgbWluLXdpZHRoOiA4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxMnJlbTtcbiAgICBtaW4td2lkdGg6IDEycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxN3JlbTtcbiAgICBtaW4td2lkdGg6IDE3cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBtaW4td2lkdGg6IDIwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyNHJlbTtcbiAgICBtaW4td2lkdGg6IDI0cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyOHJlbTtcbiAgICBtaW4td2lkdGg6IDI4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzMnJlbTtcbiAgICBtaW4td2lkdGg6IDMycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00NSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzNnJlbTtcbiAgICBtaW4td2lkdGg6IDM2cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC01MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0MHJlbTtcbiAgICBtaW4td2lkdGg6IDQwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC03MikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA1N3JlbTtcbiAgICBtaW4td2lkdGg6IDU3cmVtO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgaW5wdXRSZWYgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaWYgdGhlIGlucHV0IGlzIHZhbGlkXG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpOyAvLyBDbGVhciB0aGUgY3VzdG9tIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBlcnJvciBpZiBpbnZhbGlkXG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7IGN1c3RvbUVycm9yOiB0cnVlIH0sIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7IC8vIFNldCBjdXN0b20gbWVzc2FnZSBvbmx5IGlmIGludmFsaWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJyAmJiBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8aW5wdXRcbiAgICAgICAgcGFydD1cImlucHV0XCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfX1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIG1heGxlbmd0aD0kezEwMDB9XG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb3JyZWN0XCI+JHt0aGlzLl9jb3JyZWN0UmVzcG9uc2V9PC9kaXY+XG4gICAgYDtcbiAgfVxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJ1biB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgaXMgdXAgdG8gZGF0ZVxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICBpbnB1dC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nOiBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbmltcG9ydCB7IENob2ljZUludGVyZmFjZSB9IGZyb20gJy4uL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IHR5cGUgQ2hvaWNlID0gSFRNTEVsZW1lbnQgJiBDaG9pY2VJbnRlcmZhY2UgJiB7IGludGVybmFsczogRWxlbWVudEludGVybmFscyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZXNJbnRlcmZhY2UgZXh0ZW5kcyBJSW50ZXJhY3Rpb24ge1xuICBjb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgQ2hvaWNlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgQ2hvaWNlc01peGluRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBDaG9pY2VzSW50ZXJmYWNlIHtcbiAgICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRzOiBDaG9pY2VbXSA9IFtdO1xuXG4gICAgQHF1ZXJ5KCcjdmFsaWRhdGlvbk1lc3NhZ2UnKVxuICAgIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcycgfSlcbiAgICBwdWJsaWMgbWluQ2hvaWNlcyA9IDA7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21heC1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtYXhDaG9pY2VzID0gMTtcblxuICAgIEB3YXRjaCgnbWF4Q2hvaWNlcycsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgX2hhbmRsZU1heENob2ljZXNDaGFuZ2UoX29sZFZhbHVlOiBudW1iZXIsIF9uZXdWYWx1ZTogbnVtYmVyKSB7XG4gICAgICB0aGlzLl9kZXRlcm1pbmVJbnB1dFR5cGUoKTtcbiAgICB9XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgICB9O1xuXG4gICAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiAoY2hvaWNlLnJlYWRvbmx5ID0gcmVhZG9ubHkpKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpID8gdGhpcy5fdmFsdWUuam9pbignLCcpIDogdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPiAxICYmIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsLnNwbGl0KCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtaW5nIHRoaXMudmFsdWUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlLmZvckVhY2gocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhpcy52YWx1ZSBpcyBub3QgYW4gYXJyYXlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLl91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlQXJyYXkuaW5jbHVkZXMoY2hvaWNlLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2NvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCdpbmNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBzZWxlY3RlZENob2ljZXMubGVuZ3RoO1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuICAgICAgbGV0IHZhbGlkaXR5TWVzc2FnZSA9ICcnO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyAhPT0gMCAmJiBzZWxlY3RlZENvdW50ID4gdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlNZXNzYWdlID0gdGhpcy5kYXRhc2V0Lm1heFNlbGVjdGlvbnNNZXNzYWdlIHx8IGBZb3UgY2FuIHNlbGVjdCBhdCBtb3N0ICR7dGhpcy5tYXhDaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ291bnQgPCB0aGlzLm1pbkNob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWluU2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBtdXN0IHNlbGVjdCBhdCBsZWFzdCAke3RoaXMubWluQ2hvaWNlc30gY2hvaWNlcy5gO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KFxuICAgICAgICAgIGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IHRydWUgfSxcbiAgICAgICAgICB2YWxpZGl0eU1lc3NhZ2UsXG4gICAgICAgICAgc2VsZWN0ZWRDaG9pY2VzW3NlbGVjdGVkQ291bnQgLSAxXSB8fCB0aGlzLl9jaG9pY2VFbGVtZW50c1swXSB8fCB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICAgIGlmICh0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQpIHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLl9pbnRlcm5hbHMudmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICBjaG9pY2VFbGVtZW50LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcblxuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMucHVzaChjaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gY2hvaWNlICE9PSBjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZXRlcm1pbmVJbnB1dFR5cGUoKSB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQ6IENob2ljZSkge1xuICAgICAgdGhpcy5faW50ZXJuYWxzLmFyaWFMYWJlbCA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/ICdyYWRpby1ncm91cCcgOiAnY2hlY2tib3gtZ3JvdXAnO1xuXG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5yb2xlID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvJyA6ICdjaGVja2JveCc7XG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5zdGF0ZXMuYWRkKGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcihldmVudDogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4pIHtcbiAgICAgIHRoaXMuX3RvZ2dsZUNob2ljZUNoZWNrZWQoZXZlbnQudGFyZ2V0IGFzIENob2ljZSk7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgICBpZiAoY2hvaWNlLmlkZW50aWZpZXIgIT09IGV2ZW50LmRldGFpbC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9oYW5kbGVDaG9pY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlLCBjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICBpZiAoY2hvaWNlLmludGVybmFscz8uc3RhdGVzKSB7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnLS1jaGVja2VkJyk7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gY2hvaWNlLmludGVybmFscy5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90b2dnbGVDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlKSB7XG4gICAgICBjb25zdCBjaGVja2VkID0gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpO1xuICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsICFjaGVja2VkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZENob2ljZXMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZElkZW50aWZpZXJzID0gc2VsZWN0ZWRDaG9pY2VzLm1hcChjaG9pY2UgPT4gY2hvaWNlLmlkZW50aWZpZXIpO1xuXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gc2VsZWN0ZWRJZGVudGlmaWVyc1swXSB8fCAnJyA6IHNlbGVjdGVkSWRlbnRpZmllcnM7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggY2hvaWNlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVzcG9uc2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdXBkYXRlQ2hvaWNlU2VsZWN0aW9uKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpID8gdGhpcy5fdmFsdWUgOiBbdGhpcy5fdmFsdWVdO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gcmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcik7XG4gICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBpc1NlbGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQ2hvaWNlc01peGluRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxDaG9pY2VzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90dGV4dCcpIHtcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nLCAnJyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYDxzbG90Pjwvc2xvdD5gO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dC1pbnRlcmFjdGlvbic6IFF0aUhvdHRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5pbXBvcnQge25vdGhpbmcsIFRlbXBsYXRlUmVzdWx0LCBub0NoYW5nZX0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtkaXJlY3RpdmUsIERpcmVjdGl2ZSwgUGFydEluZm8sIFBhcnRUeXBlfSBmcm9tICcuLi9kaXJlY3RpdmUuanMnO1xuXG5jb25zdCBIVE1MX1JFU1VMVCA9IDE7XG5cbmV4cG9ydCBjbGFzcyBVbnNhZmVIVE1MRGlyZWN0aXZlIGV4dGVuZHMgRGlyZWN0aXZlIHtcbiAgc3RhdGljIGRpcmVjdGl2ZU5hbWUgPSAndW5zYWZlSFRNTCc7XG4gIHN0YXRpYyByZXN1bHRUeXBlID0gSFRNTF9SRVNVTFQ7XG5cbiAgcHJpdmF0ZSBfdmFsdWU6IHVua25vd24gPSBub3RoaW5nO1xuICBwcml2YXRlIF90ZW1wbGF0ZVJlc3VsdD86IFRlbXBsYXRlUmVzdWx0O1xuXG4gIGNvbnN0cnVjdG9yKHBhcnRJbmZvOiBQYXJ0SW5mbykge1xuICAgIHN1cGVyKHBhcnRJbmZvKTtcbiAgICBpZiAocGFydEluZm8udHlwZSAhPT0gUGFydFR5cGUuQ0hJTEQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7XG4gICAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFVuc2FmZUhUTUxEaXJlY3RpdmUpLmRpcmVjdGl2ZU5hbWVcbiAgICAgICAgfSgpIGNhbiBvbmx5IGJlIHVzZWQgaW4gY2hpbGQgYmluZGluZ3NgXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcih2YWx1ZTogc3RyaW5nIHwgdHlwZW9mIG5vdGhpbmcgfCB0eXBlb2Ygbm9DaGFuZ2UgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlID09PSBub3RoaW5nIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlUmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuICh0aGlzLl92YWx1ZSA9IHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBub0NoYW5nZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke1xuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKS5kaXJlY3RpdmVOYW1lXG4gICAgICAgIH0oKSBjYWxsZWQgd2l0aCBhIG5vbi1zdHJpbmcgdmFsdWVgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVSZXN1bHQ7XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgY29uc3Qgc3RyaW5ncyA9IFt2YWx1ZV0gYXMgdW5rbm93biBhcyBUZW1wbGF0ZVN0cmluZ3NBcnJheTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIChzdHJpbmdzIGFzIGFueSkucmF3ID0gc3RyaW5ncztcbiAgICAvLyBXQVJOSU5HOiBpbXBlcnNvbmF0aW5nIGEgVGVtcGxhdGVSZXN1bHQgbGlrZSB0aGlzIGlzIGV4dHJlbWVseVxuICAgIC8vIGRhbmdlcm91cy4gVGhpcmQtcGFydHkgZGlyZWN0aXZlcyBzaG91bGQgbm90IGRvIHRoaXMuXG4gICAgcmV0dXJuICh0aGlzLl90ZW1wbGF0ZVJlc3VsdCA9IHtcbiAgICAgIC8vIENhc3QgdG8gYSBrbm93biBzZXQgb2YgaW50ZWdlcnMgdGhhdCBzYXRpc2Z5IFJlc3VsdFR5cGUgc28gdGhhdCB3ZVxuICAgICAgLy8gZG9uJ3QgaGF2ZSB0byBleHBvcnQgUmVzdWx0VHlwZSBhbmQgcG9zc2libHkgZW5jb3VyYWdlIHRoaXMgcGF0dGVybi5cbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICBbJ18kbGl0VHlwZSQnXTogKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFVuc2FmZUhUTUxEaXJlY3RpdmUpXG4gICAgICAgIC5yZXN1bHRUeXBlIGFzIDEgfCAyLFxuICAgICAgc3RyaW5ncyxcbiAgICAgIHZhbHVlczogW10sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSByZXN1bHQgYXMgSFRNTCwgcmF0aGVyIHRoYW4gdGV4dC5cbiAqXG4gKiBUaGUgdmFsdWVzIGB1bmRlZmluZWRgLCBgbnVsbGAsIGFuZCBgbm90aGluZ2AsIHdpbGwgYWxsIHJlc3VsdCBpbiBubyBjb250ZW50XG4gKiAoZW1wdHkgc3RyaW5nKSBiZWluZyByZW5kZXJlZC5cbiAqXG4gKiBOb3RlLCB0aGlzIGlzIHVuc2FmZSB0byB1c2Ugd2l0aCBhbnkgdXNlci1wcm92aWRlZCBpbnB1dCB0aGF0IGhhc24ndCBiZWVuXG4gKiBzYW5pdGl6ZWQgb3IgZXNjYXBlZCwgYXMgaXQgbWF5IGxlYWQgdG8gY3Jvc3Mtc2l0ZS1zY3JpcHRpbmdcbiAqIHZ1bG5lcmFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuc2FmZUhUTUwgPSBkaXJlY3RpdmUoVW5zYWZlSFRNTERpcmVjdGl2ZSk7XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgICBzbG90IHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgW3JvbGU9J21lbnUnXSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgLyogYW5jaG9yLW5hbWU6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb25lZEVsZW1lbnQge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAvKiBwb3NpdGlvbi1hbmNob3I6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICAvKiB0b3A6IGFuY2hvcihib3R0b20pOyAqL1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXRXaWR0aENsYXNzID0gW1xuICAgICcnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTMnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC02JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTE1JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTIwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTcyJ1xuICBdO1xuXG4gIEBzdGF0ZSgpIG9wdGlvbnM6IE9wdGlvblR5cGVbXSA9IFtdO1xuXG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb246IHN0cmluZyA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGEtcHJvbXB0JywgdHlwZTogU3RyaW5nIH0pXG4gIGRhdGFQcm9tcHQ6IHN0cmluZyA9ICdzZWxlY3QnO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzZWxlY3QgcGFydD1cInNlbGVjdFwiIEBjaGFuZ2U9XCIke3RoaXMuY2hvaWNlU2VsZWN0ZWR9XCIgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIj5cbiAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKFxuICAgICAgICAgIG9wdGlvbiA9PiBodG1sYFxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiID9zZWxlY3RlZD1cIiR7b3B0aW9uLnNlbGVjdGVkfVwiPiR7dW5zYWZlSFRNTChvcHRpb24udGV4dENvbnRlbnQpfTwvb3B0aW9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAke3Vuc2FmZUhUTUwodGhpcy5jb3JyZWN0T3B0aW9uKX1cbiAgICBgO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW5saW5lLWNob2ljZScpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHRDb250ZW50OiB0aGlzLmRhdGFQcm9tcHQsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uY2hvaWNlcy5tYXAoY2hvaWNlID0+ICh7XG4gICAgICAgIHRleHRDb250ZW50OiBjaG9pY2UuaW5uZXJIVE1MLFxuICAgICAgICB2YWx1ZTogY2hvaWNlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0pKVxuICAgIF07XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gJycgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvcHRpb24sIGkpID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IGkgPT09IDAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLnZhbHVlO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gYDxzcGFuIHBhcnQ9XCJjb3JyZWN0LW9wdGlvblwiPiR7XG4gICAgICB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gdmFsdWUgPT09IG9wdGlvbi52YWx1ZSkudGV4dENvbnRlbnRcbiAgICB9PC9zcGFuPmA7XG4gIH1cblxuICBwdWJsaWMgY2hvaWNlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IG9wdGlvbi52YWx1ZSA9PT0gc2VsZWN0ZWRPcHRpb25WYWx1ZSB9KSk7XG4gICAgdGhpcy5zYXZlUmVzcG9uc2Uoc2VsZWN0ZWRPcHRpb25WYWx1ZSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgU2h1ZmZsZUludGVyZmFjZSB7fVxuZXhwb3J0IGNvbnN0IFNodWZmbGVNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNodWZmbGVFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfc2h1ZmZsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBjb252ZXJ0ZXI6IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgc2V0IHNodWZmbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2h1ZmZsZTtcbiAgICAgIHRoaXMuX3NodWZmbGUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCdzaHVmZmxlJywgb2xkVmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBzaHVmZmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3NodWZmbGU7XG4gICAgfVxuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgLy8gQ2FsbCBfcmVzZXRTaHVmZmxlQ2hvaWNlcyBpbml0aWFsbHkgdG8gc2V0IHRoZSBDU1Mgb3JkZXIgdG8gaW5pdGlhbC5cbiAgICAgIC8vIElmIHNodWZmbGUgaXMgdHJ1ZSwgX3NodWZmbGVDaG9pY2VzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBzZXR0ZXIuXG4gICAgICBpZiAodGhpcy5zaHVmZmxlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKSk7XG4gICAgICBjb25zdCBmaXhlZEVsZW1lbnRzOiBBcnJheTx7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgICBjb25zdCBub25GaXhlZEVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcblxuICAgICAgLy8gU2VwYXJhdGUgZml4ZWQgYW5kIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgZml4ZWRFbGVtZW50cy5wdXNoKHsgZWxlbWVudDogY2hvaWNlLCBpbmRleDogaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uRml4ZWRFbGVtZW50cy5wdXNoKGNob2ljZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgMSBvciBmZXdlciBub24tZml4ZWQgZWxlbWVudHMsIHRocm93IGFuIGVycm9yIChubyBzaHVmZmxlIHBvc3NpYmxlKVxuICAgICAgaWYgKG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaHVmZmxpbmcgaXMgbm90IHBvc3NpYmxlIHdpdGggZmV3ZXIgdGhhbiAyIG5vbi1maXhlZCBlbGVtZW50cy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNTaHVmZmxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDsgLy8gTWF4IGF0dGVtcHRzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgb3JkZXIgZm9yIGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IG9yaWdpbmFsT3JkZXIgPSBbLi4ubm9uRml4ZWRFbGVtZW50c107XG5cbiAgICAgIC8vIFNodWZmbGUgdW50aWwgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgb3IgbWF4QXR0ZW1wdHMgaXMgcmVhY2hlZFxuICAgICAgd2hpbGUgKCFpc1NodWZmbGVkICYmIGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgLy8gU2h1ZmZsZSBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICBbbm9uRml4ZWRFbGVtZW50c1tpXSwgbm9uRml4ZWRFbGVtZW50c1tqXV0gPSBbbm9uRml4ZWRFbGVtZW50c1tqXSwgbm9uRml4ZWRFbGVtZW50c1tpXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2h1ZmZsZWQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvcmRlclxuICAgICAgICBpc1NodWZmbGVkID0gIW5vbkZpeGVkRWxlbWVudHMuZXZlcnkoKGNob2ljZSwgaW5kZXgpID0+IGNob2ljZSA9PT0gb3JpZ2luYWxPcmRlcltpbmRleF0pO1xuXG4gICAgICAgIGlmIChpc1NodWZmbGVkKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1NodWZmbGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNodWZmbGUgdGhlIGNob2ljZXMgYWZ0ZXIgbXVsdGlwbGUgYXR0ZW1wdHMuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzc2lnbiBvcmRlciB0byBlYWNoIGVsZW1lbnRcbiAgICAgIGxldCBvcmRlciA9IDE7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9uRml4ZWRDaG9pY2UgPSBub25GaXhlZEVsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgbm9uRml4ZWRDaG9pY2UhLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCAnaW5pdGlhbCcpOyAvLyBjaG9pY2Uuc3R5bGUub3JkZXIgPSAnaW5pdGlhbCc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNodWZmbGVFbGVtZW50IGFzIENvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVDtcbn07XG5cbmNvbnN0IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlciA9IHtcbiAgZnJvbUF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICB9LFxuICB0b0F0dHJpYnV0ZSh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxufTtcbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxudHlwZSBMYWJlbFR5cGUgPSAncXRpLWxhYmVscy1kZWNpbWFsJyB8ICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJyB8ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbnR5cGUgTGFiZWxTdWZmaXhUeXBlID0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcgfCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnO1xuXG5kZWNsYXJlIGNsYXNzIFZvY2FidWxhcnlJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IFZvY2FidWxhcnlNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFZvY2FidWxhcnlFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbHMgPSBbJ3F0aS1sYWJlbHMtZGVjaW1hbCcsICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJywgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbFN1ZmZpeGVzID0gWydxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnLCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnXSBhcyBMYWJlbFN1ZmZpeFR5cGVbXTtcbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZVxuICAgIH0pXG4gICAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9jbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHRoaXMuX2NsYXNzZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuXG4gICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIC8vIHRoaXMucmVxdWVzdFVwZGF0ZSgnY2xhc3MnLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXM/LmpvaW4oJyAnKSB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7XG4gICAgICBzdXBlci51cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoX2NoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2h1ZmZsZScpKSB7XG4gICAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZExhYmVscygpIHtcbiAgICAgIGNvbnN0IGNsYXNzQ29udGFpbnNMYWJlbCA9IHRoaXMuX2NsYXNzZXMuc29tZShcbiAgICAgICAgY2xzID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjbHMpIHx8IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoY2xzIGFzIExhYmVsU3VmZml4VHlwZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBpc051bWJlciA9IHZhbHVlID0+IHtcbiAgICAgICAgcmV0dXJuICFpc05hTigrdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIGlmIChjbGFzc0NvbnRhaW5zTGFiZWwpIHtcbiAgICAgICAgY29uc3QgY2hvaWNlRWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSkubWFwKGMgPT4gYyBhcyBRdGlTaW1wbGVDaG9pY2UpO1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gY2hvaWNlRWxlbWVudHNcbiAgICAgICAgICAubWFwKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgZWw6IGNob2ljZSwgb3JkZXI6IGlzTnVtYmVyKGNob2ljZS5zdHlsZS5vcmRlcikgPyArY2hvaWNlLnN0eWxlLm9yZGVyIDogaW5kZXggKyAxIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpXG4gICAgICAgICAgLm1hcChjaG9pY2UgPT4gY2hvaWNlLmVsKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgKGNob2ljZXNbaV0gYXMgUXRpU2ltcGxlQ2hvaWNlKS5tYXJrZXIgPSB0aGlzLl9nZXRMYWJlbChpICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWwoaW5kZXg6IG51bWJlcikge1xuICAgICAgbGV0IGxhc3RMYWJlbCA9IHRoaXMuX2NsYXNzZXMuZmlsdGVyKGMgPT4gdGhpcy5fYWxsTGFiZWxzLmluY2x1ZGVzKGMpKS5wb3AoKSBhcyBMYWJlbFR5cGU7XG4gICAgICBjb25zdCBsYXN0TGFiZWxTdWZmaXggPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoYyBhcyBMYWJlbFN1ZmZpeFR5cGUpKS5wb3AoKTtcblxuICAgICAgaWYgKCFsYXN0TGFiZWwgJiYgbGFzdExhYmVsU3VmZml4KSB7XG4gICAgICAgIC8vIGEgc3VmZml4IHdpdGhvdXQgYSBsYWJlbCBpcyBzdHJhbmdlIHNvIGFkZCBxdGktbGFiZWxzLXVwcGVyLWFscGhhXG4gICAgICAgIGxhc3RMYWJlbCA9ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbiAgICAgIH1cbiAgICAgIGxldCBsYWJlbCA9ICcnO1xuICAgICAgc3dpdGNoIChsYXN0TGFiZWwpIHtcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1kZWNpbWFsJzpcbiAgICAgICAgICBsYWJlbCA9IGAke2luZGV4fWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcpIHtcbiAgICAgICAgbGFiZWwgKz0gJy4nO1xuICAgICAgfSBlbHNlIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcycpIHtcbiAgICAgICAgbGFiZWwgKz0gYClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gVm9jYWJ1bGFyeUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Vm9jYWJ1bGFyeUludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIFtwYXJ0PSdzbG90J10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLXF0aS1nYXAtc2l6ZSk7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG5cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtY2hvaWNlKSB7XG4gICAgZmxleDogMCAwXG4gICAgICBjYWxjKCgxMDAlIC0gKHZhcigtLXF0aS1nYXAtc2l6ZSkgKiB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkpIC8gdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpICFpbXBvcnRhbnQ7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTEpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAxO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTIpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAyO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0zKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNCkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDQ7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTUpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA1O1xuICB9XG4gIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG5gO1xuIiwgImltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNJbnRlcmZhY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nO1xuaW1wb3J0IHsgVm9jYWJ1bGFyeU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuZXhwb3J0IHR5cGUgT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnIHwgdW5kZWZpbmVkO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQ2hvaWNlSW50ZXJhY3Rpb25cbiAgZXh0ZW5kcyBWb2NhYnVsYXJ5TWl4aW4oXG4gICAgU2h1ZmZsZU1peGluKENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksICdxdGktc2ltcGxlLWNob2ljZScpLFxuICAgICdxdGktc2ltcGxlLWNob2ljZSdcbiAgKVxuICBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2VcbntcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMucm9sZSA9ICdncm91cCc7XG4gIH1cblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiBPcmllbnRhdGlvbjtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PjxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBpZD1cInZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY2hvaWNlLWludGVyYWN0aW9uJzogUXRpQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtcHJvY2Vzc2luZycpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IGxvZ2ljID0gbmV3IFF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yKCk7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuICAgIGxvZ2ljLnByb2Nlc3MocnVsZXMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnOiBRdGlPdXRjb21lUHJvY2Vzc2luZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3Ige1xuICBwdWJsaWMgcHJvY2VzcyhydWxlczogUXRpUnVsZUJhc2VbXSkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG1hdGNoQ29ycmVjdCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLW1hdGNoPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgICA8cXRpLWNvcnJlY3QgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktY29ycmVjdD5cbiAgICAgIDwvcXRpLW1hdGNoPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MTwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wLjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+IDwvcXRpLW1hcC1yZXNwb25zZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlUG9pbnQgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UtcG9pbnQgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktbWFwLXJlc3BvbnNlLXBvaW50PlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBtYXBSZXNwb25zZSwgbWFwUmVzcG9uc2VQb2ludCwgbWF0Y2hDb3JyZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncyc7XG5pbXBvcnQgeyB0eXBlIFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHJ1bGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcblxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykpIHtcbiAgICAgIGNvbnN0IHNwbGl0dGVkVGVtcGxhdGVOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykhLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBzcGxpdHRlZFRlbXBsYXRlTmFtZVtzcGxpdHRlZFRlbXBsYXRlTmFtZS5sZW5ndGggLSAxXS5yZXBsYWNlKCcueG1sJywgJycpO1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN3aXRjaCAodGVtcGxhdGVOYW1lKSB7XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZSc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlKS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlX3BvaW50Jzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2VQb2ludCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hdGNoX2NvcnJlY3QnOlxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWF0Y2hDb3JyZWN0KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmcmFnbWVudEZyb21TdHJpbmcoc3RySFRNTDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0ckhUTUwpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJzogUXRpUmVzcG9uc2VQcm9jZXNzaW5nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1bGUnKVxuZXhwb3J0IGNsYXNzIFF0aVJ1bGUgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgUXRpUnVsZUJhc2Uge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpUnVsZUJhc2Uge1xuICBwcm9jZXNzKCk6IGFueTtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1bGUnOiBRdGlSdWxlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnQGNpdG9sYWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG4vKipcbiAqIFRoZSBsb29rdXBPdXRjb21lVmFsdWUgcnVsZSBzZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRjb21lIHZhcmlhYmxlIHRvIHRoZSB2YWx1ZSBvYnRhaW5lZFxuICogYnkgbG9va2luZyB1cCB0aGUgdmFsdWUgb2YgdGhlIGFzc29jaWF0ZWQgZXhwcmVzc2lvbiBpbiB0aGUgbG9va3VwVGFibGUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGUgb3V0Y29tZSdzIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXRpTG9va3VwT3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgZ2V0IGNoaWxkRXhwcmVzc2lvbigpOiBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgT3V0Y29tZVZhcmlhYmxlO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAob3V0Y29tZVZhcmlhYmxlLmludGVycG9sYXRpb25UYWJsZSkge1xuICAgICAgdmFsdWUgPSBvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlLmdldChwYXJzZUludCh0aGlzLmNoaWxkRXhwcmVzc2lvbi5jYWxjdWxhdGUoKSkpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdsb29rdXBPdXRjb21lVmFsdWU6IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnLCBRdGlMb29rdXBPdXRjb21lVmFsdWUpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnOiBRdGlMb29rdXBPdXRjb21lVmFsdWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VDb25kaXRpb24gZXh0ZW5kcyBRdGlSdWxlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5jYWxjdWxhdGUoKSkge1xuICAgICAgICAoYnJhbmNoIGFzIHVua25vd24gYXMgUXRpUnVsZSkucHJvY2VzcygpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtY29uZGl0aW9uJywgUXRpUmVzcG9uc2VDb25kaXRpb24pO1xuIiwgImltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlLCBRdGlSdWxlQmFzZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZSBleHRlbmRzIFF0aVJ1bGUge1xuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBvdXRjb21lSWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPHN0cmluZz47XG5cbiAgICBjb25zdCBydWxlID0gbmV3IFF0aVNldE91dGNvbWVWYWx1ZVJ1bGUoZXhwcmVzc2lvbik7XG4gICAgY29uc3QgdmFsdWUgPSBydWxlLnByb2Nlc3MoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgPyB2YWx1ZS5tYXAoKHY6IHN0cmluZykgPT4gY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodikpXG4gICAgICAgICAgICA6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZVJ1bGU8VD4gaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbjogUXRpRXhwcmVzc2lvbkJhc2U8VD4pIHt9XG5cbiAgcHJvY2VzcygpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uID8gdGhpcy5leHByZXNzaW9uLmNhbGN1bGF0ZSgpIDogbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3NldE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXNldC1vdXRjb21lLXZhbHVlJywgUXRpU2V0T3V0Y29tZVZhbHVlKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBzdWJSdWxlcyA9IHRoaXMuZ2V0U3ViUnVsZXMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJSdWxlID0gc3ViUnVsZXNbaV07XG4gICAgICBzdWJSdWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZScsIFF0aVJlc3BvbnNlRWxzZSk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi8uLi9xdGktcnVsZS9xdGktcnVsZSc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUVsc2UgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtZWxzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VFbHNlIHtcbiAgcHVibGljIG92ZXJyaWRlIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1pZicsIFF0aVJlc3BvbnNlSWYpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VJZiB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1pZic7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlSWYge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWVsc2UtaWYnLCBRdGlSZXNwb25zZUVsc2VJZik7XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IGl0ZW1Db250ZXh0LCBJdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU11bHRpcGxlIH0gZnJvbSAnLi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlJztcblxuZXhwb3J0IGludGVyZmFjZSBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIC8vIGdldCBhc3Nlc3NtZW50SXRlbSgpOiBRdGlBc3Nlc3NtZW50SXRlbTtcblxuICAvLyBnZXRWYXJpYWJsZXMoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXTtcbiAgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRXhwcmVzc2lvbjxUPiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCByZXN1bHQ6IGFueTtcblxuICAvLyBoaWRlIHRoZSBzbG90IHdpdGggY3NzXG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgc2xvdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHByZT4ke0pTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LCBudWxsLCAyKX08L3ByZT5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXN1bHQoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBnZXRWYXJpYWJsZXMgPSAoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXSA9PlxuICAgIC8vIEZJWE1FOiBpZiB0aGlzIGl0c2VsZiBpcyBtdWx0aXBsZSwgdGhpcyB3aWxsIG5ldmVyIGVudGVyIHRoZSBxdGktbXVsdGlwbGUgc3dpdGNoXG4gICAgLy8gU2VlIHRoaXMgZXhhbXBsZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vMUVkVGVjaC9xdGktZXhhbXBsZXMvYmxvYi9tYXN0ZXIvcXRpdjMtZXhhbXBsZXMvcGFja2FnaW5nL2l0ZW1zL0V4YW1wbGUwNS1mZWVkYmFja0Jsb2NrLWFkYXB0aXZlLnhtbFxuXG4gICAgQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKVxuICAgICAgLm1hcCgoZTogRWxlbWVudCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAncXRpLWJhc2UtdmFsdWUnOiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogZS5nZXRBdHRyaWJ1dGUoJ2Jhc2UtdHlwZScpLFxuICAgICAgICAgICAgICB2YWx1ZTogZS50ZXh0Q29udGVudC50cmltKCksXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJ1xuICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktdmFyaWFibGUnOiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktbXVsdGlwbGUnOiB7XG4gICAgICAgICAgICBjb25zdCBtdWx0aXBsZSA9IGUgYXMgUXRpTXVsdGlwbGU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBtdWx0aXBsZS5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiB2YWx1ZXNbMF0uYmFzZVR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlcy5tYXAodiA9PiB2LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ211bHRpcGxlJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktY29ycmVjdCc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiByZXNwb25zZVZhcmlhYmxlLmJhc2VUeXBlLFxuICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiByZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5XG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIGFkZGVkIGZvciB1c2Ugb2YgcXRpLWVxdWFsLXJvdW5kZWRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBlIGFzIFF0aUV4cHJlc3Npb248bnVtYmVyPjtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBleHByZXNzaW9uLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignZGVmYXVsdCBub3Qgc3VmZmljaWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwpO1xufVxuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXN1bHQoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IGNsYXNzIFF0aUFuZCBleHRlbmRzIHF0aUFuZE1peGluKFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxRdGlDb25kaXRpb25FeHByZXNzaW9uPikge1xuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNoaWxkcmVuKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb248YW55PltdKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTW9ja1F0aUV4cHJlc3Npb248VD4gPSB7IGNhbGN1bGF0ZTogKCkgPT4gVCB9O1xudHlwZSBNb2NrQ29uc3RydWN0b3IgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiB7fTtcbmV4cG9ydCBmdW5jdGlvbiBxdGlBbmRNaXhpbjxUQmFzZSBleHRlbmRzIE1vY2tDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgcmV0dXJuIGNsYXNzIE1vY2tRdGlBbmQgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgY2FsY3VsYXRlQ2hpbGRyZW4oY2hpbGRyZW46IEFycmF5PE1vY2tRdGlFeHByZXNzaW9uPGFueT4+KSB7XG4gICAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgICAgY29uc3QgdmFsdWVzID0gY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIE1vY2tRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCk7XG4gICAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYm9vbGVhbiBhbmQgcmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHZhbCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZXMuZXZlcnkoZSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgUXRpQW5kIH0gZnJvbSAnLi9xdGktYW5kJztcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWFuZCcsIFF0aUFuZCk7XG5cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWFuZCc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hbmQnOiBRdGlBbmQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlCYXNlVmFsdWUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlID0gJ3N0cmluZyc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWJhc2UtdmFsdWUnLCBRdGlCYXNlVmFsdWUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUNvbnRhaW5zIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgZm9yIG90aGVyIHR5cGVzIHRoYW4gZGlyZWN0ZWRQYWlyXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBwcm9qZWN0aW9uMS5maWx0ZXIoeCA9PiBwcm9qZWN0aW9uMi5pbmNsdWRlcyh4KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW51bWVyYWJsZS5sZW5ndGggPiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAndW5zdXBwb3J0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGNvbnRhaW5zLCBvbmx5IGJhc2VUeXBlOiBkaXJlY3RlZFBhaXIgYW5kIGNhcmRpbmFsaXR5OiBtdWx0aXBsZSBpcyBzdXBwb3J0ZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBjb250YWlucycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29udGFpbnMnLCBRdGlDb250YWlucyk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlDb3JyZWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBnZXQgaW50ZXJwcmV0YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdpbnRlcnByZXRhdGlvbicpIHx8ICcnO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgaWYgKHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UubGVuZ3RoID4gMCA/IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlWzBdIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29ycmVjdCcsIFF0aUNvcnJlY3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWxSb3VuZGVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSByb3VuZGluZ01vZGU6ICdkZWNpbWFsUGxhY2VzJyB8ICdzaWduaWZpY2FudEZpZ3VyZXMnID0gJ3NpZ25pZmljYW50RmlndXJlcyc7XG5cbiAgZ2V0IGZpZ3VyZXMoKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJyk7XG4gICAgaWYgKCFhdHRyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBtaXNzaW5nJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlndXJlcyA9IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJykgfHwgJzAnKTtcbiAgICBpZiAoaXNOYU4oZmlndXJlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMCkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbmVnYXRpdmUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDEgJiYgdGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSBmb3IgUm91bmRpbmdNb2RlIHNpZ25pZmljYW50RmlndXJlcycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaWd1cmVzO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodmFsdWVzWzBdLmJhc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyLnZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0MS50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpID09PSBmbG9hdDIudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDEgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSA9PT1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MiAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlIGNhbm5vdCBiZSBjYXN0ZWQgdG8gbnVtZXJpYyB2YWx1ZSBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3I6ICR7ZmxvYXQxfSwgJHtmbG9hdDJ9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZXMgb3RoZXIgdGhhbiBmbG9hdCBhbmQgaW50IGNhbm5vdCBiZSB1c2VkIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvci5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwtcm91bmRlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsLXJvdW5kZWQnLCBRdGlFcXVhbFJvdW5kZWQpO1xuIiwgImltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY2xhc3MgU2NvcmluZ0hlbHBlciB7XG4gIHB1YmxpYyBzdGF0aWMgY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTE6IFJlYWRvbmx5PHN0cmluZz4sIHZhbHVlMjogUmVhZG9ubHk8c3RyaW5nPiwgYmFzZVR5cGU6IEJhc2VUeXBlKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChiYXNlVHlwZSkge1xuICAgICAgY2FzZSAnaWRlbnRpZmllcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gdmFsdWUxID09PSB2YWx1ZTI7XG4gICAgICBjYXNlICdpbnRlZ2VyJzoge1xuICAgICAgICBjb25zdCBpbnQxID0gcGFyc2VJbnQodmFsdWUxLCAxMCk7XG4gICAgICAgIGNvbnN0IGludDIgPSBwYXJzZUludCh2YWx1ZTIsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihpbnQxKSAmJiAhaXNOYU4oaW50MikpIHtcbiAgICAgICAgICByZXR1cm4gaW50MSA9PT0gaW50MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBpbnQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgY29uc3QgZmxvYXQxID0gcGFyc2VGbG9hdCh2YWx1ZTEpO1xuICAgICAgICBjb25zdCBmbG9hdDIgPSBwYXJzZUZsb2F0KHZhbHVlMik7XG4gICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgIHJldHVybiBmbG9hdDEgPT09IGZsb2F0MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb3VsZG4ndCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGZsb2F0LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAncGFpcic6XG4gICAgICBjYXNlICdkaXJlY3RlZFBhaXInOiB7XG4gICAgICAgIGNvbnN0IHBhaXIxID0gdmFsdWUxLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBjb25zdCBwYWlyMiA9IHZhbHVlMi5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgaWYgKHBhaXIxLmxlbmd0aCA9PT0gMiAmJiBwYWlyMi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBpZiAoYmFzZVR5cGUgPT09ICdwYWlyJykge1xuICAgICAgICAgICAgcGFpcjEuc29ydCgpO1xuICAgICAgICAgICAgcGFpcjIuc29ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFpcjEuam9pbignICcpID09PSBwYWlyMi5qb2luKCcgJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY29tcGFyZWQgdHdvIHBhaXIgYnV0IG9uZSBvZiB0aGUgdmFsdWVzIGRvZXMgbm90IGhhdmUgMiB2YWx1ZXM6IDE6ICR7dmFsdWUxfSAyOiAke3ZhbHVlMn1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRvbGVyYW5jZU1vZGU6ICdleGFjdCcgfCAncmVsYXRpdmUnIHwgJ2Fic29sdXRlJyA9ICdleGFjdCc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMudG9sZXJhbmNlTW9kZSAhPT0gJ2V4YWN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd0b2xlcmFuY2VNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBlcXVhbCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsJywgUXRpRXF1YWwpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUd0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0JywgUXRpR3QpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUd0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPj0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0ZScsIFF0aUd0ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlJc051bGwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgaWYgKCF2YXJpYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlc1swXS52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBOdWxsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktaXMtbnVsbCcsIFF0aUlzTnVsbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTHQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDwgK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHQnLCBRdGlMdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpTHRlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHRlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHRlJywgUXRpTHRlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBSZXNwb25zZSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHIgPT4gci5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpO1xuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUmVzcG9uc2UgJHt0aGlzLmlkZW50aWZpZXJ9IGNhbiBub3QgYmUgZm91bmRgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXBwaW5nID0gcmVzcG9uc2UubWFwcGluZztcbiAgICBjb25zdCBjYW5kaWRhdGVSZXNwb25zZXMgPSAhQXJyYXkuaXNBcnJheShyZXNwb25zZS52YWx1ZSkgPyBbcmVzcG9uc2UudmFsdWVdIDogcmVzcG9uc2UudmFsdWU7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVSZXNwb25zZSBvZiBjYW5kaWRhdGVSZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlID0gbWFwcGluZy5tYXBFbnRyaWVzLmZpbmQoZW50cnkgPT4ge1xuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGVudHJ5Lm1hcEtleSwgY2FuZGlkYXRlUmVzcG9uc2UsIHJlc3BvbnNlLmJhc2VUeXBlKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCEobWFwcGVkVmFsdWUgPT0gbnVsbCB8fCBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZSA9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwaW5nLmRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hcHBpbmcubG93ZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1heChtYXBwaW5nLmxvd2VyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChtYXBwaW5nLnVwcGVyQm91bmQgIT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gTWF0aC5taW4obWFwcGluZy51cHBlckJvdW5kLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcC1yZXNwb25zZScsIFF0aU1hcFJlc3BvbnNlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwcGluZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkZWZhdWx0LXZhbHVlJywgdHlwZTogTnVtYmVyIH0pIGRlZmF1bHRWYWx1ZTogbnVtYmVyID0gMDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbG93ZXItYm91bmQnLCB0eXBlOiBOdW1iZXIgfSkgbG93ZXJCb3VuZDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd1cHBlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSB1cHBlckJvdW5kOiBudW1iZXI7XG5cbiAgcHVibGljIGdldCBtYXBFbnRyaWVzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLW1hcC1lbnRyeScpKS5tYXAoZWwgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWFwS2V5OiBlbC5nZXRBdHRyaWJ1dGUoJ21hcC1rZXknKSxcbiAgICAgICAgbWFwcGVkVmFsdWU6ICtlbC5nZXRBdHRyaWJ1dGUoJ21hcHBlZC12YWx1ZScpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcHBpbmcnLCBRdGlNYXBwaW5nKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIC8vUEsgOiBGSVhNRS5cbiAgLy8gVGhpcyB3YXMgYSBsaXR0bGUgZXhwZXJpbWVudCBpZiB3ZSBjb3VsZCBjYWxsIHRoZSBtYXRjaCBmdW5jdGlvbiBhcyBhIHN0YXRpYyBmdW5jdGlvbixcbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWxsIGtpbmQgb2YgdGhpbmdzLCBidXQgbm93IGVzcGVjaWFsbHkgZm9yIHVzZSBpblxuICAvLyBxdGktcmVzcG9uc2UtY29uZGl0aW9uLXNjcmlwdFxuICAvLyBpbiB3aGljaCB3ZSBwYXNzIHRoZSBleHByZXNzaW9ucyBhcyBwdXJlIGZ1bmN0aW9ucywgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LlxuICAvLyBTQURMWSwgdGhlIGdldFZhcmlhYmxlcyB0aHJvd3Mgcm9ldCBpbiBkZSBldGVuLi4gd2VldCBub2cgbmlldCBwcmVjaWVzIGhvZSBkZXplIHdlcmt0LlxuICAvLyBNYWFyIGlrIGdhIGVyaW4gZHVpa2VuLlxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZVRvTWFwID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgY29ycmVjdFZhbHVlSW5mbyA9IHZhbHVlc1sxXTtcbiAgICAgIHJldHVybiBRdGlNYXRjaC5tYXRjaCh2YWx1ZVRvTWFwLCBjb3JyZWN0VmFsdWVJbmZvKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBtYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXRjaCh2YWx1ZVRvTWFwOiBSZXNwb25zZVZhcmlhYmxlLCBjb3JyZWN0VmFsdWVJbmZvOiBSZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgc3dpdGNoIChjb3JyZWN0VmFsdWVJbmZvLmNhcmRpbmFsaXR5KSB7XG4gICAgICBjYXNlICdzaW5nbGUnOiB7XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8IEFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICAgIHZhbHVlVG9NYXAudmFsdWU/LnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnb3JkZXJlZCc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlW2ldLFxuICAgICAgICAgICAgdmFsdWVUb01hcC52YWx1ZVtpXSxcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdtdWx0aXBsZSc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5zd2VySW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvcnJlY3RBbnN3ZXIgb2YgY29ycmVjdFZhbHVlSW5mby52YWx1ZSkge1xuICAgICAgICAgIGxldCBtYXRjaGluZ1ZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBhcnIgPSBbLi4udmFsdWVUb01hcC52YWx1ZV07XG4gICAgICAgICAgZm9yIChjb25zdCBtdiBvZiBhcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhjb3JyZWN0QW5zd2VyLCBtdiwgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG1hdGNoaW5nVmFsdWUgPSBtdjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXRjaGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAoYXJyIGFzIHN0cmluZ1tdKS5zcGxpY2UoYXJyLmluZGV4T2YobWF0Y2hpbmdWYWx1ZSksIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuc3dlckluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWF0Y2gnLCBRdGlNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWVtYmVyIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuIHwgbnVsbD4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuXG4gICAgaWYgKCEodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3IgdGFrZXMgdHdvIHN1Yi1leHByZXNzaW9ucycpO1xuICAgIH1cblxuICAgIGNvbnN0IFt2YWx1ZTEsIHZhbHVlMl0gPSB2YWx1ZXM7XG5cbiAgICBpZiAoISh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2hpY2ggbXVzdCBib3RoIGhhdmUgdGhlIHNhbWUgYmFzZS10eXBlJyk7XG4gICAgfVxuICAgIGlmICghKHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykpIHtcbiAgICAgIGNvbnNvbGUud2FybignYW5kIHRoZSBzZWNvbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9yIG9yZGVyZWQgY29udGFpbmVyJyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZmxvYXQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3Igc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGZsb2F0Jyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZHVyYXRpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0l0IG11c3Qgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZHVyYXRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBJZiBlaXRoZXIgc3ViLWV4cHJlc3Npb24gaXMgTlVMTCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdG9yIGlzIE5VTExcbiAgICBpZiAodmFsdWUxLnZhbHVlID09PSBudWxsIHx8IHZhbHVlMi52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBib29sZWFuIHdpdGggYSB2YWx1ZSBvZiAndHJ1ZScgaWYgdGhlIHZhbHVlIGdpdmVuIGJ5IHRoZSBmaXJzdCBzdWItZXhwcmVzc2lvbiBpcyBpbiB0aGUgY29udGFpbmVyIGRlZmluZWQgYnkgdGhlIHNlY29uZCBzdWItZXhwcmVzc2lvbi5cbiAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tZW1iZXInLCBRdGlNZW1iZXIpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlNdWx0aXBsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdtdWx0aXBsZScgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdCB2YWx1ZXMgPSB2YXJpYWJsZXMubWFwKHYgPT4gdi52YWx1ZSk7XG4gICAgLy8gY29uc29sZS5sb2codmFyaWFibGVzKTtcbiAgICAvLyBjb25zdCBmbGF0dGVuZWRBcnJheSA9IHZhbHVlcy5yZWR1Y2UoKGFjYzogc3RyaW5nW10sIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgIC8vICAgcmV0dXJuIGFjYy5jb25jYXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWUpO1xuICAgIC8vIH0sIFtdKTtcbiAgICAvLyByZXR1cm4gZmxhdHRlbmVkQXJyYXk7XG5cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW11bHRpcGxlJywgUXRpTXVsdGlwbGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU5vdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gIXJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ub3QnLCBRdGlOb3QpO1xuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU9yIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLm1hcChjID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCk7XG4gICAgICBsZXQgdmFsID0gZmFsc2U7XG4gICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUoZSA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yJywgUXRpT3IpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlPcmRlcmVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxSZXNwb25zZVZhcmlhYmxlW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBSZXNwb25zZVZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnb3JkZXJlZCcgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG9yZGVyZWQnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yZGVyZWQnLCBRdGlPcmRlcmVkKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgY2xhc3MgUXRpUHJpbnRlZFZhcmlhYmxlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBjb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKSB8fCBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJpbnRlZC12YXJpYWJsZScsIFF0aVByaW50ZWRWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpUHJvZHVjdCBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcHJvZHVjdCA9IHZhbHVlcy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2Zsb2F0JyB8fCBjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2ludGVnZXInKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yICogcGFyc2VJbnQoY3VycmVudFZhbHVlLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgY2FuIG5vdCBjb252ZXJ0IHRvIG51bWJlcmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYGhhcyBhbm90aGVyIGJhc2VUeXBlICR7Y3VycmVudFZhbHVlLmJhc2VUeXBlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIDEpO1xuICAgIHJldHVybiBwcm9kdWN0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXByb2R1Y3QnLCBRdGlQcm9kdWN0KTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3RyaW5nTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjYXNlLXNlbnNpdGl2ZScgfSkgY2FzZVNlbnNpdGl2ZSA9ICd0cnVlJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgc3RyaW5nLW1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHYxID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTEudmFsdWUgOiAodmFsdWUxLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHYyID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTIudmFsdWUgOiAodmFsdWUyLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModjEgYXMgc3RyaW5nLCB2MiBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1zdHJpbmctbWF0Y2gnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdHJpbmctbWF0Y2gnLCBRdGlTdHJpbmdNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW0gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwcml2YXRlIF9leHByZXNzaW9uOiBRdGlTdW1FeHByZXNzaW9uO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBuZXcgUXRpU3VtRXhwcmVzc2lvbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2V4cHJlc3Npb24uY2FsY3VsYXRlKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW1FeHByZXNzaW9uIGltcGxlbWVudHMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbnM6IFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkge31cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZXhwcmVzc2lvbnMubWFwKGMgPT4ge1xuICAgICAgaWYgKCFjLmNhbGN1bGF0ZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gYy5jYWxjdWxhdGUoKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsdWUgaW4gcXRpLXN1bSwgZXhwZWN0ZWQgbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN1bScsIFF0aVN1bSk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikudmFsdWVcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXZhcmlhYmxlJywgUXRpVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJTVNwY2ksIE1vZHVsZVJlc29sdXRpb25Db25maWcsIFF0aVZhcmlhYmxlSlNPTiB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuZGVjbGFyZSBjb25zdCByZXF1aXJlanM6IGFueTtcbmRlY2xhcmUgY29uc3QgZGVmaW5lOiBhbnk7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIGludGVydmFsSWQ6IGFueTtcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcGNpOiBJTVNwY2k8dW5rbm93bj47XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdtb2R1bGUnIH0pXG4gIG1vZHVsZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY3VzdG9tLWludGVyYWN0aW9uLXR5cGUtaWRlbnRpZmllcicgfSlcbiAgY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcblxuICBwcml2YXRlIGNvbnZlcnRRdGlWYXJpYWJsZUpTT04oaW5wdXQ6IFF0aVZhcmlhYmxlSlNPTik6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBmb3IgKGNvbnN0IHRvcExldmVsS2V5IGluIGlucHV0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkodG9wTGV2ZWxLZXkpKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZE9iamVjdCA9IGlucHV0W3RvcExldmVsS2V5IGFzICdsaXN0JyB8ICdiYXNlJ107XG4gICAgICAgIGlmIChuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZEtleSBpbiBuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgIGlmIChuZXN0ZWRPYmplY3QuaGFzT3duUHJvcGVydHkobmVzdGVkS2V5KSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5lc3RlZE9iamVjdFtuZXN0ZWRLZXkgYXMga2V5b2YgdHlwZW9mIG5lc3RlZE9iamVjdF07XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoU3RyaW5nKTsgLy8gQ29udmVydCBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsgLy8gQ29udmVydCB0aGUgc2luZ2xlIHZhbHVlIHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENoZWNraW5nKCk6IHZvaWQge1xuICAgIC8vIGJlY2F1c2UgdGhlIHBjaSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgdG8gY2hlY2sgZm9yIGNoYW5nZXMgd2UnbGwgdXNlIGFuIGludGVydmFsXG4gICAgLy8gdG8gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBjaGFuZ2VkLiBJZiBjaGFuZ2VkIHdlJ2xsIHNhdmUgdGhlIHJlc3BvbnNlXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3QgbmV3UmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShyZXNwb25zZSk7XG4gICAgICBpZiAoc3RyaW5naWZpZWQgIT09IHRoaXMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IHN0cmluZ2lmaWVkO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udmVydFF0aVZhcmlhYmxlSlNPTihuZXdSZXNwb25zZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BDaGVja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRk9SIE5PV1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgLy8gT25seSBzZXQgc3RhdGUgaXMgc3VwcG9ydGVkIGluIGEgUENJXG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIGdldFRBT0NvbmZpZyhub2RlKSB7XG4gICAgY29uc3QgYSA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgncHJvcGVydGllcycpO1xuICAgIGxldCBjb25maWcgPSB7fTtcblxuICAgIGNvbnN0IGdldFByb3BlcnR5VmFsdWUgPSBlbCA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHt9O1xuICAgICAgY29uc3Qga2V5ID0gZWwuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKTtcbiAgICAgICAgY29uc3QgYWxsS2V5ID0gY2hpbGRyZW4ubWFwKChjOiBIVE1MRWxlbWVudCkgPT4gYy5nZXRBdHRyaWJ1dGUoJ2tleScpKTtcbiAgICAgICAgY29uc3QgaXNBcnJheSA9IGFsbEtleS5sZW5ndGggPiAwICYmICFhbGxLZXkuZmluZChrID0+ICFOdW1iZXIuaXNJbnRlZ2VyKCtrKSk7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGNoaWxkcmVuLm1hcChjID0+IGdldENoaWxkUHJvcGVydGllcyhjKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENoaWxkUHJvcGVydGllcyA9IChlbCk6IHt9IHwgdm9pZCA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbC5jaGlsZHJlbikge1xuICAgICAgICAgIHByb3BlcnRpZXMgPSB7IC4uLnByb3BlcnRpZXMsIC4uLmdldFByb3BlcnR5VmFsdWUoY2hpbGQpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydGllcyBvZiBhKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0aWVzLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICBjb25maWcgPSB7IC4uLmNvbmZpZywgLi4uZ2V0Q2hpbGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQ2FuIG5vdCBmaW5kIHF0aS1jdXN0b20taW50ZXJhY3Rpb24gY29uZmlnJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWdpc3RlcihwY2k6IElNU3BjaTx1bmtub3duPikge1xuICAgIHRoaXMucGNpID0gcGNpO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lID09PSAnUVRJLUNVU1RPTS1JTlRFUkFDVElPTicgPyAnVEFPJyA6ICdJTVMnO1xuICAgIGNvbnN0IGRvbTogSFRNTEVsZW1lbnQgPVxuICAgICAgdHlwZSA9PSAnSU1TJyA/IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1hcmt1cCcpIDogdGhpcy5xdWVyeVNlbGVjdG9yKCdtYXJrdXAnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZCgncXRpLWN1c3RvbUludGVyYWN0aW9uJyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJyAmJiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSkge1xuICAgICAgKHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogYW55ID1cbiAgICAgIHR5cGUgPT0gJ0lNUydcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmRhdGFzZXQsXG4gICAgICAgICAgICBvbnJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbnJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHRoaXMuZ2V0VEFPQ29uZmlnKHRoaXMpO1xuICAgIGlmICh0eXBlID09ICdJTVMnKSB7XG4gICAgICBwY2kuZ2V0SW5zdGFuY2UoZG9tLCBjb25maWcsIHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChwY2kgYXMgYW55KS5pbml0aWFsaXplKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllciwgZG9tLmZpcnN0RWxlbWVudENoaWxkLCBjb25maWcpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSAnVEFPJykge1xuICAgICAgY29uc3QgbGlua3MgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnbGluaycpKS5tYXAoYWNjID0+IGFjYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlcy5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgc3R5bGVzLm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgIHN0eWxlcy5ocmVmID0gbGluaztcbiAgICAgICAgZG9tLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydENoZWNraW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgZGVmaW5lKCdxdGlDdXN0b21JbnRlcmFjdGlvbkNvbnRleHQnLCAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcjogY3R4QSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihjdHhBKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm90aWZ5UmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAvKiBvbmx5IHVzZWQgaW4gdGhlIFRBTyB2ZXJzaW9uICovXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmJ1aWxkUmVxdWlyZUNvbmZpZygpO1xuICAgIGNvbnN0IHJlcXVpcmVQQ0kgPSByZXF1aXJlanMuY29uZmlnKGNvbmZpZyk7XG4gICAgcmVxdWlyZVBDSShbJ3JlcXVpcmUnXSwgcmVxdWlyZSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWR5bmFtaWMtcmVxdWlyZVxuICAgICAgcmVxdWlyZShbdGhpcy5tb2R1bGVdKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgcmVxdWlyZWpzLnVuZGVmKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcik7XG4gICAgLy8gQ2xlYXIgdGhlIG1vZHVsZXMgaW4gdGhlIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0ID0gcmVxdWlyZWpzLnMuY29udGV4dHM7XG4gICAgZGVsZXRlIGNvbnRleHRbdGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyXTtcbiAgICB0aGlzLnN0b3BDaGVja2luZygpO1xuICB9XG5cbiAgYnVpbGRSZXF1aXJlQ29uZmlnKCkge1xuICAgIC8vIFNldCBSZXF1aXJlSlMgcGF0aHMgYW5kIHNoaW0gY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSB7XG4gICAgICBjb250ZXh0OiB0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsXG4gICAgICBjYXRjaEVycm9yOiB0cnVlLFxuICAgICAgcGF0aHM6IHdpbmRvd1sncmVxdWlyZVBhdGhzJ10gfHwge30sXG4gICAgICBzaGltOiB3aW5kb3dbJ3JlcXVpcmVTaGltJ10gfHwge31cbiAgICB9O1xuICAgIC8vIENoZWNrIGlmIFJlcXVpcmVKUyBpcyBhdmFpbGFibGUsIGlmIG5vdCwgc2V0IGFuIGVycm9yIG1lc3NhZ2VcbiAgICBpZiAoIWdsb2JhbFRoaXMucmVxdWlyZSkge1xuICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gYFJlcXVpcmVKUyBub3QgZm91bmQuIFBsZWFzZSBsb2FkIGl0IHZpYSBDRE46IGh0dHBzOi8vY2RuanMuY29tL2xpYnJhcmllcy9yZXF1aXJlLmpzYDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS11cmwnKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbk1vZHVsZXMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGVzJyk7XG5cbiAgICBpZiAoaW50ZXJhY3Rpb25Nb2R1bGVzKSB7XG4gICAgICBjb25zdCBtb2R1bGVzID0gaW50ZXJhY3Rpb25Nb2R1bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGUnKTtcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlSWQgPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwcmltYXJ5UGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdmYWxsYmFjay1wYXRoJyk7XG5cbiAgICAgICAgaWYgKG1vZHVsZUlkICYmIHByaW1hcnlQYXRoKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSBwYXRocyB1c2luZyBSZXF1aXJlSlMncyBmYWxsYmFjayBhcnJheVxuICAgICAgICAgIGNvbnN0IHBhdGhzID0gZmFsbGJhY2tQYXRoXG4gICAgICAgICAgICA/IHRoaXMuY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChmYWxsYmFja1BhdGgsIGJhc2VVcmwpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gY29uZmlnLnBhdGhzW21vZHVsZUlkXSB8fCBbXTtcbiAgICAgICAgICBjb25maWcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhleGlzdGluZ1BhdGgsIHBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhwYXRoMTogc3RyaW5nIHwgc3RyaW5nW10sIHBhdGgyOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhdGgxQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgxKSA/IHBhdGgxIDogW3BhdGgxXTtcbiAgICBjb25zdCBwYXRoMkFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoMikgPyBwYXRoMiA6IFtwYXRoMl07XG4gICAgcmV0dXJuIHBhdGgxQXJyYXkuY29uY2F0KHBhdGgyQXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICAgIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbiAgfVxuXG4gIGxvYWRDb25maWcgPSBhc3luYyAodXJsOiBzdHJpbmcsIGJhc2VVcmw/OiBzdHJpbmcpOiBQcm9taXNlPE1vZHVsZVJlc29sdXRpb25Db25maWc+ID0+IHtcbiAgICB1cmwgPSB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXModXJsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWlyZUNvbmZpZyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAocmVxdWlyZUNvbmZpZy5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXF1aXJlQ29uZmlnLmpzb24oKTtcbiAgICAgICAgY29uc3QgbW9kdWxlQ29uZyA9IGNvbmZpZyBhcyBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnO1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZUlkIGluIG1vZHVsZUNvbmcucGF0aHMpIHtcbiAgICAgICAgICBpZiAoYmFzZVVybCkge1xuICAgICAgICAgICAgbW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmdldFJlc29sdmFibGVQYXRoKG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdLCBiYXNlVXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUNvbmc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aFN0cmluZyA9IChwYXRoOiBzdHJpbmcsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuanMkLywgJycpO1xuICAgIHJldHVybiBwYXRoPy50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCAhYmFzZVBhdGhcbiAgICAgID8gcGF0aFxuICAgICAgOiB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXMoYCR7YmFzZVBhdGh9LyR7cGF0aH1gKTtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aCA9IChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgPyBwYXRoLm1hcChwID0+IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocCwgYmFzZVBhdGgpKVxuICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoU3RyaW5nKHBhdGgsIGJhc2VQYXRoKTtcbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PiR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgVG91Y2hEcmFnQW5kRHJvcCB7XG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgdG91Y2hTdGFydFBvaW50ID0gbnVsbDsgLy8gUG9pbnQgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgbGFzdENsaWNrVGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgcHJldmlvdXMgY2xpY2tcbiAgcHJpdmF0ZSBpc0RyYWdnYWJsZSA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZ2dhYmxlIGVsZW1lbnQgaXMgYWN0aXZlXG4gIHByaXZhdGUgZHJhZ1NvdXJjZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUaGUgc291cmNlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICBwcml2YXRlIGRyYWdDbG9uZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBDbG9uZSBvZiBkcmFnIHNvdXJjZSBmb3IgdmlzdWFsIGZlZWRiYWNrXG4gIHByaXZhdGUgdG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gRmxhZyBmb3IgdG91Y2hFbmQgZXZlbnRcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnIG9wZXJhdGlvbiBpcyBvbmdvaW5nXG4gIHByaXZhdGUgaW5pdGlhbFRyYW5zZm9ybSA9ICcnOyAvLyBPcmlnaW5hbCB0cmFuc2Zvcm0gc3R5bGVcbiAgcHJpdmF0ZSBoYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7IC8vIEZsYWcgdG8gZW5zdXJlIGRyYWdzdGFydCBldmVudCBpcyBkaXNwYXRjaGVkIG9uY2VcbiAgcHJpdmF0ZSByb290Tm9kZTogTm9kZSA9IG51bGw7IC8vIFJvb3Qgbm9kZSBmb3IgYm91bmRhcnkgY2FsY3VsYXRpb25zXG5cbiAgcHJpdmF0ZSBmb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUbyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBkcmFnZ2FibGUgZWxlbWVudFxuICBwcml2YXRlIGZvY3VzYWJsZURyb3Bab25lczogSFRNTEVsZW1lbnRbXSA9IFtdOyAvLyBBbGwgZHJvcHpvbmVzIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gIHByaXZhdGUgY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gSW5kZXggZm9yIHRhYmJpbmcgdGhyb3VnaCBkcm9wIHpvbmVzXG5cbiAgcHJpdmF0ZSBkYXRhVHJhbnNmZXIgPSB7XG4gICAgZGF0YToge30sXG4gICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICB9LFxuICAgIGdldERhdGEodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICB9LFxuICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICB9O1xuICBwcml2YXRlIGNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07IC8vIE9mZnNldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyYWcgY2xvbmVcblxuICBwcml2YXRlIGxhc3RUYXJnZXQgPSBudWxsOyAvLyBMYXN0IHRvdWNoIHRhcmdldFxuICBwcml2YXRlIGN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDsgLy8gQ3VycmVudCBkcm9wcGFibGUgZWxlbWVudFxuICBwcml2YXRlIGFsbG93Q2xpY2sgPSB0cnVlOyAvLyBGbGFnIHRvIGFsbG93IG9yIHByZXZlbnQgY2xpY2tcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgY29weVN0eWxlc0ZvckRyYWdDbG9uZSA9IHRydWU7XG4gIGRyYWdPbkNsaWNrRW5hYmxlZCA9IGZhbHNlO1xuICB1c2VEcmFnQ2xvbmUgPSBmYWxzZTsgLy8gU2V0IHRvIHRydWUgdG8gZHJhZyB3aXRoIGEgY2xvbmU7IHNldCB0byBmYWxzZSB0byBkcmFnIHRoZSBvcmlnaW5hbCBlbGVtZW50XG5cbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRFJBR19ESVNUQU5DRSA9IDU7IC8vIE1pbmltdW0gcGl4ZWwgbW92ZW1lbnQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0NMT05FX09QQUNJVFkgPSAxOyAvLyBPcGFjaXR5IG9mIHRoZSBkcmFnIGNsb25lIGVsZW1lbnRcbiAgaW5pdGlhbFRyYW5zaXRpb246IHN0cmluZztcbiAgLy8gZHJvcHBhYmxlczogRWxlbWVudFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZTtcbiAgICB9XG4gICAgVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzIGZvciB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLmhhbmRsZVRvdWNoQ2FuY2VsLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXM6IEVsZW1lbnRbXSkge1xuICAgIGRyYWdnYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhZGREcm9wcGFibGVFbGVtZW50cyhkcm9wcGFibGVzOiBFbGVtZW50W10pIHtcbiAgLy8gICAvLyB0aGlzLmRyb3BwYWJsZXMgPSBkcm9wcGFibGVzO1xuICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gIC8vICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoU3RhcnQoZSkge1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0geyB4LCB5IH07XG4gICAgdGhpcy5kcmFnU291cmNlID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgLy8gR2V0IHRoZSByb290IG5vZGVcbiAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5kcmFnU291cmNlLmdldFJvb3ROb2RlKCk7XG5cbiAgICBpZiAodGhpcy5kcmFnT25DbGlja0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gU2F2ZSBpbml0aWFsIHRyYW5zZm9ybVxuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybTtcblxuICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9IGNvbXB1dGVkU3R5bGUudHJhbnNpdGlvbiB8fCAnJztcblxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2l0aW9uc1xuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjbG9uZSBvZmZzZXRcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB4IC0gcmVjdC5sZWZ0O1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC55ID0geSAtIHJlY3QudG9wO1xuXG4gICAgICAvLyBTZXQgaGlnaGVyIHotaW5kZXggdG8gYnJpbmcgaXQgb24gdG9wXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJzk5OTknO1xuICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICB0aGlzLmRyYWdTb3VyY2UuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5kcmFnU291cmNlKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb3VjaCA9IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9O1xuXG4gICAgICBpZiAodGhpcy5jYWxjdWxhdGVEcmFnRGlzdGFuY2UoY3VycmVudFRvdWNoKSA+PSB0aGlzLk1JTl9EUkFHX0RJU1RBTkNFKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2gpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaDogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9KSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gRXhpc3RpbmcgY29kZSBmb3IgY3JlYXRpbmcgYW5kIGhhbmRsaW5nIHRoZSBkcmFnIGNsb25lXG4gICAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5EUkFHX0NMT05FX09QQUNJVFkudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmUgPSB0aGlzLmRyYWdTb3VyY2UuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUpIHtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBjb21wdXRlZFN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGVbc3R5bGVdID0gY29tcHV0ZWRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSB0aGUgZHJhZyBjbG9uZSB0byB0aGUgcm9vdCBub2RlXG4gICAgICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgaG9zdCBvZiB0aGUgc2hhZG93IHJvb3RcbiAgICAgICAgICB0aGlzLnJvb3ROb2RlLmhvc3QuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuc2V0RHJhZ0Nsb25lU3R5bGVzKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgZHJhZ2dpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdXNpbmcgQ1NTIHRyYW5zZm9ybXNcbiAgICAgIGlmICh0aGlzLnRvdWNoU3RhcnRQb2ludCkge1xuICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50VG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50Lng7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueTtcblxuICAgICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICAgIC8vIGNvbnN0IHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9ID0gdGhpcy5hcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtib3VuZGVkRGVsdGFYfXB4LCAke2JvdW5kZWREZWx0YVl9cHgpYDtcblxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICAgICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRyb3BUYXJnZXQgPSB0aGlzLmZpbmREcm9wVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGRyb3BUYXJnZXQgIT09IHRoaXMubGFzdFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnZW50ZXInKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmxhc3RUYXJnZXQsICdkcmFnbGVhdmUnKTtcbiAgICAgIHRoaXMubGFzdFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ292ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hFbmQoZSkge1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBsZXQgZHJvcEZvdW5kID0gZmFsc2U7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnZHJvcEZvdW5kJywgZHJvcEZvdW5kKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICBkcm9wRm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBkcmFnRW5kRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdlbmQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICBkcmFnRW5kRXZlbnRbJ2RhdGFUcmFuc2ZlciddID0geyBkcm9wRWZmZWN0OiAnbm9uZScgfTtcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZT8uZGlzcGF0Y2hFdmVudChkcmFnRW5kRXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hDYW5jZWwoZSkge1xuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3BUYXJnZXQoZXZlbnQpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZG9jdW1lbnQsIHgsIHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREcm9wVGFyZ2V0QXRQb2ludChyb290OiBEb2N1bWVudE9yU2hhZG93Um9vdCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRlcHRoOiBudW1iZXIgPSAwKTogRWxlbWVudCB8IG51bGwge1xuICAgIC8vIExpbWl0IHRoZSByZWN1cnNpb24gZGVwdGhcbiAgICBjb25zdCBNQVhfREVQVEggPSAyO1xuICAgIGlmIChkZXB0aCA+IE1BWF9ERVBUSCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCBhbiBhbmNlc3RvciB3aXRoICdkcm9wem9uZScgYXR0cmlidXRlXG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgU2hhZG93IERPTSBhbmQgZGVwdGggbGltaXQgbm90IHJlYWNoZWQsIHRyYXZlcnNlIGl0XG4gICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCAmJiBkZXB0aCA8IE1BWF9ERVBUSCkge1xuICAgICAgY29uc3Qgc2hhZG93RWxlbWVudCA9IHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZWxlbWVudC5zaGFkb3dSb290LCB4LCB5LCBkZXB0aCArIDEpO1xuICAgICAgaWYgKHNoYWRvd0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHNoYWRvd0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gZWxlbWVudCB3aXRoICdkcm9wem9uZScgZm91bmRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJyAnICYmICF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCB0byBzdGFydCBkcmFnZ2luZ1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2UgPSB0aGlzLmZvY3VzZWRFbGVtZW50O1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBkcm9wIHpvbmVzIGZvciBuYXZpZ2F0aW9uXG4gICAgICAgIHRoaXMuY29sbGVjdERyb3Bab25lcygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgZHJhZ3N0YXJ0IGV2ZW50XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInICYmIHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBUYWIga2V5IHRvIG5hdmlnYXRlIHRocm91Z2ggZHJvcCB6b25lc1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZVRvTmV4dERyb3Bab25lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlVcChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUua2V5ID09PSAnICcgJiYgdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgYWdhaW4gdG8gZHJvcCB0aGUgZWxlbWVudFxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgdGhpcy5yZXNldERyYWdTdGF0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3REcm9wWm9uZXMoKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkcm9wem9uZSBhdHRyaWJ1dGVcbiAgICB0aGlzLmZvY3VzYWJsZURyb3Bab25lcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2Ryb3B6b25lXScpKSBhcyBIVE1MRWxlbWVudFtdOyAvLyBBcnJheS5mcm9tKHRoaXMuZHJvcHBhYmxlcyk7XG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBSZXNldCBuYXZpZ2F0aW9uIGluZGV4XG4gIH1cblxuICBwcml2YXRlIG1vdmVUb05leHREcm9wWm9uZSgpIHtcbiAgICBpZiAodGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgaW5kZXggZm9yIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAodGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCArIDEpICUgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoO1xuXG4gICAgLy8gRm9jdXMgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgY29uc3QgbmV4dERyb3Bab25lID0gdGhpcy5mb2N1c2FibGVEcm9wWm9uZXNbdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleF07XG4gICAgbmV4dERyb3Bab25lLmZvY3VzKCk7XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBkcm9wIHRhcmdldFxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBuZXh0RHJvcFpvbmU7XG5cbiAgICAvLyBEaXNwYXRjaCBkcmFnZW50ZXIgZXZlbnRcbiAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQobmV4dERyb3Bab25lLCAnZHJhZ2VudGVyJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQsIHBhZ2UgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlcyA/IGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcGFnZSA/IHRvdWNoLnBhZ2VYIDogdG91Y2guY2xpZW50WCxcbiAgICAgIHk6IHBhZ2UgPyB0b3VjaC5wYWdlWSA6IHRvdWNoLmNsaWVudFlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RHJhZ0Nsb25lU3R5bGVzKHRvdWNoKSB7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke3RvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnl9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHt0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnpJbmRleCA9ICc5OTk5OTknO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50b3VjaEVuZFRyaWdnZXJlZCB8fCAhdGhpcy5kcmFnQ2xvbmUpIHJldHVybjtcblxuICAgICAgY29uc3QgbmV3TGVmdCA9IHRvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lng7XG4gICAgICBjb25zdCBuZXdUb3AgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55O1xuXG4gICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfSA9IHRoaXMuYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQsIG5ld1RvcCwgdGhpcy5kcmFnQ2xvbmUpO1xuXG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7Ym91bmRlZExlZnR9cHhgO1xuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7Ym91bmRlZFRvcH1weGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIGFuZCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG90ZW50aWFsIG5ldyBwb3NpdGlvblxuICAgIGNvbnN0IG5ld0xlZnQgPSBlbGVtZW50UmVjdC5sZWZ0ICsgZGVsdGFYO1xuICAgIGNvbnN0IG5ld1RvcCA9IGVsZW1lbnRSZWN0LnRvcCArIGRlbHRhWTtcblxuICAgIC8vIExpbWl0IHRoZSBuZXcgcG9zaXRpb24gd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRlZCBkZWx0YSB2YWx1ZXNcbiAgICBjb25zdCBib3VuZGVkRGVsdGFYID0gYm91bmRlZExlZnQgLSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVkgPSBib3VuZGVkVG9wIC0gZWxlbWVudFJlY3QudG9wO1xuXG4gICAgcmV0dXJuIHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUJvdW5kYXJpZXMobmV3TGVmdDogbnVtYmVyLCBuZXdUb3A6IG51bWJlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3TGVmdCBhbmQgbmV3VG9wIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICByZXR1cm4geyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURyYWdEaXN0YW5jZSh0b3VjaCk6IG51bWJlciB7XG4gICAgY29uc3QgeERpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueCk7XG4gICAgY29uc3QgeURpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueSk7XG4gICAgcmV0dXJuIHhEaXN0ICsgeURpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoQ3VzdG9tRXZlbnQoZWxlbWVudCwgZXZlbnRUeXBlLCBidWJibGUgPSB0cnVlKSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB7IGJ1YmJsZXM6IGJ1YmJsZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBldmVudFsnZGF0YVRyYW5zZmVyJ10gPSB0aGlzLmRhdGFUcmFuc2ZlcjtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldERyYWdTdGF0ZShkcm9wRm91bmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZT8ucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0eWxlc1xuICAgICAgICBpZiAoIWRyb3BGb3VuZCkgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSB0aGlzLmluaXRpYWxUcmFuc2l0aW9uO1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHByb3BlcnR5XG4gICAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZHJhZ0Nsb25lID0gbnVsbDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSBudWxsO1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFUcmFuc2ZlciA9IHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgICAgfSxcbiAgICAgIGdldERhdGEodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgICAgfSxcbiAgICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICAgIH07XG4gICAgdGhpcy5jbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMubGFzdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5hbGxvd0NsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSAnJztcbiAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMucm9vdE5vZGUgPSBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIERyb3BwYWJsZXNJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IERyb3BwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgdXNlU2hhZG93Um9vdDogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcm9wcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcblxuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IHRoaXMuZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIGRyb3BwYWJsZXMuZm9yRWFjaChkcm9wcGFibGUgPT4ge1xuICAgICAgICB0aGlzLnByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERyb3BwYWJsZUVsZW1lbnRzKCk6IEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdCA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcikgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnb3ZlckhhbmRsZXIgPSB0aGlzLmRyYWdvdmVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnbGVhdmVIYW5kbGVyID0gdGhpcy5kcmFnbGVhdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdlbnRlckhhbmRsZXIgPSB0aGlzLmRyYWdlbnRlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJvcEhhbmRsZXIgPSB0aGlzLmRyb3BIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuZHJhZ2xlYXZlSGFuZGxlcik7XG4gICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhdHRyaWJ1dGVOYW1lIH0pID0+IHtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcm9wcGFibGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgZGlzYWJsZWQgPSBkcm9wcGFibGUuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2VudGVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ292ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdhY3RpdmUnLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkcm9wSGFuZGxlcihldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5maW5kRHJhZ2dhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpO1xuXG4gICAgICBpZiAoIWRyYWdnYWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGRyYWdnYWJsZSAmJiAhdGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpIHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZSwgZHJvcHBhYmxlKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyYWdnYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKSB8fCB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcm9wKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQsIGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGUucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSAhPT0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuXG4gICAgICAgIC8vIGNoZWNrTWF4QXNzb2NpYXRpb25zIGFuZCBzYXZlUmVzcG9uc2UgYXJlIGRlZmluZWQvb3ZlcnJpZGRlbiBpbiBhIG1peGluXG4gICAgICAgIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICAgICAgdGhpc1snc2F2ZVJlc3BvbnNlJ10obnVsbCk7IC8vXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuXG4gICAgICAvLyB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2xlYXZlSGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBEcm9wcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxEcm9wcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIFRISVMgSVMgQSBNSVhJTiwgVEhJUyBJUyBBIE1JWElOXG4vLyBVU0UgTElLRSBUSElTXG4vLyBgYGBjbGFzcyBEcm9wTGlzdCBleHRlbmRzIEZsaXBwYWJsZXMoTGl0RWxlbWVudCkge2BgYFxuLy8gbWl4aW4gd2hpY2ggYW5pbWF0ZXMgY2hpbGRyZW4gd2l0aCBGTElQXG4vLyBhIGNvbWJpbmF0aW9uIGJldHdlZW4gdGhpcyBkaXJlY3RpdmU6XG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuLy8gYW5kIGEgdHV0b3JpYWwgaG93IHRvIG1ha2UgYSBtaXhpblxuLy8gaHR0cHM6Ly9saXQuZGV2L2RvY3MvY29tcG9zaXRpb24vbWl4aW5zL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBGbGlwcGFibGVzSW50ZXJmYWNlIHtcbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbn1cblxuLy8ganVzdCBhIGNvbnZlcnNpb24gb2YgYSBhbmd1bGFyIEZMSVAgZGlyZWN0aXZlLCBtYWRlIGFzIGEgTWl4aW5cbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5leHBvcnQgY29uc3QgRmxpcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzU2VsOiBzdHJpbmcsXG4gIGRyYWdnYWJsZXNTZWw6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIEZsaXBwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLy8gcHJpdmF0ZSBzdGF0ZSA9IG5ldyBNYXA8RWxlbWVudCwgYW55PigpO1xuICAgIC8vIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgLy8gZmxpcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmc7XG4gICAgLy8gb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIC8vICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsgLy8gcGs6IHRoaXMgaXMgdGhlIGtleSB0byBjYWxjdWxhdGUgY29ycmVjdCBwcm9wb3J0aW9uc1xuICAgIC8vICAgY29uc3QgZHJhZ2dhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyYWdnYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmFuaW1hdGVNZSk7XG4gICAgLy8gICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcbiAgICAvLyAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyYWdnYWJsZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIC8vIH1cbiAgICAvLyBwcml2YXRlIGFuaW1hdGVNZSA9ICgpID0+IHtcbiAgICAvLyAgIHRoaXMuc3RhdGUuZm9yRWFjaCgodmFsdWUsIGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGlmICh0aGlzLnN0YXRlLmdldChlbGVtKSA9PSBudWxsKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgY2FjaGUgPSB0aGlzLnN0YXRlLmdldChlbGVtKTtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFYID0gY2FjaGUubGVmdCAtIGxlZnQ7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWSA9IGNhY2hlLnRvcCAtIHRvcDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFXID0gY2FjaGUud2lkdGggLyB3aWR0aDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFIID0gY2FjaGUuaGVpZ2h0IC8gaGVpZ2h0O1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgY29uc3QgeyBkdXJhdGlvbiwgZWFzaW5nIH0gPSB7IGR1cmF0aW9uOiAzNTAsIGVhc2luZzogJ2N1YmljLWJlemllcigwLjI2LCAwLjg2LCAwLjQ0LCAwLjk4NSknIH07XG4gICAgLy8gICAgIGVsZW0uYW5pbWF0ZShcbiAgICAvLyAgICAgICBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiBgXG4gICAgLy8gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClcbiAgICAvLyBzY2FsZSgke2RlbHRhV30sICR7ZGVsdGFIfSlcbiAgICAvLyBgLFxuICAgIC8vICAgICAgICAgICAvLyB3aWR0aDogY2FjaGUud2lkdGgsXG4gICAgLy8gICAgICAgICAgIC8vIGhlaWdodDogY2FjaGUuaGVpZ2h0KyAncHgnLFxuICAgIC8vICAgICAgICAgICAvLyBvcGFjaXR5OiBjYWNoZS5vcGFjaXR5LFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06ICdub25lJyxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBkdXJhdGlvbixcbiAgICAvLyAgICAgICAgIGVhc2luZyxcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuICAgIC8vIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIC8vIH1cbiAgfVxuICByZXR1cm4gRmxpcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RmxpcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICIvLyBAd2F0Y2ggZGVjb3JhdG9yXG4vL1xuLy8gUnVucyB3aGVuIGFuIG9ic2VydmVkIHByb3BlcnR5IGNoYW5nZXMsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuXG4vL1xuLy8gVG8gd2FpdCBmb3IgYW4gdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnRcbi8vIHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyAgQHdhdGNoKCdwcm9wTmFtZScpXG4vLyAgaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbi8vICAgIC4uLlxuLy8gIH1cblxuaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgTGl2ZVF1ZXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpdmVRdWVyeShxdWVyeVNlbGVjdG9yOiBzdHJpbmcsIG9wdGlvbnM/OiBMaXZlUXVlcnlPcHRpb25zKSB7XG4gIGxldCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxMaXZlUXVlcnlPcHRpb25zPiA9IHtcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4oXG4gICAgcHJvdG86IEVsZW1DbGFzcyxcbiAgICBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGNvbm5lY3RlZENhbGxiYWNrLCBkaXNjb25uZWN0ZWRDYWxsYmFjayB9ID0gcHJvdG87XG5cbiAgICBwcm90by5jb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGNvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbkxpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb1dhdGNoID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikpO1xuICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgICAgICAgIGNvbnN0IGFkZGVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZE5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKS5tYXAoZSA9PiBlIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBhZGRlZE5vZGVzLmZpbmQobiA9PiBlbGVtZW50c1RvV2F0Y2guaW5jbHVkZXMobikpKSB7XG4gICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoYWRkZWROb2RlcywgcmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRzQWRkZWQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikgPz8gW107XG4gICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoQXJyYXkuZnJvbShlbGVtZW50c0FkZGVkKSwgW10pO1xuICAgIH07XG5cbiAgICBwcm90by5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcblxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBsaXZlUXVlcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2xpdmUtcXVlcnknO1xuaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4vZHJhZy1kcm9wLWFwaSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuaW50ZXJmYWNlIEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IGJvb2xlYW47XG4gIGRyYWdDYW5CZVBsYWNlZEJhY2s6IGJvb2xlYW47XG4gIGRyYWdPbkNsaWNrOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcmFnZ2FibGVzU2VsZWN0b3I6IHN0cmluZyxcbiAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXM6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgZXh0ZW5kcyBGbGlwcGFibGVzTWl4aW4oXG4gICAgRHJvcHBhYmxlc01peGluKHN1cGVyQ2xhc3MsIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzLCBkcm9wcGFibGVzU2VsZWN0b3IpLFxuICAgIGRyb3BwYWJsZXNTZWxlY3RvcixcbiAgICBkcmFnZ2FibGVzU2VsZWN0b3JcbiAgKSB7XG4gICAgcHJvdGVjdGVkIGRyYWdnYWJsZXMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCB7IHBhcmVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgICBwcm90ZWN0ZWQgZHJvcHBhYmxlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBmYWxzZSwgdHlwZTogT2JqZWN0IH0pIGNvbmZpZ3VyYXRpb246IEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IHRydWUsXG4gICAgICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiB0cnVlLFxuICAgICAgZHJhZ09uQ2xpY2s6IGZhbHNlXG4gICAgfTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21pbi1hc3NvY2lhdGlvbnMnIH0pIG1pbkFzc29jaWF0aW9ucyA9IDE7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtYXgtYXNzb2NpYXRpb25zJyB9KSBtYXhBc3NvY2lhdGlvbnMgPSAxO1xuXG4gICAgQGxpdmVRdWVyeShkcmFnZ2FibGVzU2VsZWN0b3IpXG4gICAgaGFuZGxlRHJhZ2dhYmxlc0NoYW5nZShkcmFnc0FkZGVkOiBIVE1MRWxlbWVudFtdLCBkcmFnc1JlbW92ZWQ6IEVsZW1lbnRbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV3RHJhZ2dhYmxlcyA9IHRoaXMuZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdzQWRkZWQpO1xuXG4gICAgICBpZiAobmV3RHJhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYWRkTmV3RHJhZ2dhYmxlcyhuZXdEcmFnZ2FibGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcmFnRHJvcEFwaSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudD4oJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGVzLmZpbHRlcihkID0+ICF0aGlzLmRyYWdnYWJsZXMuaGFzKGQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE5ld0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzKTtcbiAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaChkcmFnZ2FibGUgPT4gdGhpcy5zdG9yZURyYWdnYWJsZShkcmFnZ2FibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gQXJyYXkuZnJvbShkcmFnZ2FibGUucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihkcmFnZ2FibGUpO1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChkcmFnZ2FibGUsIHtcbiAgICAgICAgcGFyZW50OiBkcmFnZ2FibGUucGFyZW50RWxlbWVudCxcbiAgICAgICAgaW5kZXhcbiAgICAgIH0pO1xuICAgICAgZHJhZ2dhYmxlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IGBkcmFnLSR7aW5kZXh9LSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCBjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgICBkcmFnZ2FibGUuc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzXG4gICAgICAgICAgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICAgICAgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdTdGFydCA9IChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZHJhZ2dpbmcnLCAnJyk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQgPSBhc3luYyAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgY29uc3Qgd2FzRHJvcHBlZCA9IGF3YWl0IHRoaXMud2FzRHJvcHBlZChldik7XG4gICAgICBpZiAoIXdhc0Ryb3BwZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5kcmFnQ2FuQmVQbGFjZWRCYWNrKSB7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQuc2V0QXR0cmlidXRlKCdlbmFibGVkJywgJycpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnJlbW92ZUF0dHJpYnV0ZSgnZW5hYmxlZCcpKTtcbiAgICB9XG5cbiAgICAvLyBNSDogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIHN1cmUgdGhpcyBjYW4gYmUgdGVzdGVkLlxuICAgIC8vIGJlY2F1c2UgSSBjYW4ndCBnZXQgdGhlIGRyb3BFZmZlY3QgdG8gYmUgJ21vdmUnIGluIHRoZSB0ZXN0XG4gICAgcHJpdmF0ZSBjaGVja0Zvck1vdmVUZXN0SXRlbSA9IChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBpZiAoIWV2LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgbGV0IGhhc01vdmVUZXN0SXRlbSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZGF0YVRyYW5zZmVyIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShldi5kYXRhVHJhbnNmZXIuaXRlbXMpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcywgcmVzb2x2ZSBpbW1lZGlhdGVseVxuICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ3N0cmluZycgJiYgaXRlbS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSAnbW92ZS10ZXN0Jykge1xuICAgICAgICAgICAgICAgIGhhc01vdmVUZXN0SXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGl0ZW1zXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbm90ICdzdHJpbmcnLCBzdGlsbCBjb3VudCBkb3duIHBlbmRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgd2FzRHJvcHBlZChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBoYXNNb3ZlVGVzdEl0ZW0gPSBhd2FpdCB0aGlzLmNoZWNrRm9yTW92ZVRlc3RJdGVtKGV2KTtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCAhPT0gJ25vbmUnIHx8IGhhc01vdmVUZXN0SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhc01vdmVkKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ21vdmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB7IHBhcmVudCwgaW5kZXggfSA9IHRoaXMuZHJhZ2dhYmxlcy5nZXQoZHJhZ2dhYmxlKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuXG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHJhbnNpdGlvbi5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgIC8vICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heEFzc29jaWF0aW9ucygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBtYXhNYXRjaCA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1heCcpIHx8IDEpO1xuICAgICAgICBjb25zdCBjdXJyZW50QXNzb2NpYXRpb25zID0gZC5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpc2FibGVEcm9wcGFibGUgPSBjdXJyZW50QXNzb2NpYXRpb25zID49IG1heE1hdGNoO1xuICAgICAgICBpZiAoZGlzYWJsZURyb3BwYWJsZSkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkcm9wem9uZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcblxuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIHZhbHVlPy5mb3JFYWNoKGVudHJ5ID0+IHRoaXMucGxhY2VSZXNwb25zZShlbnRyeSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxhY2VSZXNwb25zZShyZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjb25zdCBbZHJvcElkLCAuLi5kcmFnSWRzXSA9IHJlc3BvbnNlLnNwbGl0KCcgJykucmV2ZXJzZSgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gdGhpcy5maW5kRHJvcHBhYmxlQnlJZChkcm9wSWQpO1xuICAgICAgZHJhZ0lkcy5mb3JFYWNoKGRyYWdJZCA9PiB0aGlzLnBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkLCBkcm9wcGFibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcm9wcGFibGVCeUlkKGlkZW50aWZpZXI6IHN0cmluZyk6IEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maW5kKGRyb3AgPT4gZHJvcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSA9PT0gaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZDogc3RyaW5nLCBkcm9wcGFibGU6IEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtpZGVudGlmaWVyPSR7ZHJhZ0lkfV1gKTtcbiAgICAgIGlmICghZHJvcHBhYmxlIHx8ICFkcmFnZ2FibGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGZpbmQgZHJhZ2dhYmxlIG9yIGRyb3BwYWJsZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyOiAke2RyYWdJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdmFsaWRBc3NvY2lhdGlvbnMgPSB0aGlzLmdldFZhbGlkQXNzb2NpYXRpb25zKCk7XG4gICAgICByZXR1cm4gdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gMCB8fCB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSB2YWxpZEFzc29jaWF0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZhbGlkQXNzb2NpYXRpb25zKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbHRlcihkID0+IGQuY2hpbGRFbGVtZW50Q291bnQgPiAwKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNhdmVSZXNwb25zZSgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdFJlc3BvbnNlRGF0YSgpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuZHJvcHBhYmxlc1xuICAgICAgICAubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgICAgY29uc3QgZHJhZ2dhYmxlc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gQXJyYXkuZnJvbShkcmFnZ2FibGVzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgICAgIGNvbnN0IGRyb3BwYWJsZUlkZW50aWZpZXIgPSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJzLm1hcChpZCA9PiBgJHtpZH0gJHtkcm9wcGFibGVJZGVudGlmaWVyfWApO1xuICAgICAgICB9KVxuICAgICAgICAuZmxhdCgpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJlc2V0KHNhdmUgPSB0cnVlKTogdm9pZCB7XG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgaWYgKHNhdmUpIHRoaXMuc2F2ZVJlc3BvbnNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNldERyb3BwYWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8SUludGVyYWN0aW9uPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHNjYWxpbmcgcG9zaXRpb24gKi9cbiAgfVxuICBzbG90W25hbWU9J3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiAwLjVyZW07XG4gIH1cblxuICA6aG9zdDo6cGFydChhc3NvY2lhYmxlcy1jb250YWluZXIpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgICAxODBkZWcsXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgLSAxcHgpLFxuICAgICAgdmFyKC0tcXRpLWJvcmRlci1jb2xvci1ncmF5KSBjYWxjKDUwJSksXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgKyAxcHgpXG4gICAgKTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgdHJ1ZSxcbiAgJy5kbCdcbikge1xuICBAc3RhdGUoKSBwcml2YXRlIF9jaGlsZHJlbk1hcDogRWxlbWVudFtdID0gW107XG5cbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG4gIC8vIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcjogKGV2ZW50OiBDdXN0b21FdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlciA9IHRoaXMuX3JlZ2lzdGVyQ2hvaWNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGNvbnN0IGNob2ljZSA9IGV2ZW50LnRhcmdldCBhcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICAgIHRoaXMuX2NoaWxkcmVuTWFwLnB1c2goY2hvaWNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiZHJvcC1jb250YWluZXJcIj5cbiAgICAgICAgJHt0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggPiAwICYmXG4gICAgICAgIEFycmF5LmZyb20oQXJyYXkoTWF0aC5jZWlsKHRoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCAvIDIpKS5rZXlzKCkpLm1hcChcbiAgICAgICAgICAoXywgaW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDxkaXYgcGFydD1cImFzc29jaWFibGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJsZWZ0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X2xlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBuYW1lPVwicmlnaHQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUFzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IHJlbW92ZURvdWJsZVNsYXNoZXMgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC91dGlscyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgLy8gVGhpcyBjdXN0b20taW50ZXJhY3Rpb24gc3VwcG9ydCB0aGUgQ0VTIEFQSSB3aGljaCBpcyB1c2UgaW4gRkFDRVRcbiAgLy9cbiAgLy8gSXQgd29ya3MgbGlrZSB0aGlzOlxuICAvLyAxLiBUaGUgQ0kgbWFuaWZlc3QgaXMgZmV0Y2hlZFxuICAvLyAyLiBBbiBpZnJhbWUgaXMgY3JlYXRlZCBhbmQgdGhlIGZpcnN0IHN0eWxlIGFuZCBmaXJzdCBzY3JpcHQgZnJvbSB0aGUgbWFuaWZlc3QgYXJlIGxvYWRlZFxuICAvLyAzLiBUaGUgZmlyc3Qgc2NyaXB0IGlzIGJvb3RzdHJhcC5qcyB3aGljaCBhbHNvIGNyZWF0ZXMgYW4gaWZyYW1lIGFuZCBsb2FkcyB0aGUgZmlyc3QgbWVkaWEgZnJvbSB0aGUgbWFuaWZlc3RcbiAgLy8gNC4gQ29tbXVuaWNhdGlvbiBpcyBkb25lIHZpYSB0aGUgQ0VTIEFQSSBidXQgYmVjYXVzZSB0aGUgaWZyYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgZ2xvYmFsIENFUyBvYmplY3Qgd2UgbmVlZCB0byB1c2Ugd2luZG93LnBvc3RNZXNzYWdlXG5cbiAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIGNoYW5nZSB0aGUgcGFja2FnZSBieSByZXBsYWNpbmcgdGhlIGJvb3RzdHJhcC5qcyB3aXRoIG91ciBvd24gYW5kIGluamVjdCBhIHByb3h5IENFUyBBUEkgdGhhdCBjb21tdW5pY2F0ZXMgdmlhIHBvc3RNZXNzYWdlXG4gIC8vIEJlY2F1c2Ugd2UgYWxzbyB3YW50IHRvIHJ1biB0aGlzIGluIHN0b3J5Ym9vaywgd2UgY2Fubm90IHVzZSB3aW5kb3cudG9wIGJlY2F1c2UgdG8gc2VuZCBtZXNzYWdlcyB0aGVyZSwgYmVjYXVzZSBpbiBjYXNlIG9mIHN0b3J5Ym9vayB0aGF0IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cbiAgLy8gU28gd2Ugc2VuZCBtZXNzYWdlcyB0byBhbGwgcGFyZW50IHdpbmRvd3NcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSA9IHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YScgfSlcbiAgZGF0YTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLWl0ZW0nIH0pXG4gIGJhc2VJdGVtVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtcmVmJyB9KVxuICBiYXNlUmVmVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdpZCcgfSlcbiAgaWQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gIG1hbmlmZXN0OiB7XG4gICAgc2NyaXB0OiBzdHJpbmdbXTtcbiAgICBzdHlsZTogc3RyaW5nW107XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuICB9O1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCB1cmlUb01hbmlmZXN0ID0gdGhpcy5kYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKVxuICAgICAgPyB0aGlzLmRhdGFcbiAgICAgIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VJdGVtVXJsICsgJy8nICsgdGhpcy5kYXRhKTtcbiAgICAvLyBmZXRjaCB0aGUganNvbiBmaWxlIGxvY2F0ZWQgYXQgdGhlIGRhdGEgYXR0cmlidXRlXG4gICAgZmV0Y2godXJpVG9NYW5pZmVzdClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm1hbmlmZXN0ID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZXR1cENFUygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnI7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1IOiBDaGFuZ2VkIHRoZSBkZWZhdWx0IGJvb3RzdHJhcC5qcyB0byB1c2UgdGhlIG5ldyBDRVMgQVBJXG4gIC8vIEJlY2F1c2UgdGhlIG9sZCBvbmUgdXNlcyB0aGUgZ2xvYmFsIENFUyBvYmplY3QgdGhhdCBpcyBub3QgYWxsb3dlZCB0byBiZSBhY2Nlc3NlZCB3aGVuIHRoZSBDSVxuICAvLyBpcyBlbWJlZGRlZCBpbiBhbiBpZnJhbWUgYW5kIGNvbWluZyBmcm9tIGFub3RoZXIgZG9tYWluXG4gIC8vIFRoZXJlZm9yIHdlIG5lZWQgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSSB0byBjb21tdW5pY2F0ZXMgdmlhIHRoZSBicm9hZGNhc3QgQVBJXG4gIHNldHVwQ0VTKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcGNpQ29udGFpbmVyJykgYXMgSFRNTElGcmFtZUVsZW1lbnQsXG4gICAgICBpZnJhbWVXaW4gPSBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUsXG4gICAgICBpZnJhbWVEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgLy8gY29uc3QgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKCdjZXNfY2hhbm5lbCcpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgaWZyYW1lRG9jLm9wZW4oKTtcbiAgICBpZnJhbWVEb2Mud3JpdGUoYFxuICAgICAgPGh0bWw+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgIDxsaW5rIGhyZWY9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zdHlsZVswXX1gKX0nIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxuICAgICAgICAgIDxzY3JpcHQgc3JjPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc2NyaXB0WzBdfWApfSc+PC9zY3JpcHQ+XG4gICAgICAgIDwvaGVhZD5cbiAgICAgICAgPGJvZHk+PC9ib2R5PlxuICAgICAgPC9odG1sPlxuICAgICAgYCk7XG5cbiAgICBpZnJhbWVEb2MuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SUZyYW1lcygpIHtcbiAgICBjb25zdCBpZnJhbWVzSW5TaGFkb3dSb290ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjb25zdCBvdXRlcklGcmFtZXMgPSBbLi4uaWZyYW1lc0luU2hhZG93Um9vdCwgLi4uaWZyYW1lXTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBvdXRlcklGcmFtZXMpIHtcbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvdXRlckRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgaWYgKG91dGVyRG9jKSB7XG4gICAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhvdXRlckRvYywgb3V0ZXJJRnJhbWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBnZXQgb25seSB1bmlxdWUgaWZyYW1lc1xuICAgIG91dGVySUZyYW1lcy5mb3JFYWNoKChpZnJhbWUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAob3V0ZXJJRnJhbWVzLmluZGV4T2YoaWZyYW1lKSAhPT0gaW5kZXgpIHtcbiAgICAgICAgb3V0ZXJJRnJhbWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dGVySUZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5uZXJJRnJhbWVzKGlmcmFtZURvY3VtZW50OiBEb2N1bWVudCwgaWZyYW1lcyA9IFtdKSB7XG4gICAgLy8gR2V0IGFsbCBpZnJhbWVzIGluIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAgY29uc3QgY3VycmVudElmcmFtZXMgPSBpZnJhbWVEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGN1cnJlbnRJZnJhbWVzLmZvckVhY2goaWZyYW1lID0+IHtcbiAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBpZnJhbWUgdG8gdGhlIGxpc3RcbiAgICAgIGlmcmFtZXMucHVzaChpZnJhbWUpO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBnZXQgaWZyYW1lcyB3aXRoaW4gdGhlIGN1cnJlbnQgaWZyYW1lXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaWZyYW1lIHNyYyBpcyBmcm9tIHRoZSBzYW1lIG9yaWdpblxuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuXG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhuZXN0ZWREb2MsIGlmcmFtZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBjcm9zcy1vcmlnaW4gaWZyYW1lOicsIGlmcmFtZVNyYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcG9zdFRvV2luZG93QW5kSWZyYW1lcyh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICBjb25zdCBpZnJhbWVzID0gdGhpcy5nZXRJRnJhbWVzKCk7XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2YgaWZyYW1lcykge1xuICAgICAgaWYgKGlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVBvc3RNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICBjb25zdCB7IHR5cGUsIGRhdGEgfSA9IGV2ZW50LmRhdGE7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzZXRSZXNwb25zZSc6XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZShkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdnZXRSZXNwb25zZSc6IHtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdyZXNwb25zZURhdGEnLCB0aGlzLnJhd1Jlc3BvbnNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdnZXRNZWRpYSc6IHtcbiAgICAgICAgY29uc3QgbWVkaWFEYXRhID0gdGhpcy5tYW5pZmVzdC5tZWRpYS5tYXAobWVkaWEgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IG1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IG1lZGlhIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VSZWZVcmwgKyAnLycgKyBtZWRpYSk7XG4gICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygnbWVkaWFEYXRhJywgbWVkaWFEYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzZXRTdGFnZUhlaWdodCc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXRTdGFnZUhlaWdodCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2UgIT09ICcnO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gdmFsO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxpZnJhbWVcbiAgICAgICAgd2lkdGg9JHt0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKX1cbiAgICAgICAgaGVpZ2h0PSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpfVxuICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICB0aXRsZT1cInBjaUNvbnRhaW5lclwiXG4gICAgICAgIGlkPVwicGNpQ29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgIDwvaWZyYW1lPlxuICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLWludGVyYWN0aW9uJzogUXRpQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5AY3VzdG9tRWxlbWVudCgncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY291bnQtYXR0ZW1wdCcgfSlcbiAgcHVibGljIGNvdW50QXR0ZW1wdDogc3RyaW5nID0gJ3RydWUnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgdGl0bGU6ICdlbmQgYXR0ZW1wdCc7XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gbm90IGltcGxlbWVudGVkIGJ5IGRlc2lnblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGJ1dHRvbiA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfSBwYXJ0PVwiYnV0dG9uXCIgQGNsaWNrPSR7dGhpcy5lbmRBdHRlbXB0fT4ke3RoaXMudGl0bGV9PC9idXR0b24+YDtcbiAgfVxuICBwdWJsaWMgZW5kQXR0ZW1wdChlOiBFdmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnZW5kLWF0dGVtcHQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgY291bnRBdHRlbXB0OiB0aGlzLmNvdW50QXR0ZW1wdCA9PT0gJ3RydWUnIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nOiBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCAncXRpLWdhcC10ZXh0JywgZmFsc2UsICdxdGktZ2FwJykge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgLyogW3BhcnQ9J2Ryb3BzJ10gLCAqL1xuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD48c2xvdCBwYXJ0PVwiZHJhZ3NcIiBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PiA8c2xvdCBwYXJ0PVwiZHJvcHNcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgbGV0IG1hdGNoZXM6IHsgdGV4dDogc3RyaW5nOyBnYXA6IHN0cmluZyB9W10gPSBbXTtcbiAgICBjb25zdCByZXNwb25zZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtYXRjaGVzID0gcmVzcG9uc2UubWFwKHggPT4ge1xuICAgICAgICBjb25zdCBzcGxpdCA9IHguc3BsaXQoJyAnKTtcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogc3BsaXRbMF0sIGdhcDogc3BsaXRbMV0gfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdhcHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1nYXAnKTtcbiAgICBnYXBzLmZvckVhY2goKGdhcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBnYXAuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICBjb25zdCB0ZXh0SWRlbnRpZmllciA9IG1hdGNoZXMuZmluZCh4ID0+IHguZ2FwID09PSBpZGVudGlmaWVyKT8udGV4dDtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYHF0aS1nYXAtdGV4dFtpZGVudGlmaWVyPVwiJHt0ZXh0SWRlbnRpZmllcn1cIl1gKT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgaWYgKHRleHRJZGVudGlmaWVyICYmIHRleHQpIHtcbiAgICAgICAgaWYgKCFnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICB0ZXh0U3Bhbi5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdGlvbicpO1xuICAgICAgICAgIHRleHRTcGFuLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgICBnYXAuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRleHRTcGFuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgZ2FwLm5leHRFbGVtZW50U2libGluZy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5pbXBvcnQge0NoaWxkUGFydCwgbm9DaGFuZ2V9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7ZGlyZWN0aXZlLCBEaXJlY3RpdmUsIFBhcnRJbmZvLCBQYXJ0VHlwZX0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcbmltcG9ydCB7XG4gIGluc2VydFBhcnQsXG4gIGdldENvbW1pdHRlZFZhbHVlLFxuICByZW1vdmVQYXJ0LFxuICBzZXRDb21taXR0ZWRWYWx1ZSxcbiAgc2V0Q2hpbGRQYXJ0VmFsdWUsXG59IGZyb20gJy4uL2RpcmVjdGl2ZS1oZWxwZXJzLmpzJztcblxuZXhwb3J0IHR5cGUgS2V5Rm48VD4gPSAoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gdW5rbm93bjtcbmV4cG9ydCB0eXBlIEl0ZW1UZW1wbGF0ZTxUPiA9IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiB1bmtub3duO1xuXG4vLyBIZWxwZXIgZm9yIGdlbmVyYXRpbmcgYSBtYXAgb2YgYXJyYXkgaXRlbSB0byBpdHMgaW5kZXggb3ZlciBhIHN1YnNldFxuLy8gb2YgYW4gYXJyYXkgKHVzZWQgdG8gbGF6aWx5IGdlbmVyYXRlIGBuZXdLZXlUb0luZGV4TWFwYCBhbmRcbi8vIGBvbGRLZXlUb0luZGV4TWFwYClcbmNvbnN0IGdlbmVyYXRlTWFwID0gKGxpc3Q6IHVua25vd25bXSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDx1bmtub3duLCBudW1iZXI+KCk7XG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIG1hcC5zZXQobGlzdFtpXSwgaSk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn07XG5cbmNsYXNzIFJlcGVhdERpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgX2l0ZW1LZXlzPzogdW5rbm93bltdO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnRJbmZvOiBQYXJ0SW5mbykge1xuICAgIHN1cGVyKHBhcnRJbmZvKTtcbiAgICBpZiAocGFydEluZm8udHlwZSAhPT0gUGFydFR5cGUuQ0hJTEQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVwZWF0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbiB0ZXh0IGV4cHJlc3Npb25zJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmFsdWVzQW5kS2V5czxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm5PclRlbXBsYXRlOiBLZXlGbjxUPiB8IEl0ZW1UZW1wbGF0ZTxUPixcbiAgICB0ZW1wbGF0ZT86IEl0ZW1UZW1wbGF0ZTxUPlxuICApIHtcbiAgICBsZXQga2V5Rm46IEtleUZuPFQ+IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZSA9IGtleUZuT3JUZW1wbGF0ZTtcbiAgICB9IGVsc2UgaWYgKGtleUZuT3JUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXlGbiA9IGtleUZuT3JUZW1wbGF0ZSBhcyBLZXlGbjxUPjtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBrZXlzW2luZGV4XSA9IGtleUZuID8ga2V5Rm4oaXRlbSwgaW5kZXgpIDogaW5kZXg7XG4gICAgICB2YWx1ZXNbaW5kZXhdID0gdGVtcGxhdGUhKGl0ZW0sIGluZGV4KTtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZXMsXG4gICAgICBrZXlzLFxuICAgIH07XG4gIH1cblxuICByZW5kZXI8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCB0ZW1wbGF0ZTogSXRlbVRlbXBsYXRlPFQ+KTogQXJyYXk8dW5rbm93bj47XG4gIHJlbmRlcjxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm46IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlOiBJdGVtVGVtcGxhdGU8VD5cbiAgKTogQXJyYXk8dW5rbm93bj47XG4gIHJlbmRlcjxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm5PclRlbXBsYXRlOiBLZXlGbjxUPiB8IEl0ZW1UZW1wbGF0ZTxUPixcbiAgICB0ZW1wbGF0ZT86IEl0ZW1UZW1wbGF0ZTxUPlxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VmFsdWVzQW5kS2V5cyhpdGVtcywga2V5Rm5PclRlbXBsYXRlLCB0ZW1wbGF0ZSkudmFsdWVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlPFQ+KFxuICAgIGNvbnRhaW5lclBhcnQ6IENoaWxkUGFydCxcbiAgICBbaXRlbXMsIGtleUZuT3JUZW1wbGF0ZSwgdGVtcGxhdGVdOiBbXG4gICAgICBJdGVyYWJsZTxUPixcbiAgICAgIEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgICAgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIF1cbiAgKSB7XG4gICAgLy8gT2xkIHBhcnQgJiBrZXkgbGlzdHMgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBsYXN0IHVwZGF0ZSAod2hpY2ggbWF5XG4gICAgLy8gYmUgcHJpbWVkIGJ5IGh5ZHJhdGlvbilcbiAgICBjb25zdCBvbGRQYXJ0cyA9IGdldENvbW1pdHRlZFZhbHVlKFxuICAgICAgY29udGFpbmVyUGFydFxuICAgICkgYXMgQXJyYXk8Q2hpbGRQYXJ0IHwgbnVsbD47XG4gICAgY29uc3Qge3ZhbHVlczogbmV3VmFsdWVzLCBrZXlzOiBuZXdLZXlzfSA9IHRoaXMuX2dldFZhbHVlc0FuZEtleXMoXG4gICAgICBpdGVtcyxcbiAgICAgIGtleUZuT3JUZW1wbGF0ZSxcbiAgICAgIHRlbXBsYXRlXG4gICAgKTtcblxuICAgIC8vIFdlIGNoZWNrIHRoYXQgb2xkUGFydHMsIHRoZSBjb21taXR0ZWQgdmFsdWUsIGlzIGFuIEFycmF5IGFzIGFuXG4gICAgLy8gaW5kaWNhdG9yIHRoYXQgdGhlIHByZXZpb3VzIHZhbHVlIGNhbWUgZnJvbSBhIHJlcGVhdCgpIGNhbGwuIElmXG4gICAgLy8gb2xkUGFydHMgaXMgbm90IGFuIEFycmF5IHRoZW4gdGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIGFuZCB3ZSByZXR1cm5cbiAgICAvLyBhbiBhcnJheSBmb3IgbGl0LWh0bWwncyBhcnJheSBoYW5kbGluZyB0byByZW5kZXIsIGFuZCByZW1lbWJlciB0aGVcbiAgICAvLyBrZXlzLlxuICAgIGlmICghQXJyYXkuaXNBcnJheShvbGRQYXJ0cykpIHtcbiAgICAgIHRoaXMuX2l0ZW1LZXlzID0gbmV3S2V5cztcbiAgICAgIHJldHVybiBuZXdWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gSW4gU1NSIGh5ZHJhdGlvbiBpdCdzIHBvc3NpYmxlIGZvciBvbGRQYXJ0cyB0byBiZSBhbiBhcnJheSBidXQgZm9yIHVzXG4gICAgLy8gdG8gbm90IGhhdmUgaXRlbSBrZXlzIGJlY2F1c2UgdGhlIHVwZGF0ZSgpIGhhc24ndCBydW4geWV0LiBXZSBzZXQgdGhlXG4gICAgLy8ga2V5cyB0byBhbiBlbXB0eSBhcnJheS4gVGhpcyB3aWxsIGNhdXNlIGFsbCBvbGRLZXkvbmV3S2V5IGNvbXBhcmlzb25zXG4gICAgLy8gdG8gZmFpbCBhbmQgZXhlY3V0aW9uIHRvIGZhbGwgdG8gdGhlIGxhc3QgbmVzdGVkIGJyYWNoIGJlbG93IHdoaWNoXG4gICAgLy8gcmV1c2VzIHRoZSBvbGRQYXJ0LlxuICAgIGNvbnN0IG9sZEtleXMgPSAodGhpcy5faXRlbUtleXMgPz89IFtdKTtcblxuICAgIC8vIE5ldyBwYXJ0IGxpc3Qgd2lsbCBiZSBidWlsdCB1cCBhcyB3ZSBnbyAoZWl0aGVyIHJldXNlZCBmcm9tXG4gICAgLy8gb2xkIHBhcnRzIG9yIGNyZWF0ZWQgZm9yIG5ldyBrZXlzIGluIHRoaXMgdXBkYXRlKS4gVGhpcyBpc1xuICAgIC8vIHNhdmVkIGluIHRoZSBhYm92ZSBjYWNoZSBhdCB0aGUgZW5kIG9mIHRoZSB1cGRhdGUuXG4gICAgY29uc3QgbmV3UGFydHM6IENoaWxkUGFydFtdID0gW107XG5cbiAgICAvLyBNYXBzIGZyb20ga2V5IHRvIGluZGV4IGZvciBjdXJyZW50IGFuZCBwcmV2aW91cyB1cGRhdGU7IHRoZXNlXG4gICAgLy8gYXJlIGdlbmVyYXRlZCBsYXppbHkgb25seSB3aGVuIG5lZWRlZCBhcyBhIHBlcmZvcm1hbmNlXG4gICAgLy8gb3B0aW1pemF0aW9uLCBzaW5jZSB0aGV5IGFyZSBvbmx5IHJlcXVpcmVkIGZvciBtdWx0aXBsZVxuICAgIC8vIG5vbi1jb250aWd1b3VzIGNoYW5nZXMgaW4gdGhlIGxpc3QsIHdoaWNoIGFyZSBsZXNzIGNvbW1vbi5cbiAgICBsZXQgbmV3S2V5VG9JbmRleE1hcCE6IE1hcDx1bmtub3duLCBudW1iZXI+O1xuICAgIGxldCBvbGRLZXlUb0luZGV4TWFwITogTWFwPHVua25vd24sIG51bWJlcj47XG5cbiAgICAvLyBIZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIG9sZCBwYXJ0cyBhbmQgbmV3IHZhbHVlc1xuICAgIGxldCBvbGRIZWFkID0gMDtcbiAgICBsZXQgb2xkVGFpbCA9IG9sZFBhcnRzLmxlbmd0aCAtIDE7XG4gICAgbGV0IG5ld0hlYWQgPSAwO1xuICAgIGxldCBuZXdUYWlsID0gbmV3VmFsdWVzLmxlbmd0aCAtIDE7XG5cbiAgICAvLyBPdmVydmlldyBvZiBPKG4pIHJlY29uY2lsaWF0aW9uIGFsZ29yaXRobSAoZ2VuZXJhbCBhcHByb2FjaFxuICAgIC8vIGJhc2VkIG9uIGlkZWFzIGZvdW5kIGluIGl2aSwgdnVlLCBzbmFiYmRvbSwgZXRjLik6XG4gICAgLy9cbiAgICAvLyAqIFdlIHN0YXJ0IHdpdGggdGhlIGxpc3Qgb2Ygb2xkIHBhcnRzIGFuZCBuZXcgdmFsdWVzIChhbmRcbiAgICAvLyAgIGFycmF5cyBvZiB0aGVpciByZXNwZWN0aXZlIGtleXMpLCBoZWFkL3RhaWwgcG9pbnRlcnMgaW50b1xuICAgIC8vICAgZWFjaCwgYW5kIHdlIGJ1aWxkIHVwIHRoZSBuZXcgbGlzdCBvZiBwYXJ0cyBieSB1cGRhdGluZ1xuICAgIC8vICAgKGFuZCB3aGVuIG5lZWRlZCwgbW92aW5nKSBvbGQgcGFydHMgb3IgY3JlYXRpbmcgbmV3IG9uZXMuXG4gICAgLy8gICBUaGUgaW5pdGlhbCBzY2VuYXJpbyBtaWdodCBsb29rIGxpa2UgdGhpcyAoZm9yIGJyZXZpdHkgb2ZcbiAgICAvLyAgIHRoZSBkaWFncmFtcywgdGhlIG51bWJlcnMgaW4gdGhlIGFycmF5IHJlZmxlY3Qga2V5c1xuICAgIC8vICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvbGQgcGFydHMgb3IgbmV3IHZhbHVlcywgYWx0aG91Z2gga2V5c1xuICAgIC8vICAgYW5kIHBhcnRzL3ZhbHVlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIGluIHBhcmFsbGVsIGFycmF5c1xuICAgIC8vICAgaW5kZXhlZCB1c2luZyB0aGUgc2FtZSBoZWFkL3RhaWwgcG9pbnRlcnMpOlxuICAgIC8vXG4gICAgLy8gICAgICBvbGRIZWFkIHYgICAgICAgICAgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAyLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFsgLCAgLCAgLCAgLCAgLCAgLCAgXVxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSA8LSByZWZsZWN0cyB0aGUgdXNlcidzIG5ld1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtIG9yZGVyXG4gICAgLy8gICAgICBuZXdIZWFkIF4gICAgICAgICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBJdGVyYXRlIG9sZCAmIG5ldyBsaXN0cyBmcm9tIGJvdGggc2lkZXMsIHVwZGF0aW5nLFxuICAgIC8vICAgc3dhcHBpbmcsIG9yIHJlbW92aW5nIHBhcnRzIGF0IHRoZSBoZWFkL3RhaWwgbG9jYXRpb25zXG4gICAgLy8gICB1bnRpbCBuZWl0aGVyIGhlYWQgbm9yIHRhaWwgY2FuIG1vdmUuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IGtleXMgYXQgaGVhZCBwb2ludGVycyBtYXRjaCwgc28gdXBkYXRlIG9sZFxuICAgIC8vICAgcGFydCAwIGluLXBsYWNlIChubyBuZWVkIHRvIG1vdmUgaXQpIGFuZCByZWNvcmQgcGFydCAwIGluXG4gICAgLy8gICB0aGUgYG5ld1BhcnRzYCBsaXN0LiBUaGUgbGFzdCB0aGluZyB3ZSBkbyBpcyBhZHZhbmNlIHRoZVxuICAgIC8vICAgYG9sZEhlYWRgIGFuZCBgbmV3SGVhZGAgcG9pbnRlcnMgKHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZVxuICAgIC8vICAgbmV4dCBkaWFncmFtKS5cbiAgICAvL1xuICAgIC8vICAgICAgb2xkSGVhZCB2ICAgICAgICAgICAgICAgICB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgMiwgMywgNCwgNSwgNl1cbiAgICAvLyAgIG5ld1BhcnRzOiBbMCwgICwgICwgICwgICwgICwgIF0gPC0gaGVhZHMgbWF0Y2hlZDogdXBkYXRlIDBcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl0gICAgYW5kIGFkdmFuY2UgYm90aCBvbGRIZWFkXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgbmV3SGVhZFxuICAgIC8vICAgICAgbmV3SGVhZCBeICAgICAgICAgICAgICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogaGVhZCBwb2ludGVycyBkb24ndCBtYXRjaCwgYnV0IHRhaWxcbiAgICAvLyAgIHBvaW50ZXJzIGRvLCBzbyB1cGRhdGUgcGFydCA2IGluIHBsYWNlIChubyBuZWVkIHRvIG1vdmVcbiAgICAvLyAgIGl0KSwgYW5kIHJlY29yZCBwYXJ0IDYgaW4gdGhlIGBuZXdQYXJ0c2AgbGlzdC4gTGFzdCxcbiAgICAvLyAgIGFkdmFuY2UgdGhlIGBvbGRUYWlsYCBhbmQgYG9sZEhlYWRgIHBvaW50ZXJzLlxuICAgIC8vXG4gICAgLy8gICAgICAgICBvbGRIZWFkIHYgICAgICAgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAyLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAgLCAgLCAgLCAgLCAgLCA2XSA8LSB0YWlscyBtYXRjaGVkOiB1cGRhdGUgNlxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBib3RoIG9sZFRhaWxcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBuZXdUYWlsXG4gICAgLy8gICAgICAgICBuZXdIZWFkIF4gICAgICAgICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBJZiBuZWl0aGVyIGhlYWQgbm9yIHRhaWwgbWF0Y2g7IG5leHQgY2hlY2sgaWYgb25lIG9mIHRoZVxuICAgIC8vICAgb2xkIGhlYWQvdGFpbCBpdGVtcyB3YXMgcmVtb3ZlZC4gV2UgZmlyc3QgbmVlZCB0byBnZW5lcmF0ZVxuICAgIC8vICAgdGhlIHJldmVyc2UgbWFwIG9mIG5ldyBrZXlzIHRvIGluZGV4IChgbmV3S2V5VG9JbmRleE1hcGApLFxuICAgIC8vICAgd2hpY2ggaXMgZG9uZSBvbmNlIGxhemlseSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbixcbiAgICAvLyAgIHNpbmNlIHdlIG9ubHkgaGl0IHRoaXMgY2FzZSBpZiBtdWx0aXBsZSBub24tY29udGlndW91c1xuICAgIC8vICAgY2hhbmdlcyB3ZXJlIG1hZGUuIE5vdGUgdGhhdCBmb3IgY29udGlndW91cyByZW1vdmFsXG4gICAgLy8gICBhbnl3aGVyZSBpbiB0aGUgbGlzdCwgdGhlIGhlYWQgYW5kIHRhaWxzIHdvdWxkIGFkdmFuY2VcbiAgICAvLyAgIGZyb20gZWl0aGVyIGVuZCBhbmQgcGFzcyBlYWNoIG90aGVyIGJlZm9yZSB3ZSBnZXQgdG8gdGhpc1xuICAgIC8vICAgY2FzZSBhbmQgcmVtb3ZhbHMgd291bGQgYmUgaGFuZGxlZCBpbiB0aGUgZmluYWwgd2hpbGUgbG9vcFxuICAgIC8vICAgd2l0aG91dCBuZWVkaW5nIHRvIGdlbmVyYXRlIHRoZSBtYXAuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IFRoZSBrZXkgYXQgYG9sZFRhaWxgIHdhcyByZW1vdmVkIChubyBsb25nZXJcbiAgICAvLyAgIGluIHRoZSBgbmV3S2V5VG9JbmRleE1hcGApLCBzbyByZW1vdmUgdGhhdCBwYXJ0IGZyb20gdGhlXG4gICAgLy8gICBET00gYW5kIGFkdmFuY2UganVzdCB0aGUgYG9sZFRhaWxgIHBvaW50ZXIuXG4gICAgLy9cbiAgICAvLyAgICAgICAgIG9sZEhlYWQgdiAgICAgICAgICAgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIDIsIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsICAsICAsICAsICAsICAsIDZdIDwtIDUgbm90IGluIG5ldyBtYXA6IHJlbW92ZVxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICA1IGFuZCBhZHZhbmNlIG9sZFRhaWxcbiAgICAvLyAgICAgICAgIG5ld0hlYWQgXiAgICAgICAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIE9uY2UgaGVhZCBhbmQgdGFpbCBjYW5ub3QgbW92ZSwgYW55IG1pc21hdGNoZXMgYXJlIGR1ZSB0b1xuICAgIC8vICAgZWl0aGVyIG5ldyBvciBtb3ZlZCBpdGVtczsgaWYgYSBuZXcga2V5IGlzIGluIHRoZSBwcmV2aW91c1xuICAgIC8vICAgXCJvbGQga2V5IHRvIG9sZCBpbmRleFwiIG1hcCwgbW92ZSB0aGUgb2xkIHBhcnQgdG8gdGhlIG5ld1xuICAgIC8vICAgbG9jYXRpb24sIG90aGVyd2lzZSBjcmVhdGUgYW5kIGluc2VydCBhIG5ldyBwYXJ0LiBOb3RlXG4gICAgLy8gICB0aGF0IHdoZW4gbW92aW5nIGFuIG9sZCBwYXJ0IHdlIG51bGwgaXRzIHBvc2l0aW9uIGluIHRoZVxuICAgIC8vICAgb2xkUGFydHMgYXJyYXkgaWYgaXQgbGllcyBiZXR3ZWVuIHRoZSBoZWFkIGFuZCB0YWlsIHNvIHdlXG4gICAgLy8gICBrbm93IHRvIHNraXAgaXQgd2hlbiB0aGUgcG9pbnRlcnMgZ2V0IHRoZXJlLlxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBuZWl0aGVyIGhlYWQgbm9yIHRhaWwgbWF0Y2gsIGFuZCBuZWl0aGVyXG4gICAgLy8gICB3ZXJlIHJlbW92ZWQ7IHNvIGZpbmQgdGhlIGBuZXdIZWFkYCBrZXkgaW4gdGhlXG4gICAgLy8gICBgb2xkS2V5VG9JbmRleE1hcGAsIGFuZCBtb3ZlIHRoYXQgb2xkIHBhcnQncyBET00gaW50byB0aGVcbiAgICAvLyAgIG5leHQgaGVhZCBwb3NpdGlvbiAoYmVmb3JlIGBvbGRQYXJ0c1tvbGRIZWFkXWApLiBMYXN0LFxuICAgIC8vICAgbnVsbCB0aGUgcGFydCBpbiB0aGUgYG9sZFBhcnRgIGFycmF5IHNpbmNlIGl0IHdhc1xuICAgIC8vICAgc29tZXdoZXJlIGluIHRoZSByZW1haW5pbmcgb2xkUGFydHMgc3RpbGwgdG8gYmUgc2Nhbm5lZFxuICAgIC8vICAgKGJldHdlZW4gdGhlIGhlYWQgYW5kIHRhaWwgcG9pbnRlcnMpIHNvIHRoYXQgd2Uga25vdyB0b1xuICAgIC8vICAgc2tpcCB0aGF0IG9sZCBwYXJ0IG9uIGZ1dHVyZSBpdGVyYXRpb25zLlxuICAgIC8vXG4gICAgLy8gICAgICAgICBvbGRIZWFkIHYgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAgLCAgLCAgLCAgLCA2XSA8LSBzdHVjazogdXBkYXRlICYgbW92ZSAyXG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdICAgIGludG8gcGxhY2UgYW5kIGFkdmFuY2VcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZFxuICAgIC8vICAgICAgICAgbmV3SGVhZCBeICAgICAgICAgICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogTm90ZSB0aGF0IGZvciBtb3Zlcy9pbnNlcnRpb25zIGxpa2UgdGhlIG9uZSBhYm92ZSwgYSBwYXJ0XG4gICAgLy8gICBpbnNlcnRlZCBhdCB0aGUgaGVhZCBwb2ludGVyIGlzIGluc2VydGVkIGJlZm9yZSB0aGVcbiAgICAvLyAgIGN1cnJlbnQgYG9sZFBhcnRzW29sZEhlYWRdYCwgYW5kIGEgcGFydCBpbnNlcnRlZCBhdCB0aGVcbiAgICAvLyAgIHRhaWwgcG9pbnRlciBpcyBpbnNlcnRlZCBiZWZvcmUgYG5ld1BhcnRzW25ld1RhaWwrMV1gLiBUaGVcbiAgICAvLyAgIHNlZW1pbmcgYXN5bW1ldHJ5IGxpZXMgaW4gdGhlIGZhY3QgdGhhdCBuZXcgcGFydHMgYXJlXG4gICAgLy8gICBtb3ZlZCBpbnRvIHBsYWNlIG91dHNpZGUgaW4sIHNvIHRvIHRoZSByaWdodCBvZiB0aGUgaGVhZFxuICAgIC8vICAgcG9pbnRlciBhcmUgb2xkIHBhcnRzLCBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0YWlsXG4gICAgLy8gICBwb2ludGVyIGFyZSBuZXcgcGFydHMuXG4gICAgLy9cbiAgICAvLyAqIFdlIGFsd2F5cyByZXN0YXJ0IGJhY2sgZnJvbSB0aGUgdG9wIG9mIHRoZSBhbGdvcml0aG0sXG4gICAgLy8gICBhbGxvd2luZyBtYXRjaGluZyBhbmQgc2ltcGxlIHVwZGF0ZXMgaW4gcGxhY2UgdG9cbiAgICAvLyAgIGNvbnRpbnVlLi4uXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IHRoZSBoZWFkIHBvaW50ZXJzIG9uY2UgYWdhaW4gbWF0Y2gsIHNvXG4gICAgLy8gICBzaW1wbHkgdXBkYXRlIHBhcnQgMSBhbmQgcmVjb3JkIGl0IGluIHRoZSBgbmV3UGFydHNgXG4gICAgLy8gICBhcnJheS4gIExhc3QsIGFkdmFuY2UgYm90aCBoZWFkIHBvaW50ZXJzLlxuICAgIC8vXG4gICAgLy8gICAgICAgICBvbGRIZWFkIHYgICAgICAgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCAgLCAgLCAgLCA2XSA8LSBoZWFkcyBtYXRjaGVkOiB1cGRhdGUgMVxuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBib3RoIG9sZEhlYWRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBuZXdIZWFkXG4gICAgLy8gICAgICAgICAgICBuZXdIZWFkIF4gICAgICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBBcyBtZW50aW9uZWQgYWJvdmUsIGl0ZW1zIHRoYXQgd2VyZSBtb3ZlZCBhcyBhIHJlc3VsdCBvZlxuICAgIC8vICAgYmVpbmcgc3R1Y2sgKHRoZSBmaW5hbCBlbHNlIGNsYXVzZSBpbiB0aGUgY29kZSBiZWxvdykgYXJlXG4gICAgLy8gICBtYXJrZWQgd2l0aCBudWxsLCBzbyB3ZSBhbHdheXMgYWR2YW5jZSBvbGQgcG9pbnRlcnMgb3ZlclxuICAgIC8vICAgdGhlc2Ugc28gd2UncmUgY29tcGFyaW5nIHRoZSBuZXh0IGFjdHVhbCBvbGQgdmFsdWUgb25cbiAgICAvLyAgIGVpdGhlciBlbmQuXG4gICAgLy9cbiAgICAvLyAqIEV4YW1wbGUgYmVsb3c6IGBvbGRIZWFkYCBpcyBudWxsIChhbHJlYWR5IHBsYWNlZCBpblxuICAgIC8vICAgbmV3UGFydHMpLCBzbyBhZHZhbmNlIGBvbGRIZWFkYC5cbiAgICAvL1xuICAgIC8vICAgICAgICAgICAgb2xkSGVhZCB2ICAgICB2IG9sZFRhaWxcbiAgICAvLyAgIG9sZEtleXM6ICBbMCwgMSwgLSwgMywgNCwgNSwgNl0gPC0gb2xkIGhlYWQgYWxyZWFkeSB1c2VkOlxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCAgLCAgLCAgLCA2XSAgICBhZHZhbmNlIG9sZEhlYWRcbiAgICAvLyAgIG5ld0tleXM6ICBbMCwgMiwgMSwgNCwgMywgNywgNl1cbiAgICAvLyAgICAgICAgICAgICAgIG5ld0hlYWQgXiAgICAgXiBuZXdUYWlsXG4gICAgLy9cbiAgICAvLyAqIE5vdGUgaXQncyBub3QgY3JpdGljYWwgdG8gbWFyayBvbGQgcGFydHMgYXMgbnVsbCB3aGVuIHRoZXlcbiAgICAvLyAgIGFyZSBtb3ZlZCBmcm9tIGhlYWQgdG8gdGFpbCBvciB0YWlsIHRvIGhlYWQsIHNpbmNlIHRoZXlcbiAgICAvLyAgIHdpbGwgYmUgb3V0c2lkZSB0aGUgcG9pbnRlciByYW5nZSBhbmQgbmV2ZXIgdmlzaXRlZCBhZ2Fpbi5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogSGVyZSB0aGUgb2xkIHRhaWwga2V5IG1hdGNoZXMgdGhlIG5ldyBoZWFkXG4gICAgLy8gICBrZXksIHNvIHRoZSBwYXJ0IGF0IHRoZSBgb2xkVGFpbGAgcG9zaXRpb24gYW5kIG1vdmUgaXRzXG4gICAgLy8gICBET00gdG8gdGhlIG5ldyBoZWFkIHBvc2l0aW9uIChiZWZvcmUgYG9sZFBhcnRzW29sZEhlYWRdYCkuXG4gICAgLy8gICBMYXN0LCBhZHZhbmNlIGBvbGRUYWlsYCBhbmQgYG5ld0hlYWRgIHBvaW50ZXJzLlxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICBvbGRIZWFkIHYgIHYgb2xkVGFpbFxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCA0LCAgLCAgLCA2XSA8LSBvbGQgdGFpbCBtYXRjaGVzIG5ld1xuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgIGhlYWQ6IHVwZGF0ZSAmIG1vdmUgNCxcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIG9sZFRhaWwgJiBuZXdIZWFkXG4gICAgLy8gICAgICAgICAgICAgICBuZXdIZWFkIF4gICAgIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBFeGFtcGxlIGJlbG93OiBPbGQgYW5kIG5ldyBoZWFkIGtleXMgbWF0Y2gsIHNvIHVwZGF0ZSB0aGVcbiAgICAvLyAgIG9sZCBoZWFkIHBhcnQgaW4gcGxhY2UsIGFuZCBhZHZhbmNlIHRoZSBgb2xkSGVhZGAgYW5kXG4gICAgLy8gICBgbmV3SGVhZGAgcG9pbnRlcnMuXG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgIG9sZEhlYWQgdiBvbGRUYWlsXG4gICAgLy8gICBvbGRLZXlzOiAgWzAsIDEsIC0sIDMsIDQsIDUsIDZdXG4gICAgLy8gICBuZXdQYXJ0czogWzAsIDIsIDEsIDQsIDMsICAgLDZdIDwtIGhlYWRzIG1hdGNoOiB1cGRhdGUgM1xuICAgIC8vICAgbmV3S2V5czogIFswLCAyLCAxLCA0LCAzLCA3LCA2XSAgICBhbmQgYWR2YW5jZSBvbGRIZWFkICZcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZFxuICAgIC8vICAgICAgICAgICAgICAgICAgbmV3SGVhZCBeICBeIG5ld1RhaWxcbiAgICAvL1xuICAgIC8vICogT25jZSB0aGUgbmV3IG9yIG9sZCBwb2ludGVycyBtb3ZlIHBhc3QgZWFjaCBvdGhlciB0aGVuIGFsbFxuICAgIC8vICAgd2UgaGF2ZSBsZWZ0IGlzIGFkZGl0aW9ucyAoaWYgb2xkIGxpc3QgZXhoYXVzdGVkKSBvclxuICAgIC8vICAgcmVtb3ZhbHMgKGlmIG5ldyBsaXN0IGV4aGF1c3RlZCkuIFRob3NlIGFyZSBoYW5kbGVkIGluIHRoZVxuICAgIC8vICAgZmluYWwgd2hpbGUgbG9vcHMgYXQgdGhlIGVuZC5cbiAgICAvL1xuICAgIC8vICogRXhhbXBsZSBiZWxvdzogYG9sZEhlYWRgIGV4Y2VlZGVkIGBvbGRUYWlsYCwgc28gd2UncmUgZG9uZVxuICAgIC8vICAgd2l0aCB0aGUgbWFpbiBsb29wLiAgQ3JlYXRlIHRoZSByZW1haW5pbmcgcGFydCBhbmQgaW5zZXJ0XG4gICAgLy8gICBpdCBhdCB0aGUgbmV3IGhlYWQgcG9zaXRpb24sIGFuZCB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICAgIC8vXG4gICAgLy8gICAgICAgICAgICAgICAgICAgKG9sZEhlYWQgPiBvbGRUYWlsKVxuICAgIC8vICAgb2xkS2V5czogIFswLCAxLCAtLCAzLCA0LCA1LCA2XVxuICAgIC8vICAgbmV3UGFydHM6IFswLCAyLCAxLCA0LCAzLCA3ICw2XSA8LSBjcmVhdGUgYW5kIGluc2VydCA3XG4gICAgLy8gICBuZXdLZXlzOiAgWzAsIDIsIDEsIDQsIDMsIDcsIDZdXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBuZXdIZWFkIF4gbmV3VGFpbFxuICAgIC8vXG4gICAgLy8gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBpZi9lbHNlIGNsYXVzZXMgaXMgbm90XG4gICAgLy8gICBpbXBvcnRhbnQgdG8gdGhlIGFsZ29yaXRobSwgYXMgbG9uZyBhcyB0aGUgbnVsbCBjaGVja3NcbiAgICAvLyAgIGNvbWUgZmlyc3QgKHRvIGVuc3VyZSB3ZSdyZSBhbHdheXMgd29ya2luZyBvbiB2YWxpZCBvbGRcbiAgICAvLyAgIHBhcnRzKSBhbmQgdGhhdCB0aGUgZmluYWwgZWxzZSBjbGF1c2UgY29tZXMgbGFzdCAoc2luY2VcbiAgICAvLyAgIHRoYXQncyB3aGVyZSB0aGUgZXhwZW5zaXZlIG1vdmVzIG9jY3VyKS4gVGhlIG9yZGVyIG9mXG4gICAgLy8gICByZW1haW5pbmcgY2xhdXNlcyBpcyBqdXN0IGEgc2ltcGxlIGd1ZXNzIGF0IHdoaWNoIGNhc2VzXG4gICAgLy8gICB3aWxsIGJlIG1vc3QgY29tbW9uLlxuICAgIC8vXG4gICAgLy8gKiBOb3RlLCB3ZSBjb3VsZCBjYWxjdWxhdGUgdGhlIGxvbmdlc3RcbiAgICAvLyAgIGluY3JlYXNpbmcgc3Vic2VxdWVuY2UgKExJUykgb2Ygb2xkIGl0ZW1zIGluIG5ldyBwb3NpdGlvbixcbiAgICAvLyAgIGFuZCBvbmx5IG1vdmUgdGhvc2Ugbm90IGluIHRoZSBMSVMgc2V0LiBIb3dldmVyIHRoYXQgY29zdHNcbiAgICAvLyAgIE8obmxvZ24pIHRpbWUgYW5kIGFkZHMgYSBiaXQgbW9yZSBjb2RlLCBhbmQgb25seSBoZWxwc1xuICAgIC8vICAgbWFrZSByYXJlIHR5cGVzIG9mIG11dGF0aW9ucyByZXF1aXJlIGZld2VyIG1vdmVzLiBUaGVcbiAgICAvLyAgIGFib3ZlIGhhbmRsZXMgcmVtb3ZlcywgYWRkcywgcmV2ZXJzYWwsIHN3YXBzLCBhbmQgc2luZ2xlXG4gICAgLy8gICBtb3ZlcyBvZiBjb250aWd1b3VzIGl0ZW1zIGluIGxpbmVhciB0aW1lLCBpbiB0aGUgbWluaW11bVxuICAgIC8vICAgbnVtYmVyIG9mIG1vdmVzLiBBcyB0aGUgbnVtYmVyIG9mIG11bHRpcGxlIG1vdmVzIHdoZXJlIExJU1xuICAgIC8vICAgbWlnaHQgaGVscCBhcHByb2FjaGVzIGEgcmFuZG9tIHNodWZmbGUsIHRoZSBMSVNcbiAgICAvLyAgIG9wdGltaXphdGlvbiBiZWNvbWVzIGxlc3MgaGVscGZ1bCwgc28gaXQgc2VlbXMgbm90IHdvcnRoXG4gICAgLy8gICB0aGUgY29kZSBhdCB0aGlzIHBvaW50LiBDb3VsZCByZWNvbnNpZGVyIGlmIGEgY29tcGVsbGluZ1xuICAgIC8vICAgY2FzZSBhcmlzZXMuXG5cbiAgICB3aGlsZSAob2xkSGVhZCA8PSBvbGRUYWlsICYmIG5ld0hlYWQgPD0gbmV3VGFpbCkge1xuICAgICAgaWYgKG9sZFBhcnRzW29sZEhlYWRdID09PSBudWxsKSB7XG4gICAgICAgIC8vIGBudWxsYCBtZWFucyBvbGQgcGFydCBhdCBoZWFkIGhhcyBhbHJlYWR5IGJlZW4gdXNlZFxuICAgICAgICAvLyBiZWxvdzsgc2tpcFxuICAgICAgICBvbGRIZWFkKys7XG4gICAgICB9IGVsc2UgaWYgKG9sZFBhcnRzW29sZFRhaWxdID09PSBudWxsKSB7XG4gICAgICAgIC8vIGBudWxsYCBtZWFucyBvbGQgcGFydCBhdCB0YWlsIGhhcyBhbHJlYWR5IGJlZW4gdXNlZFxuICAgICAgICAvLyBiZWxvdzsgc2tpcFxuICAgICAgICBvbGRUYWlsLS07XG4gICAgICB9IGVsc2UgaWYgKG9sZEtleXNbb2xkSGVhZF0gPT09IG5ld0tleXNbbmV3SGVhZF0pIHtcbiAgICAgICAgLy8gT2xkIGhlYWQgbWF0Y2hlcyBuZXcgaGVhZDsgdXBkYXRlIGluIHBsYWNlXG4gICAgICAgIG5ld1BhcnRzW25ld0hlYWRdID0gc2V0Q2hpbGRQYXJ0VmFsdWUoXG4gICAgICAgICAgb2xkUGFydHNbb2xkSGVhZF0hLFxuICAgICAgICAgIG5ld1ZhbHVlc1tuZXdIZWFkXVxuICAgICAgICApO1xuICAgICAgICBvbGRIZWFkKys7XG4gICAgICAgIG5ld0hlYWQrKztcbiAgICAgIH0gZWxzZSBpZiAob2xkS2V5c1tvbGRUYWlsXSA9PT0gbmV3S2V5c1tuZXdUYWlsXSkge1xuICAgICAgICAvLyBPbGQgdGFpbCBtYXRjaGVzIG5ldyB0YWlsOyB1cGRhdGUgaW4gcGxhY2VcbiAgICAgICAgbmV3UGFydHNbbmV3VGFpbF0gPSBzZXRDaGlsZFBhcnRWYWx1ZShcbiAgICAgICAgICBvbGRQYXJ0c1tvbGRUYWlsXSEsXG4gICAgICAgICAgbmV3VmFsdWVzW25ld1RhaWxdXG4gICAgICAgICk7XG4gICAgICAgIG9sZFRhaWwtLTtcbiAgICAgICAgbmV3VGFpbC0tO1xuICAgICAgfSBlbHNlIGlmIChvbGRLZXlzW29sZEhlYWRdID09PSBuZXdLZXlzW25ld1RhaWxdKSB7XG4gICAgICAgIC8vIE9sZCBoZWFkIG1hdGNoZXMgbmV3IHRhaWw7IHVwZGF0ZSBhbmQgbW92ZSB0byBuZXcgdGFpbFxuICAgICAgICBuZXdQYXJ0c1tuZXdUYWlsXSA9IHNldENoaWxkUGFydFZhbHVlKFxuICAgICAgICAgIG9sZFBhcnRzW29sZEhlYWRdISxcbiAgICAgICAgICBuZXdWYWx1ZXNbbmV3VGFpbF1cbiAgICAgICAgKTtcbiAgICAgICAgaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBuZXdQYXJ0c1tuZXdUYWlsICsgMV0sIG9sZFBhcnRzW29sZEhlYWRdISk7XG4gICAgICAgIG9sZEhlYWQrKztcbiAgICAgICAgbmV3VGFpbC0tO1xuICAgICAgfSBlbHNlIGlmIChvbGRLZXlzW29sZFRhaWxdID09PSBuZXdLZXlzW25ld0hlYWRdKSB7XG4gICAgICAgIC8vIE9sZCB0YWlsIG1hdGNoZXMgbmV3IGhlYWQ7IHVwZGF0ZSBhbmQgbW92ZSB0byBuZXcgaGVhZFxuICAgICAgICBuZXdQYXJ0c1tuZXdIZWFkXSA9IHNldENoaWxkUGFydFZhbHVlKFxuICAgICAgICAgIG9sZFBhcnRzW29sZFRhaWxdISxcbiAgICAgICAgICBuZXdWYWx1ZXNbbmV3SGVhZF1cbiAgICAgICAgKTtcbiAgICAgICAgaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBvbGRQYXJ0c1tvbGRIZWFkXSEsIG9sZFBhcnRzW29sZFRhaWxdISk7XG4gICAgICAgIG9sZFRhaWwtLTtcbiAgICAgICAgbmV3SGVhZCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5ld0tleVRvSW5kZXhNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIExhemlseSBnZW5lcmF0ZSBrZXktdG8taW5kZXggbWFwcywgdXNlZCBmb3IgcmVtb3ZhbHMgJlxuICAgICAgICAgIC8vIG1vdmVzIGJlbG93XG4gICAgICAgICAgbmV3S2V5VG9JbmRleE1hcCA9IGdlbmVyYXRlTWFwKG5ld0tleXMsIG5ld0hlYWQsIG5ld1RhaWwpO1xuICAgICAgICAgIG9sZEtleVRvSW5kZXhNYXAgPSBnZW5lcmF0ZU1hcChvbGRLZXlzLCBvbGRIZWFkLCBvbGRUYWlsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld0tleVRvSW5kZXhNYXAuaGFzKG9sZEtleXNbb2xkSGVhZF0pKSB7XG4gICAgICAgICAgLy8gT2xkIGhlYWQgaXMgbm8gbG9uZ2VyIGluIG5ldyBsaXN0OyByZW1vdmVcbiAgICAgICAgICByZW1vdmVQYXJ0KG9sZFBhcnRzW29sZEhlYWRdISk7XG4gICAgICAgICAgb2xkSGVhZCsrO1xuICAgICAgICB9IGVsc2UgaWYgKCFuZXdLZXlUb0luZGV4TWFwLmhhcyhvbGRLZXlzW29sZFRhaWxdKSkge1xuICAgICAgICAgIC8vIE9sZCB0YWlsIGlzIG5vIGxvbmdlciBpbiBuZXcgbGlzdDsgcmVtb3ZlXG4gICAgICAgICAgcmVtb3ZlUGFydChvbGRQYXJ0c1tvbGRUYWlsXSEpO1xuICAgICAgICAgIG9sZFRhaWwtLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbnkgbWlzbWF0Y2hlcyBhdCB0aGlzIHBvaW50IGFyZSBkdWUgdG8gYWRkaXRpb25zIG9yXG4gICAgICAgICAgLy8gbW92ZXM7IHNlZSBpZiB3ZSBoYXZlIGFuIG9sZCBwYXJ0IHdlIGNhbiByZXVzZSBhbmQgbW92ZVxuICAgICAgICAgIC8vIGludG8gcGxhY2VcbiAgICAgICAgICBjb25zdCBvbGRJbmRleCA9IG9sZEtleVRvSW5kZXhNYXAuZ2V0KG5ld0tleXNbbmV3SGVhZF0pO1xuICAgICAgICAgIGNvbnN0IG9sZFBhcnQgPSBvbGRJbmRleCAhPT0gdW5kZWZpbmVkID8gb2xkUGFydHNbb2xkSW5kZXhdIDogbnVsbDtcbiAgICAgICAgICBpZiAob2xkUGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm8gb2xkIHBhcnQgZm9yIHRoaXMgdmFsdWU7IGNyZWF0ZSBhIG5ldyBvbmUgYW5kXG4gICAgICAgICAgICAvLyBpbnNlcnQgaXRcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQgPSBpbnNlcnRQYXJ0KGNvbnRhaW5lclBhcnQsIG9sZFBhcnRzW29sZEhlYWRdISk7XG4gICAgICAgICAgICBzZXRDaGlsZFBhcnRWYWx1ZShuZXdQYXJ0LCBuZXdWYWx1ZXNbbmV3SGVhZF0pO1xuICAgICAgICAgICAgbmV3UGFydHNbbmV3SGVhZF0gPSBuZXdQYXJ0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXVzZSBvbGQgcGFydFxuICAgICAgICAgICAgbmV3UGFydHNbbmV3SGVhZF0gPSBzZXRDaGlsZFBhcnRWYWx1ZShvbGRQYXJ0LCBuZXdWYWx1ZXNbbmV3SGVhZF0pO1xuICAgICAgICAgICAgaW5zZXJ0UGFydChjb250YWluZXJQYXJ0LCBvbGRQYXJ0c1tvbGRIZWFkXSEsIG9sZFBhcnQpO1xuICAgICAgICAgICAgLy8gVGhpcyBtYXJrcyB0aGUgb2xkIHBhcnQgYXMgaGF2aW5nIGJlZW4gdXNlZCwgc28gdGhhdFxuICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBza2lwcGVkIGluIHRoZSBmaXJzdCB0d28gY2hlY2tzIGFib3ZlXG4gICAgICAgICAgICBvbGRQYXJ0c1tvbGRJbmRleCBhcyBudW1iZXJdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3SGVhZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFkZCBwYXJ0cyBmb3IgYW55IHJlbWFpbmluZyBuZXcgdmFsdWVzXG4gICAgd2hpbGUgKG5ld0hlYWQgPD0gbmV3VGFpbCkge1xuICAgICAgLy8gRm9yIGFsbCByZW1haW5pbmcgYWRkaXRpb25zLCB3ZSBpbnNlcnQgYmVmb3JlIGxhc3QgbmV3XG4gICAgICAvLyB0YWlsLCBzaW5jZSBvbGQgcG9pbnRlcnMgYXJlIG5vIGxvbmdlciB2YWxpZFxuICAgICAgY29uc3QgbmV3UGFydCA9IGluc2VydFBhcnQoY29udGFpbmVyUGFydCwgbmV3UGFydHNbbmV3VGFpbCArIDFdKTtcbiAgICAgIHNldENoaWxkUGFydFZhbHVlKG5ld1BhcnQsIG5ld1ZhbHVlc1tuZXdIZWFkXSk7XG4gICAgICBuZXdQYXJ0c1tuZXdIZWFkKytdID0gbmV3UGFydDtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgdW51c2VkIG9sZCBwYXJ0c1xuICAgIHdoaWxlIChvbGRIZWFkIDw9IG9sZFRhaWwpIHtcbiAgICAgIGNvbnN0IG9sZFBhcnQgPSBvbGRQYXJ0c1tvbGRIZWFkKytdO1xuICAgICAgaWYgKG9sZFBhcnQgIT09IG51bGwpIHtcbiAgICAgICAgcmVtb3ZlUGFydChvbGRQYXJ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTYXZlIG9yZGVyIG9mIG5ldyBwYXJ0cyBmb3IgbmV4dCByb3VuZFxuICAgIHRoaXMuX2l0ZW1LZXlzID0gbmV3S2V5cztcbiAgICAvLyBEaXJlY3RseSBzZXQgcGFydCB2YWx1ZSwgYnlwYXNzaW5nIGl0J3MgZGlydHktY2hlY2tpbmdcbiAgICBzZXRDb21taXR0ZWRWYWx1ZShjb250YWluZXJQYXJ0LCBuZXdQYXJ0cyk7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwZWF0RGlyZWN0aXZlRm4ge1xuICA8VD4oXG4gICAgaXRlbXM6IEl0ZXJhYmxlPFQ+LFxuICAgIGtleUZuT3JUZW1wbGF0ZTogS2V5Rm48VD4gfCBJdGVtVGVtcGxhdGU8VD4sXG4gICAgdGVtcGxhdGU/OiBJdGVtVGVtcGxhdGU8VD5cbiAgKTogdW5rbm93bjtcbiAgPFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgdGVtcGxhdGU6IEl0ZW1UZW1wbGF0ZTxUPik6IHVua25vd247XG4gIDxUPihcbiAgICBpdGVtczogSXRlcmFibGU8VD4sXG4gICAga2V5Rm46IEtleUZuPFQ+IHwgSXRlbVRlbXBsYXRlPFQ+LFxuICAgIHRlbXBsYXRlOiBJdGVtVGVtcGxhdGU8VD5cbiAgKTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSB0aGF0IHJlcGVhdHMgYSBzZXJpZXMgb2YgdmFsdWVzICh1c3VhbGx5IGBUZW1wbGF0ZVJlc3VsdHNgKVxuICogZ2VuZXJhdGVkIGZyb20gYW4gaXRlcmFibGUsIGFuZCB1cGRhdGVzIHRob3NlIGl0ZW1zIGVmZmljaWVudGx5IHdoZW4gdGhlXG4gKiBpdGVyYWJsZSBjaGFuZ2VzIGJhc2VkIG9uIHVzZXItcHJvdmlkZWQgYGtleXNgIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGl0ZW0uXG4gKlxuICogTm90ZSB0aGF0IGlmIGEgYGtleUZuYCBpcyBwcm92aWRlZCwgc3RyaWN0IGtleS10by1ET00gbWFwcGluZyBpcyBtYWludGFpbmVkLFxuICogbWVhbmluZyBwcmV2aW91cyBET00gZm9yIGEgZ2l2ZW4ga2V5IGlzIG1vdmVkIGludG8gdGhlIG5ldyBwb3NpdGlvbiBpZlxuICogbmVlZGVkLCBhbmQgRE9NIHdpbGwgbmV2ZXIgYmUgcmV1c2VkIHdpdGggdmFsdWVzIGZvciBkaWZmZXJlbnQga2V5cyAobmV3IERPTVxuICogd2lsbCBhbHdheXMgYmUgY3JlYXRlZCBmb3IgbmV3IGtleXMpLiBUaGlzIGlzIGdlbmVyYWxseSB0aGUgbW9zdCBlZmZpY2llbnRcbiAqIHdheSB0byB1c2UgYHJlcGVhdGAgc2luY2UgaXQgcGVyZm9ybXMgbWluaW11bSB1bm5lY2Vzc2FyeSB3b3JrIGZvciBpbnNlcnRpb25zXG4gKiBhbmQgcmVtb3ZhbHMuXG4gKlxuICogVGhlIGBrZXlGbmAgdGFrZXMgdHdvIHBhcmFtZXRlcnMsIHRoZSBpdGVtIGFuZCBpdHMgaW5kZXgsIGFuZCByZXR1cm5zIGEgdW5pcXVlIGtleSB2YWx1ZS5cbiAqXG4gKiBgYGBqc1xuICogaHRtbGBcbiAqICAgPG9sPlxuICogICAgICR7cmVwZWF0KHRoaXMuaXRlbXMsIChpdGVtKSA9PiBpdGVtLmlkLCAoaXRlbSwgaW5kZXgpID0+IHtcbiAqICAgICAgIHJldHVybiBodG1sYDxsaT4ke2luZGV4fTogJHtpdGVtLm5hbWV9PC9saT5gO1xuICogICAgIH0pfVxuICogICA8L29sPlxuICogYFxuICogYGBgXG4gKlxuICogKipJbXBvcnRhbnQqKjogSWYgcHJvdmlkaW5nIGEgYGtleUZuYCwga2V5cyAqbXVzdCogYmUgdW5pcXVlIGZvciBhbGwgaXRlbXMgaW4gYVxuICogZ2l2ZW4gY2FsbCB0byBgcmVwZWF0YC4gVGhlIGJlaGF2aW9yIHdoZW4gdHdvIG9yIG1vcmUgaXRlbXMgaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBJZiBubyBga2V5Rm5gIGlzIHByb3ZpZGVkLCB0aGlzIGRpcmVjdGl2ZSB3aWxsIHBlcmZvcm0gc2ltaWxhciB0byBtYXBwaW5nXG4gKiBpdGVtcyB0byB2YWx1ZXMsIGFuZCBET00gd2lsbCBiZSByZXVzZWQgYWdhaW5zdCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCByZXBlYXQgPSBkaXJlY3RpdmUoUmVwZWF0RGlyZWN0aXZlKSBhcyBSZXBlYXREaXJlY3RpdmVGbjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgdGhhdCBwb3dlcnMgdGhpcyBkaXJlY3RpdmUuIE5lY2Vzc2FyeSBmb3IgbmFtaW5nIHRoZVxuICogZGlyZWN0aXZlJ3MgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIHtSZXBlYXREaXJlY3RpdmV9O1xuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktZ2FwLWltZycsXG4gIGZhbHNlLFxuICAncXRpLWFzc29jaWFibGUtaG90c3BvdCdcbikge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktZ2FwLWltZyddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBnYXA6IDFyZW07XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PG51bGw+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIC8vIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWCAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSAyICogcmFkaXVzICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWSArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WCAtIGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVkgLSB0b3BZICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IENob2ljZSwgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgSG90c3BvdENob2ljZSA9IENob2ljZSAmIHsgb3JkZXI6IG51bWJlciB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICBjaG9pY2VPcmRlcmluZzogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRzOiBDaG9pY2VbXSA9IFtdO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5yZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuLy8gaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBDb2x1bW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3cge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzQ2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICBmYWxzZSxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ1xuKSB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIHJvd3M6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgY29sczogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBsYXN0Q2hlY2tlZFJhZGlvOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKCkgX3Jlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtdO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm4gc3VwZXIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgZWxzZSByZXR1cm4gdGhpcy5fcmVzcG9uc2UgYXMgc3RyaW5nW107XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSBzdXBlci52YWx1ZSA9IHZhbDtcbiAgICBlbHNlIHRoaXMuX3Jlc3BvbnNlID0gdmFsO1xuICB9XG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoXG4gICAgLy8gICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0OmZpcnN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyb3BwYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICB0aGlzLnJvd3MgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U+KFxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG4gICAgdGhpcy5jb2xzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG5cbiAgICB0aGlzLnZhbHVlID0gW107XG4gIH1cblxuICBoYW5kbGVSYWRpb0NsaWNrID0gZSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICh0aGlzLmxhc3RDaGVja2VkUmFkaW8gPT09IHJhZGlvKSB7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gcmFkaW87XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVJhZGlvQ2hhbmdlID0gZSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gY2hlY2tib3gudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94Lm5hbWU7XG4gICAgY29uc3QgdHlwZSA9IGNoZWNrYm94LnR5cGU7XG5cbiAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbdmFsdWVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdmFsdWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gWy4uLnRoaXMudmFsdWVdIDogdGhpcy52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChyZXNwb25zZVZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSkge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IHJlc3BvbnNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IGByYiAke2NoZWNrZWQgPyAncmItY2hlY2tlZCcgOiAnJ30gJHt0aGlzLmNvcnJlY3RPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSA/ICdyYi1jb3JyZWN0JyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogcm93Lm1hdGNoTWF4ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICBwYXJ0PSR7cGFydH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3Jvd0lkfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHtkaXNhYmxlfVxuICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7ZSA9PiB0aGlzLmhhbmRsZVJhZGlvQ2hhbmdlKGUpfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHtlID0+IChyb3cubWF0Y2hNYXggPT09IDEgPyB0aGlzLmhhbmRsZVJhZGlvQ2xpY2soZSkgOiBudWxsKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YFxuICAgICAgICApfVxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aU1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtBdHRyaWJ1dGVQYXJ0LCBub0NoYW5nZX0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtcbiAgZGlyZWN0aXZlLFxuICBEaXJlY3RpdmUsXG4gIERpcmVjdGl2ZVBhcmFtZXRlcnMsXG4gIFBhcnRJbmZvLFxuICBQYXJ0VHlwZSxcbn0gZnJvbSAnLi4vZGlyZWN0aXZlLmpzJztcblxuLyoqXG4gKiBBIGtleS12YWx1ZSBzZXQgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIHZhbHVlcy5cbiAqXG4gKiBUaGUga2V5IHNob3VsZCBiZSBlaXRoZXIgYSB2YWxpZCBDU1MgcHJvcGVydHkgbmFtZSBzdHJpbmcsIGxpa2VcbiAqIGAnYmFja2dyb3VuZC1jb2xvcidgLCBvciBhIHZhbGlkIEphdmFTY3JpcHQgY2FtZWwgY2FzZSBwcm9wZXJ0eSBuYW1lXG4gKiBmb3IgQ1NTU3R5bGVEZWNsYXJhdGlvbiBsaWtlIGBiYWNrZ3JvdW5kQ29sb3JgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlSW5mbyB7XG4gIFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsO1xufVxuXG5jb25zdCBpbXBvcnRhbnQgPSAnaW1wb3J0YW50Jztcbi8vIFRoZSBsZWFkaW5nIHNwYWNlIGlzIGltcG9ydGFudFxuY29uc3QgaW1wb3J0YW50RmxhZyA9ICcgIScgKyBpbXBvcnRhbnQ7XG4vLyBIb3cgbWFueSBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIGEgdmFsdWUsIGFzIGEgbmVnYXRpdmUgbnVtYmVyXG5jb25zdCBmbGFnVHJpbSA9IDAgLSBpbXBvcnRhbnRGbGFnLmxlbmd0aDtcblxuY2xhc3MgU3R5bGVNYXBEaXJlY3RpdmUgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICBwcml2YXRlIF9wcmV2aW91c1N0eWxlUHJvcGVydGllcz86IFNldDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKHBhcnRJbmZvOiBQYXJ0SW5mbykge1xuICAgIHN1cGVyKHBhcnRJbmZvKTtcbiAgICBpZiAoXG4gICAgICBwYXJ0SW5mby50eXBlICE9PSBQYXJ0VHlwZS5BVFRSSUJVVEUgfHxcbiAgICAgIHBhcnRJbmZvLm5hbWUgIT09ICdzdHlsZScgfHxcbiAgICAgIChwYXJ0SW5mby5zdHJpbmdzPy5sZW5ndGggYXMgbnVtYmVyKSA+IDJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBgc3R5bGVNYXBgIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQgaW4gdGhlIGBzdHlsZWAgYXR0cmlidXRlICcgK1xuICAgICAgICAgICdhbmQgbXVzdCBiZSB0aGUgb25seSBwYXJ0IGluIHRoZSBhdHRyaWJ1dGUuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoc3R5bGVJbmZvOiBSZWFkb25seTxTdHlsZUluZm8+KSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0eWxlSW5mbykucmVkdWNlKChzdHlsZSwgcHJvcCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBzdHlsZUluZm9bcHJvcF07XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IHByb3BlcnR5IG5hbWVzIGZyb20gY2FtZWwtY2FzZSB0byBkYXNoLWNhc2UsIGkuZS46XG4gICAgICAvLyAgYGJhY2tncm91bmRDb2xvcmAgLT4gYGJhY2tncm91bmQtY29sb3JgXG4gICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgbmFtZXMgbmVlZCBhbiBleHRyYSBgLWAgYXBwZW5kZWQgdG8gZnJvbnQ6XG4gICAgICAvLyAgYHdlYmtpdEFwcGVhcmFuY2VgIC0+IGAtd2Via2l0LWFwcGVhcmFuY2VgXG4gICAgICAvLyBFeGNlcHRpb24gaXMgYW55IHByb3BlcnR5IG5hbWUgY29udGFpbmluZyBhIGRhc2gsIGluY2x1ZGluZ1xuICAgICAgLy8gY3VzdG9tIHByb3BlcnRpZXM7IHdlIGFzc3VtZSB0aGVzZSBhcmUgYWxyZWFkeSBkYXNoLWNhc2VkIGkuZS46XG4gICAgICAvLyAgYC0tbXktYnV0dG9uLWNvbG9yYCAtLT4gYC0tbXktYnV0dG9uLWNvbG9yYFxuICAgICAgcHJvcCA9IHByb3AuaW5jbHVkZXMoJy0nKVxuICAgICAgICA/IHByb3BcbiAgICAgICAgOiBwcm9wXG4gICAgICAgICAgICAucmVwbGFjZSgvKD86Xih3ZWJraXR8bW96fG1zfG8pfCkoPz1bQS1aXSkvZywgJy0kJicpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBzdHlsZSArIGAke3Byb3B9OiR7dmFsdWV9O2A7XG4gICAgfSwgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlKHBhcnQ6IEF0dHJpYnV0ZVBhcnQsIFtzdHlsZUluZm9dOiBEaXJlY3RpdmVQYXJhbWV0ZXJzPHRoaXM+KSB7XG4gICAgY29uc3Qge3N0eWxlfSA9IHBhcnQuZWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcmV2aW91c1N0eWxlUHJvcGVydGllcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc3R5bGVJbmZvKSk7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXIoc3R5bGVJbmZvKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgb2xkIHByb3BlcnRpZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4gc3R5bGVJbmZvXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMuX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBJZiB0aGUgbmFtZSBpc24ndCBpbiBzdHlsZUluZm8gb3IgaXQncyBudWxsL3VuZGVmaW5lZFxuICAgICAgaWYgKHN0eWxlSW5mb1tuYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzIS5kZWxldGUobmFtZSk7XG4gICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIChzdHlsZSBhcyBhbnkpW25hbWVdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBvciB1cGRhdGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZUluZm8pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3R5bGVJbmZvW25hbWVdO1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZVByb3BlcnRpZXMuYWRkKG5hbWUpO1xuICAgICAgICBjb25zdCBpc0ltcG9ydGFudCA9XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aChpbXBvcnRhbnRGbGFnKTtcbiAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoJy0nKSB8fCBpc0ltcG9ydGFudCkge1xuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlzSW1wb3J0YW50XG4gICAgICAgICAgICAgID8gKHZhbHVlIGFzIHN0cmluZykuc2xpY2UoMCwgZmxhZ1RyaW0pXG4gICAgICAgICAgICAgIDogKHZhbHVlIGFzIHN0cmluZyksXG4gICAgICAgICAgICBpc0ltcG9ydGFudCA/IGltcG9ydGFudCA6ICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIChzdHlsZSBhcyBhbnkpW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgdGhhdCBhcHBsaWVzIENTUyBwcm9wZXJ0aWVzIHRvIGFuIGVsZW1lbnQuXG4gKlxuICogYHN0eWxlTWFwYCBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBgc3R5bGVgIGF0dHJpYnV0ZSBhbmQgbXVzdCBiZSB0aGUgb25seVxuICogZXhwcmVzc2lvbiBpbiB0aGUgYXR0cmlidXRlLiBJdCB0YWtlcyB0aGUgcHJvcGVydHkgbmFtZXMgaW4gdGhlXG4gKiB7QGxpbmsgU3R5bGVJbmZvIHN0eWxlSW5mb30gb2JqZWN0IGFuZCBhZGRzIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBpbmxpbmVcbiAqIHN0eWxlIG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIFByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIChgLWApIGFyZSBhc3N1bWVkIHRvIGJlIHZhbGlkIENTU1xuICogcHJvcGVydHkgbmFtZXMgYW5kIHNldCBvbiB0aGUgZWxlbWVudCdzIHN0eWxlIG9iamVjdCB1c2luZyBgc2V0UHJvcGVydHkoKWAuXG4gKiBOYW1lcyB3aXRob3V0IGRhc2hlcyBhcmUgYXNzdW1lZCB0byBiZSBjYW1lbENhc2VkIEphdmFTY3JpcHQgcHJvcGVydHkgbmFtZXNcbiAqIGFuZCBzZXQgb24gdGhlIGVsZW1lbnQncyBzdHlsZSBvYmplY3QgdXNpbmcgcHJvcGVydHkgYXNzaWdubWVudCwgYWxsb3dpbmcgdGhlXG4gKiBzdHlsZSBvYmplY3QgdG8gdHJhbnNsYXRlIEphdmFTY3JpcHQtc3R5bGUgbmFtZXMgdG8gQ1NTIHByb3BlcnR5IG5hbWVzLlxuICpcbiAqIEZvciBleGFtcGxlIGBzdHlsZU1hcCh7YmFja2dyb3VuZENvbG9yOiAncmVkJywgJ2JvcmRlci10b3AnOiAnNXB4JywgJy0tc2l6ZSc6XG4gKiAnMCd9KWAgc2V0cyB0aGUgYGJhY2tncm91bmQtY29sb3JgLCBgYm9yZGVyLXRvcGAgYW5kIGAtLXNpemVgIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHN0eWxlSW5mb1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2RpcmVjdGl2ZXMvI3N0eWxlbWFwIHN0eWxlTWFwIGNvZGUgc2FtcGxlcyBvbiBMaXQuZGV2fVxuICovXG5leHBvcnQgY29uc3Qgc3R5bGVNYXAgPSBkaXJlY3RpdmUoU3R5bGVNYXBEaXJlY3RpdmUpO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyB0aGF0IHBvd2VycyB0aGlzIGRpcmVjdGl2ZS4gTmVjZXNzYXJ5IGZvciBuYW1pbmcgdGhlXG4gKiBkaXJlY3RpdmUncyByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUge1N0eWxlTWFwRGlyZWN0aXZlfTtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktY29tcG9uZW50cyc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpSXRlbUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gIGhyZWY/OiBzdHJpbmc7XG4gIHhtbERvYzogRG9jdW1lbnRGcmFnbWVudDtcbiAgYXNzZXNzbWVudEl0ZW06IFF0aUFzc2Vzc21lbnRJdGVtIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFF0aUl0ZW1NaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KEJhc2U6IFQpIHtcbiAgY2xhc3MgUXRpSXRlbUNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWY/OiBzdHJpbmc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgICB4bWxEb2MhOiBEb2N1bWVudEZyYWdtZW50OyAvLyB0aGUgWE1MRG9jdW1lbnRcblxuICAgIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJSb290KCk6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW0gfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclJvb3Q/LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pdGVtLWNvbm5lY3RlZCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsIGhyZWY6IHRoaXMuaHJlZiB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBodG1sYCR7dGhpcy54bWxEb2N9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFF0aUl0ZW1DbGFzcyBhcyBDb25zdHJ1Y3RvcjxRdGlJdGVtSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpSXRlbU1peGluIH0gZnJvbSAnLi9xdGktaXRlbS5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpSXRlbSBleHRlbmRzIFF0aUl0ZW1NaXhpbihMaXRFbGVtZW50KSB7fVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbSc6IFF0aUl0ZW07XG4gIH1cbn0iLCAiaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1JdGVtLCBxdGlUcmFuc2Zvcm1UZXN0IH0gZnJvbSAnLi4vcXRpLXRyYW5zZm9ybWVycyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1NYW5pZmVzdCB9IGZyb20gJy4uL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdCc7XG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0SW5mbyA9IHtcbiAgdGVzdElkZW50aWZpZXI6IHN0cmluZztcbiAgdGVzdEhUTUxEb2M6IERvY3VtZW50RnJhZ21lbnQ7XG4gIHRlc3RVUkk6IHN0cmluZztcbiAgdGVzdFVSTDogc3RyaW5nO1xuICBpdGVtczoge1xuICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICBocmVmOiBzdHJpbmc7XG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgfVtdO1xufTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBlbnN1cmUgcGFja2FnZSBVUklzIGVuZCB3aXRoIGEgJy8nXG4vLyBjb25zdCBub3JtYWxpemVVcmkgPSAodXJpOiBzdHJpbmcpID0+ICh1cmkuZW5kc1dpdGgoJy8nKSA/IHVyaSA6IGAke3VyaX0vYCk7XG5cbi8vIEZldGNoZXMgYXNzZXNzbWVudCBkYXRhIGZyb20gdGhlIG1hbmlmZXN0XG5leHBvcnQgY29uc3QgZ2V0TWFuaWZlc3RJbmZvID0gYXN5bmMgKG1hbmlmZXN0VVJMOiBzdHJpbmcpOiBQcm9taXNlPE1hbmlmZXN0SW5mbz4gPT4ge1xuICBjb25zdCBiYXNlVVJJID0gbWFuaWZlc3RVUkwuc3Vic3RyaW5nKDAsIG1hbmlmZXN0VVJMLmxhc3RJbmRleE9mKCcvJykpO1xuXG4gIGNvbnN0IHRlc3QgPSBhd2FpdCBxdGlUcmFuc2Zvcm1NYW5pZmVzdCgpXG4gICAgLmxvYWQoYCR7bWFuaWZlc3RVUkx9YClcbiAgICAudGhlbihhcGkgPT4gYXBpLmFzc2Vzc21lbnRUZXN0KCkpO1xuXG4gIGNvbnN0IHRlc3RIVE1MRG9jID0gYXdhaXQgcXRpVHJhbnNmb3JtVGVzdCgpXG4gICAgLmxvYWQoYCR7YmFzZVVSSX0vJHt0ZXN0LmhyZWZ9YClcbiAgICAudGhlbihhcGkgPT4gYXBpLmh0bWxEb2MoKSk7XG5cbiAgY29uc3QgaXRlbXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1UZXN0KClcbiAgICAubG9hZChgJHtiYXNlVVJJfS8ke3Rlc3QuaHJlZn1gKVxuICAgIC50aGVuKGFwaSA9PiBhcGkuaXRlbXMoKSk7XG5cbiAgY29uc3QgdGVzdFVSTCA9IGAke2Jhc2VVUkl9LyR7dGVzdC5ocmVmfWA7XG4gIGNvbnN0IHRlc3RVUkkgPSBgJHtiYXNlVVJJfS8ke3Rlc3QuaHJlZi5zdWJzdHJpbmcoMCwgdGVzdC5ocmVmLmxhc3RJbmRleE9mKCcvJykpfWA7XG5cbiAgcmV0dXJuIHtcbiAgICB0ZXN0SFRNTERvYyxcbiAgICB0ZXN0VVJJLFxuICAgIHRlc3RVUkwsXG4gICAgaXRlbXMsXG4gICAgdGVzdElkZW50aWZpZXI6IHRlc3QuaWRlbnRpZmllclxuICB9O1xufTtcblxuLy8gRmV0Y2hlcyBhIHNpbmdsZSBpdGVtIGJ5IFVSSVxuZXhwb3J0IGNvbnN0IGdldEl0ZW1CeVVyaSA9IGFzeW5jIChpdGVtVXJpOiBzdHJpbmcpOiBQcm9taXNlPFF0aUFzc2Vzc21lbnRJdGVtPiA9PlxuICBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAubG9hZChpdGVtVXJpKVxuICAgIC50aGVuKGFwaSA9PiBhcGkuaHRtbERvYygpLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUFzc2Vzc21lbnRJdGVtKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlETSxJQUFPQSxJQUFQLGNBQ0lDLE1BQUFBO0VBYVIsWUFDRUMsSUFDQUMsSUFDQUMsS0FBQUE7QUFFQUMsVUFBTSxtQkFBbUIsRUFBQ0MsU0FBQUEsTUFBZUMsVUFBQUEsS0FBVSxDQUFBLEdBQ25EQyxLQUFLTixVQUFVQSxJQUNmTSxLQUFLTCxXQUFXQSxJQUNoQkssS0FBS0osWUFBWUEsT0FBQUEsT0FBQUEsTUFBQUE7RUFDbEI7QUFBQTs7O0FDbkJHLFNBQVVLLEVBQXNDQyxJQUFBQTtBQUNwRCxTQUFPQTtBQUNUOzs7SUNyQmFDLFdBQUFBO0VBc0JYLFlBQ0VDLElBQ0FDLElBQ0FDLElBQ0FDLElBQUFBOztBQUtBLFFBdkJNQyxLQUFTRCxZQUFBQSxPQUVUQyxLQUFRQyxXQUFBQSxPQUVoQkQsS0FBS0UsUUFBQUEsUUFxREdGLEtBQUFHLElBQTZDLENBQUNELElBQU9FLE9BQUFBO0FBRXZESixXQUFLSSxnQkFFSEosS0FBS0ksZ0JBQWdCQSxPQUV2QkosS0FBS0MsV0FBQUEsT0FDTEQsS0FBS0ksWUFBQUEsSUFHRkosS0FBS0QsYUFDUkMsS0FB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QUFDVDs7O0FDekNPLElBQU0sVUFBTixjQUFzQixhQUFhQyxFQUFVLEVBQUU7QUFBQztBQUExQyxVQUFOO0FBQUEsRUFETkMsR0FBYyxVQUFVO0FBQUEsR0FDWjs7O0FDZU4sSUFBTSxrQkFBa0IsT0FBTyxnQkFBK0M7QUFDbkYsUUFBTSxVQUFVLFlBQVksVUFBVSxHQUFHLFlBQVksWUFBWSxHQUFHLENBQUM7QUFFckUsUUFBTSxPQUFPLE1BQU0scUJBQXFCLEVBQ3JDLEtBQUssR0FBRyxXQUFXLEVBQUUsRUFDckIsS0FBSyxTQUFPLElBQUksZUFBZSxDQUFDO0FBRW5DLFFBQU0sY0FBYyxNQUFNLGlCQUFpQixFQUN4QyxLQUFLLEdBQUcsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFLEVBQzlCLEtBQUssU0FBTyxJQUFJLFFBQVEsQ0FBQztBQUU1QixRQUFNLFFBQVEsTUFBTSxpQkFBaUIsRUFDbEMsS0FBSyxHQUFHLE9BQU8sSUFBSSxLQUFLLElBQUksRUFBRSxFQUM5QixLQUFLLFNBQU8sSUFBSSxNQUFNLENBQUM7QUFFMUIsUUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssSUFBSTtBQUN2QyxRQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksS0FBSyxLQUFLLFVBQVUsR0FBRyxLQUFLLEtBQUssWUFBWSxHQUFHLENBQUMsQ0FBQztBQUVoRixTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsZ0JBQWdCLEtBQUs7QUFBQSxFQUN2QjtBQUNGO0FBR08sSUFBTSxlQUFlLE9BQU8sWUFDakMsaUJBQWlCLEVBQ2QsS0FBSyxPQUFPLEVBQ1osS0FBSyxTQUFPLElBQUksUUFBUSxFQUFFLGlCQUFzQzsiLAogICJuYW1lcyI6IFsiQ29udGV4dFJlcXVlc3RFdmVudCIsICJFdmVudCIsICJjb250ZXh0IiwgImNhbGxiYWNrIiwgInN1YnNjcmliZSIsICJzdXBlciIsICJidWJibGVzIiwgImNvbXBvc2VkIiwgInRoaXMiLCAiY3JlYXRlQ29udGV4dCIsICJrZXkiLCAiQ29udGV4dENvbnN1bWVyIiwgImhvc3QiLCAiY29udGV4dE9yT3B0aW9ucyIsICJjYWxsYmFjayIsICJzdWJzY3JpYmUiLCAidGhpcyIsICJwcm92aWRlZCIsICJ2YWx1ZSIsICJfY2FsbGJhY2siLCAidW5zdWJzY3JpYmUiLCAicmVxdWVzdFVwZGF0ZSIsICJjb250ZXh0IiwgIm9wdGlvbnMiLCAiYWRkQ29udHJvbGxlciIsICJob3N0Q29ubmVjdGVkIiwgImRpc3BhdGNoUmVxdWVzdCIsICJob3N0RGlzY29ubmVjdGVkIiwgImRpc3BhdGNoRXZlbnQiLCAiQ29udGV4dFJlcXVlc3RFdmVudCIsICJWYWx1ZU5vdGlmaWVyIiwgInZhbHVlIiwgInRoaXMiLCAiX3ZhbHVlIiwgInYiLCAic2V0VmFsdWUiLCAiZm9yY2UiLCAidXBkYXRlIiwgIk9iamVjdCIsICJpcyIsICJ1cGRhdGVPYnNlcnZlcnMiLCAiZGVmYXVsdFZhbHVlIiwgInN1YnNjcmlwdGlvbnMiLCAiTWFwIiwgImNhbGxiYWNrIiwgImRpc3Bvc2VyIiwgImNvbnN1bWVySG9zdCIsICJzdWJzY3JpYmUiLCAiaGFzIiwgInNldCIsICJkZWxldGUiLCAiZ2V0IiwgImNsZWFyQ2FsbGJhY2tzIiwgImNsZWFyIiwgIkNvbnRleHRQcm92aWRlckV2ZW50IiwgIkV2ZW50IiwgImNvbnRleHQiLCAic3VwZXIiLCAiYnViYmxlcyIsICJjb21wb3NlZCIsICJ0aGlzIiwgIkNvbnRleHRQcm92aWRlciIsICJWYWx1ZU5vdGlmaWVyIiwgImhvc3QiLCAiY29udGV4dE9yT3B0aW9ucyIsICJpbml0aWFsVmFsdWUiLCAib25Db250ZXh0UmVxdWVzdCIsICJldiIsICJjb25zdW1lckhvc3QiLCAiY29tcG9zZWRQYXRoIiwgInN0b3BQcm9wYWdhdGlvbiIsICJhZGRDYWxsYmFjayIsICJjYWxsYmFjayIsICJzdWJzY3JpYmUiLCAib25Qcm92aWRlclJlcXVlc3QiLCAiY2hpbGRQcm92aWRlckhvc3QiLCAic2VlbiIsICJTZXQiLCAic3Vic2NyaXB0aW9ucyIsICJoYXMiLCAiYWRkIiwgImRpc3BhdGNoRXZlbnQiLCAiQ29udGV4dFJlcXVlc3RFdmVudCIsICJhdHRhY2hMaXN0ZW5lcnMiLCAiYWRkQ29udHJvbGxlciIsICJhZGRFdmVudExpc3RlbmVyIiwgImhvc3RDb25uZWN0ZWQiLCAicHJvdmlkZSIsICJjb250ZXh0IiwgInByb3RvT3JUYXJnZXQiLCAibmFtZU9yQ29udGV4dCIsICJjb250cm9sbGVyTWFwIiwgIldlYWtNYXAiLCAiYWRkSW5pdGlhbGl6ZXIiLCAic2V0IiwgInRoaXMiLCAiQ29udGV4dFByb3ZpZGVyIiwgImdldCIsICJjYWxsIiwgInZhbHVlIiwgInNldFZhbHVlIiwgImNvbnN0cnVjdG9yIiwgImVsZW1lbnQiLCAiZGVzY3JpcHRvciIsICJPYmplY3QiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgIm5ld0Rlc2NyaXB0b3IiLCAidmFsdWVNYXAiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAib2xkU2V0dGVyIiwgImRlZmluZVByb3BlcnR5IiwgImNvbnN1bWUiLCAiY29udGV4dCIsICJzdWJzY3JpYmUiLCAicHJvdG9PclRhcmdldCIsICJuYW1lT3JDb250ZXh0IiwgImFkZEluaXRpYWxpemVyIiwgIkNvbnRleHRDb25zdW1lciIsICJ0aGlzIiwgImNhbGxiYWNrIiwgInZhbHVlIiwgInNldCIsICJjYWxsIiwgImNvbnN0cnVjdG9yIiwgImVsZW1lbnQiLCAiX2EiLCAiX2EiLCAiY3VzdG9tRWxlbWVudHMiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAic3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIiwgIlNoYWRvd1Jvb3QiLCAiU2hhZHlDU1MiLCAibmF0aXZlU2hhZG93IiwgIkRvY3VtZW50IiwgInByb3RvdHlwZSIsICJDU1NTdHlsZVNoZWV0IiwgImNvbnN0cnVjdGlvblRva2VuIiwgIlN5bWJvbCIsICJjc3NUYWdDYWNoZSIsICJXZWFrTWFwIiwgIkNTU1Jlc3VsdCIsICJjc3NUZXh0IiwgInN0cmluZ3MiLCAic2FmZVRva2VuIiwgInRoaXMiLCAiRXJyb3IiLCAiX3N0cmluZ3MiLCAic3R5bGVTaGVldCIsICJfc3R5bGVTaGVldCIsICJjYWNoZWFibGUiLCAibGVuZ3RoIiwgImdldCIsICJyZXBsYWNlU3luYyIsICJzZXQiLCAidG9TdHJpbmciLCAidW5zYWZlQ1NTIiwgInZhbHVlIiwgIlN0cmluZyIsICJjc3MiLCAidmFsdWVzIiwgInJlZHVjZSIsICJhY2MiLCAidiIsICJpZHgiLCAiYWRvcHRTdHlsZXMiLCAicmVuZGVyUm9vdCIsICJzdHlsZXMiLCAiYWRvcHRlZFN0eWxlU2hlZXRzIiwgIm1hcCIsICJzIiwgInN0eWxlIiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAibm9uY2UiLCAic2V0QXR0cmlidXRlIiwgInRleHRDb250ZW50IiwgImFwcGVuZENoaWxkIiwgImdldENvbXBhdGlibGVTdHlsZSIsICJzaGVldCIsICJydWxlIiwgImNzc1J1bGVzIiwgImlzIiwgImRlZmluZVByb3BlcnR5IiwgImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImdldE93blByb3BlcnR5U3ltYm9scyIsICJnZXRQcm90b3R5cGVPZiIsICJPYmplY3QiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAiY3VzdG9tRWxlbWVudHMiLCAidHJ1c3RlZFR5cGVzIiwgImVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSIsICJlbXB0eVNjcmlwdCIsICJwb2x5ZmlsbFN1cHBvcnQiLCAicmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0IiwgIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCAicHJvcCIsICJfb2JqIiwgImRlZmF1bHRDb252ZXJ0ZXIiLCAidmFsdWUiLCAidHlwZSIsICJCb29sZWFuIiwgIkFycmF5IiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImZyb21WYWx1ZSIsICJOdW1iZXIiLCAicGFyc2UiLCAiZSIsICJub3RFcXVhbCIsICJvbGQiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgIlN0cmluZyIsICJjb252ZXJ0ZXIiLCAicmVmbGVjdCIsICJoYXNDaGFuZ2VkIiwgIlN5bWJvbCIsICJtZXRhZGF0YSIsICJsaXRQcm9wZXJ0eU1ldGFkYXRhIiwgIldlYWtNYXAiLCAiUmVhY3RpdmVFbGVtZW50IiwgIkhUTUxFbGVtZW50IiwgImluaXRpYWxpemVyIiwgInRoaXMiLCAiX19wcmVwYXJlIiwgIl9pbml0aWFsaXplcnMiLCAicHVzaCIsICJvYnNlcnZlZEF0dHJpYnV0ZXMiLCAiZmluYWxpemUiLCAiX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIiwgImtleXMiLCAibmFtZSIsICJvcHRpb25zIiwgInN0YXRlIiwgImVsZW1lbnRQcm9wZXJ0aWVzIiwgInNldCIsICJub0FjY2Vzc29yIiwgImtleSIsICJkZXNjcmlwdG9yIiwgImdldFByb3BlcnR5RGVzY3JpcHRvciIsICJwcm90b3R5cGUiLCAiZ2V0IiwgInYiLCAiY2FsbCIsICJvbGRWYWx1ZSIsICJyZXF1ZXN0VXBkYXRlIiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgImhhc093blByb3BlcnR5IiwgInN1cGVyQ3RvciIsICJNYXAiLCAiZmluYWxpemVkIiwgInByb3BzIiwgInByb3BlcnRpZXMiLCAicHJvcEtleXMiLCAicCIsICJjcmVhdGVQcm9wZXJ0eSIsICJhdHRyIiwgIl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5IiwgImVsZW1lbnRTdHlsZXMiLCAiZmluYWxpemVTdHlsZXMiLCAic3R5bGVzIiwgImlzQXJyYXkiLCAiU2V0IiwgImZsYXQiLCAiSW5maW5pdHkiLCAicmV2ZXJzZSIsICJzIiwgInVuc2hpZnQiLCAiZ2V0Q29tcGF0aWJsZVN0eWxlIiwgInRvTG93ZXJDYXNlIiwgImNvbnN0cnVjdG9yIiwgInN1cGVyIiwgIl9faW5zdGFuY2VQcm9wZXJ0aWVzIiwgImlzVXBkYXRlUGVuZGluZyIsICJoYXNVcGRhdGVkIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnR5IiwgIl9faW5pdGlhbGl6ZSIsICJfX3VwZGF0ZVByb21pc2UiLCAiUHJvbWlzZSIsICJyZXMiLCAiZW5hYmxlVXBkYXRpbmciLCAiXyRjaGFuZ2VkUHJvcGVydGllcyIsICJfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMiLCAiZm9yRWFjaCIsICJpIiwgImNvbnRyb2xsZXIiLCAiX19jb250cm9sbGVycyIsICJhZGQiLCAicmVuZGVyUm9vdCIsICJpc0Nvbm5lY3RlZCIsICJob3N0Q29ubmVjdGVkIiwgImRlbGV0ZSIsICJpbnN0YW5jZVByb3BlcnRpZXMiLCAic2l6ZSIsICJjcmVhdGVSZW5kZXJSb290IiwgInNoYWRvd1Jvb3QiLCAiYXR0YWNoU2hhZG93IiwgInNoYWRvd1Jvb3RPcHRpb25zIiwgImFkb3B0U3R5bGVzIiwgImNvbm5lY3RlZENhbGxiYWNrIiwgImMiLCAiX3JlcXVlc3RlZFVwZGF0ZSIsICJkaXNjb25uZWN0ZWRDYWxsYmFjayIsICJob3N0RGlzY29ubmVjdGVkIiwgIl9vbGQiLCAiXyRhdHRyaWJ1dGVUb1Byb3BlcnR5IiwgImF0dHJWYWx1ZSIsICJ0b0F0dHJpYnV0ZSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgImN0b3IiLCAicHJvcE5hbWUiLCAiZ2V0UHJvcGVydHlPcHRpb25zIiwgImZyb21BdHRyaWJ1dGUiLCAiXyRjaGFuZ2VQcm9wZXJ0eSIsICJfX2VucXVldWVVcGRhdGUiLCAiaGFzIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMiLCAicmVqZWN0IiwgInJlc3VsdCIsICJzY2hlZHVsZVVwZGF0ZSIsICJwZXJmb3JtVXBkYXRlIiwgIndyYXBwZWQiLCAic2hvdWxkVXBkYXRlIiwgImNoYW5nZWRQcm9wZXJ0aWVzIiwgIndpbGxVcGRhdGUiLCAiaG9zdFVwZGF0ZSIsICJ1cGRhdGUiLCAiX19tYXJrVXBkYXRlZCIsICJfJGRpZFVwZGF0ZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiaG9zdFVwZGF0ZWQiLCAiZmlyc3RVcGRhdGVkIiwgInVwZGF0ZWQiLCAidXBkYXRlQ29tcGxldGUiLCAiZ2V0VXBkYXRlQ29tcGxldGUiLCAiX19wcm9wZXJ0eVRvQXR0cmlidXRlIiwgIm1vZGUiLCAicmVhY3RpdmVFbGVtZW50VmVyc2lvbnMiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAidHJ1c3RlZFR5cGVzIiwgInBvbGljeSIsICJjcmVhdGVQb2xpY3kiLCAiY3JlYXRlSFRNTCIsICJzIiwgImJvdW5kQXR0cmlidXRlU3VmZml4IiwgIm1hcmtlciIsICJNYXRoIiwgInJhbmRvbSIsICJ0b0ZpeGVkIiwgInNsaWNlIiwgIm1hcmtlck1hdGNoIiwgIm5vZGVNYXJrZXIiLCAiZCIsICJkb2N1bWVudCIsICJjcmVhdGVUcmVlV2Fsa2VyIiwgImNyZWF0ZU1hcmtlciIsICJjcmVhdGVDb21tZW50IiwgImlzUHJpbWl0aXZlIiwgInZhbHVlIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiaXNJdGVyYWJsZSIsICJTeW1ib2wiLCAiaXRlcmF0b3IiLCAiU1BBQ0VfQ0hBUiIsICJ0ZXh0RW5kUmVnZXgiLCAiY29tbWVudEVuZFJlZ2V4IiwgImNvbW1lbnQyRW5kUmVnZXgiLCAidGFnRW5kUmVnZXgiLCAiUmVnRXhwIiwgInNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgImRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgInJhd1RleHRFbGVtZW50IiwgInRhZyIsICJ0eXBlIiwgInN0cmluZ3MiLCAidmFsdWVzIiwgIl8kbGl0VHlwZSQiLCAiaHRtbCIsICJzdmciLCAibWF0aG1sIiwgIm5vQ2hhbmdlIiwgImZvciIsICJub3RoaW5nIiwgInRlbXBsYXRlQ2FjaGUiLCAiV2Vha01hcCIsICJ3YWxrZXIiLCAidHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmciLCAidHNhIiwgInN0cmluZ0Zyb21UU0EiLCAiaGFzT3duUHJvcGVydHkiLCAiRXJyb3IiLCAiZ2V0VGVtcGxhdGVIdG1sIiwgImwiLCAibGVuZ3RoIiwgImF0dHJOYW1lcyIsICJyYXdUZXh0RW5kUmVnZXgiLCAicmVnZXgiLCAiaSIsICJhdHRyTmFtZSIsICJtYXRjaCIsICJhdHRyTmFtZUVuZEluZGV4IiwgImxhc3RJbmRleCIsICJleGVjIiwgInRlc3QiLCAiZW5kIiwgInN0YXJ0c1dpdGgiLCAicHVzaCIsICJUZW1wbGF0ZSIsICJjb25zdHJ1Y3RvciIsICJvcHRpb25zIiwgIm5vZGUiLCAidGhpcyIsICJwYXJ0cyIsICJub2RlSW5kZXgiLCAiYXR0ck5hbWVJbmRleCIsICJwYXJ0Q291bnQiLCAiZWwiLCAiY3JlYXRlRWxlbWVudCIsICJjdXJyZW50Tm9kZSIsICJjb250ZW50IiwgIndyYXBwZXIiLCAiZmlyc3RDaGlsZCIsICJyZXBsYWNlV2l0aCIsICJjaGlsZE5vZGVzIiwgIm5leHROb2RlIiwgIm5vZGVUeXBlIiwgImhhc0F0dHJpYnV0ZXMiLCAibmFtZSIsICJnZXRBdHRyaWJ1dGVOYW1lcyIsICJlbmRzV2l0aCIsICJyZWFsTmFtZSIsICJzdGF0aWNzIiwgImdldEF0dHJpYnV0ZSIsICJzcGxpdCIsICJtIiwgImluZGV4IiwgImN0b3IiLCAiUHJvcGVydHlQYXJ0IiwgIkJvb2xlYW5BdHRyaWJ1dGVQYXJ0IiwgIkV2ZW50UGFydCIsICJBdHRyaWJ1dGVQYXJ0IiwgInJlbW92ZUF0dHJpYnV0ZSIsICJ0YWdOYW1lIiwgInRleHRDb250ZW50IiwgImVtcHR5U2NyaXB0IiwgImFwcGVuZCIsICJkYXRhIiwgImluZGV4T2YiLCAiX29wdGlvbnMiLCAiaW5uZXJIVE1MIiwgInJlc29sdmVEaXJlY3RpdmUiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiY3VycmVudERpcmVjdGl2ZSIsICJfX2RpcmVjdGl2ZXMiLCAiX19kaXJlY3RpdmUiLCAibmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yIiwgIl8kaW5pdGlhbGl6ZSIsICJfJHJlc29sdmUiLCAiVGVtcGxhdGVJbnN0YW5jZSIsICJ0ZW1wbGF0ZSIsICJfJHBhcnRzIiwgIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsICJfJHRlbXBsYXRlIiwgIl8kcGFyZW50IiwgInBhcmVudE5vZGUiLCAiXyRpc0Nvbm5lY3RlZCIsICJmcmFnbWVudCIsICJjcmVhdGlvblNjb3BlIiwgImltcG9ydE5vZGUiLCAicGFydEluZGV4IiwgInRlbXBsYXRlUGFydCIsICJDaGlsZFBhcnQiLCAibmV4dFNpYmxpbmciLCAiRWxlbWVudFBhcnQiLCAiXyRzZXRWYWx1ZSIsICJfX2lzQ29ubmVjdGVkIiwgInN0YXJ0Tm9kZSIsICJlbmROb2RlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiXyRzdGFydE5vZGUiLCAiXyRlbmROb2RlIiwgImlzQ29ubmVjdGVkIiwgImRpcmVjdGl2ZVBhcmVudCIsICJfJGNsZWFyIiwgIl9jb21taXRUZXh0IiwgIl9jb21taXRUZW1wbGF0ZVJlc3VsdCIsICJfY29tbWl0Tm9kZSIsICJfY29tbWl0SXRlcmFibGUiLCAiaW5zZXJ0QmVmb3JlIiwgIl9pbnNlcnQiLCAiY3JlYXRlVGV4dE5vZGUiLCAicmVzdWx0IiwgIl8kZ2V0VGVtcGxhdGUiLCAiaCIsICJfdXBkYXRlIiwgImluc3RhbmNlIiwgIl9jbG9uZSIsICJnZXQiLCAic2V0IiwgIml0ZW1QYXJ0cyIsICJpdGVtUGFydCIsICJpdGVtIiwgInN0YXJ0IiwgImZyb20iLCAiXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCIsICJuIiwgInJlbW92ZSIsICJlbGVtZW50IiwgImZpbGwiLCAiU3RyaW5nIiwgInZhbHVlSW5kZXgiLCAibm9Db21taXQiLCAiY2hhbmdlIiwgInYiLCAiX2NvbW1pdFZhbHVlIiwgInNldEF0dHJpYnV0ZSIsICJ0b2dnbGVBdHRyaWJ1dGUiLCAic3VwZXIiLCAibmV3TGlzdGVuZXIiLCAib2xkTGlzdGVuZXIiLCAic2hvdWxkUmVtb3ZlTGlzdGVuZXIiLCAiY2FwdHVyZSIsICJvbmNlIiwgInBhc3NpdmUiLCAic2hvdWxkQWRkTGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJhZGRFdmVudExpc3RlbmVyIiwgImV2ZW50IiwgImNhbGwiLCAiaG9zdCIsICJoYW5kbGVFdmVudCIsICJfJExIIiwgIl9ib3VuZEF0dHJpYnV0ZVN1ZmZpeCIsICJfbWFya2VyIiwgIl9tYXJrZXJNYXRjaCIsICJfSFRNTF9SRVNVTFQiLCAiX2dldFRlbXBsYXRlSHRtbCIsICJfVGVtcGxhdGVJbnN0YW5jZSIsICJfaXNJdGVyYWJsZSIsICJfcmVzb2x2ZURpcmVjdGl2ZSIsICJfQ2hpbGRQYXJ0IiwgIl9BdHRyaWJ1dGVQYXJ0IiwgIl9Cb29sZWFuQXR0cmlidXRlUGFydCIsICJfRXZlbnRQYXJ0IiwgIl9Qcm9wZXJ0eVBhcnQiLCAiX0VsZW1lbnRQYXJ0IiwgInBvbHlmaWxsU3VwcG9ydCIsICJsaXRIdG1sUG9seWZpbGxTdXBwb3J0IiwgImxpdEh0bWxWZXJzaW9ucyIsICJyZW5kZXIiLCAiY29udGFpbmVyIiwgInBhcnRPd25lck5vZGUiLCAicmVuZGVyQmVmb3JlIiwgIkxpdEVsZW1lbnQiLCAiUmVhY3RpdmVFbGVtZW50IiwgImNvbnN0cnVjdG9yIiwgInRoaXMiLCAicmVuZGVyT3B0aW9ucyIsICJob3N0IiwgIl9fY2hpbGRQYXJ0IiwgImNyZWF0ZVJlbmRlclJvb3QiLCAicmVuZGVyUm9vdCIsICJzdXBlciIsICJyZW5kZXJCZWZvcmUiLCAiZmlyc3RDaGlsZCIsICJjaGFuZ2VkUHJvcGVydGllcyIsICJ2YWx1ZSIsICJyZW5kZXIiLCAiaGFzVXBkYXRlZCIsICJpc0Nvbm5lY3RlZCIsICJ1cGRhdGUiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAic2V0Q29ubmVjdGVkIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgIm5vQ2hhbmdlIiwgImdsb2JhbFRoaXMiLCAibGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0IiwgInBvbHlmaWxsU3VwcG9ydCIsICJsaXRFbGVtZW50UG9seWZpbGxTdXBwb3J0IiwgImdsb2JhbFRoaXMiLCAibGl0RWxlbWVudFZlcnNpb25zIiwgInB1c2giLCAiY3VzdG9tRWxlbWVudCIsICJ0YWdOYW1lIiwgImNsYXNzT3JUYXJnZXQiLCAiY29udGV4dCIsICJhZGRJbml0aWFsaXplciIsICJjdXN0b21FbGVtZW50cyIsICJkZWZpbmUiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgInR5cGUiLCAiU3RyaW5nIiwgImNvbnZlcnRlciIsICJkZWZhdWx0Q29udmVydGVyIiwgInJlZmxlY3QiLCAiaGFzQ2hhbmdlZCIsICJub3RFcXVhbCIsICJzdGFuZGFyZFByb3BlcnR5IiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgImNvbnRleHQiLCAia2luZCIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImdsb2JhbFRoaXMiLCAibGl0UHJvcGVydHlNZXRhZGF0YSIsICJnZXQiLCAic2V0IiwgIk1hcCIsICJuYW1lIiwgInYiLCAib2xkVmFsdWUiLCAiY2FsbCIsICJ0aGlzIiwgInJlcXVlc3RVcGRhdGUiLCAiXyRjaGFuZ2VQcm9wZXJ0eSIsICJ2YWx1ZSIsICJFcnJvciIsICJwcm9wZXJ0eSIsICJwcm90b09yVGFyZ2V0IiwgIm5hbWVPckNvbnRleHQiLCAicHJvdG8iLCAiaGFzT3duUHJvcGVydHkiLCAiY29uc3RydWN0b3IiLCAiY3JlYXRlUHJvcGVydHkiLCAid3JhcHBlZCIsICJPYmplY3QiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgInN0YXRlIiwgIm9wdGlvbnMiLCAicHJvcGVydHkiLCAiYXR0cmlidXRlIiwgImRlc2MiLCAib2JqIiwgIm5hbWUiLCAiZGVzY3JpcHRvciIsICJjb25maWd1cmFibGUiLCAiZW51bWVyYWJsZSIsICJSZWZsZWN0IiwgImRlY29yYXRlIiwgIk9iamVjdCIsICJkZWZpbmVQcm9wZXJ0eSIsICJxdWVyeSIsICJzZWxlY3RvciIsICJjYWNoZSIsICJwcm90b09yVGFyZ2V0IiwgIm5hbWVPckNvbnRleHQiLCAiZGVzY3JpcHRvciIsICJkb1F1ZXJ5IiwgImVsIiwgInJlbmRlclJvb3QiLCAicXVlcnlTZWxlY3RvciIsICJnZXQiLCAic2V0IiwgImtleSIsICJTeW1ib2wiLCAidGhpcyIsICJ2IiwgImRlc2MiLCAicmVzdWx0IiwgImNhbGwiLCAiaGFzVXBkYXRlZCIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAib3B0aW9ucyIsICJvYmoiLCAibmFtZSIsICJzbG90IiwgInNlbGVjdG9yIiwgInNsb3RTZWxlY3RvciIsICJkZXNjIiwgImdldCIsICJzbG90RWwiLCAidGhpcyIsICJyZW5kZXJSb290IiwgInF1ZXJ5U2VsZWN0b3IiLCAiZWxlbWVudHMiLCAiYXNzaWduZWRFbGVtZW50cyIsICJmaWx0ZXIiLCAibm9kZSIsICJtYXRjaGVzIiwgInIiLCAiXyIsICJlIiwgInYiLCAiaSIsICJfYSIsICJuIiwgInQiLCAiX2EiLCAieG1sIiwgImF0dHJpYnV0ZXMiLCAieG1sIiwgInhtbCIsICJyIiwgIm4iLCAidCIsICJuIiwgImkiLCAiciIsICJ0IiwgInIiLCAidCIsICJyIiwgInQiLCAiciIsICJuIiwgInQiLCAiX2EiLCAiX2IiLCAidiIsICJpIiwgIm4iLCAiciIsICJ0IiwgIl9hIiwgIl9iIiwgInYiLCAiaSIsICJuIiwgInIiLCAidCIsICJyIiwgInQiLCAiciIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJ2IiwgIm4iLCAiaSIsICJ0IiwgImkiLCAidCIsICJpIiwgInQiLCAiaWZEZWZpbmVkIiwgInZhbHVlIiwgIm5vdGhpbmciLCAiciIsICJuIiwgImkiLCAibyIsICJyIiwgIm4iLCAidCIsICJfQ2hpbGRQYXJ0IiwgIkNoaWxkUGFydCIsICJfJExIIiwgImlzU2luZ2xlRXhwcmVzc2lvbiIsICJwYXJ0IiwgInN0cmluZ3MiLCAiY3JlYXRlTWFya2VyIiwgImRvY3VtZW50IiwgImNyZWF0ZUNvbW1lbnQiLCAiaW5zZXJ0UGFydCIsICJjb250YWluZXJQYXJ0IiwgInJlZlBhcnQiLCAiY29udGFpbmVyIiwgIl8kc3RhcnROb2RlIiwgInBhcmVudE5vZGUiLCAicmVmTm9kZSIsICJfJGVuZE5vZGUiLCAic3RhcnROb2RlIiwgImluc2VydEJlZm9yZSIsICJlbmROb2RlIiwgIkNoaWxkUGFydCIsICJvcHRpb25zIiwgIm5leHRTaWJsaW5nIiwgIm9sZFBhcmVudCIsICJfJHBhcmVudCIsICJwYXJlbnRDaGFuZ2VkIiwgIm5ld0Nvbm5lY3Rpb25TdGF0ZSIsICJfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzIiwgIl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQiLCAiXyRpc0Nvbm5lY3RlZCIsICJzdGFydCIsICJuIiwgInNldENoaWxkUGFydFZhbHVlIiwgInZhbHVlIiwgImRpcmVjdGl2ZVBhcmVudCIsICJfJHNldFZhbHVlIiwgIlJFU0VUX1ZBTFVFIiwgInNldENvbW1pdHRlZFZhbHVlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiZ2V0Q29tbWl0dGVkVmFsdWUiLCAicmVtb3ZlUGFydCIsICJlbmQiLCAicmVtb3ZlIiwgIlBhcnRUeXBlIiwgIkFUVFJJQlVURSIsICJDSElMRCIsICJQUk9QRVJUWSIsICJCT09MRUFOX0FUVFJJQlVURSIsICJFVkVOVCIsICJFTEVNRU5UIiwgImRpcmVjdGl2ZSIsICJjIiwgInZhbHVlcyIsICJfJGxpdERpcmVjdGl2ZSQiLCAiRGlyZWN0aXZlIiwgIl9wYXJ0SW5mbyIsICJfJGlzQ29ubmVjdGVkIiwgInRoaXMiLCAiXyRwYXJlbnQiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiX19wYXJ0IiwgIl9fYXR0cmlidXRlSW5kZXgiLCAicHJvcHMiLCAidXBkYXRlIiwgIl9wYXJ0IiwgInJlbmRlciIsICJub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQiLCAicGFyZW50IiwgImlzQ29ubmVjdGVkIiwgImNoaWxkcmVuIiwgIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsICJvYmoiLCAicmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50IiwgIl8kcGFyZW50IiwgImRlbGV0ZSIsICJzaXplIiwgImFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQiLCAiU2V0IiwgImhhcyIsICJhZGQiLCAiaW5zdGFsbERpc2Nvbm5lY3RBUEkiLCAicmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCAibmV3UGFyZW50IiwgInRoaXMiLCAibm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZCIsICJpc0NsZWFyaW5nVmFsdWUiLCAiZnJvbVBhcnRJbmRleCIsICJ2YWx1ZSIsICJfJGNvbW1pdHRlZFZhbHVlIiwgIkFycmF5IiwgImlzQXJyYXkiLCAiaSIsICJsZW5ndGgiLCAidHlwZSIsICJQYXJ0VHlwZSIsICJDSElMRCIsICJfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkIiwgIl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCAiQXN5bmNEaXJlY3RpdmUiLCAiRGlyZWN0aXZlIiwgImNvbnN0cnVjdG9yIiwgInBhcnQiLCAiYXR0cmlidXRlSW5kZXgiLCAic3VwZXIiLCAiXyRpbml0aWFsaXplIiwgIl8kaXNDb25uZWN0ZWQiLCAiaXNDbGVhcmluZ0RpcmVjdGl2ZSIsICJyZWNvbm5lY3RlZCIsICJkaXNjb25uZWN0ZWQiLCAiaXNTaW5nbGVFeHByZXNzaW9uIiwgIl9fcGFydCIsICJfJHNldFZhbHVlIiwgIm5ld1ZhbHVlcyIsICJfX2F0dHJpYnV0ZUluZGV4IiwgImNyZWF0ZVJlZiIsICJSZWYiLCAibGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2siLCAiV2Vha01hcCIsICJyZWYiLCAiZGlyZWN0aXZlIiwgIkFzeW5jRGlyZWN0aXZlIiwgIl9yZWYiLCAibm90aGluZyIsICJwYXJ0IiwgInJlZkNoYW5nZWQiLCAidGhpcyIsICJfdXBkYXRlUmVmVmFsdWUiLCAidW5kZWZpbmVkIiwgIl9sYXN0RWxlbWVudEZvclJlZiIsICJfZWxlbWVudCIsICJfY29udGV4dCIsICJvcHRpb25zIiwgImhvc3QiLCAiZWxlbWVudCIsICJpc0Nvbm5lY3RlZCIsICJjb250ZXh0IiwgImdsb2JhbFRoaXMiLCAibGFzdEVsZW1lbnRGb3JDYWxsYmFjayIsICJnZXQiLCAic2V0IiwgImNhbGwiLCAidmFsdWUiLCAiZGlzY29ubmVjdGVkIiwgInJlY29ubmVjdGVkIiwgImkiLCAiZSIsICJvIiwgIm4iLCAiciIsICJ0IiwgIl8iLCAiX2EiLCAiZSIsICJuIiwgInQiLCAiVW5zYWZlSFRNTERpcmVjdGl2ZSIsICJEaXJlY3RpdmUiLCAicGFydEluZm8iLCAic3VwZXIiLCAidGhpcyIsICJfdmFsdWUiLCAibm90aGluZyIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIkVycm9yIiwgImNvbnN0cnVjdG9yIiwgImRpcmVjdGl2ZU5hbWUiLCAidmFsdWUiLCAiX3RlbXBsYXRlUmVzdWx0IiwgIm5vQ2hhbmdlIiwgInN0cmluZ3MiLCAicmF3IiwgIl8kbGl0VHlwZSQiLCAicmVzdWx0VHlwZSIsICJ2YWx1ZXMiLCAidW5zYWZlSFRNTCIsICJkaXJlY3RpdmUiLCAiaSIsICJvIiwgInIiLCAibiIsICJ0IiwgImkiLCAiaiIsICJuIiwgIl9hIiwgImMiLCAiYSIsICJiIiwgImkiLCAibiIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAidCIsICJyIiwgImkiLCAidCIsICJyIiwgInQiLCAibiIsICJpIiwgInYiLCAiciIsICJpIiwgImkiLCAiciIsICJlIiwgInYiLCAiaSIsICJjIiwgImUiLCAibiIsICJ4IiwgInYiLCAibiIsICJuIiwgInIiLCAibiIsICJyIiwgIm4iLCAiX2EiLCAiaSIsICJjIiwgImUiLCAiciIsICJfYSIsICJfYiIsICJ2IiwgIm4iLCAidjIiLCAibiIsICJjIiwgImEiLCAiYiIsICJ2IiwgImUiLCAicCIsICJhIiwgImMiLCAiayIsICJyZXF1aXJlIiwgIm4iLCAiciIsICJ0IiwgImUiLCAieCIsICJ5IiwgIl9hIiwgIl9hIiwgIm4iLCAiX2EiLCAiZSIsICJuIiwgImQiLCAiZHJhZ2dhYmxlIiwgInBhcmVudCIsICJpbmRleCIsICJ0YXJnZXRJbmRleCIsICJuIiwgImkiLCAiXyIsICJyIiwgInQiLCAiaWZyYW1lIiwgImUiLCAibiIsICJyIiwgInQiLCAiZSIsICJuIiwgInQiLCAieCIsICJfYSIsICJfYiIsICJpIiwgInQiLCAiZ2VuZXJhdGVNYXAiLCAibGlzdCIsICJzdGFydCIsICJlbmQiLCAibWFwIiwgIk1hcCIsICJpIiwgInNldCIsICJyZXBlYXQiLCAiZGlyZWN0aXZlIiwgIkRpcmVjdGl2ZSIsICJwYXJ0SW5mbyIsICJzdXBlciIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIkVycm9yIiwgIml0ZW1zIiwgImtleUZuT3JUZW1wbGF0ZSIsICJ0ZW1wbGF0ZSIsICJrZXlGbiIsICJrZXlzIiwgInZhbHVlcyIsICJpbmRleCIsICJpdGVtIiwgInRoaXMiLCAiX2dldFZhbHVlc0FuZEtleXMiLCAiY29udGFpbmVyUGFydCIsICJvbGRQYXJ0cyIsICJnZXRDb21taXR0ZWRWYWx1ZSIsICJuZXdWYWx1ZXMiLCAibmV3S2V5cyIsICJBcnJheSIsICJpc0FycmF5IiwgIl9pdGVtS2V5cyIsICJvbGRLZXlzIiwgIm5ld1BhcnRzIiwgIm5ld0tleVRvSW5kZXhNYXAiLCAib2xkS2V5VG9JbmRleE1hcCIsICJvbGRIZWFkIiwgIm9sZFRhaWwiLCAibGVuZ3RoIiwgIm5ld0hlYWQiLCAibmV3VGFpbCIsICJzZXRDaGlsZFBhcnRWYWx1ZSIsICJpbnNlcnRQYXJ0IiwgImhhcyIsICJvbGRJbmRleCIsICJnZXQiLCAib2xkUGFydCIsICJuZXdQYXJ0IiwgInJlbW92ZVBhcnQiLCAic2V0Q29tbWl0dGVkVmFsdWUiLCAibm9DaGFuZ2UiLCAicCIsICJfYSIsICJfYiIsICJvIiwgImMiLCAiZSIsICJfIiwgImkiLCAicyIsICJyIiwgInQiLCAiZSIsICJzIiwgImkiLCAidCIsICJlIiwgImkiLCAiaG90c3BvdCIsICJzIiwgInQiLCAiZSIsICJzIiwgImkiLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgImkiLCAiZSIsICJ2IiwgImkiLCAibyIsICJyIiwgIm4iLCAidCIsICJpIiwgInQiLCAiXyIsICJpIiwgIm8iLCAiZCIsICJyIiwgIm4iLCAidCIsICJyIiwgImkiLCAiciIsICJhIiwgImkiLCAidCIsICJpbXBvcnRhbnQiLCAiaW1wb3J0YW50RmxhZyIsICJzdHlsZU1hcCIsICJkaXJlY3RpdmUiLCAiRGlyZWN0aXZlIiwgInBhcnRJbmZvIiwgInN1cGVyIiwgInR5cGUiLCAiUGFydFR5cGUiLCAiQVRUUklCVVRFIiwgIm5hbWUiLCAic3RyaW5ncyIsICJsZW5ndGgiLCAiRXJyb3IiLCAic3R5bGVJbmZvIiwgIk9iamVjdCIsICJrZXlzIiwgInJlZHVjZSIsICJzdHlsZSIsICJwcm9wIiwgInZhbHVlIiwgImluY2x1ZGVzIiwgInJlcGxhY2UiLCAidG9Mb3dlckNhc2UiLCAicGFydCIsICJlbGVtZW50IiwgInRoaXMiLCAiX3ByZXZpb3VzU3R5bGVQcm9wZXJ0aWVzIiwgIlNldCIsICJyZW5kZXIiLCAiZGVsZXRlIiwgInJlbW92ZVByb3BlcnR5IiwgImFkZCIsICJpc0ltcG9ydGFudCIsICJlbmRzV2l0aCIsICJzZXRQcm9wZXJ0eSIsICJzbGljZSIsICJub0NoYW5nZSIsICJ4IiwgInkiLCAiYyIsICJvIiwgImUiLCAiXyIsICJpIiwgIm4iLCAiciIsICJ0IiwgImV2ZW50IiwgIngiLCAiZGlmZlgiLCAiZSIsICJpIiwgIm4iLCAidCIsICJyIiwgIl9hIiwgIl9iIiwgImUiLCAidiIsICJ0IiwgInIiLCAiaSIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgInIiLCAiaSIsICJuIiwgInQiLCAiciIsICJpIiwgInQiLCAiciIsICJpIiwgIm4iLCAidCIsICJyIiwgImkiLCAibiIsICJ0IiwgIl9hIiwgIm4iLCAiciIsICJ0Il0KfQo=