haya-select 1.0.94 → 1.0.97

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.
@@ -54,6 +54,7 @@ const paginationButtonStyles = {};
54
54
  * @property {string|number} [defaultValue]
55
55
  * @property {Array<string|number>} [defaultValues]
56
56
  * @property {Array<HayaSelectOption>} [defaultValuesFromOptions]
57
+ * @property {boolean} [debug]
57
58
  * @property {import("react").ReactNode} [id]
58
59
  * @property {object} [model]
59
60
  * @property {boolean} multiple
@@ -63,7 +64,8 @@ const paginationButtonStyles = {};
63
64
  * @property {function(import("react").SyntheticEvent=): void} [onChange]
64
65
  * @property {function(Array<string|number>=): void} [onChangeValue]
65
66
  * @property {function(import("react").SyntheticEvent=): void} [onFocus]
66
- * @property {function(): void} [onOptionsClosed]
67
+ * @property {function({options: Array}): void} [onOptionsClosed]
68
+ * @property {function({options: Array}): void} [onOptionsLoaded]
67
69
  * @property {function(object): import("react").ReactNode} [optionContent]
68
70
  * @property {Array<HayaSelectOption>|function(): (Array<HayaSelectOption>|HayaSelectOptionsResult)} options
69
71
  * @property {boolean} optionsAbsolute
@@ -128,6 +130,7 @@ const PaginationPageButton = memo(shapeComponent(class PaginationPageButton exte
128
130
  /** @extends {ShapeComponent<HayaSelectProps>} */
129
131
  export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
130
132
  static defaultProps = {
133
+ debug: false,
131
134
  multiple: false,
132
135
  noOptionsText: null,
133
136
  onBlur: null,
@@ -145,6 +148,7 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
145
148
  defaultValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
146
149
  defaultValues: PropTypes.array,
147
150
  defaultValuesFromOptions: PropTypes.array,
151
+ debug: PropTypes.bool.isRequired,
148
152
  id: PropTypes.node,
149
153
  model: PropTypes.object,
150
154
  multiple: PropTypes.bool.isRequired,
@@ -155,6 +159,7 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
155
159
  onChangeValue: PropTypes.func,
156
160
  onFocus: PropTypes.func,
157
161
  onOptionsClosed: PropTypes.func,
162
+ onOptionsLoaded: PropTypes.func,
158
163
  optionContent: PropTypes.func,
159
164
  options: PropTypes.oneOfType([
160
165
  PropTypes.arrayOf(PropTypes.shape({
@@ -190,6 +195,22 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
190
195
  t = Config.current().getUseTranslate()().t;
191
196
  windowWidth = Dimensions.get("window").width;
192
197
  windowHeight = Dimensions.get("window").height;
198
+ isDebugEnabled = () => Boolean(this.p.debug);
199
+ debugLog = (functionName, details = undefined) => {
200
+ if (!this.isDebugEnabled())
201
+ return;
202
+ const baseDetails = {
203
+ id: this.p.id,
204
+ name: this.p.name
205
+ };
206
+ const mergedDetails = details ? Object.assign({}, baseDetails, details) : baseDetails;
207
+ if (mergedDetails && Object.keys(mergedDetails).length > 0) {
208
+ console.log(`[HayaSelect] ${functionName}`, mergedDetails);
209
+ }
210
+ else {
211
+ console.log(`[HayaSelect] ${functionName}`);
212
+ }
213
+ };
193
214
  setup() {
194
215
  const { t } = Config.current().getUseTranslate()();
195
216
  this.t = t;
@@ -214,8 +235,8 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
214
235
  height: null,
215
236
  loadedOptions: () => this.defaultLoadedOptions(),
216
237
  page: 1,
217
- pageInputActive: false,
218
- pageInputValue: "",
238
+ pageInputFocused: false,
239
+ pageInputValue: "1",
219
240
  pageSize: null,
220
241
  opened: false,
221
242
  optionsContainerLayout: null,
@@ -233,6 +254,13 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
233
254
  usePressOutside(this.tt.optionsContainerRef, this.tt.onPressOutsideOptions);
234
255
  useEventListener(windowTarget, "resize", this.tt.onAnythingResizedDebounced);
235
256
  useEventListener(windowTarget, "scroll", this.tt.onAnythingScrolledDebounced);
257
+ if (this.isDebugEnabled())
258
+ this.debugLog("setup", {
259
+ hasControlledValues: "values" in this.props,
260
+ hasControlledToggled: "toggled" in this.props,
261
+ multiple: this.p.multiple,
262
+ optionsType: Array.isArray(this.props.options) ? "array" : typeof this.props.options
263
+ });
236
264
  useEffect(() => {
237
265
  if (this.tt.callOptionsPositionAboveIfOutsideScreen && this.s.optionsContainerLayout) {
238
266
  this.callOptionsPositionAboveIfOutsideScreen = false;
@@ -246,12 +274,12 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
246
274
  }
247
275
  }, [this.props.values]);
248
276
  }
249
- translate(msgID) {
277
+ translate(msgID, options) {
250
278
  if (msgID.startsWith(".")) {
251
- return this.t(`haya_select${msgID}`);
279
+ return this.t(`haya_select${msgID}`, options);
252
280
  }
253
281
  else {
254
- return this.t(msgID);
282
+ return this.t(msgID, options);
255
283
  }
256
284
  }
257
285
  defaultCurrentOptions() {
@@ -355,6 +383,12 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
355
383
  }
356
384
  componentDidMount() {
357
385
  const { attribute, defaultValue, defaultValues, defaultValuesFromOptions, model, options } = this.props;
386
+ if (this.isDebugEnabled())
387
+ this.debugLog("componentDidMount", {
388
+ hasAttributeModel: Boolean(attribute && model),
389
+ hasDefaultValues: Boolean(defaultValue || defaultValues || defaultValuesFromOptions),
390
+ optionsType: typeof options
391
+ });
358
392
  if (((defaultValue || defaultValues || defaultValuesFromOptions) || (attribute && model)) && typeof options == "function") {
359
393
  this.loadDefaultValuesFromOptionsCallback();
360
394
  }
@@ -368,6 +402,8 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
368
402
  }
369
403
  }
370
404
  if (Object.keys(newState).length > 0) {
405
+ if (this.isDebugEnabled())
406
+ this.debugLog("componentDidUpdate", { syncingKeys: Object.keys(newState) });
371
407
  this.setState(newState);
372
408
  }
373
409
  }
@@ -479,32 +515,52 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
479
515
  const defaultValues = this.defaultValues();
480
516
  if (!defaultValues)
481
517
  return;
518
+ if (this.isDebugEnabled())
519
+ this.debugLog("loadDefaultValuesFromOptionsCallback", { defaultValues });
482
520
  const result = await this.props.options({
483
521
  searchValue: this.getSearchText(),
484
522
  page: this.getActivePage(),
485
523
  values: defaultValues
486
524
  });
487
525
  const { options } = this.parseOptionsResult(result);
526
+ if (this.isDebugEnabled())
527
+ this.debugLog("loadDefaultValuesFromOptionsCallback.result", { loadedOptionsCount: options?.length || 0 });
488
528
  this.setState({ currentOptions: this.state.currentOptions.concat(options) });
489
529
  }
490
- loadOptions = async () => {
530
+ loadOptions = async ({ page } = {}) => {
491
531
  const { options } = this.p;
492
532
  const searchValue = this.getSearchText();
533
+ if (this.isDebugEnabled())
534
+ this.debugLog("loadOptions", {
535
+ page,
536
+ searchValue,
537
+ optionsType: Array.isArray(options) ? "array" : typeof options
538
+ });
493
539
  if (Array.isArray(options)) {
494
540
  return this.loadOptionsFromArray(options, searchValue);
495
541
  }
496
- const result = await options({ searchValue, page: this.getActivePage() });
497
- const { options: loadedOptions, page, pageSize, totalCount } = this.parseOptionsResult(result);
498
- const resolvedPage = Number.isFinite(page) ? page : this.getActivePage();
542
+ const requestedPage = Number.isFinite(page) ? page : this.getActivePage();
543
+ const result = await options({ searchValue, page: requestedPage });
544
+ const { options: loadedOptions, page: resultPage, pageSize, totalCount } = this.parseOptionsResult(result);
545
+ const resolvedPage = Number.isFinite(resultPage) ? resultPage : requestedPage;
499
546
  const resolvedPageSize = this.resolvePageSize({ options: loadedOptions, page: resolvedPage, pageSize, totalCount });
547
+ const totalPages = Number.isFinite(totalCount) && Number.isFinite(resolvedPageSize) && resolvedPageSize > 0
548
+ ? Math.ceil(totalCount / resolvedPageSize)
549
+ : null;
500
550
  this.setState({
501
551
  loadedOptions,
502
552
  page: resolvedPage,
503
- pageInputActive: false,
504
- pageInputValue: "",
553
+ pageInputValue: String(resolvedPage),
505
554
  pageSize: Number.isFinite(totalCount) ? resolvedPageSize : null,
506
555
  totalCount: Number.isFinite(totalCount) ? totalCount : null
507
- });
556
+ }, () => this.props.onOptionsLoaded?.({ options: loadedOptions }));
557
+ if (this.isDebugEnabled())
558
+ this.debugLog("loadOptions.result", {
559
+ loadedOptionsCount: loadedOptions?.length || 0,
560
+ resolvedPage,
561
+ resolvedPageSize,
562
+ totalCount: Number.isFinite(totalCount) ? totalCount : null
563
+ });
508
564
  };
509
565
  hayaSelectOption({ key, loadedOption }) {
510
566
  if (loadedOption.type == "group") {
@@ -515,11 +571,16 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
515
571
  loadOptionsFromArray(options, searchValue) {
516
572
  const lowerSearchValue = searchValue?.toLowerCase();
517
573
  const loadedOptions = options.filter(({ text }) => !lowerSearchValue || text?.toLowerCase()?.includes(lowerSearchValue));
574
+ if (this.isDebugEnabled())
575
+ this.debugLog("loadOptionsFromArray", {
576
+ totalOptionsCount: options.length,
577
+ searchValue,
578
+ loadedOptionsCount: loadedOptions.length
579
+ });
518
580
  this.setState({
519
581
  loadedOptions,
520
582
  page: 1,
521
- pageInputActive: false,
522
- pageInputValue: "",
583
+ pageInputValue: "1",
523
584
  pageSize: null,
524
585
  totalCount: null
525
586
  });
@@ -546,6 +607,8 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
546
607
  e.preventDefault();
547
608
  e.stopPropagation();
548
609
  const { opened } = this.s;
610
+ if (this.isDebugEnabled())
611
+ this.debugLog("onSelectClicked", { opened });
549
612
  if (opened) {
550
613
  this.closeOptions();
551
614
  }
@@ -554,20 +617,27 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
554
617
  }
555
618
  };
556
619
  onSearchTextInputChangedDebounced = debounce(this.tt.loadOptions, 200);
557
- closeOptions() {
620
+ closeOptions({ options } = {}) {
621
+ const closedOptions = options || this.getCurrentOptions();
622
+ if (this.isDebugEnabled())
623
+ this.debugLog("closeOptions", { closedOptionsCount: closedOptions?.length || 0 });
558
624
  this.setState({
559
625
  height: null,
560
626
  loadedOptions: undefined,
561
627
  opened: false,
562
628
  optionsContainerLayout: null,
629
+ optionsVisibility: "hidden",
563
630
  page: 1,
564
- pageInputActive: false,
565
- pageInputValue: "",
631
+ pageInputFocused: false,
632
+ pageInputValue: "1",
566
633
  pageSize: null,
567
634
  totalCount: null
635
+ }, () => {
636
+ if (this.isDebugEnabled())
637
+ this.debugLog("closeOptions.done", { opened: this.s.opened, optionsVisibility: this.s.optionsVisibility });
568
638
  });
569
639
  if (this.props.onOptionsClosed) {
570
- this.props.onOptionsClosed({ options: this.getCurrentOptions() });
640
+ this.props.onOptionsClosed({ options: closedOptions });
571
641
  }
572
642
  if (this.p.onBlur)
573
643
  this.p.onBlur();
@@ -592,27 +662,39 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
592
662
  }
593
663
  };
594
664
  onChangeSearchText = (searchText) => {
665
+ if (this.isDebugEnabled())
666
+ this.debugLog("onChangeSearchText", { searchText, currentPage: this.s.page });
595
667
  this.searchTextValue = searchText;
596
668
  if (this.s.page != 1) {
597
- this.setState({ page: 1, pageInputActive: false, pageInputValue: "" }, this.tt.onSearchTextInputChangedDebounced);
669
+ this.setState({ page: 1, pageInputValue: "1" }, this.tt.onSearchTextInputChangedDebounced);
598
670
  }
599
671
  else {
600
672
  this.tt.onSearchTextInputChangedDebounced();
601
673
  }
602
674
  };
603
675
  openOptions() {
676
+ if (this.isDebugEnabled())
677
+ this.debugLog("openOptions", {
678
+ currentOptionsCount: this.getCurrentOptions()?.length || 0,
679
+ searchEnabled: this.p.search
680
+ });
604
681
  this.searchTextValue = "";
605
- this.setOptionsPositionBelow();
606
- this.loadOptions();
607
682
  this.callOptionsPositionAboveIfOutsideScreen = true;
608
683
  this.setState({
609
684
  height: this.s.selectContainerLayout.height,
610
685
  opened: true,
686
+ optionsPlacement: "below",
687
+ optionsVisibility: "hidden",
688
+ optionsWidth: this.s.endOfSelectLayout?.width,
689
+ page: 1,
690
+ pageInputFocused: false,
691
+ pageInputValue: "1",
611
692
  scrollLeft: Platform.OS == "web" ? document.documentElement.scrollLeft : null,
612
693
  scrollTop: Platform.OS == "web" ? document.documentElement.scrollTop : null
613
694
  }, () => {
614
695
  this.resetSearchTextInput();
615
696
  this.focusTextInput();
697
+ this.loadOptions({ page: 1 });
616
698
  });
617
699
  if (this.p.onFocus)
618
700
  this.p.onFocus();
@@ -622,6 +704,8 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
622
704
  if (!this.isActive()) {
623
705
  return; // Debounce after un-mount handeling.
624
706
  }
707
+ if (this.isDebugEnabled())
708
+ this.debugLog("setOptionsPosition");
625
709
  this.callOptionsPositionAboveIfOutsideScreen = true;
626
710
  this.setOptionsPositionBelow();
627
711
  }
@@ -630,6 +714,8 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
630
714
  const { optionsContainerLayout } = this.s;
631
715
  const endOfSelectLayout = this.s.endOfSelectLayout;
632
716
  if (!endOfSelectLayout) {
717
+ if (this.isDebugEnabled())
718
+ this.debugLog("setOptionsPositionAboveIfOutsideScreen", { placement: "below", reason: "missing-end-of-select-layout" });
633
719
  this.setState({ optionsVisibility: "visible" });
634
720
  return;
635
721
  }
@@ -637,14 +723,20 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
637
723
  const optionsTotalBottomPosition = optionsContainerLayout.height + optionsTop;
638
724
  const windowHeightWithScroll = windowHeight + this.s.scrollTop;
639
725
  if (windowHeightWithScroll < optionsTotalBottomPosition) {
726
+ if (this.isDebugEnabled())
727
+ this.debugLog("setOptionsPositionAboveIfOutsideScreen", { placement: "above" });
640
728
  this.setOptionsPositionAbove();
641
729
  }
642
730
  else {
731
+ if (this.isDebugEnabled())
732
+ this.debugLog("setOptionsPositionAboveIfOutsideScreen", { placement: "below" });
643
733
  this.setState({ optionsVisibility: "visible" });
644
734
  }
645
735
  }
646
736
  setOptionsPositionAbove() {
647
737
  const { endOfSelectLayout } = this.s;
738
+ if (this.isDebugEnabled())
739
+ this.debugLog("setOptionsPositionAbove");
648
740
  this.setState({
649
741
  opened: true,
650
742
  optionsPlacement: "above",
@@ -653,6 +745,8 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
653
745
  }, () => this.focusTextInput());
654
746
  }
655
747
  setOptionsPositionBelow() {
748
+ if (this.isDebugEnabled())
749
+ this.debugLog("setOptionsPositionBelow");
656
750
  this.setState({
657
751
  opened: true,
658
752
  optionsPlacement: "below",
@@ -661,12 +755,16 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
661
755
  }, () => this.focusTextInput());
662
756
  }
663
757
  onAnythingResized = () => {
758
+ if (this.isDebugEnabled())
759
+ this.debugLog("onAnythingResized", { opened: this.s.opened });
664
760
  if (this.s.opened) {
665
761
  this.setOptionsPosition();
666
762
  }
667
763
  };
668
764
  onAnythingResizedDebounced = debounce(this.tt.onAnythingResized, 25);
669
765
  onAnythingScrolled = () => {
766
+ if (this.isDebugEnabled())
767
+ this.debugLog("onAnythingScrolled", { opened: this.s.opened });
670
768
  if (this.s.opened) {
671
769
  this.setState({
672
770
  scrollLeft: Platform.OS == "web" ? document.documentElement.scrollLeft : null,
@@ -677,6 +775,8 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
677
775
  };
678
776
  onAnythingScrolledDebounced = debounce(this.tt.onAnythingScrolled, 25);
679
777
  onPressOutsideOptions = () => {
778
+ if (this.isDebugEnabled())
779
+ this.debugLog("onPressOutsideOptions", { opened: this.s.opened });
680
780
  // If options are open and a click is made outside of the options container
681
781
  if (this.s.opened) {
682
782
  this.closeOptions();
@@ -734,17 +834,33 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
734
834
  addPage(totalPages);
735
835
  return items;
736
836
  }
837
+ paginationDisplayValue(totalPages) {
838
+ const activePage = this.getActivePage();
839
+ const fallbackText = `Page ${activePage} of ${totalPages}`;
840
+ return this.translate(".pagination_page_of_pages", {
841
+ defaultValue: fallbackText,
842
+ page: activePage,
843
+ totalPages
844
+ }) || fallbackText;
845
+ }
846
+ paginationInputValue(totalPages) {
847
+ if (this.s.pageInputFocused)
848
+ return this.s.pageInputValue;
849
+ return this.paginationDisplayValue(totalPages);
850
+ }
737
851
  /** @param {number} page */
738
852
  setPaginationPage = (page) => {
739
853
  const totalPages = this.paginationTotalPages();
854
+ if (this.isDebugEnabled())
855
+ this.debugLog("setPaginationPage", { requestedPage: page, totalPages });
740
856
  if (!totalPages)
741
857
  return;
742
858
  const nextPage = Math.min(Math.max(Math.floor(page), 1), totalPages);
743
859
  if (nextPage == this.getActivePage()) {
744
- this.setState({ pageInputActive: false, pageInputValue: "" });
860
+ this.setState({ pageInputValue: String(this.getActivePage()) });
745
861
  return;
746
862
  }
747
- this.setState({ page: nextPage, pageInputActive: false, pageInputValue: "" }, this.tt.loadOptions);
863
+ this.setState({ page: nextPage, pageInputValue: String(nextPage) }, () => this.tt.loadOptions({ page: nextPage }));
748
864
  };
749
865
  /** @param {import("react").SyntheticEvent} event */
750
866
  onPaginationPrevPressed = (event) => {
@@ -758,14 +874,10 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
758
874
  event.stopPropagation?.();
759
875
  this.setPaginationPage(this.getActivePage() + 1);
760
876
  };
761
- /** @param {import("react").SyntheticEvent} event */
762
- onPaginationLabelPressed = (event) => {
763
- event.preventDefault?.();
764
- event.stopPropagation?.();
765
- if (this.s.pageInputActive)
766
- return;
767
- this.setState({ pageInputActive: true, pageInputValue: String(this.getActivePage()) }, () => {
768
- this.tt.pageInputRef.current?.focus?.();
877
+ onPaginationInputFocus = () => {
878
+ this.setState({
879
+ pageInputFocused: true,
880
+ pageInputValue: String(this.getActivePage())
769
881
  });
770
882
  };
771
883
  /** @param {string} value */
@@ -776,7 +888,18 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
776
888
  onPaginationInputBlur = (event) => {
777
889
  event.preventDefault?.();
778
890
  event.stopPropagation?.();
779
- this.setState({ pageInputActive: false, pageInputValue: "" });
891
+ const totalPages = this.paginationTotalPages();
892
+ const rawValue = event?.target?.value ?? this.s.pageInputValue;
893
+ const parsedValue = rawValue ? Number(String(rawValue).match(/\d+/)?.[0]) : NaN;
894
+ const nextPage = Number.isFinite(parsedValue) ? parsedValue : Number(this.s.pageInputValue);
895
+ if (totalPages && Number.isFinite(nextPage)) {
896
+ this.setState({ pageInputFocused: false }, () => this.setPaginationPage(nextPage));
897
+ return;
898
+ }
899
+ this.setState({
900
+ pageInputFocused: false,
901
+ pageInputValue: String(this.getActivePage())
902
+ });
780
903
  };
781
904
  /** @param {import("react").SyntheticEvent} event */
782
905
  onPaginationInputSubmit = (event) => {
@@ -784,15 +907,27 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
784
907
  event.stopPropagation?.();
785
908
  const totalPages = this.paginationTotalPages();
786
909
  if (!totalPages) {
787
- this.setState({ pageInputActive: false, pageInputValue: "" });
910
+ this.setState({
911
+ pageInputFocused: false,
912
+ pageInputValue: String(this.getActivePage())
913
+ });
788
914
  return;
789
915
  }
790
916
  const nextPage = Number(this.s.pageInputValue);
791
917
  if (!Number.isFinite(nextPage)) {
792
- this.setState({ pageInputActive: false, pageInputValue: "" });
918
+ this.setState({
919
+ pageInputFocused: false,
920
+ pageInputValue: String(this.getActivePage())
921
+ });
793
922
  return;
794
923
  }
795
- this.setPaginationPage(nextPage);
924
+ this.setState({ pageInputFocused: false }, () => this.setPaginationPage(nextPage));
925
+ };
926
+ /** @param {import("react").SyntheticEvent} event */
927
+ onPaginationInputKeyDown = (event) => {
928
+ if (event?.key !== "Enter")
929
+ return;
930
+ this.tt.onPaginationInputSubmit(event);
796
931
  };
797
932
  /** @returns {import("react").ReactNode|null} */
798
933
  paginationControls() {
@@ -818,7 +953,10 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
818
953
  width: 30
819
954
  } },
820
955
  React.createElement(FontAwesomeIcon, { name: "chevron-left", style: styles.paginationNavIcon ||= { color: "#334155", fontSize: 12 } })),
821
- React.createElement(Pressable, { dataSet: dataSets.paginationLabel ||= { class: "pagination-label" }, onPress: this.tt.onPaginationLabelPressed, style: styles.paginationLabelButton ||= {
956
+ React.createElement(View, { dataSet: this.cache("paginationLabelDataSet", {
957
+ class: "pagination-label",
958
+ page: currentPage
959
+ }, [currentPage]), style: styles.paginationLabelButton ||= {
822
960
  alignItems: "center",
823
961
  backgroundColor: "#f1f5f9",
824
962
  border: "1px solid #cbd5e1",
@@ -828,26 +966,15 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
828
966
  paddingHorizontal: 10,
829
967
  paddingVertical: 6
830
968
  } },
831
- !this.s.pageInputActive &&
832
- React.createElement(Text, { style: styles.paginationLabelText ||= {
833
- color: "#0f172a",
834
- fontSize: 12,
835
- fontWeight: 600
836
- } },
837
- "Page ",
838
- currentPage,
839
- " of ",
840
- totalPages),
841
- this.s.pageInputActive &&
842
- React.createElement(TextInput, { dataSet: dataSets.paginationInput ||= { class: "pagination-input" }, keyboardType: "number-pad", onBlur: this.tt.onPaginationInputBlur, onChangeText: this.tt.onPaginationInputChange, onSubmitEditing: this.tt.onPaginationInputSubmit, ref: this.tt.pageInputRef, selectTextOnFocus: true, style: styles.paginationInputStyle ||= {
843
- border: 0,
844
- color: "#0f172a",
845
- fontSize: 12,
846
- outline: "none",
847
- padding: 0,
848
- textAlign: "center",
849
- width: 80
850
- }, value: this.s.pageInputValue })),
969
+ React.createElement(TextInput, { dataSet: dataSets.paginationInput ||= { class: "pagination-input" }, keyboardType: "number-pad", onBlur: this.tt.onPaginationInputBlur, onChangeText: this.tt.onPaginationInputChange, onFocus: this.tt.onPaginationInputFocus, onPressIn: this.tt.onPaginationInputFocus, onKeyDown: this.tt.onPaginationInputKeyDown, onSubmitEditing: this.tt.onPaginationInputSubmit, ref: this.tt.pageInputRef, selectTextOnFocus: true, style: styles.paginationInputStyle ||= {
970
+ border: 0,
971
+ color: "#0f172a",
972
+ fontSize: 12,
973
+ outline: "none",
974
+ padding: 0,
975
+ textAlign: "center",
976
+ width: 120
977
+ }, value: this.paginationInputValue(totalPages) })),
851
978
  React.createElement(Pressable, { dataSet: dataSets.paginationNextButton ||= { class: "pagination-next" }, disabled: nextDisabled, onPress: this.tt.onPaginationNextPressed, style: styles[`paginationNavButton-${nextDisabled}`] ||= {
852
979
  alignItems: "center",
853
980
  backgroundColor: "#f8fafc",
@@ -952,6 +1079,7 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
952
1079
  const existingOption = currentOptions.find((currentOption) => currentOption.value == loadedOption.value);
953
1080
  const newToggled = { ...toggled };
954
1081
  let newCurrentOptions;
1082
+ let action;
955
1083
  if (existingOption) {
956
1084
  if (toggleOptions) {
957
1085
  const currentToggle = toggled[loadedOption.value];
@@ -959,32 +1087,43 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
959
1087
  if (currentIndex >= (toggleOptions.length - 1)) {
960
1088
  // No next toggled - remove toggled and option
961
1089
  delete newToggled[loadedOption.value];
1090
+ action = "remove-option-after-last-toggle";
962
1091
  newCurrentOptions = currentOptions.filter((currentOption) => currentOption.value != loadedOption.value);
963
1092
  }
964
1093
  else {
965
1094
  // Already toggled - set to next toggle
966
1095
  newToggled[loadedOption.value] = digg(toggleOptions, currentIndex + 1, "value");
1096
+ action = "cycle-toggle";
967
1097
  }
968
1098
  newState.toggled = newToggled;
969
1099
  }
970
1100
  else {
971
1101
  // Remove from current options
1102
+ action = "remove-option";
972
1103
  newCurrentOptions = currentOptions.filter((currentOption) => currentOption.value != loadedOption.value);
973
1104
  }
974
1105
  }
975
1106
  else {
976
1107
  // Don't do anything if the clicked option is disabled
977
- if (loadedOption.disabled)
1108
+ if (loadedOption.disabled) {
1109
+ if (this.isDebugEnabled())
1110
+ this.debugLog("onOptionClicked", {
1111
+ action: "ignore-disabled-option",
1112
+ optionValue: loadedOption.value
1113
+ });
978
1114
  return;
1115
+ }
979
1116
  if (toggleOptions) {
980
1117
  // Set fresh toggle
981
1118
  newToggled[loadedOption.value] = toggleOptions[0].value;
982
1119
  newState.toggled = newToggled;
983
1120
  }
984
1121
  if (multiple || toggleOptions) {
1122
+ action = "add-option";
985
1123
  newCurrentOptions = currentOptions.concat([loadedOption]);
986
1124
  }
987
1125
  else {
1126
+ action = "replace-single-option";
988
1127
  newCurrentOptions = [loadedOption];
989
1128
  }
990
1129
  }
@@ -995,6 +1134,16 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
995
1134
  newState.currentOptions = newCurrentOptions;
996
1135
  }
997
1136
  const options = newCurrentOptions || currentOptions;
1137
+ if (this.isDebugEnabled())
1138
+ this.debugLog("onOptionClicked", {
1139
+ action: action || "toggle-only",
1140
+ multiple,
1141
+ optionValue: loadedOption.value,
1142
+ optionsCountBefore: currentOptions.length,
1143
+ optionsCountAfter: options.length
1144
+ });
1145
+ if (!multiple)
1146
+ this.closeOptions({ options });
998
1147
  if (onChange) {
999
1148
  onChange({
1000
1149
  event,
@@ -1012,8 +1161,6 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
1012
1161
  }
1013
1162
  this.p.onChangeValue(optionValue);
1014
1163
  }
1015
- if (!multiple)
1016
- this.closeOptions();
1017
1164
  this.setState(newState);
1018
1165
  };
1019
1166
  stylingFor(stylingName, style = {}, caches = []) {
@@ -1105,4 +1252,4 @@ export default memo(shapeComponent(class HayaSelect extends ShapeComponent {
1105
1252
  }
1106
1253
  }
1107
1254
  }));
1108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VsZWN0L2luZGV4LmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDbEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDekUsT0FBTyxLQUFLLEVBQUMsRUFBQyxJQUFJLEVBQUMsU0FBUyxFQUFDLE1BQU0sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUNqRCxPQUFPLEVBQUMsY0FBYyxFQUFDLGNBQWMsRUFBQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3hGLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUMvQixPQUFPLGVBQWUsTUFBTSx1Q0FBdUMsQ0FBQTtBQUNuRSxPQUFPLGNBQWMsTUFBTSxtREFBbUQsQ0FBQTtBQUM5RSxPQUFPLGdCQUFnQixNQUFNLHFEQUFxRCxDQUFBO0FBQ2xGLE9BQU8sSUFBSSxNQUFNLHNDQUFzQyxDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLFdBQVcsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN4QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxVQUFVLE1BQU0sMEJBQTBCLENBQUE7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNuQyxPQUFPLGdCQUFnQixNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sZUFBZSxNQUFNLHFDQUFxQyxDQUFBO0FBRWpFLE1BQU0sTUFBTSxHQUFHLEVB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QUFjLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQTtZQUNyQyxDQUFDO1lBRUQsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUNsRSxNQUFNLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNqRSxNQUFNLGFBQWEsR0FBRyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFdEYsSUFBSSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQTtRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthbnl0aGluZ0RpZmZlcmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL2J1aWxkL2RpZmYtdXRpbHNcIlxuaW1wb3J0IENvbmZpZyBmcm9tIFwiLi4vY29uZmlnLmpzXCJcbmltcG9ydCB7ZGlnLGRpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IHtEaW1lbnNpb25zLFBsYXRmb3JtLFByZXNzYWJsZSxUZXh0SW5wdXQsVmlld30gZnJvbSBcInJlYWN0LW5hdGl2ZVwiXG5pbXBvcnQgUmVhY3Qse21lbW8sdXNlRWZmZWN0LHVzZVJlZn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7c2hhcGVDb21wb25lbnQsU2hhcGVDb21wb25lbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9zaGFwZS1jb21wb25lbnQuanNcIlxuaW1wb3J0IGRlYm91bmNlIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQgRm9udEF3ZXNvbWVJY29uIGZyb20gXCJyZWFjdC1uYXRpdmUtdmVjdG9yLWljb25zL0ZvbnRBd2Vzb21lXCJcbmltcG9ydCBpZEZvckNvbXBvbmVudCBmcm9tIFwiQGthc3Blcm5qL2FwaS1tYWtlci9idWlsZC9pbnB1dHMvaWQtZm9yLWNvbXBvbmVudFwiXG5pbXBvcnQgbmFtZUZvckNvbXBvbmVudCBmcm9tIFwiQGthc3Blcm5qL2FwaS1tYWtlci9idWlsZC9pbnB1dHMvbmFtZS1mb3ItY29tcG9uZW50XCJcbmltcG9ydCBUZXh0IGZyb20gXCJAa2FzcGVybmovYXBpLW1ha2VyL2J1aWxkL3V0aWxzL3RleHRcIlxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi9vcHRpb25cIlxuaW1wb3J0IE9wdGlvbkdyb3VwIGZyb20gXCIuL29wdGlvbi1ncm91cFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBwcm9wVHlwZXNFeGFjdCBmcm9tIFwicHJvcC10eXBlcy1leGFjdFwiXG5pbXBvcnQgUmVuZGVySHRtbCBmcm9tIFwicmVhY3QtbmF0aXZlLXJlbmRlci1odG1sXCJcbmltcG9ydCB7UG9ydGFsfSBmcm9tIFwiY29uam9pbnRtZW50XCJcbmltcG9ydCB1c2VFdmVudExpc3RlbmVyIGZyb20gXCJ5YS11c2UtZXZlbnQtbGlzdGVuZXJcIlxuaW1wb3J0IHVzZVByZXNzT3V0c2lkZSBmcm9tIFwib3V0c2lkZS1leWUvYnVpbGQvdXNlLXByZXNzLW91dHNpZGVcIlxuXG5jb25zdCBzdHlsZXMgPSB7fVxuY29uc3QgZGF0YVNldHMgPSB7fVxuY29uc3QgcGFnaW5hdGlvbkJ1dHRvbkRhdGFTZXRzID0ge31cbmNvbnN0IHBhZ2luYXRpb25CdXR0b25TdHlsZXMgPSB7fVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEhheWFTZWxlY3RUb2dnbGVPcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpY29uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbGFiZWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGF5YVNlbGVjdE9wdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSB2YWx1ZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IFt0ZXh0XVxuICogQHByb3BlcnR5IHtmdW5jdGlvbigpOiBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IFtjb250ZW50XVxuICogQHByb3BlcnR5IHtmdW5jdGlvbigpOiBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IFtjdXJyZW50Q29udGVudF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc2FibGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtodG1sXVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IFtyaWdodF1cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbiBwcm9wcyBhcmUgYWxsb3dlZDsgSGF5YVNlbGVjdCBvbmx5IHVzZXMgdGhlIGtleXMgYWJvdmUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIYXlhU2VsZWN0T3B0aW9uc1Jlc3VsdFxuICogQHByb3BlcnR5IHtBcnJheTxIYXlhU2VsZWN0T3B0aW9uPn0gb3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0b3RhbENvdW50XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwYWdlXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwYWdlU2l6ZV1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEhheWFTZWxlY3RQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdHRyaWJ1dGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV1cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbZGVmYXVsdFRvZ2dsZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IFtkZWZhdWx0VmFsdWVdXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZ3xudW1iZXI+fSBbZGVmYXVsdFZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8SGF5YVNlbGVjdE9wdGlvbj59IFtkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnNdXG4gKiBAcHJvcGVydHkge2ltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW2lkXVxuICogQHByb3BlcnR5IHtvYmplY3R9IFttb2RlbF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXVsdGlwbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV1cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKTogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBbbm9PcHRpb25zVGV4dF1cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oaW1wb3J0KFwicmVhY3RcIikuU3ludGhldGljRXZlbnQ9KTogdm9pZH0gW29uQmx1cl1cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oaW1wb3J0KFwicmVhY3RcIikuU3ludGhldGljRXZlbnQ9KTogdm9pZH0gW29uQ2hhbmdlXVxuICogQHByb3BlcnR5IHtmdW5jdGlvbihBcnJheTxzdHJpbmd8bnVtYmVyPj0pOiB2b2lkfSBbb25DaGFuZ2VWYWx1ZV1cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oaW1wb3J0KFwicmVhY3RcIikuU3ludGhldGljRXZlbnQ9KTogdm9pZH0gW29uRm9jdXNdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IHZvaWR9IFtvbk9wdGlvbnNDbG9zZWRdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKG9iamVjdCk6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW29wdGlvbkNvbnRlbnRdXG4gKiBAcHJvcGVydHkge0FycmF5PEhheWFTZWxlY3RPcHRpb24+fGZ1bmN0aW9uKCk6IChBcnJheTxIYXlhU2VsZWN0T3B0aW9uPnxIYXlhU2VsZWN0T3B0aW9uc1Jlc3VsdCl9IG9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3B0aW9uc0Fic29sdXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9wdGlvbnNQb3J0YWxcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb3B0aW9uc1dpZHRoXVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IFtwbGFjZWhvbGRlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0ZWRCYWNrZ3JvdW5kQ29sb3JdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdGVkSG92ZXJCYWNrZ3JvdW5kQ29sb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNlYXJjaFxuICogQHByb3BlcnR5IHtvYmplY3R9IFtzdHlsZXNdXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3RvZ2dsZWRdXG4gKiBAcHJvcGVydHkge0FycmF5PEhheWFTZWxlY3RUb2dnbGVPcHRpb24+fSBbdG9nZ2xlT3B0aW9uc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHJhbnNwYXJlbnRcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nfG51bWJlcj59IFt2YWx1ZXNdXG4gKi9cblxuLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG5jb25zdCBuYW1lRm9yQ29tcG9uZW50V2l0aE11bHRpcGxlID0gKGNvbXBvbmVudCkgPT4ge1xuICBsZXQgbmFtZSA9IG5hbWVGb3JDb21wb25lbnQoY29tcG9uZW50KVxuXG4gIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gY29tcG9uZW50LmdldEN1cnJlbnRPcHRpb25zKClcblxuICBpZiAoY29tcG9uZW50LnByb3BzLm11bHRpcGxlICYmIG5hbWUgJiYgY3VycmVudE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIG5hbWUgKz0gXCJbXVwiXG4gIH1cblxuICByZXR1cm4gbmFtZVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhZ2luYXRpb25QYWdlQnV0dG9uUHJvcHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWN0aXZlXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGFnZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbihudW1iZXIpOiB2b2lkfSBvblBhZ2VTZWxlY3RlZFxuICovXG5cbi8qKiBAZXh0ZW5kcyB7U2hhcGVDb21wb25lbnQ8UGFnaW5hdGlvblBhZ2VCdXR0b25Qcm9wcz59ICovXG5jb25zdCBQYWdpbmF0aW9uUGFnZUJ1dHRvbiA9IG1lbW8oc2hhcGVDb21wb25lbnQoY2xhc3MgUGFnaW5hdGlvblBhZ2VCdXR0b24gZXh0ZW5kcyBTaGFwZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBwcm9wVHlwZXNFeGFjdCh7XG4gICAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIHBhZ2U6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBvblBhZ2VTZWxlY3RlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9KVxuXG4gIC8qKiBAcGFyYW0ge2ltcG9ydChcInJlYWN0XCIpLlN5bnRoZXRpY0V2ZW50fSBldmVudCAqL1xuICBvblByZXNzID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKVxuXG4gICAgdGhpcy5wLm9uUGFnZVNlbGVjdGVkKHRoaXMucC5wYWdlKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHthY3RpdmUsIHBhZ2V9ID0gdGhpcy5wXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFByZXNzYWJsZVxuICAgICAgICBkYXRhU2V0PXtwYWdpbmF0aW9uQnV0dG9uRGF0YVNldHNbYHBhZ2luYXRpb25QYWdlLSR7cGFnZX1gXSB8fD0ge2NsYXNzOiBcInBhZ2luYXRpb24tcGFnZVwiLCBwYWdlfX1cbiAgICAgICAgZGlzYWJsZWQ9e2FjdGl2ZX1cbiAgICAgICAgb25QcmVzcz17dGhpcy50dC5vblByZXNzfVxuICAgICAgICBzdHlsZT17cGFnaW5hdGlvbkJ1dHRvblN0eWxlc1tgcGFnaW5hdGlvblBhZ2VCdXR0b24tJHthY3RpdmV9YF0gfHw9IHtcbiAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYWN0aXZlID8gXCIjMGYxNzJhXCIgOiBcIiNlMmU4ZjBcIixcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDk5OSxcbiAgICAgICAgICBoZWlnaHQ6IDI4LFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgIG1hcmdpbkhvcml6b250YWw6IDQsXG4gICAgICAgICAgd2lkdGg6IDI4XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxUZXh0XG4gICAgICAgICAgc3R5bGU9e3BhZ2luYXRpb25CdXR0b25TdHlsZXNbYHBhZ2luYXRpb25QYWdlVGV4dC0ke2FjdGl2ZX1gXSB8fD0ge1xuICAgICAgICAgICAgY29sb3I6IGFjdGl2ZSA/IFwiI2Y4ZmFmY1wiIDogXCIjMzM0MTU1XCIsXG4gICAgICAgICAgICBmb250U2l6ZTogMTIsXG4gICAgICAgICAgICBmb250V2VpZ2h0OiA2MDBcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3BhZ2V9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvUHJlc3NhYmxlPlxuICAgIClcbiAgfVxufSkpXG5cbi8qKiBAZXh0ZW5kcyB7U2hhcGVDb21wb25lbnQ8SGF5YVNlbGVjdFByb3BzPn0gKi9cbmV4cG9ydCBkZWZhdWx0IG1lbW8oc2hhcGVDb21wb25lbnQoY2xhc3MgSGF5YVNlbGVjdCBleHRlbmRzIFNoYXBlQ29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgbm9PcHRpb25zVGV4dDogbnVsbCxcbiAgICBvbkJsdXI6IG51bGwsXG4gICAgb25Gb2N1czogbnVsbCxcbiAgICBvcHRpb25zQWJzb2x1dGU6IHRydWUsXG4gICAgb3B0aW9uc1BvcnRhbDogdHJ1ZSxcbiAgICBvcHRpb25zV2lkdGg6IG51bGwsXG4gICAgc2VhcmNoOiBmYWxzZSxcbiAgICB0cmFuc3BhcmVudDogZmFsc2VcbiAgfVxuXG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBwcm9wVHlwZXNFeGFjdCh7XG4gICAgYXR0cmlidXRlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBkZWZhdWx0VG9nZ2xlZDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICBkZWZhdWx0VmFsdWVzOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgZGVmYXVsdFZhbHVlc0Zyb21PcHRpb25zOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgaWQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIG1vZGVsOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIG11bHRpcGxlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbm9PcHRpb25zVGV4dDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25DaGFuZ2VWYWx1ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25PcHRpb25zQ2xvc2VkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvcHRpb25Db250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvcHRpb25zOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBjdXJyZW50Q29udGVudDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgaHRtbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgcmlnaHQ6IFByb3BUeXBlcy5ub2RlLFxuICAgICAgICB0ZXh0OiBQcm9wVHlwZXMubm9kZSxcbiAgICAgICAgdmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKS5pc1JlcXVpcmVkXG4gICAgICB9KSksXG4gICAgICBQcm9wVHlwZXMuZnVuY1xuICAgIF0pLmlzUmVxdWlyZWQsXG4gICAgb3B0aW9uc0Fic29sdXRlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIG9wdGlvbnNQb3J0YWw6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgb3B0aW9uc1dpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMubm9kZSxcbiAgICBzZWxlY3RlZEJhY2tncm91bmRDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzZWxlY3RlZEhvdmVyQmFja2dyb3VuZENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNlYXJjaDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBzdHlsZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgdG9nZ2xlZDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB0b2dnbGVPcHRpb25zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgaWNvbjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbiAgICB9KSksXG4gICAgdHJhbnNwYXJlbnQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgdmFsdWVzOiBQcm9wVHlwZXMuYXJyYXlcbiAgfSlcblxuICBjYWxsT3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW4gPSBmYWxzZVxuICBzZWFyY2hUZXh0VmFsdWUgPSBcIlwiXG4gIHQgPSBDb25maWcuY3VycmVudCgpLmdldFVzZVRyYW5zbGF0ZSgpKCkudFxuICB3aW5kb3dXaWR0aCA9IERpbWVuc2lvbnMuZ2V0KFwid2luZG93XCIpLndpZHRoXG4gIHdpbmRvd0hlaWdodCA9IERpbWVuc2lvbnMuZ2V0KFwid2luZG93XCIpLmhlaWdodFxuXG4gIHNldHVwKCkge1xuICAgIGNvbnN0IHt0fSA9IENvbmZpZy5jdXJyZW50KCkuZ2V0VXNlVHJhbnNsYXRlKCkoKVxuXG4gICAgdGhpcy50ID0gdFxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy52YWx1ZXMpKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMucHJvcHMudmFsdWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhheWFTZWxlY3Q6IFVuZGVmaW5lZCBnaXZlbiBhcyB2YWx1ZVwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRJbnN0YW5jZSh7XG4gICAgICBlbmRPZlNlbGVjdFJlZjogdXNlUmVmKCksXG4gICAgICBvcHRpb25zQ29udGFpbmVyUmVmOiB1c2VSZWYoKSxcbiAgICAgIHBhZ2VJbnB1dFJlZjogdXNlUmVmKCksXG4gICAgICBzZWFyY2hUZXh0SW5wdXRSZWY6IHVzZVJlZigpLFxuICAgICAgc2VsZWN0Q29udGFpbmVyUmVmOiB1c2VSZWYoKVxuICAgIH0pXG4gICAgdGhpcy51c2VTdGF0ZXMoe1xuICAgICAgY3VycmVudE9wdGlvbnM6ICgpID0+IHRoaXMuZGVmYXVsdEN1cnJlbnRPcHRpb25zKCksXG4gICAgICBzZWxlY3RDb250YWluZXJMYXlvdXQ6IG51bGwsXG4gICAgICBlbmRPZlNlbGVjdExheW91dDogbnVsbCxcbiAgICAgIGhlaWdodDogbnVsbCxcbiAgICAgIGxvYWRlZE9wdGlvbnM6ICgpID0+IHRoaXMuZGVmYXVsdExvYWRlZE9wdGlvbnMoKSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBwYWdlSW5wdXRBY3RpdmU6IGZhbHNlLFxuICAgICAgcGFnZUlucHV0VmFsdWU6IFwiXCIsXG4gICAgICBwYWdlU2l6ZTogbnVsbCxcbiAgICAgIG9wZW5lZDogZmFsc2UsXG4gICAgICBvcHRpb25zQ29udGFpbmVyTGF5b3V0OiBudWxsLFxuICAgICAgb3B0aW9uc1BsYWNlbWVudDogdW5kZWZpbmVkLFxuICAgICAgb3B0aW9uc1RvcDogdW5kZWZpbmVkLFxuICAgICAgb3B0aW9uc1Zpc2liaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgIG9wdGlvbnNXaWR0aDogdW5kZWZpbmVkLFxuICAgICAgc2Nyb2xsTGVmdDogUGxhdGZvcm0uT1MgPT0gXCJ3ZWJcIiA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IDogbnVsbCxcbiAgICAgIHNjcm9sbFRvcDogUGxhdGZvcm0uT1MgPT0gXCJ3ZWJcIiA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgOiBudWxsLFxuICAgICAgdG90YWxDb3VudDogbnVsbCxcbiAgICAgIHRvZ2dsZWQ6ICgpID0+IHRoaXMuZGVmYXVsdFRvZ2dsZWQoKVxuICAgIH0pXG5cbiAgICBjb25zdCB3aW5kb3dUYXJnZXQgPSBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiICYmIHR5cGVvZiB3aW5kb3cgIT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcblxuICAgIHVzZUV2ZW50TGlzdGVuZXIoRGltZW5zaW9ucywgXCJjaGFuZ2VcIiwgdGhpcy50dC5vbkRpbWVuc2lvbnNDaGFuZ2UpXG4gICAgdXNlUHJlc3NPdXRzaWRlKHRoaXMudHQub3B0aW9uc0NvbnRhaW5lclJlZiwgdGhpcy50dC5vblByZXNzT3V0c2lkZU9wdGlvbnMpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3dUYXJnZXQsIFwicmVzaXplXCIsIHRoaXMudHQub25Bbnl0aGluZ1Jlc2l6ZWREZWJvdW5jZWQpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3dUYXJnZXQsIFwic2Nyb2xsXCIsIHRoaXMudHQub25Bbnl0aGluZ1Njcm9sbGVkRGVib3VuY2VkKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnR0LmNhbGxPcHRpb25zUG9zaXRpb25BYm92ZUlmT3V0c2lkZVNjcmVlbiAmJiB0aGlzLnMub3B0aW9uc0NvbnRhaW5lckxheW91dCkge1xuICAgICAgICB0aGlzLmNhbGxPcHRpb25zUG9zaXRpb25BYm92ZUlmT3V0c2lkZVNjcmVlbiA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2V0T3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW4oKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnR0LmNhbGxPcHRpb25zUG9zaXRpb25BYm92ZUlmT3V0c2lkZVNjcmVlbiwgdGhpcy5zLm9wdGlvbnNDb250YWluZXJMYXlvdXRdKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25JZHMgPSB0aGlzLnMuY3VycmVudE9wdGlvbnM/Lm1hcCgoY3VycmVudE9wdGlvbikgPT4gY3VycmVudE9wdGlvbi52YWx1ZSlcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy52YWx1ZXMpICYmIGFueXRoaW5nRGlmZmVyZW50KGN1cnJlbnRPcHRpb25JZHMsIHRoaXMucHJvcHMudmFsdWVzKSAmJiB0eXBlb2YgdGhpcy5wcm9wcy5vcHRpb25zID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aGlzLnNldEN1cnJlbnRGcm9tR2l2ZW5WYWx1ZXMoKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnByb3BzLnZhbHVlc10pXG4gIH1cblxuICB0cmFuc2xhdGUobXNnSUQpIHtcbiAgICBpZiAobXNnSUQuc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnQoYGhheWFfc2VsZWN0JHttc2dJRH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy50KG1zZ0lEKVxuICAgIH1cbiAgfVxuXG4gIGRlZmF1bHRDdXJyZW50T3B0aW9ucygpIHtcbiAgICBjb25zdCB7ZGVmYXVsdFZhbHVlLCBkZWZhdWx0VmFsdWVzLCB2YWx1ZXN9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHtvcHRpb25zfSA9IHRoaXMucFxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMpKSByZXR1cm4gW11cblxuICAgIHJldHVybiBvcHRpb25zLmZpbHRlcigoe3ZhbHVlfSkgPT5cbiAgICAgIChkZWZhdWx0VmFsdWUgJiYgdmFsdWUgPT0gZGVmYXVsdFZhbHVlKSB8fFxuICAgICAgICAoZGVmYXVsdFZhbHVlcyAmJiBkZWZhdWx0VmFsdWVzLmluY2x1ZGVzKHZhbHVlKSkgfHxcbiAgICAgICAgKHZhbHVlcyAmJiB2YWx1ZXMuaW5jbHVkZXModmFsdWUpKVxuICAgIClcbiAgfVxuXG4gIGRlZmF1bHRMb2FkZWRPcHRpb25zKCkge1xuICAgIGNvbnN0IHtvcHRpb25zfSA9IHRoaXMucFxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnNcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSBvZiBvcHRpb25zOiAke3R5cGVvZiBvcHRpb25zfWApXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgZ2V0QWN0aXZlUGFnZSA9ICgpID0+IHRoaXMucy5wYWdlIHx8IDFcblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxIYXlhU2VsZWN0T3B0aW9uPnxIYXlhU2VsZWN0T3B0aW9uc1Jlc3VsdH0gcmVzdWx0XG4gICAqIEByZXR1cm5zIHtIYXlhU2VsZWN0T3B0aW9uc1Jlc3VsdH1cbiAgICovXG4gIHBhcnNlT3B0aW9uc1Jlc3VsdChyZXN1bHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSByZXR1cm4ge29wdGlvbnM6IHJlc3VsdH1cblxuICAgIGlmIChyZXN1bHQgJiYgQXJyYXkuaXNBcnJheShyZXN1bHQub3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wdGlvbnM6IHJlc3VsdC5vcHRpb25zLFxuICAgICAgICB0b3RhbENvdW50OiByZXN1bHQudG90YWxDb3VudCxcbiAgICAgICAgcGFnZTogcmVzdWx0LnBhZ2UsXG4gICAgICAgIHBhZ2VTaXplOiByZXN1bHQucGFnZVNpemVcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3B0aW9ucyByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHtBcnJheTxIYXlhU2VsZWN0T3B0aW9uPn0gcGFyYW1zLm9wdGlvbnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMucGFnZV1cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMucGFnZVNpemVdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1zLnRvdGFsQ291bnRdXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH1cbiAgICovXG4gIHJlc29sdmVQYWdlU2l6ZSh7b3B0aW9ucywgcGFnZSwgcGFnZVNpemUsIHRvdGFsQ291bnR9KSB7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShwYWdlU2l6ZSkgJiYgcGFnZVNpemUgPiAwKSByZXR1cm4gcGFnZVNpemVcblxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUodGhpcy5zLnBhZ2VTaXplKSAmJiB0aGlzLnMucGFnZVNpemUgPiAwICYmIHBhZ2UgIT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMucy5wYWdlU2l6ZVxuICAgIH1cblxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUodG90YWxDb3VudCkgJiYgQXJyYXkuaXNBcnJheShvcHRpb25zKSAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmxlbmd0aFxuICAgIH1cblxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodGhpcy5zLnBhZ2VTaXplKSAmJiB0aGlzLnMucGFnZVNpemUgPiAwID8gdGhpcy5zLnBhZ2VTaXplIDogbnVsbFxuICB9XG5cbiAgZGVmYXVsdFRvZ2dsZWQgPSAoKSA9PiAoXCJ0b2dnbGVkXCIgaW4gdGhpcy5wcm9wcykgPyB0aGlzLnAudG9nZ2xlZCA6IHRoaXMucHJvcHMuZGVmYXVsdFRvZ2dsZWQgfHwge31cbiAgZ2V0VG9nZ2xlZCA9ICgpID0+IChcInRvZ2dsZWRcIiBpbiB0aGlzLnByb3BzKSA/IHRoaXMucC50b2dnbGVkIDogdGhpcy5zLnRvZ2dsZWRcbiAgZ2V0VmFsdWVzID0gKCkgPT4gKFwidmFsdWVzXCIgaW4gdGhpcy5wcm9wcykgPyB0aGlzLnAudmFsdWVzIDogdGhpcy5zLmN1cnJlbnRPcHRpb25zLm1hcCgoY3VycmVudE9wdGlvbikgPT4gY3VycmVudE9wdGlvbi52YWx1ZSlcbiAgZ2V0Q3VycmVudE9wdGlvbnMgPSAoKSA9PiB7XG4gICAgaWYgKFwidmFsdWVzXCIgaW4gdGhpcy5wcm9wcyAmJiB0eXBlb2YgdGhpcy5wcm9wcy52YWx1ZXMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wLnZhbHVlcykgJiYgdGhpcy5wLnZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnByb3BzLm9wdGlvbnMpICYmIEFycmF5LmlzQXJyYXkodGhpcy5wLnZhbHVlcykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucC52YWx1ZXMubWFwKCh2YWx1ZSkgPT4gdGhpcy5wLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUgPT0gdmFsdWUpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnMubG9hZGVkT3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KHRoaXMucC52YWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnAudmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBsZXQgZm91bmRPcHRpb24gPSB0aGlzLnMubG9hZGVkT3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PSB2YWx1ZSlcblxuICAgICAgICAgIGlmICghZm91bmRPcHRpb24pIHtcbiAgICAgICAgICAgIGZvdW5kT3B0aW9uID0gdGhpcy5zLmN1cnJlbnRPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09IHZhbHVlKVxuXG4gICAgICAgICAgICBpZiAoIWZvdW5kT3B0aW9uKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkbid0IGZpbmQgb3B0aW9uOiAke3ZhbHVlfSBpbiBsb2FkZWRPcHRpb25zIG9yIHN0YXRlIGN1cnJlbnRPcHRpb25zYCxcbiAgICAgICAgICAgICAgICB7c3RhdGVMb2FkZWRPcHRpb25zOiB0aGlzLnMubG9hZGVkT3B0aW9ucywgc3RhdGVDdXJyZW50T3B0aW9uczogdGhpcy5zLmN1cnJlbnRPcHRpb25zLCBwcm9wc09wdGlvbnM6IHRoaXMucHJvcHMub3B0aW9uc31cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmb3VuZE9wdGlvblxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vcHRpb25zID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBPcHRpb25zIGhhdmVuJ3QgYmVlbiBsb2FkZWQgeWV0LlxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMucC52YWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnAudmFsdWVzLm1hcCgodmFsdWUpID0+ICh7dmFsdWV9KSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmN1cnJlbnRPcHRpb25zXG4gIH1cblxuICBnZXRDdXJyZW50T3B0aW9uVmFsdWVzKCkge1xuICAgIGlmIChcInZhbHVlc1wiIGluIHRoaXMucHJvcHMpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMucC52YWx1ZXMpID8gdGhpcy5wLnZhbHVlcyA6IFtdXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudE9wdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRPcHRpb25zKClcblxuICAgIGlmICghY3VycmVudE9wdGlvbnMpIHJldHVybiBbXVxuXG4gICAgcmV0dXJuIGN1cnJlbnRPcHRpb25zXG4gICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbj8udmFsdWUpXG4gICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlICE9IFwidW5kZWZpbmVkXCIpXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBjb25zdCB7YXR0cmlidXRlLCBkZWZhdWx0VmFsdWUsIGRlZmF1bHRWYWx1ZXMsIGRlZmF1bHRWYWx1ZXNGcm9tT3B0aW9ucywgbW9kZWwsIG9wdGlvbnN9ID0gdGhpcy5wcm9wc1xuXG4gICAgaWYgKCgoZGVmYXVsdFZhbHVlIHx8IGRlZmF1bHRWYWx1ZXMgfHwgZGVmYXVsdFZhbHVlc0Zyb21PcHRpb25zKSB8fCAoYXR0cmlidXRlICYmIG1vZGVsKSkgJiYgdHlwZW9mIG9wdGlvbnMgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLmxvYWREZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnNDYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge31cblxuICAgIGlmIChcInRvZ2dsZWRcIiBpbiB0aGlzLnByb3BzKSB7XG4gICAgICBjb25zdCBuZXdUb2dnbGVkID0gdGhpcy5wLnRvZ2dsZWRcblxuICAgICAgaWYgKGFueXRoaW5nRGlmZmVyZW50KHRoaXMuc3RhdGUudG9nZ2xlZCwgbmV3VG9nZ2xlZCkpIHtcbiAgICAgICAgbmV3U3RhdGUudG9nZ2xlZCA9IG5ld1RvZ2dsZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtlbmRPZlNlbGVjdFJlZn0gPSB0aGlzLnR0XG4gICAgY29uc3Qge3RyYW5zcGFyZW50fSA9IHRoaXMucFxuICAgIGNvbnN0IHtjbGFzc05hbWUsIHBsYWNlaG9sZGVyLCB0b2dnbGVPcHRpb25zfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7b3BlbmVkLCBvcHRpb25zUGxhY2VtZW50fSA9IHRoaXMuc1xuICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy5nZXRDdXJyZW50T3B0aW9ucygpXG4gICAgY29uc3QgaWQgPSBpZEZvckNvbXBvbmVudCh0aGlzKVxuXG4gICAgY29uc3Qgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwgPSB7Li4udGhpcy5zdHlsaW5nRm9yKFwic2VsZWN0Q29udGFpbmVyXCIsIHtcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwicm93XCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0cmFuc3BhcmVudCA/IHVuZGVmaW5lZCA6IFwiI2ZmZlwiLFxuICAgICAgYm9yZGVyOiB0cmFuc3BhcmVudCA/IHVuZGVmaW5lZCA6IFwiMXB4IHNvbGlkICM5OTlcIixcbiAgICAgIGJvcmRlclJhZGl1czogdHJhbnNwYXJlbnQgPyB1bmRlZmluZWQgOiA0LFxuICAgICAgY29sb3I6IFwiIzAwMFwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIHBhZGRpbmdUb3A6IDUsXG4gICAgICBwYWRkaW5nQm90dG9tOiA1LFxuICAgICAgcGFkZGluZ0xlZnQ6IDVcbiAgICB9LCBbdHJhbnNwYXJlbnRdKX1cblxuICAgIGlmIChvcGVuZWQpIHtcbiAgICAgIC8vIFByZXZlbnQgc2VsZWN0IGZyb20gY2hhbmdpbmcgc2l6ZSBvbmNlIHRoZSBjb250ZW50IGlzIHJlcGxhY2VkIHdpdGggc2VhcmNoIHRleHQgb25jZSBvcGVuZWRcbiAgICAgIHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmhlaWdodCA9IHRoaXMucy5oZWlnaHRcblxuICAgICAgY29uc3QgYmFzZUJvcmRlclJhZGl1cyA9IHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmJvcmRlclJhZGl1c1xuXG4gICAgICBpZiAob3B0aW9uc1BsYWNlbWVudCA9PSBcImFib3ZlXCIpIHtcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wTGVmdFJhZGl1cyA9IDBcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wUmlnaHRSYWRpdXMgPSAwXG4gICAgICAgIHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzID0gYmFzZUJvcmRlclJhZGl1c1xuICAgICAgICBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzID0gYmFzZUJvcmRlclJhZGl1c1xuXG4gICAgICAgIGRlbGV0ZSBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJSYWRpdXNcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9uc1BsYWNlbWVudCA9PSBcImJlbG93XCIpIHtcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wTGVmdFJhZGl1cyA9IGJhc2VCb3JkZXJSYWRpdXNcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wUmlnaHRSYWRpdXMgPSBiYXNlQm9yZGVyUmFkaXVzXG4gICAgICAgIHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzID0gMFxuICAgICAgICBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzID0gMFxuXG4gICAgICAgIGRlbGV0ZSBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJSYWRpdXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXdcbiAgICAgICAgZGF0YVNldD17dGhpcy5jYWNoZShcInJvb3RWaWV3RGF0YVNldFwiLCB7XG4gICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICBjb21wb25lbnQ6IFwiaGF5YS1zZWxlY3RcIixcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBvcGVuZWQsXG4gICAgICAgICAgb3B0aW9uc1BsYWNlbWVudCxcbiAgICAgICAgICB0b2dnbGVzOiBCb29sZWFuKHRvZ2dsZU9wdGlvbnMpXG4gICAgICAgIH0sIFtjbGFzc05hbWUsIGlkLCBvcGVuZWQsIG9wdGlvbnNQbGFjZW1lbnQsIEJvb2xlYW4odG9nZ2xlT3B0aW9ucyldKX1cbiAgICAgICAgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcIm1haW5cIil9XG4gICAgICA+XG4gICAgICAgIDxQcmVzc2FibGVcbiAgICAgICAgICBkYXRhU2V0PXt0aGlzLnNlbGVjdENvbnRhaW5lckRhdGFTZXQgfHw9IHtjbGFzczogXCJzZWxlY3QtY29udGFpbmVyXCJ9fVxuICAgICAgICAgIG9uTGF5b3V0PXt0aGlzLnR0Lm9uU2VsZWN0Q29udGFpbmVyTGF5b3V0fVxuICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25TZWxlY3RDbGlja2VkfVxuICAgICAgICAgIHJlZj17dGhpcy50dC5zZWxlY3RDb250YWluZXJSZWZ9XG4gICAgICAgICAgc3R5bGU9e3NlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsfVxuICAgICAgICA+XG4gICAgICAgICAgPFZpZXdcbiAgICAgICAgICAgIGRhdGFTZXQ9e3RoaXMuY3VycmVudFNlbGVjdGVkRGF0YVNldCB8fD0ge2NsYXNzOiBcImN1cnJlbnQtc2VsZWN0ZWRcIn19XG4gICAgICAgICAgICBzdHlsZT17dGhpcy5zdHlsaW5nRm9yKFwiY3VycmVudFNlbGVjdGVkXCIsIHRoaXMuY3VycmVudFNlbGVjdGVkU3R5bGUgfHw9IHt3aWR0aDogXCJjYWxjKDEwMCUgLSAyNXB4KVwiLCBmbGV4V3JhcDogXCJ3cmFwXCIsIG92ZXJmbG93OiBcImhpZGRlblwifSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge29wZW5lZCAmJlxuICAgICAgICAgICAgICA8VGV4dElucHV0XG4gICAgICAgICAgICAgICAgZGF0YVNldD17dGhpcy5zZWFyY2hUZXh0SW5wdXREYXRhU2V0IHx8PSB7Y2xhc3M6IFwic2VhcmNoLXRleHQtaW5wdXRcIn19XG4gICAgICAgICAgICAgICAgb25DaGFuZ2VUZXh0PXt0aGlzLnR0Lm9uQ2hhbmdlU2VhcmNoVGV4dH1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy50cmFuc2xhdGUoXCIuc2VhcmNoX2RvdF9kb3RfZG90XCIpfVxuICAgICAgICAgICAgICAgIHJlZj17dGhpcy50dC5zZWFyY2hUZXh0SW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcInNlYXJjaFRleHRJbnB1dFwiLCB0aGlzLnNlYXJjaFRleHRJbnB1dFN0eWxlIHx8PSB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgICAgICAgICBvdXRsaW5lOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDBcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9e3RoaXMuc2VhcmNoVGV4dFZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeyFvcGVuZWQgJiZcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7Y3VycmVudE9wdGlvbnMubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICAgIDxUZXh0IG51bWJlck9mTGluZXM9ezF9IHN0eWxlPXt0aGlzLnN0eWxpbmdGb3IoXCJub3RoaW5nU2VsZWN0ZWRcIiwgdGhpcy5ub3RoaW5nU2VsZWN0ZWRTdHlsZSB8fD0ge2NvbG9yOiBcImdyZXlcIn0pfT5cbiAgICAgICAgICAgICAgICAgICAge3BsYWNlaG9sZGVyIHx8IHRoaXMudHJhbnNsYXRlKFwiLm5vdGhpbmdfc2VsZWN0ZWRcIil9XG4gICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9ucy5sZW5ndGggPT0gMCAmJiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiICYmXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9e2lkRm9yQ29tcG9uZW50KHRoaXMpfVxuICAgICAgICAgICAgICAgICAgICBuYW1lPXtuYW1lRm9yQ29tcG9uZW50V2l0aE11bHRpcGxlKHRoaXMpfVxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAge2N1cnJlbnRPcHRpb25zLm1hcCgoY3VycmVudE9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXQ9e3RoaXMuY3VycmVudE9wdGlvbkRhdGFTZXQgfHw9IHtjbGFzczogXCJjdXJyZW50LW9wdGlvblwifX1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW50T3B0aW9uLmtleSB8fCBgY3VycmVudC12YWx1ZS0ke2N1cnJlbnRPcHRpb24udmFsdWV9YH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcImN1cnJlbnRPcHRpb25cIiwge21hcmdpblJpZ2h0OiA2fSl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9uLnR5cGUgPT0gXCJncm91cFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgPFZpZXcgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcImN1cnJlbnRPcHRpb25Hcm91cFwiLCB0aGlzLmN1cnJlbnRPcHRpb25Hcm91cFN0eWxlIHx8PSB7Zm9udFdlaWdodDogXCJib2xkXCJ9KX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzdHlsZT17dGhpcy5zdHlsaW5nRm9yKFwiY3VycmVudE9wdGlvbkdyb3VwVGV4dFwiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9uLnRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9WaWV3PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9uLnR5cGUgIT0gXCJncm91cFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtQbGF0Zm9ybS5PUyA9PSBcIndlYlwiICYmIG5hbWVGb3JDb21wb25lbnRXaXRoTXVsdGlwbGUodGhpcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e2lkRm9yQ29tcG9uZW50KHRoaXMpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9e25hbWVGb3JDb21wb25lbnRXaXRoTXVsdGlwbGUodGhpcyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2RpZ2coY3VycmVudE9wdGlvbiwgXCJ2YWx1ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByZXNlbnRPcHRpb24oY3VycmVudE9wdGlvbiwgXCJjdXJyZW50XCIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICBkYXRhU2V0PXt0aGlzLmNoZXZyb25Db250YWluZXJEYXRhU2V0IHx8PSB7Y2xhc3M6IFwiY2hldnJvbi1jb250YWluZXJcIn19XG4gICAgICAgICAgICBzdHlsZT17dGhpcy5zdHlsaW5nRm9yKFwiY2hldnJvbkNvbnRhaW5lclwiLCB0aGlzLmNoZXZyb25Db250YWluZXJTdHlsZSB8fD0ge1xuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCJhdXRvXCIsXG4gICAgICAgICAgICAgIG1hcmdpblJpZ2h0OiA4XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Rm9udEF3ZXNvbWVJY29uIG5hbWU9e29wZW5lZCA/IFwiY2hldnJvbi11cFwiIDogXCJjaGV2cm9uLWRvd25cIn0gc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcImNoZXZyb25cIiwgdGhpcy5jaGV2cm9uU3R5bGUgfHw9IHtmb250U2l6ZTogMTJ9KX0gLz5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgICA8Vmlld1xuICAgICAgICAgIGRhdGFTZXQ9e3RoaXMuZW5kT2ZTZWxlY3REYXRhU2V0IHx8PSB7Y2xhc3M6IFwiZW5kLW9mLXNlbGVjdFwifX1cbiAgICAgICAgICBvbkxheW91dD17dGhpcy50dC5vbkVuZE9mU2VsZWN0TGF5b3V0fVxuICAgICAgICAgIHJlZj17ZW5kT2ZTZWxlY3RSZWZ9XG4gICAgICAgIC8+XG4gICAgICAgIHtvcGVuZWQgJiYgdGhpcy5wLm9wdGlvbnNQb3J0YWwgJiZcbiAgICAgICAgICA8UG9ydGFsPlxuICAgICAgICAgICAge3RoaXMub3B0aW9uc0NvbnRhaW5lcigpfVxuICAgICAgICAgIDwvUG9ydGFsPlxuICAgICAgICB9XG4gICAgICAgIHtvcGVuZWQgJiYgIXRoaXMucC5vcHRpb25zUG9ydGFsICYmXG4gICAgICAgICAgPFZpZXc+XG4gICAgICAgICAgICB7dGhpcy5vcHRpb25zQ29udGFpbmVyKCl9XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICB9XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgZGVmYXVsdFZhbHVlcyAoKSB7XG4gICAgY29uc3Qge2F0dHJpYnV0ZSwgZGVmYXVsdFZhbHVlLCBkZWZhdWx0VmFsdWVzLCBkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnMsIG1vZGVsfSA9IHRoaXMucHJvcHNcblxuICAgIGlmIChkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnMpIHJldHVybiBkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnNcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgaWYgKGRlZmF1bHRWYWx1ZXMpIHJldHVybiBkZWZhdWx0VmFsdWVzXG5cbiAgICBpZiAoYXR0cmlidXRlICYmIG1vZGVsKSB7XG4gICAgICBpZiAoIShhdHRyaWJ1dGUgaW4gbW9kZWwpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggYXR0cmlidXRlIG9uICR7bW9kZWwubW9kZWxDbGFzc0RhdGEoKS5uYW1lfTogJHthdHRyaWJ1dGV9YClcblxuICAgICAgcmV0dXJuIG1vZGVsW2F0dHJpYnV0ZV0oKVxuICAgIH1cbiAgfVxuXG4gIGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLnR0LmVuZE9mU2VsZWN0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBhc3luYyBsb2FkRGVmYXVsdFZhbHVlc0Zyb21PcHRpb25zQ2FsbGJhY2soKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IHRoaXMuZGVmYXVsdFZhbHVlcygpXG5cbiAgICBpZiAoIWRlZmF1bHRWYWx1ZXMpIHJldHVyblxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9wcy5vcHRpb25zKHtcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmdldFNlYXJjaFRleHQoKSxcbiAgICAgIHBhZ2U6IHRoaXMuZ2V0QWN0aXZlUGFnZSgpLFxuICAgICAgdmFsdWVzOiBkZWZhdWx0VmFsdWVzXG4gICAgfSlcblxuICAgIGNvbnN0IHtvcHRpb25zfSA9IHRoaXMucGFyc2VPcHRpb25zUmVzdWx0KHJlc3VsdClcblxuICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRPcHRpb25zOiB0aGlzLnN0YXRlLmN1cnJlbnRPcHRpb25zLmNvbmNhdChvcHRpb25zKX0pXG4gIH1cblxuICBsb2FkT3B0aW9ucyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7b3B0aW9uc30gPSB0aGlzLnBcbiAgICBjb25zdCBzZWFyY2hWYWx1ZSA9IHRoaXMuZ2V0U2VhcmNoVGV4dCgpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZE9wdGlvbnNGcm9tQXJyYXkob3B0aW9ucywgc2VhcmNoVmFsdWUpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3B0aW9ucyh7c2VhcmNoVmFsdWUsIHBhZ2U6IHRoaXMuZ2V0QWN0aXZlUGFnZSgpfSlcbiAgICBjb25zdCB7b3B0aW9uczogbG9hZGVkT3B0aW9ucywgcGFnZSwgcGFnZVNpemUsIHRvdGFsQ291bnR9ID0gdGhpcy5wYXJzZU9wdGlvbnNSZXN1bHQocmVzdWx0KVxuICAgIGNvbnN0IHJlc29sdmVkUGFnZSA9IE51bWJlci5pc0Zpbml0ZShwYWdlKSA/IHBhZ2UgOiB0aGlzLmdldEFjdGl2ZVBhZ2UoKVxuICAgIGNvbnN0IHJlc29sdmVkUGFnZVNpemUgPSB0aGlzLnJlc29sdmVQYWdlU2l6ZSh7b3B0aW9uczogbG9hZGVkT3B0aW9ucywgcGFnZTogcmVzb2x2ZWRQYWdlLCBwYWdlU2l6ZSwgdG90YWxDb3VudH0pXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGxvYWRlZE9wdGlvbnMsXG4gICAgICBwYWdlOiByZXNvbHZlZFBhZ2UsXG4gICAgICBwYWdlSW5wdXRBY3RpdmU6IGZhbHNlLFxuICAgICAgcGFnZUlucHV0VmFsdWU6IFwiXCIsXG4gICAgICBwYWdlU2l6ZTogTnVtYmVyLmlzRmluaXRlKHRvdGFsQ291bnQpID8gcmVzb2x2ZWRQYWdlU2l6ZSA6IG51bGwsXG4gICAgICB0b3RhbENvdW50OiBOdW1iZXIuaXNGaW5pdGUodG90YWxDb3VudCkgPyB0b3RhbENvdW50IDogbnVsbFxuICAgIH0pXG4gIH1cblxuICBoYXlhU2VsZWN0T3B0aW9uKHtrZXksIGxvYWRlZE9wdGlvbn0pIHtcbiAgICBpZiAobG9hZGVkT3B0aW9uLnR5cGUgPT0gXCJncm91cFwiKSB7XG4gICAgICByZXR1cm4gPE9wdGlvbkdyb3VwIGtleT17a2V5fSBvcHRpb249e2xvYWRlZE9wdGlvbn0gLz5cbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPE9wdGlvblxuICAgICAgICBjdXJyZW50T3B0aW9uVmFsdWVzPXt0aGlzLmdldEN1cnJlbnRPcHRpb25WYWx1ZXMoKX1cbiAgICAgICAgaWNvbj17dGhpcy5pY29uRm9yT3B0aW9uKGxvYWRlZE9wdGlvbil9XG4gICAgICAgIGtleT17a2V5fVxuICAgICAgICBvcHRpb249e2xvYWRlZE9wdGlvbn1cbiAgICAgICAgb25PcHRpb25DbGlja2VkPXt0aGlzLnR0Lm9uT3B0aW9uQ2xpY2tlZH1cbiAgICAgICAgcHJlc2VudE9wdGlvbj17dGhpcy50dC5wcmVzZW50T3B0aW9ufVxuICAgICAgICBzZWxlY3RlZEJhY2tncm91bmRDb2xvcj17dGhpcy5wcm9wcy5zZWxlY3RlZEJhY2tncm91bmRDb2xvcn1cbiAgICAgICAgc2VsZWN0ZWRIb3ZlckJhY2tncm91bmRDb2xvcj17dGhpcy5wcm9wcy5zZWxlY3RlZEhvdmVyQmFja2dyb3VuZENvbG9yfVxuICAgICAgLz5cbiAgICApXG4gIH1cblxuICBsb2FkT3B0aW9uc0Zyb21BcnJheShvcHRpb25zLCBzZWFyY2hWYWx1ZSkge1xuICAgIGNvbnN0IGxvd2VyU2VhcmNoVmFsdWUgPSBzZWFyY2hWYWx1ZT8udG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGxvYWRlZE9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcigoe3RleHR9KSA9PiAhbG93ZXJTZWFyY2hWYWx1ZSB8fCB0ZXh0Py50b0xvd2VyQ2FzZSgpPy5pbmNsdWRlcyhsb3dlclNlYXJjaFZhbHVlKSlcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbG9hZGVkT3B0aW9ucyxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBwYWdlSW5wdXRBY3RpdmU6IGZhbHNlLFxuICAgICAgcGFnZUlucHV0VmFsdWU6IFwiXCIsXG4gICAgICBwYWdlU2l6ZTogbnVsbCxcbiAgICAgIHRvdGFsQ291bnQ6IG51bGxcbiAgICB9KVxuICB9XG5cbiAgb25EaW1lbnNpb25zQ2hhbmdlID0gKHt3aW5kb3d9KSA9PiB7XG4gICAgdGhpcy53aW5kb3dXaWR0aCA9IHdpbmRvdy53aWR0aFxuICAgIHRoaXMud2luZG93SGVpZ2h0ID0gd2luZG93LmhlaWdodFxuICB9XG5cbiAgb25TZWxlY3RDb250YWluZXJMYXlvdXQgPSAoZSkgPT4gdGhpcy5zZXRTdGF0ZSh7c2VsZWN0Q29udGFpbmVyTGF5b3V0OiBPYmplY3QuYXNzaWduKHt9LCBkaWdnKGUsIFwibmF0aXZlRXZlbnRcIiwgXCJsYXlvdXRcIikpfSlcbiAgb25FbmRPZlNlbGVjdExheW91dCA9IChlKSA9PiB7XG4gICAgY29uc3QgZW5kT2ZTZWxlY3RMYXlvdXQgPSBPYmplY3QuYXNzaWduKHt9LCBkaWdnKGUsIFwibmF0aXZlRXZlbnRcIiwgXCJsYXlvdXRcIikpXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7ZW5kT2ZTZWxlY3RMYXlvdXR9XG5cbiAgICBpZiAodGhpcy5zLm9wZW5lZCAmJiBlbmRPZlNlbGVjdExheW91dD8ud2lkdGgpIHtcbiAgICAgIG5ld1N0YXRlLm9wdGlvbnNXaWR0aCA9IGVuZE9mU2VsZWN0TGF5b3V0LndpZHRoXG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucy5vcGVuZWQgJiYgdGhpcy5zLm9wdGlvbnNDb250YWluZXJMYXlvdXQpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zUG9zaXRpb25BYm92ZUlmT3V0c2lkZVNjcmVlbigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBvbk9wdGlvbnNDb250YWluZXJMYXlvdXQgPSAoZSkgPT4gdGhpcy5zZXRTdGF0ZSh7b3B0aW9uc0NvbnRhaW5lckxheW91dDogT2JqZWN0LmFzc2lnbih7fSwgZGlnZyhlLCBcIm5hdGl2ZUV2ZW50XCIsIFwibGF5b3V0XCIpKX0pXG5cbiAgb25TZWxlY3RDbGlja2VkID0gKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICBjb25zdCB7b3BlbmVkfSA9IHRoaXMuc1xuXG4gICAgaWYgKG9wZW5lZCkge1xuICAgICAgdGhpcy5jbG9zZU9wdGlvbnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5PcHRpb25zKClcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaFRleHRJbnB1dENoYW5nZWREZWJvdW5jZWQgPSBkZWJvdW5jZSh0aGlzLnR0LmxvYWRPcHRpb25zLCAyMDApXG5cbiAgY2xvc2VPcHRpb25zKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaGVpZ2h0OiBudWxsLFxuICAgICAgbG9hZGVkT3B0aW9uczogdW5kZWZpbmVkLFxuICAgICAgb3BlbmVkOiBmYWxzZSxcbiAgICAgIG9wdGlvbnNDb250YWluZXJMYXlvdXQ6IG51bGwsXG4gICAgICBwYWdlOiAxLFxuICAgICAgcGFnZUlucHV0QWN0aXZlOiBmYWxzZSxcbiAgICAgIHBhZ2VJbnB1dFZhbHVlOiBcIlwiLFxuICAgICAgcGFnZVNpemU6IG51bGwsXG4gICAgICB0b3RhbENvdW50OiBudWxsXG4gICAgfSlcblxuICAgIGlmICh0aGlzLnByb3BzLm9uT3B0aW9uc0Nsb3NlZCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk9wdGlvbnNDbG9zZWQoe29wdGlvbnM6IHRoaXMuZ2V0Q3VycmVudE9wdGlvbnMoKX0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucC5vbkJsdXIpIHRoaXMucC5vbkJsdXIoKVxuICB9XG5cbiAgZ2V0U2VhcmNoVGV4dCA9ICgpID0+IHRoaXMuc2VhcmNoVGV4dFZhbHVlIHx8IFwiXCJcblxuICByZXNldFNlYXJjaFRleHRJbnB1dCA9ICgpID0+IHtcbiAgICB0aGlzLnNlYXJjaFRleHRWYWx1ZSA9IFwiXCJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMudHQuc2VhcmNoVGV4dElucHV0UmVmLmN1cnJlbnRcblxuICAgIGlmIChpbnB1dD8uY2xlYXIpIHtcbiAgICAgIGlucHV0LmNsZWFyKClcbiAgICB9IGVsc2UgaWYgKGlucHV0Py5zZXROYXRpdmVQcm9wcykge1xuICAgICAgaW5wdXQuc2V0TmF0aXZlUHJvcHMoe3RleHQ6IFwiXCJ9KVxuICAgIH0gZWxzZSBpZiAoaW5wdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlucHV0LnZhbHVlID0gXCJcIlxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWdub3JlIGlmIHRoZSByZWYgZG9lc24ndCBzdXBwb3J0IGRpcmVjdCB2YWx1ZSBhc3NpZ25tZW50LlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlU2VhcmNoVGV4dCA9IChzZWFyY2hUZXh0KSA9PiB7XG4gICAgdGhpcy5zZWFyY2hUZXh0VmFsdWUgPSBzZWFyY2hUZXh0XG5cbiAgICBpZiAodGhpcy5zLnBhZ2UgIT0gMSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7cGFnZTogMSwgcGFnZUlucHV0QWN0aXZlOiBmYWxzZSwgcGFnZUlucHV0VmFsdWU6IFwiXCJ9LCB0aGlzLnR0Lm9uU2VhcmNoVGV4dElucHV0Q2hhbmdlZERlYm91bmNlZClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50dC5vblNlYXJjaFRleHRJbnB1dENoYW5nZWREZWJvdW5jZWQoKVxuICAgIH1cbiAgfVxuXG4gIG9wZW5PcHRpb25zKCkge1xuICAgIHRoaXMuc2VhcmNoVGV4dFZhbHVlID0gXCJcIlxuICAgIHRoaXMuc2V0T3B0aW9uc1Bvc2l0aW9uQmVsb3coKVxuICAgIHRoaXMubG9hZE9wdGlvbnMoKVxuICAgIHRoaXMuY2FsbE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuID0gdHJ1ZVxuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB7XG4gICAgICAgIGhlaWdodDogdGhpcy5zLnNlbGVjdENvbnRhaW5lckxheW91dC5oZWlnaHQsXG4gICAgICAgIG9wZW5lZDogdHJ1ZSxcbiAgICAgICAgc2Nyb2xsTGVmdDogUGxhdGZvcm0uT1MgPT0gXCJ3ZWJcIiA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IDogbnVsbCxcbiAgICAgICAgc2Nyb2xsVG9wOiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IG51bGxcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzZXRTZWFyY2hUZXh0SW5wdXQoKVxuICAgICAgICB0aGlzLmZvY3VzVGV4dElucHV0KClcbiAgICAgIH1cbiAgICApXG5cbiAgICBpZiAodGhpcy5wLm9uRm9jdXMpIHRoaXMucC5vbkZvY3VzKClcbiAgfVxuXG4gIGZvY3VzVGV4dElucHV0ID0gKCkgPT4gZGlnZyh0aGlzLnR0LnNlYXJjaFRleHRJbnB1dFJlZiwgXCJjdXJyZW50XCIpPy5mb2N1cygpXG5cbiAgc2V0T3B0aW9uc1Bvc2l0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICByZXR1cm4gLy8gRGVib3VuY2UgYWZ0ZXIgdW4tbW91bnQgaGFuZGVsaW5nLlxuICAgIH1cblxuICAgIHRoaXMuY2FsbE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuID0gdHJ1ZVxuICAgIHRoaXMuc2V0T3B0aW9uc1Bvc2l0aW9uQmVsb3coKVxuICB9XG5cbiAgc2V0T3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW4oKSB7XG4gICAgY29uc3Qge3dpbmRvd0hlaWdodH0gPSB0aGlzLnR0XG4gICAgY29uc3Qge29wdGlvbnNDb250YWluZXJMYXlvdXR9ID0gdGhpcy5zXG4gICAgY29uc3QgZW5kT2ZTZWxlY3RMYXlvdXQgPSB0aGlzLnMuZW5kT2ZTZWxlY3RMYXlvdXRcblxuICAgIGlmICghZW5kT2ZTZWxlY3RMYXlvdXQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe29wdGlvbnNWaXNpYmlsaXR5OiBcInZpc2libGVcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zVG9wID0gZW5kT2ZTZWxlY3RMYXlvdXQudG9wXG4gICAgY29uc3Qgb3B0aW9uc1RvdGFsQm90dG9tUG9zaXRpb24gPSBvcHRpb25zQ29udGFpbmVyTGF5b3V0LmhlaWdodCArIG9wdGlvbnNUb3BcbiAgICBjb25zdCB3aW5kb3dIZWlnaHRXaXRoU2Nyb2xsID0gd2luZG93SGVpZ2h0ICsgdGhpcy5zLnNjcm9sbFRvcFxuXG4gICAgaWYgKHdpbmRvd0hlaWdodFdpdGhTY3JvbGwgPCBvcHRpb25zVG90YWxCb3R0b21Qb3NpdGlvbikge1xuICAgICAgdGhpcy5zZXRPcHRpb25zUG9zaXRpb25BYm92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe29wdGlvbnNWaXNpYmlsaXR5OiBcInZpc2libGVcIn0pXG4gICAgfVxuICB9XG5cbiAgc2V0T3B0aW9uc1Bvc2l0aW9uQWJvdmUoKSB7XG4gICAgY29uc3Qge2VuZE9mU2VsZWN0TGF5b3V0fSA9IHRoaXMuc1xuXG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgb3BlbmVkOiB0cnVlLFxuICAgICAgICBvcHRpb25zUGxhY2VtZW50OiBcImFib3ZlXCIsXG4gICAgICAgIG9wdGlvbnNWaXNpYmlsaXR5OiBcInZpc2libGVcIixcbiAgICAgICAgb3B0aW9uc1dpZHRoOiBlbmRPZlNlbGVjdExheW91dD8ud2lkdGhcbiAgICAgIH0sXG4gICAgICAoKSA9PiB0aGlzLmZvY3VzVGV4dElucHV0KClcbiAgICApXG4gIH1cblxuICBzZXRPcHRpb25zUG9zaXRpb25CZWxvdygpIHtcbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAge1xuICAgICAgICBvcGVuZWQ6IHRydWUsXG4gICAgICAgIG9wdGlvbnNQbGFjZW1lbnQ6IFwiYmVsb3dcIixcbiAgICAgICAgb3B0aW9uc1Zpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgICAgIG9wdGlvbnNXaWR0aDogdGhpcy5zLmVuZE9mU2VsZWN0TGF5b3V0Py53aWR0aFxuICAgICAgfSxcbiAgICAgICgpID0+IHRoaXMuZm9jdXNUZXh0SW5wdXQoKVxuICAgIClcbiAgfVxuXG4gIG9uQW55dGhpbmdSZXNpemVkID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnMub3BlbmVkKSB7XG4gICAgICB0aGlzLnNldE9wdGlvbnNQb3NpdGlvbigpXG4gICAgfVxuICB9XG5cbiAgb25Bbnl0aGluZ1Jlc2l6ZWREZWJvdW5jZWQgPSBkZWJvdW5jZSh0aGlzLnR0Lm9uQW55dGhpbmdSZXNpemVkLCAyNSlcblxuICBvbkFueXRoaW5nU2Nyb2xsZWQgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMucy5vcGVuZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxMZWZ0OiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgOiBudWxsLFxuICAgICAgICBzY3JvbGxUb3A6IFBsYXRmb3JtLk9TID09IFwid2ViXCIgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIDogbnVsbFxuICAgICAgfSlcbiAgICAgIHRoaXMuc2V0T3B0aW9uc1Bvc2l0aW9uKClcbiAgICB9XG4gIH1cblxuICBvbkFueXRoaW5nU2Nyb2xsZWREZWJvdW5jZWQgPSBkZWJvdW5jZSh0aGlzLnR0Lm9uQW55dGhpbmdTY3JvbGxlZCwgMjUpXG5cbiAgb25QcmVzc091dHNpZGVPcHRpb25zID0gKCkgPT4ge1xuICAgIC8vIElmIG9wdGlvbnMgYXJlIG9wZW4gYW5kIGEgY2xpY2sgaXMgbWFkZSBvdXRzaWRlIG9mIHRoZSBvcHRpb25zIGNvbnRhaW5lclxuICAgIGlmICh0aGlzLnMub3BlbmVkKSB7XG4gICAgICB0aGlzLmNsb3NlT3B0aW9ucygpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH0gKi9cbiAgcGFnaW5hdGlvblRvdGFsUGFnZXMoKSB7XG4gICAgY29uc3Qge3RvdGFsQ291bnR9ID0gdGhpcy5zXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0b3RhbENvdW50KSB8fCB0b3RhbENvdW50IDw9IDApIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplKHtcbiAgICAgIG9wdGlvbnM6IHRoaXMucy5sb2FkZWRPcHRpb25zIHx8IFtdLFxuICAgICAgcGFnZTogdGhpcy5nZXRBY3RpdmVQYWdlKCksXG4gICAgICBwYWdlU2l6ZTogdGhpcy5zLnBhZ2VTaXplLFxuICAgICAgdG90YWxDb3VudFxuICAgIH0pXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYWdlU2l6ZSkgfHwgcGFnZVNpemUgPD0gMCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBNYXRoLmNlaWwodG90YWxDb3VudCAvIHBhZ2VTaXplKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0b3RhbFBhZ2VzXG4gICAqIEByZXR1cm5zIHtBcnJheTx7a2V5OiBzdHJpbmcsIHR5cGU6IFwicGFnZVwifFwiZWxsaXBzaXNcIiwgdmFsdWU/OiBudW1iZXJ9Pn1cbiAgICovXG4gIHBhZ2luYXRpb25QYWdlSXRlbXModG90YWxQYWdlcykge1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5nZXRBY3RpdmVQYWdlKClcbiAgICBjb25zdCBpdGVtcyA9IFtdXG4gICAgY29uc3QgYWRkUGFnZSA9IChwYWdlKSA9PiBpdGVtcy5wdXNoKHtrZXk6IGBwYWdlLSR7cGFnZX1gLCB0eXBlOiBcInBhZ2VcIiwgdmFsdWU6IHBhZ2V9KVxuICAgIGNvbnN0IGFkZEVsbGlwc2lzID0gKGtleSkgPT4gaXRlbXMucHVzaCh7a2V5LCB0eXBlOiBcImVsbGlwc2lzXCJ9KVxuXG4gICAgaWYgKHRvdGFsUGFnZXMgPD0gNykge1xuICAgICAgZm9yIChsZXQgcGFnZSA9IDE7IHBhZ2UgPD0gdG90YWxQYWdlczsgcGFnZSArPSAxKSB7XG4gICAgICAgIGFkZFBhZ2UocGFnZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgYWRkUGFnZSgxKVxuXG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IDJcbiAgICBsZXQgc3RhcnQgPSBNYXRoLm1heCgyLCBjdXJyZW50UGFnZSAtIHdpbmRvd1NpemUpXG4gICAgbGV0IGVuZCA9IE1hdGgubWluKHRvdGFsUGFnZXMgLSAxLCBjdXJyZW50UGFnZSArIHdpbmRvd1NpemUpXG5cbiAgICBpZiAoY3VycmVudFBhZ2UgPD0gMykge1xuICAgICAgc3RhcnQgPSAyXG4gICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbFBhZ2VzIC0gMSwgNSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IHRvdGFsUGFnZXMgLSAyKSB7XG4gICAgICBlbmQgPSB0b3RhbFBhZ2VzIC0gMVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgyLCB0b3RhbFBhZ2VzIC0gNClcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiAyKSBhZGRFbGxpcHNpcyhcImVsbGlwc2lzLXN0YXJ0XCIpXG5cbiAgICBmb3IgKGxldCBwYWdlID0gc3RhcnQ7IHBhZ2UgPD0gZW5kOyBwYWdlICs9IDEpIHtcbiAgICAgIGFkZFBhZ2UocGFnZSlcbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgdG90YWxQYWdlcyAtIDEpIGFkZEVsbGlwc2lzKFwiZWxsaXBzaXMtZW5kXCIpXG5cbiAgICBhZGRQYWdlKHRvdGFsUGFnZXMpXG5cbiAgICByZXR1cm4gaXRlbXNcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gcGFnZSAqL1xuICBzZXRQYWdpbmF0aW9uUGFnZSA9IChwYWdlKSA9PiB7XG4gICAgY29uc3QgdG90YWxQYWdlcyA9IHRoaXMucGFnaW5hdGlvblRvdGFsUGFnZXMoKVxuXG4gICAgaWYgKCF0b3RhbFBhZ2VzKSByZXR1cm5cblxuICAgIGNvbnN0IG5leHRQYWdlID0gTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5mbG9vcihwYWdlKSwgMSksIHRvdGFsUGFnZXMpXG5cbiAgICBpZiAobmV4dFBhZ2UgPT0gdGhpcy5nZXRBY3RpdmVQYWdlKCkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3BhZ2VJbnB1dEFjdGl2ZTogZmFsc2UsIHBhZ2VJbnB1dFZhbHVlOiBcIlwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe3BhZ2U6IG5leHRQYWdlLCBwYWdlSW5wdXRBY3RpdmU6IGZhbHNlLCBwYWdlSW5wdXRWYWx1ZTogXCJcIn0sIHRoaXMudHQubG9hZE9wdGlvbnMpXG4gIH1cblxuICAvKiogQHBhcmFtIHtpbXBvcnQoXCJyZWFjdFwiKS5TeW50aGV0aWNFdmVudH0gZXZlbnQgKi9cbiAgb25QYWdpbmF0aW9uUHJldlByZXNzZWQgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdD8uKClcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24/LigpXG5cbiAgICB0aGlzLnNldFBhZ2luYXRpb25QYWdlKHRoaXMuZ2V0QWN0aXZlUGFnZSgpIC0gMSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge2ltcG9ydChcInJlYWN0XCIpLlN5bnRoZXRpY0V2ZW50fSBldmVudCAqL1xuICBvblBhZ2luYXRpb25OZXh0UHJlc3NlZCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Py4oKVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbj8uKClcblxuICAgIHRoaXMuc2V0UGFnaW5hdGlvblBhZ2UodGhpcy5nZXRBY3RpdmVQYWdlKCkgKyAxKVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7aW1wb3J0KFwicmVhY3RcIikuU3ludGhldGljRXZlbnR9IGV2ZW50ICovXG4gIG9uUGFnaW5hdGlvbkxhYmVsUHJlc3NlZCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Py4oKVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbj8uKClcblxuICAgIGlmICh0aGlzLnMucGFnZUlucHV0QWN0aXZlKSByZXR1cm5cblxuICAgIHRoaXMuc2V0U3RhdGUoe3BhZ2VJbnB1dEFjdGl2ZTogdHJ1ZSwgcGFnZUlucHV0VmFsdWU6IFN0cmluZyh0aGlzLmdldEFjdGl2ZVBhZ2UoKSl9LCAoKSA9PiB7XG4gICAgICB0aGlzLnR0LnBhZ2VJbnB1dFJlZi5jdXJyZW50Py5mb2N1cz8uKClcbiAgICB9KVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAqL1xuICBvblBhZ2luYXRpb25JbnB1dENoYW5nZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe3BhZ2VJbnB1dFZhbHVlOiB2YWx1ZX0pXG4gIH1cblxuICAvKiogQHBhcmFtIHtpbXBvcnQoXCJyZWFjdFwiKS5TeW50aGV0aWNFdmVudH0gZXZlbnQgKi9cbiAgb25QYWdpbmF0aW9uSW5wdXRCbHVyID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7cGFnZUlucHV0QWN0aXZlOiBmYWxzZSwgcGFnZUlucHV0VmFsdWU6IFwiXCJ9KVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7aW1wb3J0KFwicmVhY3RcIikuU3ludGhldGljRXZlbnR9IGV2ZW50ICovXG4gIG9uUGFnaW5hdGlvbklucHV0U3VibWl0ID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKVxuXG4gICAgY29uc3QgdG90YWxQYWdlcyA9IHRoaXMucGFnaW5hdGlvblRvdGFsUGFnZXMoKVxuXG4gICAgaWYgKCF0b3RhbFBhZ2VzKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtwYWdlSW5wdXRBY3RpdmU6IGZhbHNlLCBwYWdlSW5wdXRWYWx1ZTogXCJcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UGFnZSA9IE51bWJlcih0aGlzLnMucGFnZUlucHV0VmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuZXh0UGFnZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3BhZ2VJbnB1dEFjdGl2ZTogZmFsc2UsIHBhZ2VJbnB1dFZhbHVlOiBcIlwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2V0UGFnaW5hdGlvblBhZ2UobmV4dFBhZ2UpXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZXxudWxsfSAqL1xuICBwYWdpbmF0aW9uQ29udHJvbHMoKSB7XG4gICAgY29uc3QgdG90YWxQYWdlcyA9IHRoaXMucGFnaW5hdGlvblRvdGFsUGFnZXMoKVxuXG4gICAgaWYgKCF0b3RhbFBhZ2VzIHx8IHRvdGFsUGFnZXMgPD0gMSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5nZXRBY3RpdmVQYWdlKClcbiAgICBjb25zdCBwcmV2RGlzYWJsZWQgPSBjdXJyZW50UGFnZSA8PSAxXG4gICAgY29uc3QgbmV4dERpc2FibGVkID0gY3VycmVudFBhZ2UgPj0gdG90YWxQYWdlc1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3XG4gICAgICAgIGRhdGFTZXQ9e2RhdGFTZXRzLnBhZ2luYXRpb25Db250YWluZXIgfHw9IHtjbGFzczogXCJvcHRpb25zLXBhZ2luYXRpb25cIn19XG4gICAgICAgIHN0eWxlPXtzdHlsZXMucGFnaW5hdGlvbkNvbnRhaW5lciB8fD0ge1xuICAgICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2UyZThmMFwiLFxuICAgICAgICAgIHBhZGRpbmc6IDhcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPFZpZXdcbiAgICAgICAgICBkYXRhU2V0PXtkYXRhU2V0cy5wYWdpbmF0aW9uSGVhZGVyIHx8PSB7Y2xhc3M6IFwicGFnaW5hdGlvbi1oZWFkZXJcIn19XG4gICAgICAgICAgc3R5bGU9e3N0eWxlcy5wYWdpbmF0aW9uSGVhZGVyIHx8PSB7ZmxleERpcmVjdGlvbjogXCJyb3dcIiwgYWxpZ25JdGVtczogXCJjZW50ZXJcIiwganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwifX1cbiAgICAgICAgPlxuICAgICAgICAgIDxQcmVzc2FibGVcbiAgICAgICAgICAgIGRhdGFTZXQ9e2RhdGFTZXRzLnBhZ2luYXRpb25QcmV2QnV0dG9uIHx8PSB7Y2xhc3M6IFwicGFnaW5hdGlvbi1wcmV2XCJ9fVxuICAgICAgICAgICAgZGlzYWJsZWQ9e3ByZXZEaXNhYmxlZH1cbiAgICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25QYWdpbmF0aW9uUHJldlByZXNzZWR9XG4gICAgICAgICAgICBzdHlsZT17c3R5bGVzW2BwYWdpbmF0aW9uTmF2QnV0dG9uLSR7cHJldkRpc2FibGVkfWBdIHx8PSB7XG4gICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZjhmYWZjXCIsXG4gICAgICAgICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2NiZDVlMVwiLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDgsXG4gICAgICAgICAgICAgIGhlaWdodDogMzAsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBvcGFjaXR5OiBwcmV2RGlzYWJsZWQgPyAwLjQgOiAxLFxuICAgICAgICAgICAgICB3aWR0aDogMzBcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEZvbnRBd2Vzb21lSWNvblxuICAgICAgICAgICAgICBuYW1lPVwiY2hldnJvbi1sZWZ0XCJcbiAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlcy5wYWdpbmF0aW9uTmF2SWNvbiB8fD0ge2NvbG9yOiBcIiMzMzQxNTVcIiwgZm9udFNpemU6IDEyfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9QcmVzc2FibGU+XG4gICAgICAgICAgPFByZXNzYWJsZVxuICAgICAgICAgICAgZGF0YVNldD17ZGF0YVNldHMucGFnaW5hdGlvbkxhYmVsIHx8PSB7Y2xhc3M6IFwicGFnaW5hdGlvbi1sYWJlbFwifX1cbiAgICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25QYWdpbmF0aW9uTGFiZWxQcmVzc2VkfVxuICAgICAgICAgICAgc3R5bGU9e3N0eWxlcy5wYWdpbmF0aW9uTGFiZWxCdXR0b24gfHw9IHtcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmMWY1ZjlcIixcbiAgICAgICAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjY2JkNWUxXCIsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMTQsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBtaW5XaWR0aDogMTQwLFxuICAgICAgICAgICAgICBwYWRkaW5nSG9yaXpvbnRhbDogMTAsXG4gICAgICAgICAgICAgIHBhZGRpbmdWZXJ0aWNhbDogNlxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7IXRoaXMucy5wYWdlSW5wdXRBY3RpdmUgJiZcbiAgICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGVzLnBhZ2luYXRpb25MYWJlbFRleHQgfHw9IHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiMwZjE3MmFcIixcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxMixcbiAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDYwMFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBQYWdlIHtjdXJyZW50UGFnZX0gb2Yge3RvdGFsUGFnZXN9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHt0aGlzLnMucGFnZUlucHV0QWN0aXZlICYmXG4gICAgICAgICAgICAgIDxUZXh0SW5wdXRcbiAgICAgICAgICAgICAgICBkYXRhU2V0PXtkYXRhU2V0cy5wYWdpbmF0aW9uSW5wdXQgfHw9IHtjbGFzczogXCJwYWdpbmF0aW9uLWlucHV0XCJ9fVxuICAgICAgICAgICAgICAgIGtleWJvYXJkVHlwZT1cIm51bWJlci1wYWRcIlxuICAgICAgICAgICAgICAgIG9uQmx1cj17dGhpcy50dC5vblBhZ2luYXRpb25JbnB1dEJsdXJ9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2VUZXh0PXt0aGlzLnR0Lm9uUGFnaW5hdGlvbklucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgIG9uU3VibWl0RWRpdGluZz17dGhpcy50dC5vblBhZ2luYXRpb25JbnB1dFN1Ym1pdH1cbiAgICAgICAgICAgICAgICByZWY9e3RoaXMudHQucGFnZUlucHV0UmVmfVxuICAgICAgICAgICAgICAgIHNlbGVjdFRleHRPbkZvY3VzXG4gICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlcy5wYWdpbmF0aW9uSW5wdXRTdHlsZSB8fD0ge1xuICAgICAgICAgICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IFwiIzBmMTcyYVwiLFxuICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDgwXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zLnBhZ2VJbnB1dFZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgICAgIDxQcmVzc2FibGVcbiAgICAgICAgICAgIGRhdGFTZXQ9e2RhdGFTZXRzLnBhZ2luYXRpb25OZXh0QnV0dG9uIHx8PSB7Y2xhc3M6IFwicGFnaW5hdGlvbi1uZXh0XCJ9fVxuICAgICAgICAgICAgZGlzYWJsZWQ9e25leHREaXNhYmxlZH1cbiAgICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25QYWdpbmF0aW9uTmV4dFByZXNzZWR9XG4gICAgICAgICAgICBzdHlsZT17c3R5bGVzW2BwYWdpbmF0aW9uTmF2QnV0dG9uLSR7bmV4dERpc2FibGVkfWBdIHx8PSB7XG4gICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZjhmYWZjXCIsXG4gICAgICAgICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2NiZDVlMVwiLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDgsXG4gICAgICAgICAgICAgIGhlaWdodDogMzAsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBvcGFjaXR5OiBuZXh0RGlzYWJsZWQgPyAwLjQgOiAxLFxuICAgICAgICAgICAgICB3aWR0aDogMzBcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEZvbnRBd2Vzb21lSWNvblxuICAgICAgICAgICAgICBuYW1lPVwiY2hldnJvbi1yaWdodFwiXG4gICAgICAgICAgICAgIHN0eWxlPXtzdHlsZXMucGFnaW5hdGlvbk5hdkljb24gfHw9IHtjb2xvcjogXCIjMzM0MTU1XCIsIGZvbnRTaXplOiAxMn19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgICA8L1ZpZXc+XG4gICAgICAgIDxWaWV3XG4gICAgICAgICAgZGF0YVNldD17ZGF0YVNldHMucGFnaW5hdGlvblBhZ2VzIHx8PSB7Y2xhc3M6IFwicGFnaW5hdGlvbi1wYWdlc1wifX1cbiAgICAgICAgICBzdHlsZT17c3R5bGVzLnBhZ2luYXRpb25QYWdlcyB8fD0ge1xuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJyb3dcIixcbiAgICAgICAgICAgIGZsZXhXcmFwOiBcIndyYXBcIixcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgbWFyZ2luVG9wOiA4XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHt0aGlzLnBhZ2luYXRpb25QYWdlSXRlbXModG90YWxQYWdlcykubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09IFwiZWxsaXBzaXNcIikge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAgICAgICBkYXRhU2V0PXtkYXRhU2V0c1tgcGFnaW5hdGlvbkVsbGlwc2lzLSR7aXRlbS5rZXl9YF0gfHw9IHtjbGFzczogXCJwYWdpbmF0aW9uLWVsbGlwc2lzXCJ9fVxuICAgICAgICAgICAgICAgICAga2V5PXtpdGVtLmtleX1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXtzdHlsZXMucGFnaW5hdGlvbkVsbGlwc2lzIHx8PSB7cGFkZGluZ0hvcml6b250YWw6IDZ9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXtzdHlsZXMucGFnaW5hdGlvbkVsbGlwc2lzVGV4dCB8fD0ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiM2NDc0OGJcIixcbiAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogMTIsXG4gICAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogNjAwXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8UGFnaW5hdGlvblBhZ2VCdXR0b25cbiAgICAgICAgICAgICAgICBhY3RpdmU9e2l0ZW0udmFsdWUgPT0gY3VycmVudFBhZ2V9XG4gICAgICAgICAgICAgICAga2V5PXtpdGVtLmtleX1cbiAgICAgICAgICAgICAgICBvblBhZ2VTZWxlY3RlZD17dGhpcy50dC5zZXRQYWdpbmF0aW9uUGFnZX1cbiAgICAgICAgICAgICAgICBwYWdlPXtpdGVtLnZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pfVxuICAgICAgICA8L1ZpZXc+XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgb3B0aW9uc0NvbnRhaW5lcigpIHtcbiAgICBjb25zdCB7c2VsZWN0Q29udGFpbmVyTGF5b3V0LCBsb2FkZWRPcHRpb25zLCBlbmRPZlNlbGVjdExheW91dCwgb3B0aW9uc0NvbnRhaW5lckxheW91dCwgb3B0aW9uc1BsYWNlbWVudCwgb3B0aW9uc1Zpc2liaWxpdHl9ID0gdGhpcy5zXG4gICAgbGV0IGxlZnQsIHRvcFxuXG4gICAgbGV0IHN0eWxlID0ge1xuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIHpJbmRleDogOTk5OTksXG4gICAgICBlbGV2YXRpb246IDk5OTk5LFxuICAgICAgdmlzaWJpbGl0eTogb3B0aW9uc1Zpc2liaWxpdHksXG4gICAgICB3aWR0aDogdGhpcy5wLm9wdGlvbnNXaWR0aCB8fCB0aGlzLnMub3B0aW9uc1dpZHRoLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmZmZcIixcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzk5OVwiLFxuICAgICAgbWF4SGVpZ2h0OiAzMDAsXG4gICAgICBvdmVyZmxvd1k6IFwiYXV0b1wiXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnAub3B0aW9uc1BvcnRhbCkge1xuICAgICAgc3R5bGUudG9wID0gMFxuICAgICAgc3R5bGUubGVmdCA9IDBcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnAub3B0aW9uc0Fic29sdXRlKSB7XG4gICAgICBzdHlsZS5sZWZ0ID0gMFxuICAgICAgc3R5bGUuYm90dG9tID0gMFxuICAgIH0gZWxzZSBpZiAob3B0aW9uc1BsYWNlbWVudCA9PSBcImJlbG93XCIpIHtcbiAgICAgIGlmIChQbGF0Zm9ybS5PUyA9PSBcIndlYlwiKSB7XG4gICAgICAgIC8vIG9uTGF5b3V0IHRvcCB2YWx1ZSBpcyBzb21ldGltZXMgbmVnYXRpdmUgc28gdXNlIGJyb3dzZXIgSlMgdG8gZ2V0IGl0IGluc3RlYWRcbiAgICAgICAgdG9wID0gZGlnZyh0aGlzLnR0LmVuZE9mU2VsZWN0UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIFwidG9wXCIpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCArIDFcblxuICAgICAgICAvLyBvbkxheW91dCBsZWZ0IHZhbHVlcyBkb2Vzbid0IGFsd2F5cyB1cGRhdGUgd2hlbiBjaGFuZ2VkXG4gICAgICAgIGxlZnQgPSBkaWdnKHRoaXMudHQuZW5kT2ZTZWxlY3RSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgXCJsZWZ0XCIpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnQgPSB0aGlzLnMuZW5kT2ZTZWxlY3RMYXlvdXQubGVmdFxuICAgICAgICB0b3AgPSBzZWxlY3RDb250YWluZXJMYXlvdXQudG9wXG4gICAgICB9XG5cbiAgICAgIHN0eWxlLmxlZnQgPSBsZWZ0XG4gICAgICBzdHlsZS50b3AgPSB0b3AgLSAyXG4gICAgfSBlbHNlIGlmIChvcHRpb25zUGxhY2VtZW50ID09IFwiYWJvdmVcIikge1xuICAgICAgaWYgKFBsYXRmb3JtLk9TID09IFwid2ViXCIpIHtcbiAgICAgICAgLy8gb25MYXlvdXQgdG9wIHZhbHVlIGlzIHNvbWV0aW1lcyBuZWdhdGl2ZSBzbyB1c2UgYnJvd3NlciBKUyB0byBnZXQgaXQgaW5zdGVhZFxuICAgICAgICB0b3AgPSBkaWdnKHRoaXMudHQuc2VsZWN0Q29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIFwidG9wXCIpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuXG4gICAgICAgIC8vIG9uTGF5b3V0IGxlZnQgdmFsdWVzIGRvZXNuJ3QgYWx3YXlzIHVwZGF0ZSB3aGVuIGNoYW5nZWRcbiAgICAgICAgbGVmdCA9IGRpZ2codGhpcy50dC5zZWxlY3RDb250YWluZXJSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgXCJsZWZ0XCIpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnQgPSBlbmRPZlNlbGVjdExheW91dC5sZWZ0XG4gICAgICAgIHRvcCA9IHNlbGVjdENvbnRhaW5lckxheW91dC50b3BcbiAgICAgIH1cblxuICAgICAgc3R5bGUubGVmdCA9IGxlZnRcbiAgICAgIHN0eWxlLnRvcCA9IHRvcCAtIG9wdGlvbnNDb250YWluZXJMYXlvdXQuaGVpZ2h0ICsgMVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua29ud24gb3B0aW9ucyBwbGFjZW1lbnQ6ICR7b3B0aW9uc1BsYWNlbWVudH1gKVxuICAgIH1cblxuICAgIHN0eWxlID0gdGhpcy5zdHlsaW5nRm9yKFwib3B0aW9uc0NvbnRhaW5lclwiLCBzdHlsZSwgW2xlZnQsIHRvcCwgc3R5bGUudmlzaWJpbGl0eSwgc3R5bGUud2lkdGhdKVxuXG4gICAgY29uc3QgaWQgPSBpZEZvckNvbXBvbmVudCh0aGlzKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3XG4gICAgICAgIGRhdGFTZXQ9e3RoaXMuY2FjaGUoXCJvcHRpb25zQ29udGFpbmVyRGF0YVNldFwiLCB7Y2xhc3M6IFwib3B0aW9ucy1jb250YWluZXJcIiwgaWQsIHJvbGU6IFwiZGlhbG9nXCJ9LCBbaWRdKX1cbiAgICAgICAgb25MYXlvdXQ9e3RoaXMudHQub25PcHRpb25zQ29udGFpbmVyTGF5b3V0fVxuICAgICAgICByZWY9e3RoaXMudHQub3B0aW9uc0NvbnRhaW5lclJlZn1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgPlxuICAgICAgICB7bG9hZGVkT3B0aW9ucz8ubWFwKChsb2FkZWRPcHRpb24pID0+XG4gICAgICAgICAgdGhpcy5oYXlhU2VsZWN0T3B0aW9uKHtcbiAgICAgICAgICAgIGtleTogbG9hZGVkT3B0aW9uLmtleSB8fCBgbG9hZGVkLW9wdGlvbi0ke2xvYWRlZE9wdGlvbi52YWx1ZX1gLFxuICAgICAgICAgICAgbG9hZGVkT3B0aW9uXG4gICAgICAgICAgfSlcbiAgICAgICAgKX1cbiAgICAgICAge2xvYWRlZE9wdGlvbnM/Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIDxWaWV3IGRhdGFTZXQ9e3RoaXMubm9PcHRpb25zQ29udGFpbmVyRGF0YVNldCB8fD0ge2NsYXNzOiBcIm5vLW9wdGlvbnMtY29udGFpbmVyXCJ9fT5cbiAgICAgICAgICAgIDxUZXh0Pnt0aGlzLnAubm9PcHRpb25zVGV4dCA/IHRoaXMucC5ub09wdGlvbnNUZXh0KCkgOiB0aGlzLnRyYW5zbGF0ZShcIi5ub19vcHRpb25zX2ZvdW5kXCIpfTwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgIH1cbiAgICAgICAge3RoaXMucGFnaW5hdGlvbkNvbnRyb2xzKCl9XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgb25PcHRpb25DbGlja2VkID0gKGV2ZW50LCBsb2FkZWRPcHRpb24pID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgIGNvbnN0IHtvbkNoYW5nZSwgdG9nZ2xlT3B0aW9uc30gPSB0aGlzLnByb3BzXG4gICAgY29uc3Qge211bHRpcGxlfSA9IHRoaXMucFxuICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy5nZXRDdXJyZW50T3B0aW9ucygpXG4gICAgY29uc3QgdG9nZ2xlZCA9IHRoaXMuZ2V0VG9nZ2xlZCgpXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7fVxuICAgIGNvbnN0IGV4aXN0aW5nT3B0aW9uID0gY3VycmVudE9wdGlvbnMuZmluZCgoY3VycmVudE9wdGlvbikgPT4gY3VycmVudE9wdGlvbi52YWx1ZSA9PSBsb2FkZWRPcHRpb24udmFsdWUpXG4gICAgY29uc3QgbmV3VG9nZ2xlZCA9IHsuLi50b2dnbGVkfVxuICAgIGxldCBuZXdDdXJyZW50T3B0aW9uc1xuXG4gICAgaWYgKGV4aXN0aW5nT3B0aW9uKSB7XG4gICAgICBpZiAodG9nZ2xlT3B0aW9ucykge1xuICAgICAgICBjb25zdCBjdXJyZW50VG9nZ2xlID0gdG9nZ2xlZFtsb2FkZWRPcHRpb24udmFsdWVdXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRvZ2dsZU9wdGlvbnMuZmluZEluZGV4KChlbGVtZW50KSA9PiBlbGVtZW50LnZhbHVlID09IGN1cnJlbnRUb2dnbGUpXG5cbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAodG9nZ2xlT3B0aW9ucy5sZW5ndGggLSAxKSkge1xuICAgICAgICAgIC8vIE5vIG5leHQgdG9nZ2xlZCAtIHJlbW92ZSB0b2dnbGVkIGFuZCBvcHRpb25cbiAgICAgICAgICBkZWxldGUgbmV3VG9nZ2xlZFtsb2FkZWRPcHRpb24udmFsdWVdXG5cbiAgICAgICAgICBuZXdDdXJyZW50T3B0aW9ucyA9IGN1cnJlbnRPcHRpb25zLmZpbHRlcigoY3VycmVudE9wdGlvbikgPT4gY3VycmVudE9wdGlvbi52YWx1ZSAhPSBsb2FkZWRPcHRpb24udmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSB0b2dnbGVkIC0gc2V0IHRvIG5leHQgdG9nZ2xlXG4gICAgICAgICAgbmV3VG9nZ2xlZFtsb2FkZWRPcHRpb24udmFsdWVdID0gZGlnZyh0b2dnbGVPcHRpb25zLCBjdXJyZW50SW5kZXggKyAxLCBcInZhbHVlXCIpXG4gICAgICAgIH1cblxuICAgICAgICBuZXdTdGF0ZS50b2dnbGVkID0gbmV3VG9nZ2xlZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gY3VycmVudCBvcHRpb25zXG4gICAgICAgIG5ld0N1cnJlbnRPcHRpb25zID0gY3VycmVudE9wdGlvbnMuZmlsdGVyKChjdXJyZW50T3B0aW9uKSA9PiBjdXJyZW50T3B0aW9uLnZhbHVlICE9IGxvYWRlZE9wdGlvbi52YWx1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGNsaWNrZWQgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAgICBpZiAobG9hZGVkT3B0aW9uLmRpc2FibGVkKSByZXR1cm5cblxuICAgICAgaWYgKHRvZ2dsZU9wdGlvbnMpIHtcbiAgICAgICAgLy8gU2V0IGZyZXNoIHRvZ2dsZVxuICAgICAgICBuZXdUb2dnbGVkW2xvYWRlZE9wdGlvbi52YWx1ZV0gPSB0b2dnbGVPcHRpb25zWzBdLnZhbHVlXG4gICAgICAgIG5ld1N0YXRlLnRvZ2dsZWQgPSBuZXdUb2dnbGVkXG4gICAgICB9XG5cbiAgICAgIGlmIChtdWx0aXBsZSB8fCB0b2dnbGVPcHRpb25zKSB7XG4gICAgICAgIG5ld0N1cnJlbnRPcHRpb25zID0gY3VycmVudE9wdGlvbnMuY29uY2F0KFtsb2FkZWRPcHRpb25dKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q3VycmVudE9wdGlvbnMgPSBbbG9hZGVkT3B0aW9uXVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcInZhbHVlc1wiIGluIHRoaXMucHJvcHMgJiYgdGhpcy5wcm9wcy52YWx1ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gY3VycmVudE9wdGlvbnMgYXJlIGNvbnRyb2xsZWQgYW5kIGEgdXNlTWVtbyBjYWxsYmFjayBpcyBoYW5kZWxpbmcgc2V0dGluZyBjdXJyZW50IG9wdGlvbnMuXG4gICAgfSBlbHNlIGlmIChuZXdDdXJyZW50T3B0aW9ucykge1xuICAgICAgbmV3U3RhdGUuY3VycmVudE9wdGlvbnMgPSBuZXdDdXJyZW50T3B0aW9uc1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSBuZXdDdXJyZW50T3B0aW9ucyB8fCBjdXJyZW50T3B0aW9uc1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICBvbkNoYW5nZSh7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICB0b2dnbGVzOiBuZXdUb2dnbGVkXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlVmFsdWUpIHtcbiAgICAgIGxldCBvcHRpb25WYWx1ZVxuXG4gICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25WYWx1ZSA9IGRpZyhvcHRpb25zLCAwLCBcInZhbHVlXCIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMucC5vbkNoYW5nZVZhbHVlKG9wdGlvblZhbHVlKVxuICAgIH1cblxuICAgIGlmICghbXVsdGlwbGUpIHRoaXMuY2xvc2VPcHRpb25zKClcbiAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKVxuICB9XG5cbiAgc3R5bGluZ0ZvcihzdHlsaW5nTmFtZSwgc3R5bGUgPSB7fSwgY2FjaGVzID0gW10pIHtcbiAgICBsZXQgY3VzdG9tU3R5bGluZyA9IGRpZyh0aGlzLCBcInByb3BzXCIsIFwic3R5bGVzXCIsIHN0eWxpbmdOYW1lKVxuXG4gICAgaWYgKHR5cGVvZiBjdXN0b21TdHlsaW5nID09IFwiZnVuY3Rpb25cIikgY3VzdG9tU3R5bGluZyA9IGN1c3RvbVN0eWxpbmcoe3N0YXRlOiB0aGlzLnN0YXRlLCBzdHlsZX0pXG5cbiAgICBpZiAoY3VzdG9tU3R5bGluZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3R5bGUsIGN1c3RvbVN0eWxpbmcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUoYHN0eWxpbmdGb3ItJHtzdHlsaW5nTmFtZX1gLCBzdHlsZSwgY2FjaGVzKVxuICB9XG5cbiAgaWNvbkZvck9wdGlvbihvcHRpb24pIHtcbiAgICBjb25zdCB7dG9nZ2xlT3B0aW9uc30gPSB0aGlzLnByb3BzIHx8IHt9XG4gICAgY29uc3QgdG9nZ2xlZCA9IHRoaXMuZ2V0VG9nZ2xlZCgpXG5cbiAgICBpZiAodG9nZ2xlT3B0aW9ucyAmJiAob3B0aW9uLnZhbHVlIGluIHRvZ2dsZWQpKSB7XG4gICAgICBjb25zdCB0b2dnbGVkVmFsdWUgPSB0b2dnbGVkW29wdGlvbi52YWx1ZV1cbiAgICAgIGNvbnN0IHRvZ2dsZWRPcHRpb24gPSB0b2dnbGVPcHRpb25zLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQudmFsdWUgPT0gdG9nZ2xlZFZhbHVlKVxuXG4gICAgICBpZiAoIXRvZ2dsZWRPcHRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGEgdG9nZ2xlIG9wdGlvbiBmb3IgdmFsdWU6ICR7dG9nZ2xlZFZhbHVlfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b2dnbGVkT3B0aW9uLmljb25cbiAgICB9XG4gIH1cblxuICBwcmVzZW50T3B0aW9uID0gKG9wdGlvbiwgbW9kZSkgPT4ge1xuICAgIGNvbnN0IHtvcHRpb25Db250ZW50LCB0b2dnbGVPcHRpb25zfSA9IHRoaXMucHJvcHMgfHwge31cbiAgICBjb25zdCB0b2dnbGVkID0gdGhpcy5nZXRUb2dnbGVkKClcbiAgICBjb25zdCBpY29uID0gdGhpcy5pY29uRm9yT3B0aW9uKG9wdGlvbilcbiAgICBjb25zdCB0b2dnbGVWYWx1ZSA9IHRvZ2dsZWRbb3B0aW9uLnZhbHVlXVxuICAgIGNvbnN0IHRvZ2dsZU9wdGlvbiA9IHRvZ2dsZU9wdGlvbnM/LmZpbmQoKHRvZ2dsZU9wdGlvbkkpID0+IHRvZ2dsZU9wdGlvbkkudmFsdWUgPT0gdG9nZ2xlVmFsdWUpXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmdldEN1cnJlbnRPcHRpb25WYWx1ZXMoKS5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgPT0gb3B0aW9uLnZhbHVlKVxuICAgIGxldCBzdHlsZVxuICAgIGxldCBjb250ZW50Tm9kZVxuXG4gICAgaWYgKG1vZGUgPT0gXCJjdXJyZW50XCIpIHtcbiAgICAgIHN0eWxlID0gdGhpcy5zdHlsaW5nRm9yKFwiY3VycmVudE9wdGlvblByZXNlbnRhdGlvblRleHRcIiwge2ZsZXg6IDEsIHdoaXRlU3BhY2U6IFwibm93cmFwXCJ9KVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZSA9IHRoaXMuc3R5bGluZ0ZvcihcIm9wdGlvblByZXNlbnRhdGlvblRleHRcIiwge2ZsZXg6IDEsIHdoaXRlU3BhY2U6IFwibm93cmFwXCJ9KVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8Vmlld1xuICAgICAgICBkYXRhU2V0PXt0aGlzLmNhY2hlKFwicHJlc2VudE9wdGlvblZpZXdEYXRhU2V0XCIsIHtcbiAgICAgICAgICB0ZXh0OiBvcHRpb24udGV4dCxcbiAgICAgICAgICB0b2dnbGVJY29uOiB0b2dnbGVPcHRpb24/Lmljb24sXG4gICAgICAgICAgdG9nZ2xlVmFsdWU6IHRvZ2dsZU9wdGlvbj8udmFsdWUsXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZVxuICAgICAgICB9LCBbb3B0aW9uLnRleHQsIG9wdGlvbi52YWx1ZSwgdG9nZ2xlT3B0aW9uPy5pY29uLCB0b2dnbGVPcHRpb24/LnZhbHVlXSl9XG4gICAgICAgIHN0eWxlPXt0aGlzLmNhY2hlKFwib3B0aW9uUHJlc2VudGF0aW9uU3R5bGVcIiwge2ZsZXhEaXJlY3Rpb246IFwicm93XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCJ9KX1cbiAgICAgICAgdGVzdElEPVwib3B0aW9uLXByZXNlbnRhdGlvblwiXG4gICAgICA+XG4gICAgICAgIHt0b2dnbGVPcHRpb25zICYmICEob3B0aW9uLnZhbHVlIGluIHRvZ2dsZWQpICYmXG4gICAgICAgICAgPFZpZXdcbiAgICAgICAgICAgIHN0eWxlPXt0aGlzLmNhY2hlKFwidG9nZ2xlSWNvblBsYWNlaG9sZGVyU3R5bGVcIiwge3dpZHRoOiAyMH0pfVxuICAgICAgICAgICAgdGVzdElEPVwidG9nZ2xlLWljb24tcGxhY2Vob2xkZXJcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgICAge3RvZ2dsZU9wdGlvbnMgJiYgKG9wdGlvbi52YWx1ZSBpbiB0b2dnbGVkKSAmJlxuICAgICAgICAgIDxWaWV3IHN0eWxlPXt0aGlzLmNhY2hlKFwidG9nZ2xlSWNvbkNvbnRhaW5lclN0eWxlXCIsIHthbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIiwgd2lkdGg6IDIwfSl9PlxuICAgICAgICAgICAgPEZvbnRBd2Vzb21lSWNvblxuICAgICAgICAgICAgICBuYW1lPXtpY29ufVxuICAgICAgICAgICAgICB0ZXN0SUQ9XCJ0b2dnbGUtaWNvblwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgfVxuICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9uQ29udGVudCkge1xuICAgICAgICAgICAgY29udGVudE5vZGUgPSBvcHRpb25Db250ZW50KHtpY29uLCBtb2RlLCBvcHRpb24sIHNlbGVjdGVkLCB0b2dnbGVPcHRpb24sIHRvZ2dsZVZhbHVlLCB0b2dnbGVkfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gXCJjdXJyZW50XCIgJiYgb3B0aW9uLmN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgICBjb250ZW50Tm9kZSA9IG9wdGlvbi5jdXJyZW50Q29udGVudCgpXG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uY29udGVudCkge1xuICAgICAgICAgICAgY29udGVudE5vZGUgPSBvcHRpb24uY29udGVudCgpXG4gICAgICAgICAgfSBlbHNlIGlmIChcImh0bWxcIiBpbiBvcHRpb24gJiYgUGxhdGZvcm0uT1MgIT0gXCJ3ZWJcIikge1xuICAgICAgICAgICAgY29udGVudE5vZGUgPSA8UmVuZGVySHRtbCBzb3VyY2U9e3todG1sOiBkaWdnKG9wdGlvbiwgXCJodG1sXCIpfX0gLz5cbiAgICAgICAgICB9IGVsc2UgaWYgKFwiaHRtbFwiIGluIG9wdGlvbiAmJiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiKSB7XG4gICAgICAgICAgICBjb250ZW50Tm9kZSA9IDxkaXYgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGRpZ2cob3B0aW9uLCBcImh0bWxcIil9fSAvPlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50Tm9kZSA9IChcbiAgICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgICAgdGVzdElEPVwib3B0aW9uLXByZXNlbnRhdGlvbi10ZXh0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtvcHRpb24udGV4dH1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8VmlldyBzdHlsZT17dGhpcy5jYWNoZShcIm9wdGlvblByZXNlbnRhdGlvbkNvbnRlbnRTdHlsZVwiLCB7ZmxleDogMX0pfT5cbiAgICAgICAgICAgICAgICB7Y29udGVudE5vZGV9XG4gICAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICAgICAge29wdGlvbi5yaWdodCAmJlxuICAgICAgICAgICAgICAgIDxWaWV3IHN0eWxlPXt0aGlzLmNhY2hlKFwib3B0aW9uUHJlc2VudGF0aW9uUmlnaHRTdHlsZVwiLCB7YWxpZ25JdGVtczogXCJjZW50ZXJcIiwganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsIG1hcmdpbkxlZnQ6IDh9KX0+XG4gICAgICAgICAgICAgICAgICB7b3B0aW9uLnJpZ2h0fVxuICAgICAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKVxuICAgICAgICB9KSgpfVxuICAgICAgPC9WaWV3PlxuICAgIClcbiAgfVxuXG4gIGFzeW5jIHNldEN1cnJlbnRGcm9tR2l2ZW5WYWx1ZXMoKSB7XG4gICAgY29uc3Qge29wdGlvbnMsIHZhbHVlc30gPSB0aGlzLnBcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykgJiYgdmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMucy5jdXJyZW50T3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRPcHRpb25zOiBbXX0pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMoe3BhZ2U6IHRoaXMuZ2V0QWN0aXZlUGFnZSgpLCB2YWx1ZXN9KVxuICAgIGNvbnN0IHtvcHRpb25zOiBjdXJyZW50T3B0aW9uc30gPSB0aGlzLnBhcnNlT3B0aW9uc1Jlc3VsdChyZXN1bHQpXG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9IGN1cnJlbnRPcHRpb25zPy5tYXAoKGN1cnJlbnRPcHRpb24pID0+IGN1cnJlbnRPcHRpb24udmFsdWUpXG4gICAgY29uc3Qgc3RhdGVWYWx1ZXMgPSB0aGlzLnMuY3VycmVudE9wdGlvbnM/Lm1hcCgoY3VycmVudE9wdGlvbikgPT4gY3VycmVudE9wdGlvbi52YWx1ZSlcblxuICAgIGlmIChhbnl0aGluZ0RpZmZlcmVudChjdXJyZW50VmFsdWVzLCBzdGF0ZVZhbHVlcykpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRPcHRpb25zfSlcbiAgICB9XG4gIH1cbn0pKVxuIl19
1255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VsZWN0L2luZGV4LmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDbEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDekUsT0FBTyxLQUFLLEVBQUMsRUFBQyxJQUFJLEVBQUMsU0FBUyxFQUFDLE1BQU0sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUNqRCxPQUFPLEVBQUMsY0FBYyxFQUFDLGNBQWMsRUFBQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3hGLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUMvQixPQUFPLGVBQWUsTUFBTSx1Q0FBdUMsQ0FBQTtBQUNuRSxPQUFPLGNBQWMsTUFBTSxtREFBbUQsQ0FBQTtBQUM5RSxPQUFPLGdCQUFnQixNQUFNLHFEQUFxRCxDQUFBO0FBQ2xGLE9BQU8sSUFBSSxNQUFNLHNDQUFzQyxDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLFdBQVcsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN4QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxVQUFVLE1BQU0sMEJBQTBCLENBQUE7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNuQyxPQUFPLGdCQUFnQixNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sZUFBZSxNQUFNLHFDQUFxQyxDQUFBO0FBRWpFLE1BQU0sTUFBTSxHQUFHLEVB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bEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLGNBQWMsRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFBO1lBQ3JDLENBQUM7WUFFRCxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sRUFBQyxPQUFPLEVBQUUsY0FBYyxFQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pFLE1BQU0sYUFBYSxHQUFHLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV0RixJQUFJLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFBO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FueXRoaW5nRGlmZmVyZW50fSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvZGlmZi11dGlsc1wiXG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuLi9jb25maWcuanNcIlxuaW1wb3J0IHtkaWcsZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQge0RpbWVuc2lvbnMsUGxhdGZvcm0sUHJlc3NhYmxlLFRleHRJbnB1dCxWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCBSZWFjdCx7bWVtbyx1c2VFZmZlY3QsdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtzaGFwZUNvbXBvbmVudCxTaGFwZUNvbXBvbmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL2J1aWxkL3NoYXBlLWNvbXBvbmVudC5qc1wiXG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcImRlYm91bmNlXCJcbmltcG9ydCBGb250QXdlc29tZUljb24gZnJvbSBcInJlYWN0LW5hdGl2ZS12ZWN0b3ItaWNvbnMvRm9udEF3ZXNvbWVcIlxuaW1wb3J0IGlkRm9yQ29tcG9uZW50IGZyb20gXCJAa2FzcGVybmovYXBpLW1ha2VyL2J1aWxkL2lucHV0cy9pZC1mb3ItY29tcG9uZW50XCJcbmltcG9ydCBuYW1lRm9yQ29tcG9uZW50IGZyb20gXCJAa2FzcGVybmovYXBpLW1ha2VyL2J1aWxkL2lucHV0cy9uYW1lLWZvci1jb21wb25lbnRcIlxuaW1wb3J0IFRleHQgZnJvbSBcIkBrYXNwZXJuai9hcGktbWFrZXIvYnVpbGQvdXRpbHMvdGV4dFwiXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuL29wdGlvblwiXG5pbXBvcnQgT3B0aW9uR3JvdXAgZnJvbSBcIi4vb3B0aW9uLWdyb3VwXCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IHByb3BUeXBlc0V4YWN0IGZyb20gXCJwcm9wLXR5cGVzLWV4YWN0XCJcbmltcG9ydCBSZW5kZXJIdG1sIGZyb20gXCJyZWFjdC1uYXRpdmUtcmVuZGVyLWh0bWxcIlxuaW1wb3J0IHtQb3J0YWx9IGZyb20gXCJjb25qb2ludG1lbnRcIlxuaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSBcInlhLXVzZS1ldmVudC1saXN0ZW5lclwiXG5pbXBvcnQgdXNlUHJlc3NPdXRzaWRlIGZyb20gXCJvdXRzaWRlLWV5ZS9idWlsZC91c2UtcHJlc3Mtb3V0c2lkZVwiXG5cbmNvbnN0IHN0eWxlcyA9IHt9XG5jb25zdCBkYXRhU2V0cyA9IHt9XG5jb25zdCBwYWdpbmF0aW9uQnV0dG9uRGF0YVNldHMgPSB7fVxuY29uc3QgcGFnaW5hdGlvbkJ1dHRvblN0eWxlcyA9IHt9XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGF5YVNlbGVjdFRvZ2dsZU9wdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGljb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYWJlbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIYXlhU2VsZWN0T3B0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IHZhbHVlXG4gKiBAcHJvcGVydHkge2ltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW3RleHRdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW2NvbnRlbnRdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW2N1cnJlbnRDb250ZW50XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0bWxdXG4gKiBAcHJvcGVydHkge2ltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW3JpZ2h0XVxuICpcbiAqIEFkZGl0aW9uYWwgb3B0aW9uIHByb3BzIGFyZSBhbGxvd2VkOyBIYXlhU2VsZWN0IG9ubHkgdXNlcyB0aGUga2V5cyBhYm92ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEhheWFTZWxlY3RPcHRpb25zUmVzdWx0XG4gKiBAcHJvcGVydHkge0FycmF5PEhheWFTZWxlY3RPcHRpb24+fSBvcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RvdGFsQ291bnRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BhZ2VdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BhZ2VTaXplXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGF5YVNlbGVjdFByb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2F0dHJpYnV0ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xhc3NOYW1lXVxuICogQHByb3BlcnR5IHtvYmplY3R9IFtkZWZhdWx0VG9nZ2xlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bWJlcn0gW2RlZmF1bHRWYWx1ZV1cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nfG51bWJlcj59IFtkZWZhdWx0VmFsdWVzXVxuICogQHByb3BlcnR5IHtBcnJheTxIYXlhU2VsZWN0T3B0aW9uPn0gW2RlZmF1bHRWYWx1ZXNGcm9tT3B0aW9uc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlYnVnXVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IFtpZF1cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbbW9kZWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG11bHRpcGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW25vT3B0aW9uc1RleHRdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKGltcG9ydChcInJlYWN0XCIpLlN5bnRoZXRpY0V2ZW50PSk6IHZvaWR9IFtvbkJsdXJdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKGltcG9ydChcInJlYWN0XCIpLlN5bnRoZXRpY0V2ZW50PSk6IHZvaWR9IFtvbkNoYW5nZV1cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oQXJyYXk8c3RyaW5nfG51bWJlcj49KTogdm9pZH0gW29uQ2hhbmdlVmFsdWVdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKGltcG9ydChcInJlYWN0XCIpLlN5bnRoZXRpY0V2ZW50PSk6IHZvaWR9IFtvbkZvY3VzXVxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7b3B0aW9uczogQXJyYXl9KTogdm9pZH0gW29uT3B0aW9uc0Nsb3NlZF1cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe29wdGlvbnM6IEFycmF5fSk6IHZvaWR9IFtvbk9wdGlvbnNMb2FkZWRdXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKG9iamVjdCk6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gW29wdGlvbkNvbnRlbnRdXG4gKiBAcHJvcGVydHkge0FycmF5PEhheWFTZWxlY3RPcHRpb24+fGZ1bmN0aW9uKCk6IChBcnJheTxIYXlhU2VsZWN0T3B0aW9uPnxIYXlhU2VsZWN0T3B0aW9uc1Jlc3VsdCl9IG9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3B0aW9uc0Fic29sdXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9wdGlvbnNQb3J0YWxcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb3B0aW9uc1dpZHRoXVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IFtwbGFjZWhvbGRlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0ZWRCYWNrZ3JvdW5kQ29sb3JdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdGVkSG92ZXJCYWNrZ3JvdW5kQ29sb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNlYXJjaFxuICogQHByb3BlcnR5IHtvYmplY3R9IFtzdHlsZXNdXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3RvZ2dsZWRdXG4gKiBAcHJvcGVydHkge0FycmF5PEhheWFTZWxlY3RUb2dnbGVPcHRpb24+fSBbdG9nZ2xlT3B0aW9uc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHJhbnNwYXJlbnRcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nfG51bWJlcj59IFt2YWx1ZXNdXG4gKi9cblxuLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG5jb25zdCBuYW1lRm9yQ29tcG9uZW50V2l0aE11bHRpcGxlID0gKGNvbXBvbmVudCkgPT4ge1xuICBsZXQgbmFtZSA9IG5hbWVGb3JDb21wb25lbnQoY29tcG9uZW50KVxuXG4gIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gY29tcG9uZW50LmdldEN1cnJlbnRPcHRpb25zKClcblxuICBpZiAoY29tcG9uZW50LnByb3BzLm11bHRpcGxlICYmIG5hbWUgJiYgY3VycmVudE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIG5hbWUgKz0gXCJbXVwiXG4gIH1cblxuICByZXR1cm4gbmFtZVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhZ2luYXRpb25QYWdlQnV0dG9uUHJvcHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWN0aXZlXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGFnZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbihudW1iZXIpOiB2b2lkfSBvblBhZ2VTZWxlY3RlZFxuICovXG5cbi8qKiBAZXh0ZW5kcyB7U2hhcGVDb21wb25lbnQ8UGFnaW5hdGlvblBhZ2VCdXR0b25Qcm9wcz59ICovXG5jb25zdCBQYWdpbmF0aW9uUGFnZUJ1dHRvbiA9IG1lbW8oc2hhcGVDb21wb25lbnQoY2xhc3MgUGFnaW5hdGlvblBhZ2VCdXR0b24gZXh0ZW5kcyBTaGFwZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBwcm9wVHlwZXNFeGFjdCh7XG4gICAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIHBhZ2U6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBvblBhZ2VTZWxlY3RlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9KVxuXG4gIC8qKiBAcGFyYW0ge2ltcG9ydChcInJlYWN0XCIpLlN5bnRoZXRpY0V2ZW50fSBldmVudCAqL1xuICBvblByZXNzID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKVxuXG4gICAgdGhpcy5wLm9uUGFnZVNlbGVjdGVkKHRoaXMucC5wYWdlKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHthY3RpdmUsIHBhZ2V9ID0gdGhpcy5wXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFByZXNzYWJsZVxuICAgICAgICBkYXRhU2V0PXtwYWdpbmF0aW9uQnV0dG9uRGF0YVNldHNbYHBhZ2luYXRpb25QYWdlLSR7cGFnZX1gXSB8fD0ge2NsYXNzOiBcInBhZ2luYXRpb24tcGFnZVwiLCBwYWdlfX1cbiAgICAgICAgZGlzYWJsZWQ9e2FjdGl2ZX1cbiAgICAgICAgb25QcmVzcz17dGhpcy50dC5vblByZXNzfVxuICAgICAgICBzdHlsZT17cGFnaW5hdGlvbkJ1dHRvblN0eWxlc1tgcGFnaW5hdGlvblBhZ2VCdXR0b24tJHthY3RpdmV9YF0gfHw9IHtcbiAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYWN0aXZlID8gXCIjMGYxNzJhXCIgOiBcIiNlMmU4ZjBcIixcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDk5OSxcbiAgICAgICAgICBoZWlnaHQ6IDI4LFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgIG1hcmdpbkhvcml6b250YWw6IDQsXG4gICAgICAgICAgd2lkdGg6IDI4XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxUZXh0XG4gICAgICAgICAgc3R5bGU9e3BhZ2luYXRpb25CdXR0b25TdHlsZXNbYHBhZ2luYXRpb25QYWdlVGV4dC0ke2FjdGl2ZX1gXSB8fD0ge1xuICAgICAgICAgICAgY29sb3I6IGFjdGl2ZSA/IFwiI2Y4ZmFmY1wiIDogXCIjMzM0MTU1XCIsXG4gICAgICAgICAgICBmb250U2l6ZTogMTIsXG4gICAgICAgICAgICBmb250V2VpZ2h0OiA2MDBcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3BhZ2V9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvUHJlc3NhYmxlPlxuICAgIClcbiAgfVxufSkpXG5cbi8qKiBAZXh0ZW5kcyB7U2hhcGVDb21wb25lbnQ8SGF5YVNlbGVjdFByb3BzPn0gKi9cbmV4cG9ydCBkZWZhdWx0IG1lbW8oc2hhcGVDb21wb25lbnQoY2xhc3MgSGF5YVNlbGVjdCBleHRlbmRzIFNoYXBlQ29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgIG5vT3B0aW9uc1RleHQ6IG51bGwsXG4gICAgb25CbHVyOiBudWxsLFxuICAgIG9uRm9jdXM6IG51bGwsXG4gICAgb3B0aW9uc0Fic29sdXRlOiB0cnVlLFxuICAgIG9wdGlvbnNQb3J0YWw6IHRydWUsXG4gICAgb3B0aW9uc1dpZHRoOiBudWxsLFxuICAgIHNlYXJjaDogZmFsc2UsXG4gICAgdHJhbnNwYXJlbnQ6IGZhbHNlXG4gIH1cblxuICBzdGF0aWMgcHJvcFR5cGVzID0gcHJvcFR5cGVzRXhhY3Qoe1xuICAgIGF0dHJpYnV0ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGVmYXVsdFRvZ2dsZWQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgZGVmYXVsdFZhbHVlczogUHJvcFR5cGVzLmFycmF5LFxuICAgIGRlZmF1bHRWYWx1ZXNGcm9tT3B0aW9uczogUHJvcFR5cGVzLmFycmF5LFxuICAgIGRlYnVnOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIGlkOiBQcm9wVHlwZXMubm9kZSxcbiAgICBtb2RlbDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBtdWx0aXBsZTogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG5vT3B0aW9uc1RleHQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uQ2hhbmdlVmFsdWU6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uT3B0aW9uc0Nsb3NlZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25PcHRpb25zTG9hZGVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvcHRpb25Db250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvcHRpb25zOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBjdXJyZW50Q29udGVudDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgaHRtbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgcmlnaHQ6IFByb3BUeXBlcy5ub2RlLFxuICAgICAgICB0ZXh0OiBQcm9wVHlwZXMubm9kZSxcbiAgICAgICAgdmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKS5pc1JlcXVpcmVkXG4gICAgICB9KSksXG4gICAgICBQcm9wVHlwZXMuZnVuY1xuICAgIF0pLmlzUmVxdWlyZWQsXG4gICAgb3B0aW9uc0Fic29sdXRlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIG9wdGlvbnNQb3J0YWw6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgb3B0aW9uc1dpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMubm9kZSxcbiAgICBzZWxlY3RlZEJhY2tncm91bmRDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzZWxlY3RlZEhvdmVyQmFja2dyb3VuZENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNlYXJjaDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBzdHlsZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgdG9nZ2xlZDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB0b2dnbGVPcHRpb25zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgaWNvbjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbiAgICB9KSksXG4gICAgdHJhbnNwYXJlbnQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgdmFsdWVzOiBQcm9wVHlwZXMuYXJyYXlcbiAgfSlcblxuICBjYWxsT3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW4gPSBmYWxzZVxuICBzZWFyY2hUZXh0VmFsdWUgPSBcIlwiXG4gIHQgPSBDb25maWcuY3VycmVudCgpLmdldFVzZVRyYW5zbGF0ZSgpKCkudFxuICB3aW5kb3dXaWR0aCA9IERpbWVuc2lvbnMuZ2V0KFwid2luZG93XCIpLndpZHRoXG4gIHdpbmRvd0hlaWdodCA9IERpbWVuc2lvbnMuZ2V0KFwid2luZG93XCIpLmhlaWdodFxuXG4gIGlzRGVidWdFbmFibGVkID0gKCkgPT4gQm9vbGVhbih0aGlzLnAuZGVidWcpXG5cbiAgZGVidWdMb2cgPSAoZnVuY3Rpb25OYW1lLCBkZXRhaWxzID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzRGVidWdFbmFibGVkKCkpIHJldHVyblxuXG4gICAgY29uc3QgYmFzZURldGFpbHMgPSB7XG4gICAgICBpZDogdGhpcy5wLmlkLFxuICAgICAgbmFtZTogdGhpcy5wLm5hbWVcbiAgICB9XG5cbiAgICBjb25zdCBtZXJnZWREZXRhaWxzID0gZGV0YWlscyA/IE9iamVjdC5hc3NpZ24oe30sIGJhc2VEZXRhaWxzLCBkZXRhaWxzKSA6IGJhc2VEZXRhaWxzXG5cbiAgICBpZiAobWVyZ2VkRGV0YWlscyAmJiBPYmplY3Qua2V5cyhtZXJnZWREZXRhaWxzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW0hheWFTZWxlY3RdICR7ZnVuY3Rpb25OYW1lfWAsIG1lcmdlZERldGFpbHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbSGF5YVNlbGVjdF0gJHtmdW5jdGlvbk5hbWV9YClcbiAgICB9XG4gIH1cblxuICBzZXR1cCgpIHtcbiAgICBjb25zdCB7dH0gPSBDb25maWcuY3VycmVudCgpLmdldFVzZVRyYW5zbGF0ZSgpKClcblxuICAgIHRoaXMudCA9IHRcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucHJvcHMudmFsdWVzKSkge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnByb3BzLnZhbHVlcykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIYXlhU2VsZWN0OiBVbmRlZmluZWQgZ2l2ZW4gYXMgdmFsdWVcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0SW5zdGFuY2Uoe1xuICAgICAgZW5kT2ZTZWxlY3RSZWY6IHVzZVJlZigpLFxuICAgICAgb3B0aW9uc0NvbnRhaW5lclJlZjogdXNlUmVmKCksXG4gICAgICBwYWdlSW5wdXRSZWY6IHVzZVJlZigpLFxuICAgICAgc2VhcmNoVGV4dElucHV0UmVmOiB1c2VSZWYoKSxcbiAgICAgIHNlbGVjdENvbnRhaW5lclJlZjogdXNlUmVmKClcbiAgICB9KVxuICAgIHRoaXMudXNlU3RhdGVzKHtcbiAgICAgIGN1cnJlbnRPcHRpb25zOiAoKSA9PiB0aGlzLmRlZmF1bHRDdXJyZW50T3B0aW9ucygpLFxuICAgICAgc2VsZWN0Q29udGFpbmVyTGF5b3V0OiBudWxsLFxuICAgICAgZW5kT2ZTZWxlY3RMYXlvdXQ6IG51bGwsXG4gICAgICBoZWlnaHQ6IG51bGwsXG4gICAgICBsb2FkZWRPcHRpb25zOiAoKSA9PiB0aGlzLmRlZmF1bHRMb2FkZWRPcHRpb25zKCksXG4gICAgICBwYWdlOiAxLFxuICAgICAgcGFnZUlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBwYWdlSW5wdXRWYWx1ZTogXCIxXCIsXG4gICAgICBwYWdlU2l6ZTogbnVsbCxcbiAgICAgIG9wZW5lZDogZmFsc2UsXG4gICAgICBvcHRpb25zQ29udGFpbmVyTGF5b3V0OiBudWxsLFxuICAgICAgb3B0aW9uc1BsYWNlbWVudDogdW5kZWZpbmVkLFxuICAgICAgb3B0aW9uc1RvcDogdW5kZWZpbmVkLFxuICAgICAgb3B0aW9uc1Zpc2liaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgIG9wdGlvbnNXaWR0aDogdW5kZWZpbmVkLFxuICAgICAgc2Nyb2xsTGVmdDogUGxhdGZvcm0uT1MgPT0gXCJ3ZWJcIiA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IDogbnVsbCxcbiAgICAgIHNjcm9sbFRvcDogUGxhdGZvcm0uT1MgPT0gXCJ3ZWJcIiA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgOiBudWxsLFxuICAgICAgdG90YWxDb3VudDogbnVsbCxcbiAgICAgIHRvZ2dsZWQ6ICgpID0+IHRoaXMuZGVmYXVsdFRvZ2dsZWQoKVxuICAgIH0pXG5cbiAgICBjb25zdCB3aW5kb3dUYXJnZXQgPSBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiICYmIHR5cGVvZiB3aW5kb3cgIT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcblxuICAgIHVzZUV2ZW50TGlzdGVuZXIoRGltZW5zaW9ucywgXCJjaGFuZ2VcIiwgdGhpcy50dC5vbkRpbWVuc2lvbnNDaGFuZ2UpXG4gICAgdXNlUHJlc3NPdXRzaWRlKHRoaXMudHQub3B0aW9uc0NvbnRhaW5lclJlZiwgdGhpcy50dC5vblByZXNzT3V0c2lkZU9wdGlvbnMpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3dUYXJnZXQsIFwicmVzaXplXCIsIHRoaXMudHQub25Bbnl0aGluZ1Jlc2l6ZWREZWJvdW5jZWQpXG4gICAgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3dUYXJnZXQsIFwic2Nyb2xsXCIsIHRoaXMudHQub25Bbnl0aGluZ1Njcm9sbGVkRGVib3VuY2VkKVxuXG4gICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcInNldHVwXCIsIHtcbiAgICAgIGhhc0NvbnRyb2xsZWRWYWx1ZXM6IFwidmFsdWVzXCIgaW4gdGhpcy5wcm9wcyxcbiAgICAgIGhhc0NvbnRyb2xsZWRUb2dnbGVkOiBcInRvZ2dsZWRcIiBpbiB0aGlzLnByb3BzLFxuICAgICAgbXVsdGlwbGU6IHRoaXMucC5tdWx0aXBsZSxcbiAgICAgIG9wdGlvbnNUeXBlOiBBcnJheS5pc0FycmF5KHRoaXMucHJvcHMub3B0aW9ucykgPyBcImFycmF5XCIgOiB0eXBlb2YgdGhpcy5wcm9wcy5vcHRpb25zXG4gICAgfSlcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50dC5jYWxsT3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW4gJiYgdGhpcy5zLm9wdGlvbnNDb250YWluZXJMYXlvdXQpIHtcbiAgICAgICAgdGhpcy5jYWxsT3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW4gPSBmYWxzZVxuICAgICAgICB0aGlzLnNldE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuKClcbiAgICAgIH1cbiAgICB9LCBbdGhpcy50dC5jYWxsT3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW4sIHRoaXMucy5vcHRpb25zQ29udGFpbmVyTGF5b3V0XSlcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50T3B0aW9uSWRzID0gdGhpcy5zLmN1cnJlbnRPcHRpb25zPy5tYXAoKGN1cnJlbnRPcHRpb24pID0+IGN1cnJlbnRPcHRpb24udmFsdWUpXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucHJvcHMudmFsdWVzKSAmJiBhbnl0aGluZ0RpZmZlcmVudChjdXJyZW50T3B0aW9uSWRzLCB0aGlzLnByb3BzLnZhbHVlcykgJiYgdHlwZW9mIHRoaXMucHJvcHMub3B0aW9ucyA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhpcy5zZXRDdXJyZW50RnJvbUdpdmVuVmFsdWVzKClcbiAgICAgIH1cbiAgICB9LCBbdGhpcy5wcm9wcy52YWx1ZXNdKVxuICB9XG5cbiAgdHJhbnNsYXRlKG1zZ0lELCBvcHRpb25zKSB7XG4gICAgaWYgKG1zZ0lELnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy50KGBoYXlhX3NlbGVjdCR7bXNnSUR9YCwgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudChtc2dJRCwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0Q3VycmVudE9wdGlvbnMoKSB7XG4gICAgY29uc3Qge2RlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlcywgdmFsdWVzfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7b3B0aW9uc30gPSB0aGlzLnBcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zKSkgcmV0dXJuIFtdXG5cbiAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIoKHt2YWx1ZX0pID0+XG4gICAgICAoZGVmYXVsdFZhbHVlICYmIHZhbHVlID09IGRlZmF1bHRWYWx1ZSkgfHxcbiAgICAgICAgKGRlZmF1bHRWYWx1ZXMgJiYgZGVmYXVsdFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHx8XG4gICAgICAgICh2YWx1ZXMgJiYgdmFsdWVzLmluY2x1ZGVzKHZhbHVlKSlcbiAgICApXG4gIH1cblxuICBkZWZhdWx0TG9hZGVkT3B0aW9ucygpIHtcbiAgICBjb25zdCB7b3B0aW9uc30gPSB0aGlzLnBcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBvcHRpb25zXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb2Ygb3B0aW9uczogJHt0eXBlb2Ygb3B0aW9uc31gKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIGdldEFjdGl2ZVBhZ2UgPSAoKSA9PiB0aGlzLnMucGFnZSB8fCAxXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8SGF5YVNlbGVjdE9wdGlvbj58SGF5YVNlbGVjdE9wdGlvbnNSZXN1bHR9IHJlc3VsdFxuICAgKiBAcmV0dXJucyB7SGF5YVNlbGVjdE9wdGlvbnNSZXN1bHR9XG4gICAqL1xuICBwYXJzZU9wdGlvbnNSZXN1bHQocmVzdWx0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgcmV0dXJuIHtvcHRpb25zOiByZXN1bHR9XG5cbiAgICBpZiAocmVzdWx0ICYmIEFycmF5LmlzQXJyYXkocmVzdWx0Lm9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcHRpb25zOiByZXN1bHQub3B0aW9ucyxcbiAgICAgICAgdG90YWxDb3VudDogcmVzdWx0LnRvdGFsQ291bnQsXG4gICAgICAgIHBhZ2U6IHJlc3VsdC5wYWdlLFxuICAgICAgICBwYWdlU2l6ZTogcmVzdWx0LnBhZ2VTaXplXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9wdGlvbnMgcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7QXJyYXk8SGF5YVNlbGVjdE9wdGlvbj59IHBhcmFtcy5vcHRpb25zXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1zLnBhZ2VdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1zLnBhZ2VTaXplXVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhcmFtcy50b3RhbENvdW50XVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfG51bGx9XG4gICAqL1xuICByZXNvbHZlUGFnZVNpemUoe29wdGlvbnMsIHBhZ2UsIHBhZ2VTaXplLCB0b3RhbENvdW50fSkge1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocGFnZVNpemUpICYmIHBhZ2VTaXplID4gMCkgcmV0dXJuIHBhZ2VTaXplXG5cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHRoaXMucy5wYWdlU2l6ZSkgJiYgdGhpcy5zLnBhZ2VTaXplID4gMCAmJiBwYWdlICE9IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnMucGFnZVNpemVcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHRvdGFsQ291bnQpICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucykgJiYgb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5sZW5ndGhcbiAgICB9XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHRoaXMucy5wYWdlU2l6ZSkgJiYgdGhpcy5zLnBhZ2VTaXplID4gMCA/IHRoaXMucy5wYWdlU2l6ZSA6IG51bGxcbiAgfVxuXG4gIGRlZmF1bHRUb2dnbGVkID0gKCkgPT4gKFwidG9nZ2xlZFwiIGluIHRoaXMucHJvcHMpID8gdGhpcy5wLnRvZ2dsZWQgOiB0aGlzLnByb3BzLmRlZmF1bHRUb2dnbGVkIHx8IHt9XG4gIGdldFRvZ2dsZWQgPSAoKSA9PiAoXCJ0b2dnbGVkXCIgaW4gdGhpcy5wcm9wcykgPyB0aGlzLnAudG9nZ2xlZCA6IHRoaXMucy50b2dnbGVkXG4gIGdldFZhbHVlcyA9ICgpID0+IChcInZhbHVlc1wiIGluIHRoaXMucHJvcHMpID8gdGhpcy5wLnZhbHVlcyA6IHRoaXMucy5jdXJyZW50T3B0aW9ucy5tYXAoKGN1cnJlbnRPcHRpb24pID0+IGN1cnJlbnRPcHRpb24udmFsdWUpXG4gIGdldEN1cnJlbnRPcHRpb25zID0gKCkgPT4ge1xuICAgIGlmIChcInZhbHVlc1wiIGluIHRoaXMucHJvcHMgJiYgdHlwZW9mIHRoaXMucHJvcHMudmFsdWVzICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucC52YWx1ZXMpICYmIHRoaXMucC52YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW11cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5vcHRpb25zKSAmJiBBcnJheS5pc0FycmF5KHRoaXMucC52YWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnAudmFsdWVzLm1hcCgodmFsdWUpID0+IHRoaXMucC5vcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09IHZhbHVlKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zLmxvYWRlZE9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnAudmFsdWVzKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wLnZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgbGV0IGZvdW5kT3B0aW9uID0gdGhpcy5zLmxvYWRlZE9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUgPT0gdmFsdWUpXG5cbiAgICAgICAgICBpZiAoIWZvdW5kT3B0aW9uKSB7XG4gICAgICAgICAgICBmb3VuZE9wdGlvbiA9IHRoaXMucy5jdXJyZW50T3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PSB2YWx1ZSlcblxuICAgICAgICAgICAgaWYgKCFmb3VuZE9wdGlvbikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3VsZG4ndCBmaW5kIG9wdGlvbjogJHt2YWx1ZX0gaW4gbG9hZGVkT3B0aW9ucyBvciBzdGF0ZSBjdXJyZW50T3B0aW9uc2AsXG4gICAgICAgICAgICAgICAge3N0YXRlTG9hZGVkT3B0aW9uczogdGhpcy5zLmxvYWRlZE9wdGlvbnMsIHN0YXRlQ3VycmVudE9wdGlvbnM6IHRoaXMucy5jdXJyZW50T3B0aW9ucywgcHJvcHNPcHRpb25zOiB0aGlzLnByb3BzLm9wdGlvbnN9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZm91bmRPcHRpb25cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucHJvcHMub3B0aW9ucyA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gT3B0aW9ucyBoYXZlbid0IGJlZW4gbG9hZGVkIHlldC5cbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnAudmFsdWVzKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wLnZhbHVlcy5tYXAoKHZhbHVlKSA9PiAoe3ZhbHVlfSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucy5jdXJyZW50T3B0aW9uc1xuICB9XG5cbiAgZ2V0Q3VycmVudE9wdGlvblZhbHVlcygpIHtcbiAgICBpZiAoXCJ2YWx1ZXNcIiBpbiB0aGlzLnByb3BzKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnAudmFsdWVzKSA/IHRoaXMucC52YWx1ZXMgOiBbXVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy5nZXRDdXJyZW50T3B0aW9ucygpXG5cbiAgICBpZiAoIWN1cnJlbnRPcHRpb25zKSByZXR1cm4gW11cblxuICAgIHJldHVybiBjdXJyZW50T3B0aW9uc1xuICAgICAgLm1hcCgob3B0aW9uKSA9PiBvcHRpb24/LnZhbHVlKVxuICAgICAgLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSAhPSBcInVuZGVmaW5lZFwiKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3Qge2F0dHJpYnV0ZSwgZGVmYXVsdFZhbHVlLCBkZWZhdWx0VmFsdWVzLCBkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnMsIG1vZGVsLCBvcHRpb25zfSA9IHRoaXMucHJvcHNcblxuICAgIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHRoaXMuZGVidWdMb2coXCJjb21wb25lbnREaWRNb3VudFwiLCB7XG4gICAgICBoYXNBdHRyaWJ1dGVNb2RlbDogQm9vbGVhbihhdHRyaWJ1dGUgJiYgbW9kZWwpLFxuICAgICAgaGFzRGVmYXVsdFZhbHVlczogQm9vbGVhbihkZWZhdWx0VmFsdWUgfHwgZGVmYXVsdFZhbHVlcyB8fCBkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnMpLFxuICAgICAgb3B0aW9uc1R5cGU6IHR5cGVvZiBvcHRpb25zXG4gICAgfSlcblxuICAgIGlmICgoKGRlZmF1bHRWYWx1ZSB8fCBkZWZhdWx0VmFsdWVzIHx8IGRlZmF1bHRWYWx1ZXNGcm9tT3B0aW9ucykgfHwgKGF0dHJpYnV0ZSAmJiBtb2RlbCkpICYmIHR5cGVvZiBvcHRpb25zID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5sb2FkRGVmYXVsdFZhbHVlc0Zyb21PcHRpb25zQ2FsbGJhY2soKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHt9XG5cbiAgICBpZiAoXCJ0b2dnbGVkXCIgaW4gdGhpcy5wcm9wcykge1xuICAgICAgY29uc3QgbmV3VG9nZ2xlZCA9IHRoaXMucC50b2dnbGVkXG5cbiAgICAgIGlmIChhbnl0aGluZ0RpZmZlcmVudCh0aGlzLnN0YXRlLnRvZ2dsZWQsIG5ld1RvZ2dsZWQpKSB7XG4gICAgICAgIG5ld1N0YXRlLnRvZ2dsZWQgPSBuZXdUb2dnbGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKG5ld1N0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwiY29tcG9uZW50RGlkVXBkYXRlXCIsIHtzeW5jaW5nS2V5czogT2JqZWN0LmtleXMobmV3U3RhdGUpfSlcbiAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtlbmRPZlNlbGVjdFJlZn0gPSB0aGlzLnR0XG4gICAgY29uc3Qge3RyYW5zcGFyZW50fSA9IHRoaXMucFxuICAgIGNvbnN0IHtjbGFzc05hbWUsIHBsYWNlaG9sZGVyLCB0b2dnbGVPcHRpb25zfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7b3BlbmVkLCBvcHRpb25zUGxhY2VtZW50fSA9IHRoaXMuc1xuICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy5nZXRDdXJyZW50T3B0aW9ucygpXG4gICAgY29uc3QgaWQgPSBpZEZvckNvbXBvbmVudCh0aGlzKVxuXG4gICAgY29uc3Qgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwgPSB7Li4udGhpcy5zdHlsaW5nRm9yKFwic2VsZWN0Q29udGFpbmVyXCIsIHtcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwicm93XCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0cmFuc3BhcmVudCA/IHVuZGVmaW5lZCA6IFwiI2ZmZlwiLFxuICAgICAgYm9yZGVyOiB0cmFuc3BhcmVudCA/IHVuZGVmaW5lZCA6IFwiMXB4IHNvbGlkICM5OTlcIixcbiAgICAgIGJvcmRlclJhZGl1czogdHJhbnNwYXJlbnQgPyB1bmRlZmluZWQgOiA0LFxuICAgICAgY29sb3I6IFwiIzAwMFwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIHBhZGRpbmdUb3A6IDUsXG4gICAgICBwYWRkaW5nQm90dG9tOiA1LFxuICAgICAgcGFkZGluZ0xlZnQ6IDVcbiAgICB9LCBbdHJhbnNwYXJlbnRdKX1cblxuICAgIGlmIChvcGVuZWQpIHtcbiAgICAgIC8vIFByZXZlbnQgc2VsZWN0IGZyb20gY2hhbmdpbmcgc2l6ZSBvbmNlIHRoZSBjb250ZW50IGlzIHJlcGxhY2VkIHdpdGggc2VhcmNoIHRleHQgb25jZSBvcGVuZWRcbiAgICAgIHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmhlaWdodCA9IHRoaXMucy5oZWlnaHRcblxuICAgICAgY29uc3QgYmFzZUJvcmRlclJhZGl1cyA9IHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmJvcmRlclJhZGl1c1xuXG4gICAgICBpZiAob3B0aW9uc1BsYWNlbWVudCA9PSBcImFib3ZlXCIpIHtcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wTGVmdFJhZGl1cyA9IDBcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wUmlnaHRSYWRpdXMgPSAwXG4gICAgICAgIHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzID0gYmFzZUJvcmRlclJhZGl1c1xuICAgICAgICBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzID0gYmFzZUJvcmRlclJhZGl1c1xuXG4gICAgICAgIGRlbGV0ZSBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJSYWRpdXNcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9uc1BsYWNlbWVudCA9PSBcImJlbG93XCIpIHtcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wTGVmdFJhZGl1cyA9IGJhc2VCb3JkZXJSYWRpdXNcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyU3R5bGVBY3R1YWwuYm9yZGVyVG9wUmlnaHRSYWRpdXMgPSBiYXNlQm9yZGVyUmFkaXVzXG4gICAgICAgIHNlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsLmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzID0gMFxuICAgICAgICBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzID0gMFxuXG4gICAgICAgIGRlbGV0ZSBzZWxlY3RDb250YWluZXJTdHlsZUFjdHVhbC5ib3JkZXJSYWRpdXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXdcbiAgICAgICAgZGF0YVNldD17dGhpcy5jYWNoZShcInJvb3RWaWV3RGF0YVNldFwiLCB7XG4gICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICBjb21wb25lbnQ6IFwiaGF5YS1zZWxlY3RcIixcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBvcGVuZWQsXG4gICAgICAgICAgb3B0aW9uc1BsYWNlbWVudCxcbiAgICAgICAgICB0b2dnbGVzOiBCb29sZWFuKHRvZ2dsZU9wdGlvbnMpXG4gICAgICAgIH0sIFtjbGFzc05hbWUsIGlkLCBvcGVuZWQsIG9wdGlvbnNQbGFjZW1lbnQsIEJvb2xlYW4odG9nZ2xlT3B0aW9ucyldKX1cbiAgICAgICAgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcIm1haW5cIil9XG4gICAgICA+XG4gICAgICAgIDxQcmVzc2FibGVcbiAgICAgICAgICBkYXRhU2V0PXt0aGlzLnNlbGVjdENvbnRhaW5lckRhdGFTZXQgfHw9IHtjbGFzczogXCJzZWxlY3QtY29udGFpbmVyXCJ9fVxuICAgICAgICAgIG9uTGF5b3V0PXt0aGlzLnR0Lm9uU2VsZWN0Q29udGFpbmVyTGF5b3V0fVxuICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25TZWxlY3RDbGlja2VkfVxuICAgICAgICAgIHJlZj17dGhpcy50dC5zZWxlY3RDb250YWluZXJSZWZ9XG4gICAgICAgICAgc3R5bGU9e3NlbGVjdENvbnRhaW5lclN0eWxlQWN0dWFsfVxuICAgICAgICA+XG4gICAgICAgICAgPFZpZXdcbiAgICAgICAgICAgIGRhdGFTZXQ9e3RoaXMuY3VycmVudFNlbGVjdGVkRGF0YVNldCB8fD0ge2NsYXNzOiBcImN1cnJlbnQtc2VsZWN0ZWRcIn19XG4gICAgICAgICAgICBzdHlsZT17dGhpcy5zdHlsaW5nRm9yKFwiY3VycmVudFNlbGVjdGVkXCIsIHRoaXMuY3VycmVudFNlbGVjdGVkU3R5bGUgfHw9IHt3aWR0aDogXCJjYWxjKDEwMCUgLSAyNXB4KVwiLCBmbGV4V3JhcDogXCJ3cmFwXCIsIG92ZXJmbG93OiBcImhpZGRlblwifSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge29wZW5lZCAmJlxuICAgICAgICAgICAgICA8VGV4dElucHV0XG4gICAgICAgICAgICAgICAgZGF0YVNldD17dGhpcy5zZWFyY2hUZXh0SW5wdXREYXRhU2V0IHx8PSB7Y2xhc3M6IFwic2VhcmNoLXRleHQtaW5wdXRcIn19XG4gICAgICAgICAgICAgICAgb25DaGFuZ2VUZXh0PXt0aGlzLnR0Lm9uQ2hhbmdlU2VhcmNoVGV4dH1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy50cmFuc2xhdGUoXCIuc2VhcmNoX2RvdF9kb3RfZG90XCIpfVxuICAgICAgICAgICAgICAgIHJlZj17dGhpcy50dC5zZWFyY2hUZXh0SW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcInNlYXJjaFRleHRJbnB1dFwiLCB0aGlzLnNlYXJjaFRleHRJbnB1dFN0eWxlIHx8PSB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgICAgICAgICBvdXRsaW5lOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDBcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9e3RoaXMuc2VhcmNoVGV4dFZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeyFvcGVuZWQgJiZcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7Y3VycmVudE9wdGlvbnMubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICAgIDxUZXh0IG51bWJlck9mTGluZXM9ezF9IHN0eWxlPXt0aGlzLnN0eWxpbmdGb3IoXCJub3RoaW5nU2VsZWN0ZWRcIiwgdGhpcy5ub3RoaW5nU2VsZWN0ZWRTdHlsZSB8fD0ge2NvbG9yOiBcImdyZXlcIn0pfT5cbiAgICAgICAgICAgICAgICAgICAge3BsYWNlaG9sZGVyIHx8IHRoaXMudHJhbnNsYXRlKFwiLm5vdGhpbmdfc2VsZWN0ZWRcIil9XG4gICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9ucy5sZW5ndGggPT0gMCAmJiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiICYmXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9e2lkRm9yQ29tcG9uZW50KHRoaXMpfVxuICAgICAgICAgICAgICAgICAgICBuYW1lPXtuYW1lRm9yQ29tcG9uZW50V2l0aE11bHRpcGxlKHRoaXMpfVxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAge2N1cnJlbnRPcHRpb25zLm1hcCgoY3VycmVudE9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXQ9e3RoaXMuY3VycmVudE9wdGlvbkRhdGFTZXQgfHw9IHtjbGFzczogXCJjdXJyZW50LW9wdGlvblwifX1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW50T3B0aW9uLmtleSB8fCBgY3VycmVudC12YWx1ZS0ke2N1cnJlbnRPcHRpb24udmFsdWV9YH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcImN1cnJlbnRPcHRpb25cIiwge21hcmdpblJpZ2h0OiA2fSl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9uLnR5cGUgPT0gXCJncm91cFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgPFZpZXcgc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcImN1cnJlbnRPcHRpb25Hcm91cFwiLCB0aGlzLmN1cnJlbnRPcHRpb25Hcm91cFN0eWxlIHx8PSB7Zm9udFdlaWdodDogXCJib2xkXCJ9KX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzdHlsZT17dGhpcy5zdHlsaW5nRm9yKFwiY3VycmVudE9wdGlvbkdyb3VwVGV4dFwiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9uLnRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9WaWV3PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHtjdXJyZW50T3B0aW9uLnR5cGUgIT0gXCJncm91cFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtQbGF0Zm9ybS5PUyA9PSBcIndlYlwiICYmIG5hbWVGb3JDb21wb25lbnRXaXRoTXVsdGlwbGUodGhpcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e2lkRm9yQ29tcG9uZW50KHRoaXMpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9e25hbWVGb3JDb21wb25lbnRXaXRoTXVsdGlwbGUodGhpcyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2RpZ2coY3VycmVudE9wdGlvbiwgXCJ2YWx1ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByZXNlbnRPcHRpb24oY3VycmVudE9wdGlvbiwgXCJjdXJyZW50XCIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICBkYXRhU2V0PXt0aGlzLmNoZXZyb25Db250YWluZXJEYXRhU2V0IHx8PSB7Y2xhc3M6IFwiY2hldnJvbi1jb250YWluZXJcIn19XG4gICAgICAgICAgICBzdHlsZT17dGhpcy5zdHlsaW5nRm9yKFwiY2hldnJvbkNvbnRhaW5lclwiLCB0aGlzLmNoZXZyb25Db250YWluZXJTdHlsZSB8fD0ge1xuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCJhdXRvXCIsXG4gICAgICAgICAgICAgIG1hcmdpblJpZ2h0OiA4XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Rm9udEF3ZXNvbWVJY29uIG5hbWU9e29wZW5lZCA/IFwiY2hldnJvbi11cFwiIDogXCJjaGV2cm9uLWRvd25cIn0gc3R5bGU9e3RoaXMuc3R5bGluZ0ZvcihcImNoZXZyb25cIiwgdGhpcy5jaGV2cm9uU3R5bGUgfHw9IHtmb250U2l6ZTogMTJ9KX0gLz5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgICA8Vmlld1xuICAgICAgICAgIGRhdGFTZXQ9e3RoaXMuZW5kT2ZTZWxlY3REYXRhU2V0IHx8PSB7Y2xhc3M6IFwiZW5kLW9mLXNlbGVjdFwifX1cbiAgICAgICAgICBvbkxheW91dD17dGhpcy50dC5vbkVuZE9mU2VsZWN0TGF5b3V0fVxuICAgICAgICAgIHJlZj17ZW5kT2ZTZWxlY3RSZWZ9XG4gICAgICAgIC8+XG4gICAgICAgIHtvcGVuZWQgJiYgdGhpcy5wLm9wdGlvbnNQb3J0YWwgJiZcbiAgICAgICAgICA8UG9ydGFsPlxuICAgICAgICAgICAge3RoaXMub3B0aW9uc0NvbnRhaW5lcigpfVxuICAgICAgICAgIDwvUG9ydGFsPlxuICAgICAgICB9XG4gICAgICAgIHtvcGVuZWQgJiYgIXRoaXMucC5vcHRpb25zUG9ydGFsICYmXG4gICAgICAgICAgPFZpZXc+XG4gICAgICAgICAgICB7dGhpcy5vcHRpb25zQ29udGFpbmVyKCl9XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICB9XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgZGVmYXVsdFZhbHVlcyAoKSB7XG4gICAgY29uc3Qge2F0dHJpYnV0ZSwgZGVmYXVsdFZhbHVlLCBkZWZhdWx0VmFsdWVzLCBkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnMsIG1vZGVsfSA9IHRoaXMucHJvcHNcblxuICAgIGlmIChkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnMpIHJldHVybiBkZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnNcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgaWYgKGRlZmF1bHRWYWx1ZXMpIHJldHVybiBkZWZhdWx0VmFsdWVzXG5cbiAgICBpZiAoYXR0cmlidXRlICYmIG1vZGVsKSB7XG4gICAgICBpZiAoIShhdHRyaWJ1dGUgaW4gbW9kZWwpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggYXR0cmlidXRlIG9uICR7bW9kZWwubW9kZWxDbGFzc0RhdGEoKS5uYW1lfTogJHthdHRyaWJ1dGV9YClcblxuICAgICAgcmV0dXJuIG1vZGVsW2F0dHJpYnV0ZV0oKVxuICAgIH1cbiAgfVxuXG4gIGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLnR0LmVuZE9mU2VsZWN0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBhc3luYyBsb2FkRGVmYXVsdFZhbHVlc0Zyb21PcHRpb25zQ2FsbGJhY2soKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IHRoaXMuZGVmYXVsdFZhbHVlcygpXG5cbiAgICBpZiAoIWRlZmF1bHRWYWx1ZXMpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcImxvYWREZWZhdWx0VmFsdWVzRnJvbU9wdGlvbnNDYWxsYmFja1wiLCB7ZGVmYXVsdFZhbHVlc30pXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnByb3BzLm9wdGlvbnMoe1xuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMuZ2V0U2VhcmNoVGV4dCgpLFxuICAgICAgcGFnZTogdGhpcy5nZXRBY3RpdmVQYWdlKCksXG4gICAgICB2YWx1ZXM6IGRlZmF1bHRWYWx1ZXNcbiAgICB9KVxuXG4gICAgY29uc3Qge29wdGlvbnN9ID0gdGhpcy5wYXJzZU9wdGlvbnNSZXN1bHQocmVzdWx0KVxuICAgIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHRoaXMuZGVidWdMb2coXCJsb2FkRGVmYXVsdFZhbHVlc0Zyb21PcHRpb25zQ2FsbGJhY2sucmVzdWx0XCIsIHtsb2FkZWRPcHRpb25zQ291bnQ6IG9wdGlvbnM/Lmxlbmd0aCB8fCAwfSlcblxuICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRPcHRpb25zOiB0aGlzLnN0YXRlLmN1cnJlbnRPcHRpb25zLmNvbmNhdChvcHRpb25zKX0pXG4gIH1cblxuICBsb2FkT3B0aW9ucyA9IGFzeW5jICh7cGFnZX0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtvcHRpb25zfSA9IHRoaXMucFxuICAgIGNvbnN0IHNlYXJjaFZhbHVlID0gdGhpcy5nZXRTZWFyY2hUZXh0KClcbiAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwibG9hZE9wdGlvbnNcIiwge1xuICAgICAgcGFnZSxcbiAgICAgIHNlYXJjaFZhbHVlLFxuICAgICAgb3B0aW9uc1R5cGU6IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBcImFycmF5XCIgOiB0eXBlb2Ygb3B0aW9uc1xuICAgIH0pXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZE9wdGlvbnNGcm9tQXJyYXkob3B0aW9ucywgc2VhcmNoVmFsdWUpXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdGVkUGFnZSA9IE51bWJlci5pc0Zpbml0ZShwYWdlKSA/IHBhZ2UgOiB0aGlzLmdldEFjdGl2ZVBhZ2UoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMoe3NlYXJjaFZhbHVlLCBwYWdlOiByZXF1ZXN0ZWRQYWdlfSlcbiAgICBjb25zdCB7b3B0aW9uczogbG9hZGVkT3B0aW9ucywgcGFnZTogcmVzdWx0UGFnZSwgcGFnZVNpemUsIHRvdGFsQ291bnR9ID0gdGhpcy5wYXJzZU9wdGlvbnNSZXN1bHQocmVzdWx0KVxuICAgIGNvbnN0IHJlc29sdmVkUGFnZSA9IE51bWJlci5pc0Zpbml0ZShyZXN1bHRQYWdlKSA/IHJlc3VsdFBhZ2UgOiByZXF1ZXN0ZWRQYWdlXG4gICAgY29uc3QgcmVzb2x2ZWRQYWdlU2l6ZSA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplKHtvcHRpb25zOiBsb2FkZWRPcHRpb25zLCBwYWdlOiByZXNvbHZlZFBhZ2UsIHBhZ2VTaXplLCB0b3RhbENvdW50fSlcbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gTnVtYmVyLmlzRmluaXRlKHRvdGFsQ291bnQpICYmIE51bWJlci5pc0Zpbml0ZShyZXNvbHZlZFBhZ2VTaXplKSAmJiByZXNvbHZlZFBhZ2VTaXplID4gMFxuICAgICAgPyBNYXRoLmNlaWwodG90YWxDb3VudCAvIHJlc29sdmVkUGFnZVNpemUpXG4gICAgICA6IG51bGxcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbG9hZGVkT3B0aW9ucyxcbiAgICAgIHBhZ2U6IHJlc29sdmVkUGFnZSxcbiAgICAgIHBhZ2VJbnB1dFZhbHVlOiBTdHJpbmcocmVzb2x2ZWRQYWdlKSxcbiAgICAgIHBhZ2VTaXplOiBOdW1iZXIuaXNGaW5pdGUodG90YWxDb3VudCkgPyByZXNvbHZlZFBhZ2VTaXplIDogbnVsbCxcbiAgICAgIHRvdGFsQ291bnQ6IE51bWJlci5pc0Zpbml0ZSh0b3RhbENvdW50KSA/IHRvdGFsQ291bnQgOiBudWxsXG4gICAgfSwgKCkgPT4gdGhpcy5wcm9wcy5vbk9wdGlvbnNMb2FkZWQ/Lih7b3B0aW9uczogbG9hZGVkT3B0aW9uc30pKVxuXG4gICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcImxvYWRPcHRpb25zLnJlc3VsdFwiLCB7XG4gICAgICBsb2FkZWRPcHRpb25zQ291bnQ6IGxvYWRlZE9wdGlvbnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgcmVzb2x2ZWRQYWdlLFxuICAgICAgcmVzb2x2ZWRQYWdlU2l6ZSxcbiAgICAgIHRvdGFsQ291bnQ6IE51bWJlci5pc0Zpbml0ZSh0b3RhbENvdW50KSA/IHRvdGFsQ291bnQgOiBudWxsXG4gICAgfSlcbiAgfVxuXG4gIGhheWFTZWxlY3RPcHRpb24oe2tleSwgbG9hZGVkT3B0aW9ufSkge1xuICAgIGlmIChsb2FkZWRPcHRpb24udHlwZSA9PSBcImdyb3VwXCIpIHtcbiAgICAgIHJldHVybiA8T3B0aW9uR3JvdXAga2V5PXtrZXl9IG9wdGlvbj17bG9hZGVkT3B0aW9ufSAvPlxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8T3B0aW9uXG4gICAgICAgIGN1cnJlbnRPcHRpb25WYWx1ZXM9e3RoaXMuZ2V0Q3VycmVudE9wdGlvblZhbHVlcygpfVxuICAgICAgICBpY29uPXt0aGlzLmljb25Gb3JPcHRpb24obG9hZGVkT3B0aW9uKX1cbiAgICAgICAga2V5PXtrZXl9XG4gICAgICAgIG9wdGlvbj17bG9hZGVkT3B0aW9ufVxuICAgICAgICBvbk9wdGlvbkNsaWNrZWQ9e3RoaXMudHQub25PcHRpb25DbGlja2VkfVxuICAgICAgICBwcmVzZW50T3B0aW9uPXt0aGlzLnR0LnByZXNlbnRPcHRpb259XG4gICAgICAgIHNlbGVjdGVkQmFja2dyb3VuZENvbG9yPXt0aGlzLnByb3BzLnNlbGVjdGVkQmFja2dyb3VuZENvbG9yfVxuICAgICAgICBzZWxlY3RlZEhvdmVyQmFja2dyb3VuZENvbG9yPXt0aGlzLnByb3BzLnNlbGVjdGVkSG92ZXJCYWNrZ3JvdW5kQ29sb3J9XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIGxvYWRPcHRpb25zRnJvbUFycmF5KG9wdGlvbnMsIHNlYXJjaFZhbHVlKSB7XG4gICAgY29uc3QgbG93ZXJTZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlPy50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgbG9hZGVkT3B0aW9ucyA9IG9wdGlvbnMuZmlsdGVyKCh7dGV4dH0pID0+ICFsb3dlclNlYXJjaFZhbHVlIHx8IHRleHQ/LnRvTG93ZXJDYXNlKCk/LmluY2x1ZGVzKGxvd2VyU2VhcmNoVmFsdWUpKVxuICAgIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHRoaXMuZGVidWdMb2coXCJsb2FkT3B0aW9uc0Zyb21BcnJheVwiLCB7XG4gICAgICB0b3RhbE9wdGlvbnNDb3VudDogb3B0aW9ucy5sZW5ndGgsXG4gICAgICBzZWFyY2hWYWx1ZSxcbiAgICAgIGxvYWRlZE9wdGlvbnNDb3VudDogbG9hZGVkT3B0aW9ucy5sZW5ndGhcbiAgICB9KVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBsb2FkZWRPcHRpb25zLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VJbnB1dFZhbHVlOiBcIjFcIixcbiAgICAgIHBhZ2VTaXplOiBudWxsLFxuICAgICAgdG90YWxDb3VudDogbnVsbFxuICAgIH0pXG4gIH1cblxuICBvbkRpbWVuc2lvbnNDaGFuZ2UgPSAoe3dpbmRvd30pID0+IHtcbiAgICB0aGlzLndpbmRvd1dpZHRoID0gd2luZG93LndpZHRoXG4gICAgdGhpcy53aW5kb3dIZWlnaHQgPSB3aW5kb3cuaGVpZ2h0XG4gIH1cblxuICBvblNlbGVjdENvbnRhaW5lckxheW91dCA9IChlKSA9PiB0aGlzLnNldFN0YXRlKHtzZWxlY3RDb250YWluZXJMYXlvdXQ6IE9iamVjdC5hc3NpZ24oe30sIGRpZ2coZSwgXCJuYXRpdmVFdmVudFwiLCBcImxheW91dFwiKSl9KVxuICBvbkVuZE9mU2VsZWN0TGF5b3V0ID0gKGUpID0+IHtcbiAgICBjb25zdCBlbmRPZlNlbGVjdExheW91dCA9IE9iamVjdC5hc3NpZ24oe30sIGRpZ2coZSwgXCJuYXRpdmVFdmVudFwiLCBcImxheW91dFwiKSlcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtlbmRPZlNlbGVjdExheW91dH1cblxuICAgIGlmICh0aGlzLnMub3BlbmVkICYmIGVuZE9mU2VsZWN0TGF5b3V0Py53aWR0aCkge1xuICAgICAgbmV3U3RhdGUub3B0aW9uc1dpZHRoID0gZW5kT2ZTZWxlY3RMYXlvdXQud2lkdGhcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zLm9wZW5lZCAmJiB0aGlzLnMub3B0aW9uc0NvbnRhaW5lckxheW91dCkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIG9uT3B0aW9uc0NvbnRhaW5lckxheW91dCA9IChlKSA9PiB0aGlzLnNldFN0YXRlKHtvcHRpb25zQ29udGFpbmVyTGF5b3V0OiBPYmplY3QuYXNzaWduKHt9LCBkaWdnKGUsIFwibmF0aXZlRXZlbnRcIiwgXCJsYXlvdXRcIikpfSlcblxuICBvblNlbGVjdENsaWNrZWQgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgIGNvbnN0IHtvcGVuZWR9ID0gdGhpcy5zXG4gICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcIm9uU2VsZWN0Q2xpY2tlZFwiLCB7b3BlbmVkfSlcblxuICAgIGlmIChvcGVuZWQpIHtcbiAgICAgIHRoaXMuY2xvc2VPcHRpb25zKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuT3B0aW9ucygpXG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hUZXh0SW5wdXRDaGFuZ2VkRGVib3VuY2VkID0gZGVib3VuY2UodGhpcy50dC5sb2FkT3B0aW9ucywgMjAwKVxuXG4gIGNsb3NlT3B0aW9ucyh7b3B0aW9uc30gPSB7fSkge1xuICAgIGNvbnN0IGNsb3NlZE9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMuZ2V0Q3VycmVudE9wdGlvbnMoKVxuICAgIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHRoaXMuZGVidWdMb2coXCJjbG9zZU9wdGlvbnNcIiwge2Nsb3NlZE9wdGlvbnNDb3VudDogY2xvc2VkT3B0aW9ucz8ubGVuZ3RoIHx8IDB9KVxuXG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgaGVpZ2h0OiBudWxsLFxuICAgICAgICBsb2FkZWRPcHRpb25zOiB1bmRlZmluZWQsXG4gICAgICAgIG9wZW5lZDogZmFsc2UsXG4gICAgICAgIG9wdGlvbnNDb250YWluZXJMYXlvdXQ6IG51bGwsXG4gICAgICAgIG9wdGlvbnNWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBwYWdlSW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgICAgcGFnZUlucHV0VmFsdWU6IFwiMVwiLFxuICAgICAgICBwYWdlU2l6ZTogbnVsbCxcbiAgICAgICAgdG90YWxDb3VudDogbnVsbFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcImNsb3NlT3B0aW9ucy5kb25lXCIsIHtvcGVuZWQ6IHRoaXMucy5vcGVuZWQsIG9wdGlvbnNWaXNpYmlsaXR5OiB0aGlzLnMub3B0aW9uc1Zpc2liaWxpdHl9KVxuICAgICAgfVxuICAgIClcblxuICAgIGlmICh0aGlzLnByb3BzLm9uT3B0aW9uc0Nsb3NlZCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk9wdGlvbnNDbG9zZWQoe29wdGlvbnM6IGNsb3NlZE9wdGlvbnN9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLnAub25CbHVyKSB0aGlzLnAub25CbHVyKClcbiAgfVxuXG4gIGdldFNlYXJjaFRleHQgPSAoKSA9PiB0aGlzLnNlYXJjaFRleHRWYWx1ZSB8fCBcIlwiXG5cbiAgcmVzZXRTZWFyY2hUZXh0SW5wdXQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZWFyY2hUZXh0VmFsdWUgPSBcIlwiXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnR0LnNlYXJjaFRleHRJbnB1dFJlZi5jdXJyZW50XG5cbiAgICBpZiAoaW5wdXQ/LmNsZWFyKSB7XG4gICAgICBpbnB1dC5jbGVhcigpXG4gICAgfSBlbHNlIGlmIChpbnB1dD8uc2V0TmF0aXZlUHJvcHMpIHtcbiAgICAgIGlucHV0LnNldE5hdGl2ZVByb3BzKHt0ZXh0OiBcIlwifSlcbiAgICB9IGVsc2UgaWYgKGlucHV0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IFwiXCJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElnbm9yZSBpZiB0aGUgcmVmIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3QgdmFsdWUgYXNzaWdubWVudC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZVNlYXJjaFRleHQgPSAoc2VhcmNoVGV4dCkgPT4ge1xuICAgIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHRoaXMuZGVidWdMb2coXCJvbkNoYW5nZVNlYXJjaFRleHRcIiwge3NlYXJjaFRleHQsIGN1cnJlbnRQYWdlOiB0aGlzLnMucGFnZX0pXG4gICAgdGhpcy5zZWFyY2hUZXh0VmFsdWUgPSBzZWFyY2hUZXh0XG5cbiAgICBpZiAodGhpcy5zLnBhZ2UgIT0gMSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7cGFnZTogMSwgcGFnZUlucHV0VmFsdWU6IFwiMVwifSwgdGhpcy50dC5vblNlYXJjaFRleHRJbnB1dENoYW5nZWREZWJvdW5jZWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHQub25TZWFyY2hUZXh0SW5wdXRDaGFuZ2VkRGVib3VuY2VkKClcbiAgICB9XG4gIH1cblxuICBvcGVuT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwib3Blbk9wdGlvbnNcIiwge1xuICAgICAgY3VycmVudE9wdGlvbnNDb3VudDogdGhpcy5nZXRDdXJyZW50T3B0aW9ucygpPy5sZW5ndGggfHwgMCxcbiAgICAgIHNlYXJjaEVuYWJsZWQ6IHRoaXMucC5zZWFyY2hcbiAgICB9KVxuICAgIHRoaXMuc2VhcmNoVGV4dFZhbHVlID0gXCJcIlxuICAgIHRoaXMuY2FsbE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuID0gdHJ1ZVxuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB7XG4gICAgICAgIGhlaWdodDogdGhpcy5zLnNlbGVjdENvbnRhaW5lckxheW91dC5oZWlnaHQsXG4gICAgICAgIG9wZW5lZDogdHJ1ZSxcbiAgICAgICAgb3B0aW9uc1BsYWNlbWVudDogXCJiZWxvd1wiLFxuICAgICAgICBvcHRpb25zVmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICAgICAgb3B0aW9uc1dpZHRoOiB0aGlzLnMuZW5kT2ZTZWxlY3RMYXlvdXQ/LndpZHRoLFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBwYWdlSW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgICAgcGFnZUlucHV0VmFsdWU6IFwiMVwiLFxuICAgICAgICBzY3JvbGxMZWZ0OiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgOiBudWxsLFxuICAgICAgICBzY3JvbGxUb3A6IFBsYXRmb3JtLk9TID09IFwid2ViXCIgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIDogbnVsbFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldFNlYXJjaFRleHRJbnB1dCgpXG4gICAgICAgIHRoaXMuZm9jdXNUZXh0SW5wdXQoKVxuICAgICAgICB0aGlzLmxvYWRPcHRpb25zKHtwYWdlOiAxfSlcbiAgICAgIH1cbiAgICApXG5cbiAgICBpZiAodGhpcy5wLm9uRm9jdXMpIHRoaXMucC5vbkZvY3VzKClcbiAgfVxuXG4gIGZvY3VzVGV4dElucHV0ID0gKCkgPT4gZGlnZyh0aGlzLnR0LnNlYXJjaFRleHRJbnB1dFJlZiwgXCJjdXJyZW50XCIpPy5mb2N1cygpXG5cbiAgc2V0T3B0aW9uc1Bvc2l0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICByZXR1cm4gLy8gRGVib3VuY2UgYWZ0ZXIgdW4tbW91bnQgaGFuZGVsaW5nLlxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHRoaXMuZGVidWdMb2coXCJzZXRPcHRpb25zUG9zaXRpb25cIilcbiAgICB0aGlzLmNhbGxPcHRpb25zUG9zaXRpb25BYm92ZUlmT3V0c2lkZVNjcmVlbiA9IHRydWVcbiAgICB0aGlzLnNldE9wdGlvbnNQb3NpdGlvbkJlbG93KClcbiAgfVxuXG4gIHNldE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuKCkge1xuICAgIGNvbnN0IHt3aW5kb3dIZWlnaHR9ID0gdGhpcy50dFxuICAgIGNvbnN0IHtvcHRpb25zQ29udGFpbmVyTGF5b3V0fSA9IHRoaXMuc1xuICAgIGNvbnN0IGVuZE9mU2VsZWN0TGF5b3V0ID0gdGhpcy5zLmVuZE9mU2VsZWN0TGF5b3V0XG5cbiAgICBpZiAoIWVuZE9mU2VsZWN0TGF5b3V0KSB7XG4gICAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwic2V0T3B0aW9uc1Bvc2l0aW9uQWJvdmVJZk91dHNpZGVTY3JlZW5cIiwge3BsYWNlbWVudDogXCJiZWxvd1wiLCByZWFzb246IFwibWlzc2luZy1lbmQtb2Ytc2VsZWN0LWxheW91dFwifSlcbiAgICAgIHRoaXMuc2V0U3RhdGUoe29wdGlvbnNWaXNpYmlsaXR5OiBcInZpc2libGVcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zVG9wID0gZW5kT2ZTZWxlY3RMYXlvdXQudG9wXG4gICAgY29uc3Qgb3B0aW9uc1RvdGFsQm90dG9tUG9zaXRpb24gPSBvcHRpb25zQ29udGFpbmVyTGF5b3V0LmhlaWdodCArIG9wdGlvbnNUb3BcbiAgICBjb25zdCB3aW5kb3dIZWlnaHRXaXRoU2Nyb2xsID0gd2luZG93SGVpZ2h0ICsgdGhpcy5zLnNjcm9sbFRvcFxuXG4gICAgaWYgKHdpbmRvd0hlaWdodFdpdGhTY3JvbGwgPCBvcHRpb25zVG90YWxCb3R0b21Qb3NpdGlvbikge1xuICAgICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcInNldE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuXCIsIHtwbGFjZW1lbnQ6IFwiYWJvdmVcIn0pXG4gICAgICB0aGlzLnNldE9wdGlvbnNQb3NpdGlvbkFib3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcInNldE9wdGlvbnNQb3NpdGlvbkFib3ZlSWZPdXRzaWRlU2NyZWVuXCIsIHtwbGFjZW1lbnQ6IFwiYmVsb3dcIn0pXG4gICAgICB0aGlzLnNldFN0YXRlKHtvcHRpb25zVmlzaWJpbGl0eTogXCJ2aXNpYmxlXCJ9KVxuICAgIH1cbiAgfVxuXG4gIHNldE9wdGlvbnNQb3NpdGlvbkFib3ZlKCkge1xuICAgIGNvbnN0IHtlbmRPZlNlbGVjdExheW91dH0gPSB0aGlzLnNcbiAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwic2V0T3B0aW9uc1Bvc2l0aW9uQWJvdmVcIilcblxuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB7XG4gICAgICAgIG9wZW5lZDogdHJ1ZSxcbiAgICAgICAgb3B0aW9uc1BsYWNlbWVudDogXCJhYm92ZVwiLFxuICAgICAgICBvcHRpb25zVmlzaWJpbGl0eTogXCJ2aXNpYmxlXCIsXG4gICAgICAgIG9wdGlvbnNXaWR0aDogZW5kT2ZTZWxlY3RMYXlvdXQ/LndpZHRoXG4gICAgICB9LFxuICAgICAgKCkgPT4gdGhpcy5mb2N1c1RleHRJbnB1dCgpXG4gICAgKVxuICB9XG5cbiAgc2V0T3B0aW9uc1Bvc2l0aW9uQmVsb3coKSB7XG4gICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcInNldE9wdGlvbnNQb3NpdGlvbkJlbG93XCIpXG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgb3BlbmVkOiB0cnVlLFxuICAgICAgICBvcHRpb25zUGxhY2VtZW50OiBcImJlbG93XCIsXG4gICAgICAgIG9wdGlvbnNWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgICAgICBvcHRpb25zV2lkdGg6IHRoaXMucy5lbmRPZlNlbGVjdExheW91dD8ud2lkdGhcbiAgICAgIH0sXG4gICAgICAoKSA9PiB0aGlzLmZvY3VzVGV4dElucHV0KClcbiAgICApXG4gIH1cblxuICBvbkFueXRoaW5nUmVzaXplZCA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwib25Bbnl0aGluZ1Jlc2l6ZWRcIiwge29wZW5lZDogdGhpcy5zLm9wZW5lZH0pXG4gICAgaWYgKHRoaXMucy5vcGVuZWQpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9uc1Bvc2l0aW9uKClcbiAgICB9XG4gIH1cblxuICBvbkFueXRoaW5nUmVzaXplZERlYm91bmNlZCA9IGRlYm91bmNlKHRoaXMudHQub25Bbnl0aGluZ1Jlc2l6ZWQsIDI1KVxuXG4gIG9uQW55dGhpbmdTY3JvbGxlZCA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwib25Bbnl0aGluZ1Njcm9sbGVkXCIsIHtvcGVuZWQ6IHRoaXMucy5vcGVuZWR9KVxuICAgIGlmICh0aGlzLnMub3BlbmVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsTGVmdDogUGxhdGZvcm0uT1MgPT0gXCJ3ZWJcIiA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IDogbnVsbCxcbiAgICAgICAgc2Nyb2xsVG9wOiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IG51bGxcbiAgICAgIH0pXG4gICAgICB0aGlzLnNldE9wdGlvbnNQb3NpdGlvbigpXG4gICAgfVxuICB9XG5cbiAgb25Bbnl0aGluZ1Njcm9sbGVkRGVib3VuY2VkID0gZGVib3VuY2UodGhpcy50dC5vbkFueXRoaW5nU2Nyb2xsZWQsIDI1KVxuXG4gIG9uUHJlc3NPdXRzaWRlT3B0aW9ucyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwib25QcmVzc091dHNpZGVPcHRpb25zXCIsIHtvcGVuZWQ6IHRoaXMucy5vcGVuZWR9KVxuICAgIC8vIElmIG9wdGlvbnMgYXJlIG9wZW4gYW5kIGEgY2xpY2sgaXMgbWFkZSBvdXRzaWRlIG9mIHRoZSBvcHRpb25zIGNvbnRhaW5lclxuICAgIGlmICh0aGlzLnMub3BlbmVkKSB7XG4gICAgICB0aGlzLmNsb3NlT3B0aW9ucygpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH0gKi9cbiAgcGFnaW5hdGlvblRvdGFsUGFnZXMoKSB7XG4gICAgY29uc3Qge3RvdGFsQ291bnR9ID0gdGhpcy5zXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0b3RhbENvdW50KSB8fCB0b3RhbENvdW50IDw9IDApIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplKHtcbiAgICAgIG9wdGlvbnM6IHRoaXMucy5sb2FkZWRPcHRpb25zIHx8IFtdLFxuICAgICAgcGFnZTogdGhpcy5nZXRBY3RpdmVQYWdlKCksXG4gICAgICBwYWdlU2l6ZTogdGhpcy5zLnBhZ2VTaXplLFxuICAgICAgdG90YWxDb3VudFxuICAgIH0pXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYWdlU2l6ZSkgfHwgcGFnZVNpemUgPD0gMCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBNYXRoLmNlaWwodG90YWxDb3VudCAvIHBhZ2VTaXplKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0b3RhbFBhZ2VzXG4gICAqIEByZXR1cm5zIHtBcnJheTx7a2V5OiBzdHJpbmcsIHR5cGU6IFwicGFnZVwifFwiZWxsaXBzaXNcIiwgdmFsdWU/OiBudW1iZXJ9Pn1cbiAgICovXG4gIHBhZ2luYXRpb25QYWdlSXRlbXModG90YWxQYWdlcykge1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5nZXRBY3RpdmVQYWdlKClcbiAgICBjb25zdCBpdGVtcyA9IFtdXG4gICAgY29uc3QgYWRkUGFnZSA9IChwYWdlKSA9PiBpdGVtcy5wdXNoKHtrZXk6IGBwYWdlLSR7cGFnZX1gLCB0eXBlOiBcInBhZ2VcIiwgdmFsdWU6IHBhZ2V9KVxuICAgIGNvbnN0IGFkZEVsbGlwc2lzID0gKGtleSkgPT4gaXRlbXMucHVzaCh7a2V5LCB0eXBlOiBcImVsbGlwc2lzXCJ9KVxuXG4gICAgaWYgKHRvdGFsUGFnZXMgPD0gNykge1xuICAgICAgZm9yIChsZXQgcGFnZSA9IDE7IHBhZ2UgPD0gdG90YWxQYWdlczsgcGFnZSArPSAxKSB7XG4gICAgICAgIGFkZFBhZ2UocGFnZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgYWRkUGFnZSgxKVxuXG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IDJcbiAgICBsZXQgc3RhcnQgPSBNYXRoLm1heCgyLCBjdXJyZW50UGFnZSAtIHdpbmRvd1NpemUpXG4gICAgbGV0IGVuZCA9IE1hdGgubWluKHRvdGFsUGFnZXMgLSAxLCBjdXJyZW50UGFnZSArIHdpbmRvd1NpemUpXG5cbiAgICBpZiAoY3VycmVudFBhZ2UgPD0gMykge1xuICAgICAgc3RhcnQgPSAyXG4gICAgICBlbmQgPSBNYXRoLm1pbih0b3RhbFBhZ2VzIC0gMSwgNSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IHRvdGFsUGFnZXMgLSAyKSB7XG4gICAgICBlbmQgPSB0b3RhbFBhZ2VzIC0gMVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgyLCB0b3RhbFBhZ2VzIC0gNClcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiAyKSBhZGRFbGxpcHNpcyhcImVsbGlwc2lzLXN0YXJ0XCIpXG5cbiAgICBmb3IgKGxldCBwYWdlID0gc3RhcnQ7IHBhZ2UgPD0gZW5kOyBwYWdlICs9IDEpIHtcbiAgICAgIGFkZFBhZ2UocGFnZSlcbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgdG90YWxQYWdlcyAtIDEpIGFkZEVsbGlwc2lzKFwiZWxsaXBzaXMtZW5kXCIpXG5cbiAgICBhZGRQYWdlKHRvdGFsUGFnZXMpXG5cbiAgICByZXR1cm4gaXRlbXNcbiAgfVxuXG4gIHBhZ2luYXRpb25EaXNwbGF5VmFsdWUodG90YWxQYWdlcykge1xuICAgIGNvbnN0IGFjdGl2ZVBhZ2UgPSB0aGlzLmdldEFjdGl2ZVBhZ2UoKVxuICAgIGNvbnN0IGZhbGxiYWNrVGV4dCA9IGBQYWdlICR7YWN0aXZlUGFnZX0gb2YgJHt0b3RhbFBhZ2VzfWBcblxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZShcIi5wYWdpbmF0aW9uX3BhZ2Vfb2ZfcGFnZXNcIiwge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxsYmFja1RleHQsXG4gICAgICBwYWdlOiBhY3RpdmVQYWdlLFxuICAgICAgdG90YWxQYWdlc1xuICAgIH0pIHx8IGZhbGxiYWNrVGV4dFxuICB9XG5cbiAgcGFnaW5hdGlvbklucHV0VmFsdWUodG90YWxQYWdlcykge1xuICAgIGlmICh0aGlzLnMucGFnZUlucHV0Rm9jdXNlZCkgcmV0dXJuIHRoaXMucy5wYWdlSW5wdXRWYWx1ZVxuXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvbkRpc3BsYXlWYWx1ZSh0b3RhbFBhZ2VzKVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7bnVtYmVyfSBwYWdlICovXG4gIHNldFBhZ2luYXRpb25QYWdlID0gKHBhZ2UpID0+IHtcbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gdGhpcy5wYWdpbmF0aW9uVG90YWxQYWdlcygpXG4gICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcInNldFBhZ2luYXRpb25QYWdlXCIsIHtyZXF1ZXN0ZWRQYWdlOiBwYWdlLCB0b3RhbFBhZ2VzfSlcblxuICAgIGlmICghdG90YWxQYWdlcykgcmV0dXJuXG5cbiAgICBjb25zdCBuZXh0UGFnZSA9IE1hdGgubWluKE1hdGgubWF4KE1hdGguZmxvb3IocGFnZSksIDEpLCB0b3RhbFBhZ2VzKVxuXG4gICAgaWYgKG5leHRQYWdlID09IHRoaXMuZ2V0QWN0aXZlUGFnZSgpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtwYWdlSW5wdXRWYWx1ZTogU3RyaW5nKHRoaXMuZ2V0QWN0aXZlUGFnZSgpKX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAge3BhZ2U6IG5leHRQYWdlLCBwYWdlSW5wdXRWYWx1ZTogU3RyaW5nKG5leHRQYWdlKX0sXG4gICAgICAoKSA9PiB0aGlzLnR0LmxvYWRPcHRpb25zKHtwYWdlOiBuZXh0UGFnZX0pXG4gICAgKVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7aW1wb3J0KFwicmVhY3RcIikuU3ludGhldGljRXZlbnR9IGV2ZW50ICovXG4gIG9uUGFnaW5hdGlvblByZXZQcmVzc2VkID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKVxuXG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uUGFnZSh0aGlzLmdldEFjdGl2ZVBhZ2UoKSAtIDEpXG4gIH1cblxuICAvKiogQHBhcmFtIHtpbXBvcnQoXCJyZWFjdFwiKS5TeW50aGV0aWNFdmVudH0gZXZlbnQgKi9cbiAgb25QYWdpbmF0aW9uTmV4dFByZXNzZWQgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdD8uKClcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24/LigpXG5cbiAgICB0aGlzLnNldFBhZ2luYXRpb25QYWdlKHRoaXMuZ2V0QWN0aXZlUGFnZSgpICsgMSlcbiAgfVxuXG4gIG9uUGFnaW5hdGlvbklucHV0Rm9jdXMgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBwYWdlSW5wdXRGb2N1c2VkOiB0cnVlLFxuICAgICAgcGFnZUlucHV0VmFsdWU6IFN0cmluZyh0aGlzLmdldEFjdGl2ZVBhZ2UoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAqL1xuICBvblBhZ2luYXRpb25JbnB1dENoYW5nZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe3BhZ2VJbnB1dFZhbHVlOiB2YWx1ZX0pXG4gIH1cblxuICAvKiogQHBhcmFtIHtpbXBvcnQoXCJyZWFjdFwiKS5TeW50aGV0aWNFdmVudH0gZXZlbnQgKi9cbiAgb25QYWdpbmF0aW9uSW5wdXRCbHVyID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKVxuXG4gICAgY29uc3QgdG90YWxQYWdlcyA9IHRoaXMucGFnaW5hdGlvblRvdGFsUGFnZXMoKVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQ/LnRhcmdldD8udmFsdWUgPz8gdGhpcy5zLnBhZ2VJbnB1dFZhbHVlXG4gICAgY29uc3QgcGFyc2VkVmFsdWUgPSByYXdWYWx1ZSA/IE51bWJlcihTdHJpbmcocmF3VmFsdWUpLm1hdGNoKC9cXGQrLyk/LlswXSkgOiBOYU5cbiAgICBjb25zdCBuZXh0UGFnZSA9IE51bWJlci5pc0Zpbml0ZShwYXJzZWRWYWx1ZSkgPyBwYXJzZWRWYWx1ZSA6IE51bWJlcih0aGlzLnMucGFnZUlucHV0VmFsdWUpXG5cbiAgICBpZiAodG90YWxQYWdlcyAmJiBOdW1iZXIuaXNGaW5pdGUobmV4dFBhZ2UpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtwYWdlSW5wdXRGb2N1c2VkOiBmYWxzZX0sICgpID0+IHRoaXMuc2V0UGFnaW5hdGlvblBhZ2UobmV4dFBhZ2UpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBwYWdlSW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHBhZ2VJbnB1dFZhbHVlOiBTdHJpbmcodGhpcy5nZXRBY3RpdmVQYWdlKCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge2ltcG9ydChcInJlYWN0XCIpLlN5bnRoZXRpY0V2ZW50fSBldmVudCAqL1xuICBvblBhZ2luYXRpb25JbnB1dFN1Ym1pdCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Py4oKVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbj8uKClcblxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSB0aGlzLnBhZ2luYXRpb25Ub3RhbFBhZ2VzKClcblxuICAgIGlmICghdG90YWxQYWdlcykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHBhZ2VJbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgICBwYWdlSW5wdXRWYWx1ZTogU3RyaW5nKHRoaXMuZ2V0QWN0aXZlUGFnZSgpKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5leHRQYWdlID0gTnVtYmVyKHRoaXMucy5wYWdlSW5wdXRWYWx1ZSlcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG5leHRQYWdlKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHBhZ2VJbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgICBwYWdlSW5wdXRWYWx1ZTogU3RyaW5nKHRoaXMuZ2V0QWN0aXZlUGFnZSgpKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe3BhZ2VJbnB1dEZvY3VzZWQ6IGZhbHNlfSwgKCkgPT4gdGhpcy5zZXRQYWdpbmF0aW9uUGFnZShuZXh0UGFnZSkpXG4gIH1cblxuICAvKiogQHBhcmFtIHtpbXBvcnQoXCJyZWFjdFwiKS5TeW50aGV0aWNFdmVudH0gZXZlbnQgKi9cbiAgb25QYWdpbmF0aW9uSW5wdXRLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50Py5rZXkgIT09IFwiRW50ZXJcIikgcmV0dXJuXG5cbiAgICB0aGlzLnR0Lm9uUGFnaW5hdGlvbklucHV0U3VibWl0KGV2ZW50KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV8bnVsbH0gKi9cbiAgcGFnaW5hdGlvbkNvbnRyb2xzKCkge1xuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSB0aGlzLnBhZ2luYXRpb25Ub3RhbFBhZ2VzKClcblxuICAgIGlmICghdG90YWxQYWdlcyB8fCB0b3RhbFBhZ2VzIDw9IDEpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuZ2V0QWN0aXZlUGFnZSgpXG4gICAgY29uc3QgcHJldkRpc2FibGVkID0gY3VycmVudFBhZ2UgPD0gMVxuICAgIGNvbnN0IG5leHREaXNhYmxlZCA9IGN1cnJlbnRQYWdlID49IHRvdGFsUGFnZXNcblxuICAgIHJldHVybiAoXG4gICAgICA8Vmlld1xuICAgICAgICBkYXRhU2V0PXtkYXRhU2V0cy5wYWdpbmF0aW9uQ29udGFpbmVyIHx8PSB7Y2xhc3M6IFwib3B0aW9ucy1wYWdpbmF0aW9uXCJ9fVxuICAgICAgICBzdHlsZT17c3R5bGVzLnBhZ2luYXRpb25Db250YWluZXIgfHw9IHtcbiAgICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkICNlMmU4ZjBcIixcbiAgICAgICAgICBwYWRkaW5nOiA4XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxWaWV3XG4gICAgICAgICAgZGF0YVNldD17ZGF0YVNldHMucGFnaW5hdGlvbkhlYWRlciB8fD0ge2NsYXNzOiBcInBhZ2luYXRpb24taGVhZGVyXCJ9fVxuICAgICAgICAgIHN0eWxlPXtzdHlsZXMucGFnaW5hdGlvbkhlYWRlciB8fD0ge2ZsZXhEaXJlY3Rpb246IFwicm93XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIGp1c3RpZnlDb250ZW50OiBcInNwYWNlLWJldHdlZW5cIn19XG4gICAgICAgID5cbiAgICAgICAgICA8UHJlc3NhYmxlXG4gICAgICAgICAgICBkYXRhU2V0PXtkYXRhU2V0cy5wYWdpbmF0aW9uUHJldkJ1dHRvbiB8fD0ge2NsYXNzOiBcInBhZ2luYXRpb24tcHJldlwifX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtwcmV2RGlzYWJsZWR9XG4gICAgICAgICAgICBvblByZXNzPXt0aGlzLnR0Lm9uUGFnaW5hdGlvblByZXZQcmVzc2VkfVxuICAgICAgICAgICAgc3R5bGU9e3N0eWxlc1tgcGFnaW5hdGlvbk5hdkJ1dHRvbi0ke3ByZXZEaXNhYmxlZH1gXSB8fD0ge1xuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y4ZmFmY1wiLFxuICAgICAgICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNjYmQ1ZTFcIixcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA4LFxuICAgICAgICAgICAgICBoZWlnaHQ6IDMwLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgb3BhY2l0eTogcHJldkRpc2FibGVkID8gMC40IDogMSxcbiAgICAgICAgICAgICAgd2lkdGg6IDMwXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxGb250QXdlc29tZUljb25cbiAgICAgICAgICAgICAgbmFtZT1cImNoZXZyb24tbGVmdFwiXG4gICAgICAgICAgICAgIHN0eWxlPXtzdHlsZXMucGFnaW5hdGlvbk5hdkljb24gfHw9IHtjb2xvcjogXCIjMzM0MTU1XCIsIGZvbnRTaXplOiAxMn19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICBkYXRhU2V0PXt0aGlzLmNhY2hlKFwicGFnaW5hdGlvbkxhYmVsRGF0YVNldFwiLCB7XG4gICAgICAgICAgICAgIGNsYXNzOiBcInBhZ2luYXRpb24tbGFiZWxcIixcbiAgICAgICAgICAgICAgcGFnZTogY3VycmVudFBhZ2VcbiAgICAgICAgICAgIH0sIFtjdXJyZW50UGFnZV0pfVxuICAgICAgICAgICAgc3R5bGU9e3N0eWxlcy5wYWdpbmF0aW9uTGFiZWxCdXR0b24gfHw9IHtcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmMWY1ZjlcIixcbiAgICAgICAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjY2JkNWUxXCIsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMTQsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBtaW5XaWR0aDogMTQwLFxuICAgICAgICAgICAgICBwYWRkaW5nSG9yaXpvbnRhbDogMTAsXG4gICAgICAgICAgICAgIHBhZGRpbmdWZXJ0aWNhbDogNlxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGV4dElucHV0XG4gICAgICAgICAgICAgIGRhdGFTZXQ9e2RhdGFTZXRzLnBhZ2luYXRpb25JbnB1dCB8fD0ge2NsYXNzOiBcInBhZ2luYXRpb24taW5wdXRcIn19XG4gICAgICAgICAgICAgIGtleWJvYXJkVHlwZT1cIm51bWJlci1wYWRcIlxuICAgICAgICAgICAgICBvbkJsdXI9e3RoaXMudHQub25QYWdpbmF0aW9uSW5wdXRCbHVyfVxuICAgICAgICAgICAgICBvbkNoYW5nZVRleHQ9e3RoaXMudHQub25QYWdpbmF0aW9uSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgIG9uRm9jdXM9e3RoaXMudHQub25QYWdpbmF0aW9uSW5wdXRGb2N1c31cbiAgICAgICAgICAgICAgb25QcmVzc0luPXt0aGlzLnR0Lm9uUGFnaW5hdGlvbklucHV0Rm9jdXN9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy50dC5vblBhZ2luYXRpb25JbnB1dEtleURvd259XG4gICAgICAgICAgICAgIG9uU3VibWl0RWRpdGluZz17dGhpcy50dC5vblBhZ2luYXRpb25JbnB1dFN1Ym1pdH1cbiAgICAgICAgICAgICAgcmVmPXt0aGlzLnR0LnBhZ2VJbnB1dFJlZn1cbiAgICAgICAgICAgICAgc2VsZWN0VGV4dE9uRm9jdXNcbiAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlcy5wYWdpbmF0aW9uSW5wdXRTdHlsZSB8fD0ge1xuICAgICAgICAgICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgICAgICAgICBjb2xvcjogXCIjMGYxNzJhXCIsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgICAgIG91dGxpbmU6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxMjBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgdmFsdWU9e3RoaXMucGFnaW5hdGlvbklucHV0VmFsdWUodG90YWxQYWdlcyl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICA8UHJlc3NhYmxlXG4gICAgICAgICAgICBkYXRhU2V0PXtkYXRhU2V0cy5wYWdpbmF0aW9uTmV4dEJ1dHRvbiB8fD0ge2NsYXNzOiBcInBhZ2luYXRpb24tbmV4dFwifX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtuZXh0RGlzYWJsZWR9XG4gICAgICAgICAgICBvblByZXNzPXt0aGlzLnR0Lm9uUGFnaW5hdGlvbk5leHRQcmVzc2VkfVxuICAgICAgICAgICAgc3R5bGU9e3N0eWxlc1tgcGFnaW5hdGlvbk5hdkJ1dHRvbi0ke25leHREaXNhYmxlZH1gXSB8fD0ge1xuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y4ZmFmY1wiLFxuICAgICAgICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNjYmQ1ZTFcIixcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA4LFxuICAgICAgICAgICAgICBoZWlnaHQ6IDMwLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgb3BhY2l0eTogbmV4dERpc2FibGVkID8gMC40IDogMSxcbiAgICAgICAgICAgICAgd2lkdGg6IDMwXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxGb250QXdlc29tZUljb25cbiAgICAgICAgICAgICAgbmFtZT1cImNoZXZyb24tcmlnaHRcIlxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGVzLnBhZ2luYXRpb25OYXZJY29uIHx8PSB7Y29sb3I6IFwiIzMzNDE1NVwiLCBmb250U2l6ZTogMTJ9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1ByZXNzYWJsZT5cbiAgICAgICAgPC9WaWV3PlxuICAgICAgICA8Vmlld1xuICAgICAgICAgIGRhdGFTZXQ9e2RhdGFTZXRzLnBhZ2luYXRpb25QYWdlcyB8fD0ge2NsYXNzOiBcInBhZ2luYXRpb24tcGFnZXNcIn19XG4gICAgICAgICAgc3R5bGU9e3N0eWxlcy5wYWdpbmF0aW9uUGFnZXMgfHw9IHtcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246IFwicm93XCIsXG4gICAgICAgICAgICBmbGV4V3JhcDogXCJ3cmFwXCIsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG1hcmdpblRvcDogOFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7dGhpcy5wYWdpbmF0aW9uUGFnZUl0ZW1zKHRvdGFsUGFnZXMpLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PSBcImVsbGlwc2lzXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgICAgICAgZGF0YVNldD17ZGF0YVNldHNbYHBhZ2luYXRpb25FbGxpcHNpcy0ke2l0ZW0ua2V5fWBdIHx8PSB7Y2xhc3M6IFwicGFnaW5hdGlvbi1lbGxpcHNpc1wifX1cbiAgICAgICAgICAgICAgICAgIGtleT17aXRlbS5rZXl9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGVzLnBhZ2luYXRpb25FbGxpcHNpcyB8fD0ge3BhZGRpbmdIb3Jpem9udGFsOiA2fX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGVzLnBhZ2luYXRpb25FbGxpcHNpc1RleHQgfHw9IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCIjNjQ3NDhiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDYwMFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAuLi5cbiAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPFBhZ2luYXRpb25QYWdlQnV0dG9uXG4gICAgICAgICAgICAgICAgYWN0aXZlPXtpdGVtLnZhbHVlID09IGN1cnJlbnRQYWdlfVxuICAgICAgICAgICAgICAgIGtleT17aXRlbS5rZXl9XG4gICAgICAgICAgICAgICAgb25QYWdlU2VsZWN0ZWQ9e3RoaXMudHQuc2V0UGFnaW5hdGlvblBhZ2V9XG4gICAgICAgICAgICAgICAgcGFnZT17aXRlbS52YWx1ZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9WaWV3PlxuICAgICAgPC9WaWV3PlxuICAgIClcbiAgfVxuXG4gIG9wdGlvbnNDb250YWluZXIoKSB7XG4gICAgY29uc3Qge3NlbGVjdENvbnRhaW5lckxheW91dCwgbG9hZGVkT3B0aW9ucywgZW5kT2ZTZWxlY3RMYXlvdXQsIG9wdGlvbnNDb250YWluZXJMYXlvdXQsIG9wdGlvbnNQbGFjZW1lbnQsIG9wdGlvbnNWaXNpYmlsaXR5fSA9IHRoaXMuc1xuICAgIGxldCBsZWZ0LCB0b3BcblxuICAgIGxldCBzdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICB6SW5kZXg6IDk5OTk5LFxuICAgICAgZWxldmF0aW9uOiA5OTk5OSxcbiAgICAgIHZpc2liaWxpdHk6IG9wdGlvbnNWaXNpYmlsaXR5LFxuICAgICAgd2lkdGg6IHRoaXMucC5vcHRpb25zV2lkdGggfHwgdGhpcy5zLm9wdGlvbnNXaWR0aCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZmZmXCIsXG4gICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM5OTlcIixcbiAgICAgIG1heEhlaWdodDogMzAwLFxuICAgICAgb3ZlcmZsb3dZOiBcImF1dG9cIlxuICAgIH1cblxuICAgIGlmICghdGhpcy5wLm9wdGlvbnNQb3J0YWwpIHtcbiAgICAgIHN0eWxlLnRvcCA9IDBcbiAgICAgIHN0eWxlLmxlZnQgPSAwXG4gICAgfSBlbHNlIGlmICghdGhpcy5wLm9wdGlvbnNBYnNvbHV0ZSkge1xuICAgICAgc3R5bGUubGVmdCA9IDBcbiAgICAgIHN0eWxlLmJvdHRvbSA9IDBcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnNQbGFjZW1lbnQgPT0gXCJiZWxvd1wiKSB7XG4gICAgICBpZiAoUGxhdGZvcm0uT1MgPT0gXCJ3ZWJcIikge1xuICAgICAgICAvLyBvbkxheW91dCB0b3AgdmFsdWUgaXMgc29tZXRpbWVzIG5lZ2F0aXZlIHNvIHVzZSBicm93c2VyIEpTIHRvIGdldCBpdCBpbnN0ZWFkXG4gICAgICAgIHRvcCA9IGRpZ2codGhpcy50dC5lbmRPZlNlbGVjdFJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBcInRvcFwiKSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgKyAxXG5cbiAgICAgICAgLy8gb25MYXlvdXQgbGVmdCB2YWx1ZXMgZG9lc24ndCBhbHdheXMgdXBkYXRlIHdoZW4gY2hhbmdlZFxuICAgICAgICBsZWZ0ID0gZGlnZyh0aGlzLnR0LmVuZE9mU2VsZWN0UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIFwibGVmdFwiKSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0ID0gdGhpcy5zLmVuZE9mU2VsZWN0TGF5b3V0LmxlZnRcbiAgICAgICAgdG9wID0gc2VsZWN0Q29udGFpbmVyTGF5b3V0LnRvcFxuICAgICAgfVxuXG4gICAgICBzdHlsZS5sZWZ0ID0gbGVmdFxuICAgICAgc3R5bGUudG9wID0gdG9wIC0gMlxuICAgIH0gZWxzZSBpZiAob3B0aW9uc1BsYWNlbWVudCA9PSBcImFib3ZlXCIpIHtcbiAgICAgIGlmIChQbGF0Zm9ybS5PUyA9PSBcIndlYlwiKSB7XG4gICAgICAgIC8vIG9uTGF5b3V0IHRvcCB2YWx1ZSBpcyBzb21ldGltZXMgbmVnYXRpdmUgc28gdXNlIGJyb3dzZXIgSlMgdG8gZ2V0IGl0IGluc3RlYWRcbiAgICAgICAgdG9wID0gZGlnZyh0aGlzLnR0LnNlbGVjdENvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBcInRvcFwiKSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BcblxuICAgICAgICAvLyBvbkxheW91dCBsZWZ0IHZhbHVlcyBkb2Vzbid0IGFsd2F5cyB1cGRhdGUgd2hlbiBjaGFuZ2VkXG4gICAgICAgIGxlZnQgPSBkaWdnKHRoaXMudHQuc2VsZWN0Q29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIFwibGVmdFwiKSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0ID0gZW5kT2ZTZWxlY3RMYXlvdXQubGVmdFxuICAgICAgICB0b3AgPSBzZWxlY3RDb250YWluZXJMYXlvdXQudG9wXG4gICAgICB9XG5cbiAgICAgIHN0eWxlLmxlZnQgPSBsZWZ0XG4gICAgICBzdHlsZS50b3AgPSB0b3AgLSBvcHRpb25zQ29udGFpbmVyTGF5b3V0LmhlaWdodCArIDFcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtvbnduIG9wdGlvbnMgcGxhY2VtZW50OiAke29wdGlvbnNQbGFjZW1lbnR9YClcbiAgICB9XG5cbiAgICBzdHlsZSA9IHRoaXMuc3R5bGluZ0ZvcihcIm9wdGlvbnNDb250YWluZXJcIiwgc3R5bGUsIFtsZWZ0LCB0b3AsIHN0eWxlLnZpc2liaWxpdHksIHN0eWxlLndpZHRoXSlcblxuICAgIGNvbnN0IGlkID0gaWRGb3JDb21wb25lbnQodGhpcylcblxuICAgIHJldHVybiAoXG4gICAgICA8Vmlld1xuICAgICAgICBkYXRhU2V0PXt0aGlzLmNhY2hlKFwib3B0aW9uc0NvbnRhaW5lckRhdGFTZXRcIiwge2NsYXNzOiBcIm9wdGlvbnMtY29udGFpbmVyXCIsIGlkLCByb2xlOiBcImRpYWxvZ1wifSwgW2lkXSl9XG4gICAgICAgIG9uTGF5b3V0PXt0aGlzLnR0Lm9uT3B0aW9uc0NvbnRhaW5lckxheW91dH1cbiAgICAgICAgcmVmPXt0aGlzLnR0Lm9wdGlvbnNDb250YWluZXJSZWZ9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgID5cbiAgICAgICAge2xvYWRlZE9wdGlvbnM/Lm1hcCgobG9hZGVkT3B0aW9uKSA9PlxuICAgICAgICAgIHRoaXMuaGF5YVNlbGVjdE9wdGlvbih7XG4gICAgICAgICAgICBrZXk6IGxvYWRlZE9wdGlvbi5rZXkgfHwgYGxvYWRlZC1vcHRpb24tJHtsb2FkZWRPcHRpb24udmFsdWV9YCxcbiAgICAgICAgICAgIGxvYWRlZE9wdGlvblxuICAgICAgICAgIH0pXG4gICAgICAgICl9XG4gICAgICAgIHtsb2FkZWRPcHRpb25zPy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICA8VmlldyBkYXRhU2V0PXt0aGlzLm5vT3B0aW9uc0NvbnRhaW5lckRhdGFTZXQgfHw9IHtjbGFzczogXCJuby1vcHRpb25zLWNvbnRhaW5lclwifX0+XG4gICAgICAgICAgICA8VGV4dD57dGhpcy5wLm5vT3B0aW9uc1RleHQgPyB0aGlzLnAubm9PcHRpb25zVGV4dCgpIDogdGhpcy50cmFuc2xhdGUoXCIubm9fb3B0aW9uc19mb3VuZFwiKX08L1RleHQ+XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICB9XG4gICAgICAgIHt0aGlzLnBhZ2luYXRpb25Db250cm9scygpfVxuICAgICAgPC9WaWV3PlxuICAgIClcbiAgfVxuXG4gIG9uT3B0aW9uQ2xpY2tlZCA9IChldmVudCwgbG9hZGVkT3B0aW9uKSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICBjb25zdCB7b25DaGFuZ2UsIHRvZ2dsZU9wdGlvbnN9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHttdWx0aXBsZX0gPSB0aGlzLnBcbiAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IHRoaXMuZ2V0Q3VycmVudE9wdGlvbnMoKVxuICAgIGNvbnN0IHRvZ2dsZWQgPSB0aGlzLmdldFRvZ2dsZWQoKVxuICAgIGNvbnN0IG5ld1N0YXRlID0ge31cbiAgICBjb25zdCBleGlzdGluZ09wdGlvbiA9IGN1cnJlbnRPcHRpb25zLmZpbmQoKGN1cnJlbnRPcHRpb24pID0+IGN1cnJlbnRPcHRpb24udmFsdWUgPT0gbG9hZGVkT3B0aW9uLnZhbHVlKVxuICAgIGNvbnN0IG5ld1RvZ2dsZWQgPSB7Li4udG9nZ2xlZH1cbiAgICBsZXQgbmV3Q3VycmVudE9wdGlvbnNcbiAgICBsZXQgYWN0aW9uXG5cbiAgICBpZiAoZXhpc3RpbmdPcHRpb24pIHtcbiAgICAgIGlmICh0b2dnbGVPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUb2dnbGUgPSB0b2dnbGVkW2xvYWRlZE9wdGlvbi52YWx1ZV1cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdG9nZ2xlT3B0aW9ucy5maW5kSW5kZXgoKGVsZW1lbnQpID0+IGVsZW1lbnQudmFsdWUgPT0gY3VycmVudFRvZ2dsZSlcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID49ICh0b2dnbGVPcHRpb25zLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgLy8gTm8gbmV4dCB0b2dnbGVkIC0gcmVtb3ZlIHRvZ2dsZWQgYW5kIG9wdGlvblxuICAgICAgICAgIGRlbGV0ZSBuZXdUb2dnbGVkW2xvYWRlZE9wdGlvbi52YWx1ZV1cbiAgICAgICAgICBhY3Rpb24gPSBcInJlbW92ZS1vcHRpb24tYWZ0ZXItbGFzdC10b2dnbGVcIlxuXG4gICAgICAgICAgbmV3Q3VycmVudE9wdGlvbnMgPSBjdXJyZW50T3B0aW9ucy5maWx0ZXIoKGN1cnJlbnRPcHRpb24pID0+IGN1cnJlbnRPcHRpb24udmFsdWUgIT0gbG9hZGVkT3B0aW9uLnZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFscmVhZHkgdG9nZ2xlZCAtIHNldCB0byBuZXh0IHRvZ2dsZVxuICAgICAgICAgIG5ld1RvZ2dsZWRbbG9hZGVkT3B0aW9uLnZhbHVlXSA9IGRpZ2codG9nZ2xlT3B0aW9ucywgY3VycmVudEluZGV4ICsgMSwgXCJ2YWx1ZVwiKVxuICAgICAgICAgIGFjdGlvbiA9IFwiY3ljbGUtdG9nZ2xlXCJcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld1N0YXRlLnRvZ2dsZWQgPSBuZXdUb2dnbGVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgZnJvbSBjdXJyZW50IG9wdGlvbnNcbiAgICAgICAgYWN0aW9uID0gXCJyZW1vdmUtb3B0aW9uXCJcbiAgICAgICAgbmV3Q3VycmVudE9wdGlvbnMgPSBjdXJyZW50T3B0aW9ucy5maWx0ZXIoKGN1cnJlbnRPcHRpb24pID0+IGN1cnJlbnRPcHRpb24udmFsdWUgIT0gbG9hZGVkT3B0aW9uLnZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgY2xpY2tlZCBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICAgIGlmIChsb2FkZWRPcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSkgdGhpcy5kZWJ1Z0xvZyhcIm9uT3B0aW9uQ2xpY2tlZFwiLCB7XG4gICAgICAgICAgYWN0aW9uOiBcImlnbm9yZS1kaXNhYmxlZC1vcHRpb25cIixcbiAgICAgICAgICBvcHRpb25WYWx1ZTogbG9hZGVkT3B0aW9uLnZhbHVlXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodG9nZ2xlT3B0aW9ucykge1xuICAgICAgICAvLyBTZXQgZnJlc2ggdG9nZ2xlXG4gICAgICAgIG5ld1RvZ2dsZWRbbG9hZGVkT3B0aW9uLnZhbHVlXSA9IHRvZ2dsZU9wdGlvbnNbMF0udmFsdWVcbiAgICAgICAgbmV3U3RhdGUudG9nZ2xlZCA9IG5ld1RvZ2dsZWRcbiAgICAgIH1cblxuICAgICAgaWYgKG11bHRpcGxlIHx8IHRvZ2dsZU9wdGlvbnMpIHtcbiAgICAgICAgYWN0aW9uID0gXCJhZGQtb3B0aW9uXCJcbiAgICAgICAgbmV3Q3VycmVudE9wdGlvbnMgPSBjdXJyZW50T3B0aW9ucy5jb25jYXQoW2xvYWRlZE9wdGlvbl0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3Rpb24gPSBcInJlcGxhY2Utc2luZ2xlLW9wdGlvblwiXG4gICAgICAgIG5ld0N1cnJlbnRPcHRpb25zID0gW2xvYWRlZE9wdGlvbl1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXCJ2YWx1ZXNcIiBpbiB0aGlzLnByb3BzICYmIHRoaXMucHJvcHMudmFsdWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGN1cnJlbnRPcHRpb25zIGFyZSBjb250cm9sbGVkIGFuZCBhIHVzZU1lbW8gY2FsbGJhY2sgaXMgaGFuZGVsaW5nIHNldHRpbmcgY3VycmVudCBvcHRpb25zLlxuICAgIH0gZWxzZSBpZiAobmV3Q3VycmVudE9wdGlvbnMpIHtcbiAgICAgIG5ld1N0YXRlLmN1cnJlbnRPcHRpb25zID0gbmV3Q3VycmVudE9wdGlvbnNcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gbmV3Q3VycmVudE9wdGlvbnMgfHwgY3VycmVudE9wdGlvbnNcbiAgICBpZiAodGhpcy5pc0RlYnVnRW5hYmxlZCgpKSB0aGlzLmRlYnVnTG9nKFwib25PcHRpb25DbGlja2VkXCIsIHtcbiAgICAgIGFjdGlvbjogYWN0aW9uIHx8IFwidG9nZ2xlLW9ubHlcIixcbiAgICAgIG11bHRpcGxlLFxuICAgICAgb3B0aW9uVmFsdWU6IGxvYWRlZE9wdGlvbi52YWx1ZSxcbiAgICAgIG9wdGlvbnNDb3VudEJlZm9yZTogY3VycmVudE9wdGlvbnMubGVuZ3RoLFxuICAgICAgb3B0aW9uc0NvdW50QWZ0ZXI6IG9wdGlvbnMubGVuZ3RoXG4gICAgfSlcblxuICAgIGlmICghbXVsdGlwbGUpIHRoaXMuY2xvc2VPcHRpb25zKHtvcHRpb25zfSlcblxuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgb25DaGFuZ2Uoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgdG9nZ2xlczogbmV3VG9nZ2xlZFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vbkNoYW5nZVZhbHVlKSB7XG4gICAgICBsZXQgb3B0aW9uVmFsdWVcblxuICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uVmFsdWUgPSBkaWcob3B0aW9ucywgMCwgXCJ2YWx1ZVwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnAub25DaGFuZ2VWYWx1ZShvcHRpb25WYWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKVxuICB9XG5cbiAgc3R5bGluZ0ZvcihzdHlsaW5nTmFtZSwgc3R5bGUgPSB7fSwgY2FjaGVzID0gW10pIHtcbiAgICBsZXQgY3VzdG9tU3R5bGluZyA9IGRpZyh0aGlzLCBcInByb3BzXCIsIFwic3R5bGVzXCIsIHN0eWxpbmdOYW1lKVxuXG4gICAgaWYgKHR5cGVvZiBjdXN0b21TdHlsaW5nID09IFwiZnVuY3Rpb25cIikgY3VzdG9tU3R5bGluZyA9IGN1c3RvbVN0eWxpbmcoe3N0YXRlOiB0aGlzLnN0YXRlLCBzdHlsZX0pXG5cbiAgICBpZiAoY3VzdG9tU3R5bGluZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3R5bGUsIGN1c3RvbVN0eWxpbmcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUoYHN0eWxpbmdGb3ItJHtzdHlsaW5nTmFtZX1gLCBzdHlsZSwgY2FjaGVzKVxuICB9XG5cbiAgaWNvbkZvck9wdGlvbihvcHRpb24pIHtcbiAgICBjb25zdCB7dG9nZ2xlT3B0aW9uc30gPSB0aGlzLnByb3BzIHx8IHt9XG4gICAgY29uc3QgdG9nZ2xlZCA9IHRoaXMuZ2V0VG9nZ2xlZCgpXG5cbiAgICBpZiAodG9nZ2xlT3B0aW9ucyAmJiAob3B0aW9uLnZhbHVlIGluIHRvZ2dsZWQpKSB7XG4gICAgICBjb25zdCB0b2dnbGVkVmFsdWUgPSB0b2dnbGVkW29wdGlvbi52YWx1ZV1cbiAgICAgIGNvbnN0IHRvZ2dsZWRPcHRpb24gPSB0b2dnbGVPcHRpb25zLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQudmFsdWUgPT0gdG9nZ2xlZFZhbHVlKVxuXG4gICAgICBpZiAoIXRvZ2dsZWRPcHRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGEgdG9nZ2xlIG9wdGlvbiBmb3IgdmFsdWU6ICR7dG9nZ2xlZFZhbHVlfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b2dnbGVkT3B0aW9uLmljb25cbiAgICB9XG4gIH1cblxuICBwcmVzZW50T3B0aW9uID0gKG9wdGlvbiwgbW9kZSkgPT4ge1xuICAgIGNvbnN0IHtvcHRpb25Db250ZW50LCB0b2dnbGVPcHRpb25zfSA9IHRoaXMucHJvcHMgfHwge31cbiAgICBjb25zdCB0b2dnbGVkID0gdGhpcy5nZXRUb2dnbGVkKClcbiAgICBjb25zdCBpY29uID0gdGhpcy5pY29uRm9yT3B0aW9uKG9wdGlvbilcbiAgICBjb25zdCB0b2dnbGVWYWx1ZSA9IHRvZ2dsZWRbb3B0aW9uLnZhbHVlXVxuICAgIGNvbnN0IHRvZ2dsZU9wdGlvbiA9IHRvZ2dsZU9wdGlvbnM/LmZpbmQoKHRvZ2dsZU9wdGlvbkkpID0+IHRvZ2dsZU9wdGlvbkkudmFsdWUgPT0gdG9nZ2xlVmFsdWUpXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmdldEN1cnJlbnRPcHRpb25WYWx1ZXMoKS5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgPT0gb3B0aW9uLnZhbHVlKVxuICAgIGxldCBzdHlsZVxuICAgIGxldCBjb250ZW50Tm9kZVxuXG4gICAgaWYgKG1vZGUgPT0gXCJjdXJyZW50XCIpIHtcbiAgICAgIHN0eWxlID0gdGhpcy5zdHlsaW5nRm9yKFwiY3VycmVudE9wdGlvblByZXNlbnRhdGlvblRleHRcIiwge2ZsZXg6IDEsIHdoaXRlU3BhY2U6IFwibm93cmFwXCJ9KVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZSA9IHRoaXMuc3R5bGluZ0ZvcihcIm9wdGlvblByZXNlbnRhdGlvblRleHRcIiwge2ZsZXg6IDEsIHdoaXRlU3BhY2U6IFwibm93cmFwXCJ9KVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8Vmlld1xuICAgICAgICBkYXRhU2V0PXt0aGlzLmNhY2hlKFwicHJlc2VudE9wdGlvblZpZXdEYXRhU2V0XCIsIHtcbiAgICAgICAgICB0ZXh0OiBvcHRpb24udGV4dCxcbiAgICAgICAgICB0b2dnbGVJY29uOiB0b2dnbGVPcHRpb24/Lmljb24sXG4gICAgICAgICAgdG9nZ2xlVmFsdWU6IHRvZ2dsZU9wdGlvbj8udmFsdWUsXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZVxuICAgICAgICB9LCBbb3B0aW9uLnRleHQsIG9wdGlvbi52YWx1ZSwgdG9nZ2xlT3B0aW9uPy5pY29uLCB0b2dnbGVPcHRpb24/LnZhbHVlXSl9XG4gICAgICAgIHN0eWxlPXt0aGlzLmNhY2hlKFwib3B0aW9uUHJlc2VudGF0aW9uU3R5bGVcIiwge2ZsZXhEaXJlY3Rpb246IFwicm93XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCJ9KX1cbiAgICAgICAgdGVzdElEPVwib3B0aW9uLXByZXNlbnRhdGlvblwiXG4gICAgICA+XG4gICAgICAgIHt0b2dnbGVPcHRpb25zICYmICEob3B0aW9uLnZhbHVlIGluIHRvZ2dsZWQpICYmXG4gICAgICAgICAgPFZpZXdcbiAgICAgICAgICAgIHN0eWxlPXt0aGlzLmNhY2hlKFwidG9nZ2xlSWNvblBsYWNlaG9sZGVyU3R5bGVcIiwge3dpZHRoOiAyMH0pfVxuICAgICAgICAgICAgdGVzdElEPVwidG9nZ2xlLWljb24tcGxhY2Vob2xkZXJcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgICAge3RvZ2dsZU9wdGlvbnMgJiYgKG9wdGlvbi52YWx1ZSBpbiB0b2dnbGVkKSAmJlxuICAgICAgICAgIDxWaWV3IHN0eWxlPXt0aGlzLmNhY2hlKFwidG9nZ2xlSWNvbkNvbnRhaW5lclN0eWxlXCIsIHthbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIiwgd2lkdGg6IDIwfSl9PlxuICAgICAgICAgICAgPEZvbnRBd2Vzb21lSWNvblxuICAgICAgICAgICAgICBuYW1lPXtpY29ufVxuICAgICAgICAgICAgICB0ZXN0SUQ9XCJ0b2dnbGUtaWNvblwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgfVxuICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9uQ29udGVudCkge1xuICAgICAgICAgICAgY29udGVudE5vZGUgPSBvcHRpb25Db250ZW50KHtpY29uLCBtb2RlLCBvcHRpb24sIHNlbGVjdGVkLCB0b2dnbGVPcHRpb24sIHRvZ2dsZVZhbHVlLCB0b2dnbGVkfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gXCJjdXJyZW50XCIgJiYgb3B0aW9uLmN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgICBjb250ZW50Tm9kZSA9IG9wdGlvbi5jdXJyZW50Q29udGVudCgpXG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uY29udGVudCkge1xuICAgICAgICAgICAgY29udGVudE5vZGUgPSBvcHRpb24uY29udGVudCgpXG4gICAgICAgICAgfSBlbHNlIGlmIChcImh0bWxcIiBpbiBvcHRpb24gJiYgUGxhdGZvcm0uT1MgIT0gXCJ3ZWJcIikge1xuICAgICAgICAgICAgY29udGVudE5vZGUgPSA8UmVuZGVySHRtbCBzb3VyY2U9e3todG1sOiBkaWdnKG9wdGlvbiwgXCJodG1sXCIpfX0gLz5cbiAgICAgICAgICB9IGVsc2UgaWYgKFwiaHRtbFwiIGluIG9wdGlvbiAmJiBQbGF0Zm9ybS5PUyA9PSBcIndlYlwiKSB7XG4gICAgICAgICAgICBjb250ZW50Tm9kZSA9IDxkaXYgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGRpZ2cob3B0aW9uLCBcImh0bWxcIil9fSAvPlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50Tm9kZSA9IChcbiAgICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgICAgdGVzdElEPVwib3B0aW9uLXByZXNlbnRhdGlvbi10ZXh0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtvcHRpb24udGV4dH1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8VmlldyBzdHlsZT17dGhpcy5jYWNoZShcIm9wdGlvblByZXNlbnRhdGlvbkNvbnRlbnRTdHlsZVwiLCB7ZmxleDogMX0pfT5cbiAgICAgICAgICAgICAgICB7Y29udGVudE5vZGV9XG4gICAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICAgICAge29wdGlvbi5yaWdodCAmJlxuICAgICAgICAgICAgICAgIDxWaWV3IHN0eWxlPXt0aGlzLmNhY2hlKFwib3B0aW9uUHJlc2VudGF0aW9uUmlnaHRTdHlsZVwiLCB7YWxpZ25JdGVtczogXCJjZW50ZXJcIiwganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsIG1hcmdpbkxlZnQ6IDh9KX0+XG4gICAgICAgICAgICAgICAgICB7b3B0aW9uLnJpZ2h0fVxuICAgICAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKVxuICAgICAgICB9KSgpfVxuICAgICAgPC9WaWV3PlxuICAgIClcbiAgfVxuXG4gIGFzeW5jIHNldEN1cnJlbnRGcm9tR2l2ZW5WYWx1ZXMoKSB7XG4gICAgY29uc3Qge29wdGlvbnMsIHZhbHVlc30gPSB0aGlzLnBcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykgJiYgdmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMucy5jdXJyZW50T3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRPcHRpb25zOiBbXX0pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMoe3BhZ2U6IHRoaXMuZ2V0QWN0aXZlUGFnZSgpLCB2YWx1ZXN9KVxuICAgIGNvbnN0IHtvcHRpb25zOiBjdXJyZW50T3B0aW9uc30gPSB0aGlzLnBhcnNlT3B0aW9uc1Jlc3VsdChyZXN1bHQpXG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9IGN1cnJlbnRPcHRpb25zPy5tYXAoKGN1cnJlbnRPcHRpb24pID0+IGN1cnJlbnRPcHRpb24udmFsdWUpXG4gICAgY29uc3Qgc3RhdGVWYWx1ZXMgPSB0aGlzLnMuY3VycmVudE9wdGlvbnM/Lm1hcCgoY3VycmVudE9wdGlvbikgPT4gY3VycmVudE9wdGlvbi52YWx1ZSlcblxuICAgIGlmIChhbnl0aGluZ0RpZmZlcmVudChjdXJyZW50VmFsdWVzLCBzdGF0ZVZhbHVlcykpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRPcHRpb25zfSlcbiAgICB9XG4gIH1cbn0pKVxuIl19