@sumaris-net/ngx-components 2.18.0-alpha1 → 2.18.0-alpha10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/doc/changelog.md +3 -0
  2. package/esm2022/public_api.mjs +2 -1
  3. package/esm2022/src/app/admin/users/users.mjs +2 -2
  4. package/esm2022/src/app/core/account/account.page.mjs +1 -1
  5. package/esm2022/src/app/core/form/array/form-array.mjs +2 -1
  6. package/esm2022/src/app/core/form/form.class.mjs +7 -14
  7. package/esm2022/src/app/core/form/properties/properties.form.mjs +132 -47
  8. package/esm2022/src/app/core/form/properties/property.validator.mjs +21 -7
  9. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +3 -3
  10. package/esm2022/src/app/core/register/register.form.mjs +1 -1
  11. package/esm2022/src/app/core/services/model/entity.model.mjs +4 -2
  12. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +19 -8
  13. package/esm2022/src/app/core/settings/settings.module.mjs +5 -4
  14. package/esm2022/src/app/core/settings/settings.page.mjs +45 -45
  15. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +4 -4
  16. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  17. package/esm2022/src/app/core/table/table.class.mjs +8 -5
  18. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  19. package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
  20. package/esm2022/src/app/shared/dates.mjs +4 -8
  21. package/esm2022/src/app/shared/form/field.component.mjs +33 -14
  22. package/esm2022/src/app/shared/functions.mjs +16 -1
  23. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +11 -10
  24. package/esm2022/src/app/shared/inputs.mjs +1 -1
  25. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +1 -1
  26. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +36 -19
  27. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +1 -1
  28. package/esm2022/src/app/shared/material/chips/material.chips.mjs +3 -3
  29. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +3 -3
  30. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +33 -20
  31. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +15 -10
  32. package/esm2022/src/app/shared/pipes/html.pipes.mjs +52 -0
  33. package/esm2022/src/app/shared/pipes/pipes.module.mjs +10 -3
  34. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +8 -9
  35. package/esm2022/src/environments/environment.mjs +3 -3
  36. package/fesm2022/sumaris-net.ngx-components.mjs +684 -460
  37. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  38. package/package.json +6 -6
  39. package/public_api.d.ts +1 -0
  40. package/src/app/core/form/array/form-array.d.ts +1 -1
  41. package/src/app/core/form/form.class.d.ts +2 -5
  42. package/src/app/core/form/properties/properties.form.d.ts +32 -10
  43. package/src/app/core/form/properties/property.validator.d.ts +9 -3
  44. package/src/app/core/services/validator/local-settings.validator.d.ts +6 -2
  45. package/src/app/core/settings/settings.module.d.ts +2 -1
  46. package/src/app/core/settings/settings.page.d.ts +29 -18
  47. package/src/app/shared/dates.d.ts +9 -3
  48. package/src/app/shared/form/field.component.d.ts +3 -2
  49. package/src/app/shared/functions.d.ts +2 -0
  50. package/src/app/shared/inputs.d.ts +5 -5
  51. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +4 -0
  52. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +12 -4
  53. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +9 -6
  54. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +4 -1
  55. package/src/app/shared/pipes/html.pipes.d.ts +15 -0
  56. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  57. package/src/assets/i18n/fr.json +3 -2
  58. package/src/assets/manifest.json +1 -1
  59. package/src/environments/environment.d.ts +0 -1
  60. package/src/theme/_ngx-components.scss +3 -2
@@ -3,7 +3,7 @@ import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
3
  import { BehaviorSubject, isObservable, merge, Subject, Subscription, timer } from 'rxjs';
4
4
  import { debounceTime, distinctUntilChanged, filter, map, mergeMap, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
5
5
  import { changeCaseToUnderscore, findParentWithClass, isBlankString, isNil, isNilOrBlank, isNotNil, isNotNilBoolean, isNotNilObject, isNotNilOrBlank, isNotNilString, toNumber, } from '../../functions';
6
- import { focusInput, selectInputRange } from '../../inputs';
6
+ import { focusInput, selectInputContent, selectInputRange } from '../../inputs';
7
7
  import { firstNotNilPromise } from '../../observables';
8
8
  import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
9
9
  import { fromScrollEndEvent } from '../../events';
@@ -100,6 +100,7 @@ export class MatAutocompleteField {
100
100
  clearButtonTitle;
101
101
  trimSearchText;
102
102
  splitSearchText;
103
+ selectInputContentOnFocus;
103
104
  /**
104
105
  * @deprecated Use panelClass instead
105
106
  */
@@ -118,8 +119,7 @@ export class MatAutocompleteField {
118
119
  dropButtonClick = new EventEmitter(true);
119
120
  keydownEscape = new EventEmitter();
120
121
  keyupEnter = new EventEmitter();
121
- // TODO: used by named filter (but missing mat-select emit() )
122
- optionSelected = new EventEmitter();
122
+ selectionChange = new EventEmitter();
123
123
  matSelect;
124
124
  ionSearchbar;
125
125
  matInputText;
@@ -225,6 +225,7 @@ export class MatAutocompleteField {
225
225
  this.debounceTime = this.debounceTime ?? this.config.debounceTime;
226
226
  this.highlightAccent = this.highlightAccent ?? this.config.highlightAccent;
227
227
  this.applyImplicitValue = this.applyImplicitValue ?? this.config.applyImplicitValue;
228
+ this.selectInputContentOnFocus = this.selectInputContentOnFocus ?? this.config.selectInputContentOnFocus;
228
229
  }
229
230
  // Default values
230
231
  this.required = isNotNilBoolean(this.required)
@@ -237,6 +238,7 @@ export class MatAutocompleteField {
237
238
  this.displayWith = this.displayWith || MatAutocompleteFieldUtils.createDisplayFn(this.displayAttributes, this.multiple, this.displaySeparator);
238
239
  this.splitSearchText = this.splitSearchText ?? true;
239
240
  this.trimSearchText = this.trimSearchText ?? !this.mobile; // True by default on desktop, but false in mobile (not need in the searchbar)
241
+ this.selectInputContentOnFocus = this.selectInputContentOnFocus ?? false;
240
242
  this.equals = this.equals || MatAutocompleteFieldUtils.defaultEquals;
241
243
  this.displayColumnSizes =
242
244
  this.displayColumnSizes ||
@@ -543,6 +545,11 @@ export class MatAutocompleteField {
543
545
  if (!hasContent || this.showPanelOnFocus || this.showAllOnFocus) {
544
546
  // DEBUG
545
547
  //if (this.debug) console.debug(this.logPrefix + ' Emit focus event');
548
+ // Select input content, if enable
549
+ if (this.selectInputContentOnFocus) {
550
+ selectInputContent(event);
551
+ event?.preventDefault(); // Avoid to caret to be changed
552
+ }
546
553
  this.focused.emit();
547
554
  return true;
548
555
  }
@@ -677,6 +684,23 @@ export class MatAutocompleteField {
677
684
  this.matSelect?.close();
678
685
  }
679
686
  }
687
+ /* -- protected method -- */
688
+ markAsLoading() {
689
+ if (this._$filteredItems.value) {
690
+ this._$filteredItems.next(undefined);
691
+ this._itemCount = undefined;
692
+ this._implicitValue = undefined;
693
+ this._onFetchMoreCallback = undefined;
694
+ this._moreItemsCount = 0;
695
+ this.markForCheck();
696
+ }
697
+ }
698
+ onSelectionChange(event) {
699
+ this.selectionChange.emit({ source: event.source, value: event.value });
700
+ }
701
+ onOptionSelected(event) {
702
+ this.selectionChange.emit({ source: event.source, value: event.option.value });
703
+ }
680
704
  /* -- private method -- */
681
705
  async suggest(value, filter) {
682
706
  // Split string value, if allow (.e.g 'AAA - Item AAA' => 'AAA')
@@ -767,16 +791,6 @@ export class MatAutocompleteField {
767
791
  markForCheck() {
768
792
  this.cd.markForCheck();
769
793
  }
770
- markAsLoading() {
771
- if (this._$filteredItems.value) {
772
- this._$filteredItems.next(undefined);
773
- this._itemCount = undefined;
774
- this._implicitValue = undefined;
775
- this._onFetchMoreCallback = undefined;
776
- this._moreItemsCount = 0;
777
- this.markForCheck();
778
- }
779
- }
780
794
  _fixMatSelectPositionAndSearchbar() {
781
795
  if (!this.matSelect)
782
796
  return;
@@ -886,13 +900,13 @@ export class MatAutocompleteField {
886
900
  });
887
901
  }
888
902
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MatAutocompleteField, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ModalController }, { token: i0.Renderer2 }, { token: i2.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
889
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: MatAutocompleteField, selector: "mat-autocomplete-field", inputs: { equals: "equals", logPrefix: "logPrefix", formControl: "formControl", formControlName: "formControlName", floatLabel: "floatLabel", appearance: "appearance", subscriptSizing: "subscriptSizing", placeholder: "placeholder", suggestFn: "suggestFn", required: ["required", "required", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], debounceTime: ["debounceTime", "debounceTime", numberAttribute], displaySeparator: "displaySeparator", displayWith: "displayWith", displayAttributes: "displayAttributes", displayColumnSizes: "displayColumnSizes", displayColumnNames: "displayColumnNames", highlightAccent: ["highlightAccent", "highlightAccent", booleanAttribute], showAllOnFocus: ["showAllOnFocus", "showAllOnFocus", booleanAttribute], showPanelOnFocus: ["showPanelOnFocus", "showPanelOnFocus", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], config: "config", i18nPrefix: "i18nPrefix", noResultMessage: "noResultMessage", panelClass: "panelClass", panelWidth: "panelWidth", disableRipple: ["disableRipple", "disableRipple", booleanAttribute], matAutocompletePosition: "matAutocompletePosition", multiple: ["multiple", "multiple", booleanAttribute], fetchMoreThreshold: "fetchMoreThreshold", suggestLengthThreshold: ["suggestLengthThreshold", "suggestLengthThreshold", numberAttribute], showLoadingSpinner: ["showLoadingSpinner", "showLoadingSpinner", booleanAttribute], debug: ["debug", "debug", booleanAttribute], showSearchBar: ["showSearchBar", "showSearchBar", booleanAttribute], stickySearchBar: ["stickySearchBar", "stickySearchBar", booleanAttribute], applyImplicitValue: "applyImplicitValue", dropButtonTitle: "dropButtonTitle", clearButtonTitle: "clearButtonTitle", trimSearchText: ["trimSearchText", "trimSearchText", booleanAttribute], splitSearchText: ["splitSearchText", "splitSearchText", booleanAttribute], classList: ["class", "classList"], filter: "filter", readonly: ["readonly", "readonly", booleanAttribute], tabindex: "tabindex", items: "items" }, outputs: { clicked: "click", blurred: "blur", focused: "focus", dropButtonClick: "dropButtonClick", keydownEscape: "keydown.escape", keyupEnter: "keyup.enter", optionSelected: "optionSelected" }, providers: [
903
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: MatAutocompleteField, selector: "mat-autocomplete-field", inputs: { equals: "equals", logPrefix: "logPrefix", formControl: "formControl", formControlName: "formControlName", floatLabel: "floatLabel", appearance: "appearance", subscriptSizing: "subscriptSizing", placeholder: "placeholder", suggestFn: "suggestFn", required: ["required", "required", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], debounceTime: ["debounceTime", "debounceTime", numberAttribute], displaySeparator: "displaySeparator", displayWith: "displayWith", displayAttributes: "displayAttributes", displayColumnSizes: "displayColumnSizes", displayColumnNames: "displayColumnNames", highlightAccent: ["highlightAccent", "highlightAccent", booleanAttribute], showAllOnFocus: ["showAllOnFocus", "showAllOnFocus", booleanAttribute], showPanelOnFocus: ["showPanelOnFocus", "showPanelOnFocus", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], config: "config", i18nPrefix: "i18nPrefix", noResultMessage: "noResultMessage", panelClass: "panelClass", panelWidth: "panelWidth", disableRipple: ["disableRipple", "disableRipple", booleanAttribute], matAutocompletePosition: "matAutocompletePosition", multiple: ["multiple", "multiple", booleanAttribute], fetchMoreThreshold: "fetchMoreThreshold", suggestLengthThreshold: ["suggestLengthThreshold", "suggestLengthThreshold", numberAttribute], showLoadingSpinner: ["showLoadingSpinner", "showLoadingSpinner", booleanAttribute], debug: ["debug", "debug", booleanAttribute], showSearchBar: ["showSearchBar", "showSearchBar", booleanAttribute], stickySearchBar: ["stickySearchBar", "stickySearchBar", booleanAttribute], applyImplicitValue: "applyImplicitValue", dropButtonTitle: "dropButtonTitle", clearButtonTitle: "clearButtonTitle", trimSearchText: ["trimSearchText", "trimSearchText", booleanAttribute], splitSearchText: ["splitSearchText", "splitSearchText", booleanAttribute], selectInputContentOnFocus: ["selectInputContentOnFocus", "selectInputContentOnFocus", booleanAttribute], classList: ["class", "classList"], filter: "filter", readonly: ["readonly", "readonly", booleanAttribute], tabindex: "tabindex", items: "items" }, outputs: { clicked: "click", blurred: "blur", focused: "focus", dropButtonClick: "dropButtonClick", keydownEscape: "keydown.escape", keyupEnter: "keyup.enter", selectionChange: "selectionChange" }, providers: [
890
904
  {
891
905
  provide: NG_VALUE_ACCESSOR,
892
906
  multi: true,
893
907
  useExisting: forwardRef(() => MatAutocompleteField),
894
908
  },
895
- ], viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }, { propertyName: "ionSearchbar", first: true, predicate: ["ionSearchbar"], descendants: true }, { propertyName: "matInputText", first: true, predicate: ["matInputText"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"_displayValue\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"_displayValue\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n >\n <mat-select-trigger>{{ value | toString: displayWith }}</mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"false\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n >\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n <!-- Options -->\n @for (item of items; track item) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initMatSelectInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n <!-- footer -->\n @if (itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"optionSelected.emit($event)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n\n <!-- Options -->\n @for (item of items; track item) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" [title]=\"text.innerText\" class=\"ion-align-self-center\">\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent\n }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile && !multiple) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\"\n [title]=\"dropButtonTitle || '' | translate\"\n >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"clearButtonTitle || '' | translate\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start:0}button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i13.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.HighlightPipe, name: "highlight" }, { kind: "pipe", type: i16.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i17.ToStringPipe, name: "toString" }, { kind: "pipe", type: i17.StrLengthPipe, name: "strLength" }, { kind: "pipe", type: i18.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i19.RxPush, name: "push" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
909
+ ], viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }, { propertyName: "ionSearchbar", first: true, predicate: ["ionSearchbar"], descendants: true }, { propertyName: "matInputText", first: true, predicate: ["matInputText"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], ngImport: i0, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"_displayValue\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"_displayValue\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n >\n <mat-select-trigger>{{ value | toString: displayWith }}</mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"false\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n >\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initMatSelectInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n <!-- footer -->\n @if (itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"onOptionSelected($event)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col\n [size]=\"displayColumnSizes[i]\"\n [title]=\"text.innerText\"\n class=\"ion-align-self-center\"\n >\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent\n }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile && !multiple) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\"\n [title]=\"dropButtonTitle || '' | translate\"\n >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"clearButtonTitle || '' | translate\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start:0}button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i13.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.HighlightPipe, name: "highlight" }, { kind: "pipe", type: i16.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i17.ToStringPipe, name: "toString" }, { kind: "pipe", type: i17.StrLengthPipe, name: "strLength" }, { kind: "pipe", type: i18.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i19.RxPush, name: "push" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
896
910
  }
897
911
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MatAutocompleteField, decorators: [{
898
912
  type: Component,
@@ -902,7 +916,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
902
916
  multi: true,
903
917
  useExisting: forwardRef(() => MatAutocompleteField),
904
918
  },
905
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"_displayValue\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"_displayValue\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n >\n <mat-select-trigger>{{ value | toString: displayWith }}</mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"false\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n >\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n <!-- Options -->\n @for (item of items; track item) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initMatSelectInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n <!-- footer -->\n @if (itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"optionSelected.emit($event)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n }\n\n <!-- Options -->\n @for (item of items; track item) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" [title]=\"text.innerText\" class=\"ion-align-self-center\">\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent\n }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile && !multiple) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\"\n [title]=\"dropButtonTitle || '' | translate\"\n >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"clearButtonTitle || '' | translate\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start:0}button[hidden]{display:none}\n"] }]
919
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-grid class=\"ion-no-padding field-container\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n @if (_readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [title]=\"_displayValue\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ value | toString: displayWith }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n } @else {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"_displayValue\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <!-- Mobile or Multiple (use <mat-select>) -->\n @if (mobile || multiple) {\n <mat-select\n #matSelect\n hideSingleSelectionIndicator\n disableOptionCentering\n [disableRipple]=\"disableRipple\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\"\n >\n <mat-select-trigger>{{ value | toString: displayWith }}</mat-select-trigger>\n <!-- Search bar -->\n @if (showSearchBar) {\n <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n <ion-searchbar\n #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"false\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n ></ion-searchbar>\n </mat-optgroup>\n }\n <!-- Headers -->\n <ion-row\n class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n >\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n\n <!-- None option -->\n @if (!required && !multiple && !clearable) {\n <mat-option class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n }\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\" class=\"ion-align-self-center ion-text-wrap\">\n <ion-label\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n \"\n ></ion-label>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initMatSelectInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- need more character -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n <!-- footer -->\n @if (itemCount; as count) {\n <mat-option class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </mat-option>\n }\n </mat-select>\n } @else {\n <!-- desktop (use mat-autocomplete) -->\n <input\n matInput\n #matInputText\n type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' && placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n />\n <!-- autocomplete -->\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n [hideSingleSelectionIndicator]=\"true\"\n [displayWith]=\"displayWith\"\n [class]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n [disableRipple]=\"disableRipple\"\n (optionSelected)=\"onOptionSelected($event)\"\n >\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n @for (attr of displayAttributes; track attr; let i = $index) {\n <ion-col [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n }\n </ion-row>\n @if (_$filteredItems | push: 'userBlocking'; as items) {\n <!-- No item option -->\n @if (items | isEmptyArray) {\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n <i>{{ noResultMessage | translate }}</i>\n </ion-label>\n </mat-option>\n } @else {\n <!-- Options -->\n @for (item of items; track $index) {\n <mat-option [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList || ''\">\n @for (path of displayAttributes; track path; let i = $index) {\n <ion-col\n [size]=\"displayColumnSizes[i]\"\n [title]=\"text.innerText\"\n class=\"ion-align-self-center\"\n >\n <ion-text>\n <span\n #text\n [innerHTML]=\"\n item\n | propertyGet: path\n | highlight\n : {\n search: matInputText.value,\n withAccent: highlightAccent\n }\n \"\n ></span>\n </ion-text>\n </ion-col>\n }\n </ion-row>\n </mat-option>\n }\n }\n <!-- More item -->\n @if (_moreItemsCount) {\n <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n <!-- Need more characters -->\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n </ion-label>\n </mat-option>\n } @else {\n <!-- Loading spinner -->\n <mat-option class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n }\n\n <!-- footer -->\n @if (itemCount; as count) {\n <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </mat-autocomplete>\n }\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @if (formControl.hasError('entity')) {\n <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n }\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n <!-- Hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n @if (!mobile && !multiple) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\"\n [title]=\"dropButtonTitle || '' | translate\"\n >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n }\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\"\n [title]=\"clearButtonTitle || '' | translate\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label,:host.ion-text-wrap ion-text{white-space:normal!important}ion-grid.field-container>ion-row>ion-col.ion-no-padding{--ion-padding-start:0}button[hidden]{display:none}\n"] }]
906
920
  }], ctorParameters: () => [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.ModalController }, { type: i0.Renderer2 }, { type: i2.FormGroupDirective, decorators: [{
907
921
  type: Optional
908
922
  }] }], propDecorators: { equals: [{
@@ -1004,6 +1018,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
1004
1018
  }], splitSearchText: [{
1005
1019
  type: Input,
1006
1020
  args: [{ transform: booleanAttribute }]
1021
+ }], selectInputContentOnFocus: [{
1022
+ type: Input,
1023
+ args: [{ transform: booleanAttribute }]
1007
1024
  }], classList: [{
1008
1025
  type: Input,
1009
1026
  args: [{ alias: 'class' }]
@@ -1024,9 +1041,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
1024
1041
  }], keyupEnter: [{
1025
1042
  type: Output,
1026
1043
  args: ['keyup.enter']
1027
- }], optionSelected: [{
1044
+ }], selectionChange: [{
1028
1045
  type: Output,
1029
- args: ['optionSelected']
1046
+ args: ['selectionChange']
1030
1047
  }], matSelect: [{
1031
1048
  type: ViewChild,
1032
1049
  args: ['matSelect']
@@ -1052,4 +1069,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
1052
1069
  }], items: [{
1053
1070
  type: Input
1054
1071
  }] } });
1055
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFFVixLQUFLLEVBQ0wsZUFBZSxFQUdmLFFBQVEsRUFDUixNQUFNLEVBRU4sbUJBQW1CLEVBQ25CLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTRDLGlCQUFpQixFQUFzQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3SCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqSSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsS0FBSyxFQUNMLFlBQVksRUFDWixRQUFRLEVBQ1IsZUFBZSxFQUNmLGNBQWMsRUFDZCxlQUFlLEVBQ2YsY0FBYyxFQUNkLFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxVQUFVLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFF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QUFPLEVBQUU7Z0JBUVIsT0FBTztzQkFBdkIsTUFBTTt1QkFBQyxPQUFPO2dCQUVDLE9BQU87c0JBQXRCLE1BQU07dUJBQUMsTUFBTTtnQkFFRyxPQUFPO3NCQUF2QixNQUFNO3VCQUFDLE9BQU87Z0JBQ0wsZUFBZTtzQkFBeEIsTUFBTTtnQkFDbUIsYUFBYTtzQkFBdEMsTUFBTTt1QkFBQyxnQkFBZ0I7Z0JBQ0QsVUFBVTtzQkFBaEMsTUFBTTt1QkFBQyxhQUFhO2dCQUdLLGNBQWM7c0JBQXZDLE1BQU07dUJBQUMsZ0JBQWdCO2dCQUVBLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0UsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNHLFlBQVk7c0JBQXZDLFNBQVM7dUJBQUMsZUFBZTtnQkFDUyxtQkFBbUI7c0JBQXJELFNBQVM7dUJBQUMsc0JBQXNCO2dCQW1CcEIsTUFBTTtzQkFBbEIsS0FBSztnQkFZc0MsUUFBUTtzQkFBbkQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFTekIsUUFBUTtzQkFBcEIsS0FBSztnQkFTTyxLQUFLO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFJlbmRlcmVyU3R5bGVGbGFnczIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBpc09ic2VydmFibGUsIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZldGNoTW9yZUZuLCBMb2FkUmVzdWx0LCBTdWdnZXN0Rm4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge1xuICBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlLFxuICBmaW5kUGFyZW50V2l0aENsYXNzLFxuICBpc0JsYW5rU3RyaW5nLFxuICBpc05pbCxcbiAgaXNOaWxPckJsYW5rLFxuICBpc05vdE5pbCxcbiAgaXNOb3ROaWxCb29sZWFuLFxuICBpc05vdE5pbE9iamVjdCxcbiAgaXNOb3ROaWxPckJsYW5rLFxuICBpc05vdE5pbFN0cmluZyxcbiAgdG9OdW1iZXIsXG59IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmb2N1c0lucHV0LCBJbnB1dEVsZW1lbnQsIHNlbGVjdElucHV0UmFuZ2UgfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHsgZmlyc3ROb3ROaWxQcm9taXNlIH0gZnJvbSAnLi4vLi4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgQXBwRmxvYXRMYWJlbFR5cGUsIERpc3BsYXlGbiwgRXF1YWxzRm4gfSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIFN1YnNjcmlwdFNpemluZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0U2VsZWN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBmcm9tU2Nyb2xsRW5kRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHsgSW9uU2VhcmNoYmFyLCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBpc01vYmlsZSB9IGZyb20gJy4uLy4uL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBzdWdnZXN0RnJvbUFycmF5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgU2VhcmNoYmFyQ2hhbmdlRXZlbnREZXRhaWwgfSBmcm9tICdAaW9uaWMvY29yZS9kaXN0L3R5cGVzL2NvbXBvbmVudHMvc2VhcmNoYmFyL3NlYXJjaGJhci1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscyB9IGZyb20gJy4vbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLnV0aWxzJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdAcngtYW5ndWxhci9jZGsvem9uZS1sZXNzL2Jyb3dzZXInO1xuaW1wb3J0IHsgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcblxuY29uc3Qgbm9vcCA9IChfPzogYW55KSA9PiB7fTtcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbWF0LWF1dG9jb21wbGV0ZS1maWVsZCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNYXRBdXRvY29tcGxldGVGaWVsZCksXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdEF1dG9jb21wbGV0ZUZpZWxkIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIElucHV0RWxlbWVudCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuXG4gIHByaXZhdGUgX29uRmV0Y2hNb3JlQ2FsbGJhY2s6IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8YW55Pj47XG4gIHByaXZhdGUgX2ltcGxpY2l0VmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9pdGVtc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9vcGVuZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfJGZpbHRlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9pdGVtQ291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVsb2FkJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBwcm90ZWN0ZWQgX3JlYWRvbmx5ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfdGFiaW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF8kaW5wdXRJdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBfJGZpbHRlcmVkSXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgX2Rpc3BsYXlWYWx1ZSA9ICcnO1xuICBwcm90ZWN0ZWQgX21vcmVJdGVtc0NvdW50OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlJCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIHByb3RlY3RlZCBfZGVmYXVsdFBhbmVsV2lkdGg6IHN0cmluZyA9IG51bGw7XG5cbiAgQElucHV0KCkgZXF1YWxzOiBFcXVhbHNGbjtcbiAgQElucHV0KCkgbG9nUHJlZml4ID0gJ1ttYXQtYXV0b2NvbXBsZXRlXSAnO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWU6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEFwcEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlO1xuICBASW5wdXQoKSBzdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgc3VnZ2VzdEZuOiBTdWdnZXN0Rm48YW55LCBhbnk+O1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBkZWJvdW5jZVRpbWU6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlTZXBhcmF0b3I6IHN0cmluZyB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlXaXRoOiBEaXNwbGF5Rm4gfCBudWxsO1xuICBASW5wdXQoKSBkaXNwbGF5QXR0cmlidXRlczogc3RyaW5nW107XG4gIEBJbnB1dCgpIGRpc3BsYXlDb2x1bW5TaXplczogKG51bWJlciB8ICdhdXRvJyB8IHVuZGVmaW5lZClbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtbk5hbWVzOiBzdHJpbmdbXTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZ2hsaWdodEFjY2VudDogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dBbGxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1BhbmVsT25Gb2N1czogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGF1dG9mb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoKSBjb25maWc6IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnO1xuICBASW5wdXQoKSBpMThuUHJlZml4ID0gJ1JFRkVSRU5USUFMLic7XG4gIEBJbnB1dCgpIG5vUmVzdWx0TWVzc2FnZSA9ICdDT01NT04uTk9fUkVTVUxUJztcbiAgQElucHV0KCkgcGFuZWxDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKSBwYW5lbFdpZHRoOiBzdHJpbmc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlUmlwcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uOiAnYXV0bycgfCAnYWJvdmUnIHwgJ2JlbG93JztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG11bHRpcGxlOiBib29sZWFuO1xuICBASW5wdXQoKSBmZXRjaE1vcmVUaHJlc2hvbGQgPSAnMTUlJztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgc3VnZ2VzdExlbmd0aFRocmVzaG9sZDogbnVtYmVyID0gbnVsbDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dMb2FkaW5nU3Bpbm5lciA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZWJ1ZyA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1NlYXJjaEJhciA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzdGlja3lTZWFyY2hCYXIgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwbHlJbXBsaWNpdFZhbHVlOiBib29sZWFuIHwgKCh2YWx1ZTogYW55KSA9PiBib29sZWFuKTtcbiAgQElucHV0KCkgZHJvcEJ1dHRvblRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNsZWFyQnV0dG9uVGl0bGU6IHN0cmluZztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHRyaW1TZWFyY2hUZXh0OiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc3BsaXRTZWFyY2hUZXh0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgcGFuZWxDbGFzcyBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoeyBhbGlhczogJ2NsYXNzJyB9KSBzZXQgY2xhc3NMaXN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhbmVsQ2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBnZXQgY2xhc3NMaXN0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxDbGFzcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCdjbGljaycpIGNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCdibHVyJykgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoJ2ZvY3VzJykgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyb3BCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KHRydWUpO1xuICBAT3V0cHV0KCdrZXlkb3duLmVzY2FwZScpIGtleWRvd25Fc2NhcGUgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCdrZXl1cC5lbnRlcicpIGtleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIC8vIFRPRE86IHVzZWQgYnkgbmFtZWQgZmlsdGVyIChidXQgbWlzc2luZyBtYXQtc2VsZWN0IGVtaXQoKSApXG4gIEBPdXRwdXQoJ29wdGlvblNlbGVjdGVkJykgb3B0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWF0U2VsZWN0JykgbWF0U2VsZWN0OiBNYXRTZWxlY3Q7XG4gIEBWaWV3Q2hpbGQoJ2lvblNlYXJjaGJhcicpIGlvblNlYXJjaGJhcjogSW9uU2VhcmNoYmFyO1xuICBAVmlld0NoaWxkKCdtYXRJbnB1dFRleHQnKSBtYXRJbnB1dFRleHQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge31cblxuICBnZXQgaXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1Db3VudDtcbiAgfVxuXG4gIGdldCBjYW5GZXRjaE1vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgJiYgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPiAwO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlcih2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kZmlsdGVyLnZhbHVlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgU2V0dGluZyBmaWx0ZXI6XCIsIHZhbHVlKTtcbiAgICAgIHRoaXMuXyRmaWx0ZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl8kZmlsdGVyLnZhbHVlO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpdGVtcyh2YWx1ZTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSkge1xuICAgIC8vIFJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gb24gaXRlbXMsIChpZiBleGl0cylcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgSXRlbXMgcmVjZWl2ZWQgdHdpY2UgIScpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmIChpc09ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbiA9IHZhbHVlLnN1YnNjcmliZSgodikgPT4gdGhpcy5fJGlucHV0SXRlbXMubmV4dCh2KSk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSkge1xuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcy5uZXh0KHZhbHVlIGFzIGFueVtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXRlbXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuXyRpbnB1dEl0ZW1zO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5IHx8IHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQ7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3JlYWRvbmx5ICYmIHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlZDtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05pbCh0aGlzLl8kZmlsdGVyZWRJdGVtcy52YWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPz8gKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZD4uXCIpO1xuXG4gICAgLy8gQ29uZmlndXJhdGlvbiBmcm9tIGNvbmZpZyBvYmplY3RcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gdGhpcy5zdWdnZXN0Rm4gPz8gdGhpcy5jb25maWcuc3VnZ2VzdEZuO1xuICAgICAgaWYgKCF0aGlzLnN1Z2dlc3RGbiAmJiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyID8/IHRoaXMuY29uZmlnLmZpbHRlcjtcbiAgICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID8/IHRoaXMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzID8/IHRoaXMuY29uZmlnLmNvbHVtblNpemVzO1xuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5OYW1lcztcbiAgICAgIHRoaXMuZGlzcGxheVNlcGFyYXRvciA9IHRoaXMuZGlzcGxheVNlcGFyYXRvciA/PyB0aGlzLmNvbmZpZy5kaXNwbGF5V2l0aFNlcGFyYXRvcjtcbiAgICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoID8/IHRoaXMuY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgdGhpcy5zcGxpdFNlYXJjaFRleHQgPSB0aGlzLnNwbGl0U2VhcmNoVGV4dCA/PyB0aGlzLmNvbmZpZy5zcGxpdFNlYXJjaFRleHQ7XG4gICAgICB0aGlzLnRyaW1TZWFyY2hUZXh0ID0gdGhpcy50cmltU2VhcmNoVGV4dCA/PyB0aGlzLmNvbmZpZy50cmltU2VhcmNoVGV4dDtcbiAgICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMgPz8gdGhpcy5jb25maWcuZXF1YWxzO1xuICAgICAgdGhpcy5tdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUgPz8gdGhpcy5jb25maWcubXVsdGlwbGU7XG4gICAgICB0aGlzLm1vYmlsZSA9IHRoaXMubW9iaWxlID8/IHRoaXMuY29uZmlnLm1vYmlsZTtcbiAgICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA/PyB0aGlzLmNvbmZpZy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkO1xuICAgICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd0FsbE9uRm9jdXM7XG4gICAgICB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPSB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd1BhbmVsT25Gb2N1cztcbiAgICAgIHRoaXMucGFuZWxDbGFzcyA9IHRoaXMucGFuZWxDbGFzcyA/PyB0aGlzLmNvbmZpZy5wYW5lbENsYXNzID8/IHRoaXMuY29uZmlnLmNsYXNzO1xuICAgICAgdGhpcy5wYW5lbFdpZHRoID0gdGhpcy5wYW5lbFdpZHRoID8/IHRoaXMuY29uZmlnLnBhbmVsV2lkdGg7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZSA9IHRoaXMuZGVib3VuY2VUaW1lID8/IHRoaXMuY29uZmlnLmRlYm91bmNlVGltZTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0QWNjZW50ID0gdGhpcy5oaWdobGlnaHRBY2NlbnQgPz8gdGhpcy5jb25maWcuaGlnaGxpZ2h0QWNjZW50O1xuICAgICAgdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPSB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA/PyB0aGlzLmNvbmZpZy5hcHBseUltcGxpY2l0VmFsdWU7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICB0aGlzLnJlcXVpcmVkID0gaXNOb3ROaWxCb29sZWFuKHRoaXMucmVxdWlyZWQpXG4gICAgICA/IHRoaXMucmVxdWlyZWRcbiAgICAgIDogdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQgfHwgaXNCbGFua1N0cmluZyh0aGlzLnJlcXVpcmVkKTtcbiAgICB0aGlzLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZSA/PyBmYWxzZTtcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMubW9iaWxlID8/IGlzTW9iaWxlKHdpbmRvdyk7XG4gICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPz8gdGhpcy5maWx0ZXI/LmF0dHJpYnV0ZXMgPz8gWydsYWJlbCcsICduYW1lJ107XG4gICAgdGhpcy5kaXNwbGF5U2VwYXJhdG9yID0gdGhpcy5kaXNwbGF5U2VwYXJhdG9yID8/IERFRkFVTFRfSk9JTl9QUk9QRVJUSUVTX1NFUEFSQVRPUjtcbiAgICB0aGlzLmRpc3BsYXlXaXRoID0gdGhpcy5kaXNwbGF5V2l0aCB8fCBNYXRBdXRvY29tcGxldGVGaWVsZFV0aWxzLmNyZWF0ZURpc3BsYXlGbih0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLCB0aGlzLm11bHRpcGxlLCB0aGlzLmRpc3BsYXlTZXBhcmF0b3IpO1xuICAgIHRoaXMuc3BsaXRTZWFyY2hUZXh0ID0gdGhpcy5zcGxpdFNlYXJjaFRleHQgPz8gdHJ1ZTtcbiAgICB0aGlzLnRyaW1TZWFyY2hUZXh0ID0gdGhpcy50cmltU2VhcmNoVGV4dCA/PyAhdGhpcy5tb2JpbGU7IC8vIFRydWUgYnkgZGVmYXVsdCBvbiBkZXNrdG9wLCBidXQgZmFsc2UgaW4gbW9iaWxlIChub3QgbmVlZCBpbiB0aGUgc2VhcmNoYmFyKVxuICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMgfHwgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscy5kZWZhdWx0RXF1YWxzO1xuXG4gICAgdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgPVxuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgfHxcbiAgICAgIC8vIGlmIG9ubHkgY29sdW1uOiBhdXRvIHNpemVcbiAgICAgICh0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMSAmJiBbdW5kZWZpbmVkXSkgfHxcbiAgICAgIC8vIENvbXB1dGVkIGNvbHVtbiBzaXplOlxuICAgICAgLy8gLSBpZiBsYWJlbCB0aGVuIGNvbCBzaXplID0gMlxuICAgICAgLy8gLSBpZiByYW5rT3JkZXIgdGhlbiBjb2wgc2l6ZSA9IDFcbiAgICAgIC8vIC0gZXNlID0+IGF1dG8gc2l6ZVxuICAgICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGF0dHIgJiYgKGF0dHIuZW5kc1dpdGgoJ2xhYmVsJykgPyAzIDogYXR0ci5lbmRzV2l0aCgncmFua09yZGVyJykgPyAyIDogdW5kZWZpbmVkKSk7XG4gICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLm1hcChcbiAgICAgIChhdHRyLCBpbmRleCkgPT4gKHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzICYmIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzW2luZGV4XSkgfHwgdGhpcy5pMThuUHJlZml4ICsgY2hhbmdlQ2FzZVRvVW5kZXJzY29yZShhdHRyKS50b1VwcGVyQ2FzZSgpXG4gICAgKTtcbiAgICBjb25zdCBwYW5lbENsYXNzZXMgPSB0aGlzLnBhbmVsQ2xhc3M/LnNwbGl0KC9cXHMrLyk7XG4gICAgdGhpcy5wYW5lbFdpZHRoID1cbiAgICAgIHRoaXMucGFuZWxXaWR0aCA/P1xuICAgICAgKHBhbmVsQ2xhc3NlcyAmJlxuICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLW1lZGl1bScpICYmICczMDBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLWxhcmdlJykgJiYgJzQwMHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgteGxhcmdlJykgJiYgJzQ1MHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgtODB2dycpICYmICc4MHZ3JykgfHxcbiAgICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC13aWR0aCcpIHx8IHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC1zaXplJykpICYmICcxMDB2dycpKSk7XG4gICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID8/IDA7XG4gICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgPz8gKHRoaXMubW9iaWxlICYmIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwKTtcbiAgICB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPSB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPz8gdHJ1ZTtcbiAgICB0aGlzLmRlYm91bmNlVGltZSA9IHRoaXMuZGVib3VuY2VUaW1lID8/ICh0aGlzLm1vYmlsZSA/IDY1MCA6IDI1MCk7XG4gICAgdGhpcy5oaWdobGlnaHRBY2NlbnQgPSB0aGlzLmhpZ2hsaWdodEFjY2VudCA/PyBmYWxzZTtcbiAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uID0gdGhpcy5tYXRBdXRvY29tcGxldGVQb3NpdGlvbiA/PyAnYXV0byc7XG4gICAgdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPSB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA/PyAhdGhpcy5tb2JpbGU7XG5cbiAgICAvLyBObyBzdWdnZXN0Rm46IGZpbHRlciBvbiB0aGUgZ2l2ZW4gaXRlbXNcbiAgICBpZiAoIXRoaXMuc3VnZ2VzdEZuKSB7XG4gICAgICBjb25zdCBzdWdnZXN0RnJvbUFycmF5Rm46IFN1Z2dlc3RGbjxhbnksIGFueT4gPSBhc3luYyAodmFsdWUsIGZpbHRlcikgPT5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQ2FsbGluZyBzdWdnZXN0RnJvbUFycmF5IHdpdGggdmFsdWU9JywgdmFsdWUpO1xuXG4gICAgICAgIHN1Z2dlc3RGcm9tQXJyYXkodGhpcy5fJGlucHV0SXRlbXMudmFsdWUsIHZhbHVlLCB7XG4gICAgICAgICAgc2VhcmNoQXR0cmlidXRlczogdGhpcy5kaXNwbGF5QXR0cmlidXRlcyxcbiAgICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBXYWl0IChvbmNlKSB0aGF0IGl0ZW1zIGFyZSBsb2FkZWQsIHRoZW4gY2FsbCBzdWdnZXN0IGZyb20gYXJyYXkgZm5cbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gYXN5bmMgKHZhbHVlLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKGlzTmlsKHRoaXMuXyRpbnB1dEl0ZW1zLnZhbHVlKSkge1xuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFdhaXRpbmcgaXRlbXMgdG8gYmUgc2V0Li4uXCIpO1xuXG4gICAgICAgICAgYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuXyRpbnB1dEl0ZW1zKTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIGl0ZW1zOlwiLCB0aGlzLmlucHV0SXRlbXMkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1Z2dlc3RGbiA9IHN1Z2dlc3RGcm9tQXJyYXlGbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpOyAvLyBMb29wXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNlbmQgdmFsdWUgdG8gc3VnZ2VzdCB3aGVuIDpcbiAgICAvLyAtIGlzIG5pbCBhbmQgJyonLCBhbmQgbm8gbWluIGxlbmd0aCB0aHJlc2hvbGRcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIG5vdCBhIHN0cmluZyB0eXBlIChlLmcuIG9iamVjdClcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIGlzIGEgc3RyaW5nLCBhbmQgaGFzIGVub3VnaCBjaGFyYWN0ZXJcbiAgICBjb25zdCB0aHJlc2hvbGRGaWx0ZXJGbiA9ICh2YWx1ZTogYW55KSA9PlxuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDAgfHxcbiAgICAgIChpc05vdE5pbCh2YWx1ZSkgJiYgKCEodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgfHwgKHZhbHVlICE9PSAnKicgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+PSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpKSk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zQ2hhbmdlcyA9IG1lcmdlKFxuICAgICAgLy8gUmVsb2FkIGV2ZW50IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUsIHRvIGZvcmNlIHJlbG9hZCBldmVuIGlmIHNhbWUgdmFsdWUpXG4gICAgICB0aGlzLl9yZWxvYWQkLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pLFxuICAgICAgICB0YXAoKF8pID0+IHRoaXMuc2hvd0xvYWRpbmdTcGlubmVyICYmIHRoaXMubWFya0FzTG9hZGluZygpKVxuICAgICAgKSxcblxuICAgICAgLy8gU2VhcmNoIHRleHQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgYmVjYXVzZSBvZiB0aGUgZGVib3VuY2VUaW1lKCkgcGlwZSlcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+IHRoaXMuZW5hYmxlZCAmJiBpc05vdE5pbFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAvLyBNYXJrIGFzIGxvYWRpbmcgKHRvIHNob3cgbG9hZGluZyBzcGlubmVyKSAtIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBiZWZvcmUgZGVib3VuY2VUaW1lXG4gICAgICAgIHRhcCgoXykgPT4gdGhpcy5zaG93TG9hZGluZ1NwaW5uZXIgJiYgdGhpcy5tYXJrQXNMb2FkaW5nKCkpLFxuICAgICAgICAvLyBGaWx0ZXIgaWYgbm90IGVub3VnaCBjaGFyYWN0ZXJcbiAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICgodmFsdWU/Lmxlbmd0aCB8fCAwKSA8IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXkgdmFsdWUsIHRvIGVuYWJsZSB0aGUgbWVzc2FnZSBcIm5vdCBlbm91Z2ggY2hhcmFjdGVyc1wiXG4gICAgICAgICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pLFxuICAgICAgICAvLyBXYWl0IGEgZGVib3VuY2UgdGltZVxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWUpXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vLHRhcCgodmFsdWUpID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VhcmNoIHRleHQgY2hhbmdlczonLCB2YWx1ZSkpXG4gICAgICApLFxuXG4gICAgICAvLyBPYmplY3Qgc2V0OiB1c2UgaXQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgcGlwZSBuZWVkKVxuICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgc3RhcnRXaXRoPGFueT4odGhpcy5mb3JtQ29udHJvbC52YWx1ZSksXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+IGlzTm90TmlsT2JqZWN0KHZhbHVlKSksXG4gICAgICAgIHRhcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGNvbnRyb2wgdmFsdWUgY2hhbmdlczonLCB2YWx1ZSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIGRpc3BsYXkgdmFsdWUgKGlmIG5lZWQpXG4gICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5kaXNwbGF5V2l0aCh2YWx1ZSkgfHwgJyc7XG4gICAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlWYWx1ZSAhPT0gZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSBkaXNwbGF5VmFsdWU7XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IHRvIHRoZSBpbnB1dFt0eXBlPXRleHRdIGZpZWxkXG4gICAgICAgICAgICBpZiAodGhpcy5tYXRJbnB1dFRleHQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX2Rpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBJZiBtdWx0aXBsZTogZG8gbm90IHJlY29tcHV0ZSBpdGVtcyAob25seSBmb3IgdGhlIGZpcnN0IHRpbWUsIHdoZW4gbG9hZGluZylcbiAgICAgICAgLy8gd2hlbiBmb3JtQ29udHJvbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmxvYWRpbmcgfHwgKCF0aGlzLm11bHRpcGxlICYmICF0aGlzLnNob3dBbGxPbkZvY3VzKSlcbiAgICAgICksXG5cbiAgICAgIC8vIE1lcmdlIHNvbWUgb2JzZXJ2YWJsZXMsIHdpdGggYSBjb21tb24gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBwaXBlXG4gICAgICBtZXJnZShcbiAgICAgICAgLy8gT24gZHJvcGRvd24gYnV0dG9uIGNsaWNrIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLnBpcGUoZmlsdGVyKChldmVudCkgPT4gIWV2ZW50IHx8ICFldmVudC5kZWZhdWx0UHJldmVudGVkKSksXG4gICAgICAgIC8vIEZvY3VzIG9yIGNsaWNrID0+IExvYWQgYWxsIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIG1lcmdlKHRoaXMuZm9jdXNlZCwgdGhpcy5jbGlja2VkKSxcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8ucGlwZSh0YXAoKF8pID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZm9jdXNlZCBvciBjbGlja2VkIGV2ZW50JykpKSxcbiAgICAgICAgLy8gSW5wdXQgaXRlbXMgb3IgZmlsdGVyIGNoYW5nZXNcbiAgICAgICAgbWVyZ2UodGhpcy5fJGlucHV0SXRlbXMsIHRoaXMuXyRmaWx0ZXIpLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfKSA9PiAhdGhpcy5sb2FkaW5nKVxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy90YXAoKF8pID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgJGlucHV0SXRlbXMgb3IgZmlsdGVyIGV2ZW50JykpXG4gICAgICAgIClcbiAgICAgICkucGlwZShcbiAgICAgICAgZmlsdGVyKChfKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBtYXAoKF8pID0+ICh0aGlzLnNob3dBbGxPbkZvY3VzID8gJyonIDogdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkpLFxuICAgICAgICAvLyBEaXN0aW5ndWlzaCBjaGFuZ2VzXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh2MSwgdjIpID0+XG4gICAgICAgICAgLy8gSWYgbG9hZGluZyAobm90IGxvYWRlZCB5ZXQpLCBzaW11bGF0ZSB0aGF0IHZhbHVlIGNoYW5nZWQgdG8gZm9yY2UgbG9hZFxuICAgICAgICAgIHRoaXMubG9hZGluZyA/IGZhbHNlIDogdjEgPT09IHYyIHx8IHRoaXMuZXF1YWxzKHYxLCB2MilcbiAgICAgICAgKSxcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBjaGFyYWN0ZXJzXG4gICAgICAgIGZpbHRlcih0aHJlc2hvbGRGaWx0ZXJGbiksXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIHRhcCgodmFsdWUpID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgdXBkYXRlIGV2ZW50OiAnLCB2YWx1ZSkpXG4gICAgICApXG4gICAgKS5waXBlKFxuICAgICAgLy8gU3VnZ2VzdCB2YWx1ZXNcbiAgICAgIG1lcmdlTWFwKCh2YWx1ZSkgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCB0aGlzLmZpbHRlcikpLFxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vdGFwKGl0ZW1zID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZnJvbSBzdWdnZXN0OiAnLCBpdGVtcykpLFxuXG4gICAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICAgIHRhcCgoaXRlbXMpID0+ICEodGhpcy5tb2JpbGUgfHwgdGhpcy5tdWx0aXBsZSkgJiYgdGhpcy51cGRhdGVJbXBsaWNpdFZhbHVlKGl0ZW1zKSlcbiAgICApO1xuXG4gICAgLy8gRmV0Y2ggbW9yZSBldmVudHNcbiAgICBjb25zdCBmZXRjaE1vcmVJdGVtc0NoYW5nZXMgPSB0aGlzLl9mZXRjaE1vcmUkLnBpcGUoXG4gICAgICB0YXAoKGV2ZW50KSA9PiBldmVudD8ucHJldmVudERlZmF1bHQoKSksIC8vIEF2b2lkIHRvIGNsb3NlIHRoZSBtYXQtc2VsZWN0XG4gICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jYW5GZXRjaE1vcmUpLFxuICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5mZXRjaE1vcmUoKSksXG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL3RhcChtb3JlSXRlbXMgPT4gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZnJvbSBmZXRjaCBNb3JlOiAnLCBtb3JlSXRlbXMpKSxcblxuICAgICAgLy8gQ29uY2F0IHRvIGV4aXN0aW5nIGl0ZW1zXG4gICAgICBtYXAoKG1vcmVJdGVtcykgPT4gKHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnZhbHVlIHx8IFtdKS5jb25jYXQobW9yZUl0ZW1zKSlcbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIGZpbHRlcmVkIGl0ZW1zXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcyxcblxuICAgICAgICAvLyBVcGRhdGUgaXRlbXMgZXZlbnRzXG4gICAgICAgIGZpbHRlcmVkSXRlbXNDaGFuZ2VzLFxuXG4gICAgICAgIC8vIEZldGNoIG1vcmUgZXZlbnRzXG4gICAgICAgIGZldGNoTW9yZUl0ZW1zQ2hhbmdlc1xuICAgICAgKS5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBjb250cm9sIHZhbHVlIGlzIGluc2lkZSAobWF0LXNlbGVjdClcbiAgICAgICAgLy8gKG90aGVyd2lzZSBjdXJyZW50IHZhbHVlIHdpbGwgdmlzdWFsbHkgZGlzYXBwZWFyKVxuICAgICAgICBpZiAoaXRlbXMgJiYgKHRoaXMubW9iaWxlIHx8IHRoaXMubXVsdGlwbGUpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICAgICAgLy8gSWYgZm9ybSB2YWx1ZSBpcyBtaXNzaW5nOiBhcHBlbmQgdG8gbGlzdFxuICAgICAgICAgIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KHZhbHVlLmZpbHRlcigodikgPT4gaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiB0aGlzLmVxdWFscyhpdGVtLCB2KSkgPT09IC0xKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiB0aGlzLmVxdWFscyhpdGVtLCB2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgbmV3IGZpbHRlcmVkIGl0ZW1zJywgaXRlbXMpO1xuXG4gICAgICAgIC8vIEVtaXQgaXRlbXNcbiAgICAgICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMubmV4dChpdGVtcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBcHBseWluZyBpbXBsaWNpdCB2YWx1ZSwgb24gYmx1clxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmJsdXJyZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU2tpcCBpZiBtdWx0aXBsZSAobm8gaW1wbGljaXQgdmFsdWUpIG9yIGRpc2FibGVcbiAgICAgICAgICBmaWx0ZXIoKF8pID0+ICF0aGlzLm11bHRpcGxlICYmICF0aGlzLm1vYmlsZSAmJiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy8sdGFwKF8gPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBibHVycmVkIGV2ZW50JykpLFxuICAgICAgICAgIG1hcCgoXykgPT4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGxldCBpbnZhbGlkYXRlRmlsdGVyZWRJdGVtcyA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gV2hlbiBsZWF2ZSBjb21wb25lbnQgd2l0aG91dCBvYmplY3QsIHVzZSBpbXBsaWNpdCB2YWx1ZSBpZiA6XG4gICAgICAgICAgLy8gLSBhbiBleHBsaWNpdCB2YWx1ZVxuICAgICAgICAgIC8vIC0gZmllbGQgaXMgbm90IGVtcHR5ICh1c2VyIGZpbGwgc29tZXRoaW5nKVxuICAgICAgICAgIC8vIC0gT1IgZmllbGQgZW1wdHkgYnV0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKHRoaXMuX2ltcGxpY2l0VmFsdWUgJiYgKCh0aGlzLnJlcXVpcmVkICYmIGlzTmlsT3JCbGFuayh2YWx1ZSkpIHx8IChpc05vdE5pbE9yQmxhbmsodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX2ltcGxpY2l0VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGludmFsaWRhdGVGaWx0ZXJlZEl0ZW1zID0gdGhpcy5zaG93QWxsT25Gb2N1cztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTmlsIHZhbHVlXG4gICAgICAgICAgZWxzZSBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlciBoYXMgc2VsZWN0ZWQgYW4gaXRlbTogaW52YWxpZGF0ZSBpZiBzaG93QWxsT25Gb2N1c1xuICAgICAgICAgICAgaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMgPSB0aGlzLnNob3dBbGxPbkZvY3VzICYmIGlzTm90TmlsT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gbnVsbDsgLy8gcmVzZXQgdGhlIGltcGxpY2l0IHZhbHVlXG4gICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7IC8vIENsb25lIHBhbmVsXG5cbiAgICAgICAgICAvLyBJbnZhbGlkYXRlIGxvYWRlZCBpdGVtcyAobWFyayBhcyBsb2FkaW5nIHNob3VsZCBmb3JjZSBuZXd0IGZvY3VzIHRvIHJlbG9hZCBpdGVtcylcbiAgICAgICAgICBpZiAoaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMpIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gZm9ybSBjb250cm9sIHN0YXR1cyBjaGFuZ2VcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgIC8vIFVwZGF0ZSBjb21wb25lbnQgc3RhdGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNoZWNrSWZUb3VjaGVkKCkpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmtleWRvd25Fc2NhcGUuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAvLyBBdm9pZCBmb3JtIG9yIHBhZ2UgdG8gbWFuYWdlIGVzY2FwZSBldmVudFxuICAgICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgQ2xvc2luZyB0aGUgcGFuZWwgKGtleWRvd24uZXNjYXBlKVwiKTtcblxuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fZml4TWF0U2VsZWN0UG9zaXRpb25BbmRTZWFyY2hiYXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5faXRlbXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuXyRpbnB1dEl0ZW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGlucHV0SXRlbXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVsb2FkJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXIuY29tcGxldGUoKTtcblxuICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5jbGlja2VkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5ibHVycmVkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mb2N1c2VkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXlkb3duRXNjYXBlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXl1cEVudGVyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZmV0Y2hNb3JlJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gbnVsbDtcbiAgICB0aGlzLmRpc3BsYXlXaXRoID0gbnVsbDtcbiAgICB0aGlzLmVxdWFscyA9IG51bGw7XG4gICAgdGhpcy5zdWdnZXN0Rm4gPSBudWxsO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zID0gbnVsbDtcbiAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgdGhpcy5wYW5lbENsYXNzID0gbnVsbDtcblxuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gbnVsbDtcblxuICAgIC8vIERlc3Ryb3kgdGhlICdhdXRvY29tcGxldGUnIGluc3RhbmNlLCB0byBhdm9pZCBtZW1vcnkgbGVha1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlPy5uZ09uRGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIHJlbG9hZCBjb250ZW50LiBVc2VmdWwgd2hlbiBmaWx0ZXIgaGFzIGJlZW4gY2hhbmdlZCBidXQgbm90IGRldGVjdGVkXG4gICAqL1xuICByZWxvYWRJdGVtcyh2YWx1ZT86IGFueSkge1xuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIEFza2luZyB0byByZWxvYWRJdGVtcygpXCIpO1xuICAgIC8vIEZvcmNlIGEgcmVmcmVzaFxuICAgIHRoaXMuX3JlbG9hZCQubmV4dCh2YWx1ZSB8fCAodGhpcy5zaG93QWxsT25Gb2N1cyAmJiB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKTtcblxuICAgIC8vIENsZWFyIHRoZSBzZWFyY2ggYmFyIChpZiBoaWRkZW4pXG4gICAgaWYgKHRoaXMubW9iaWxlICYmICF0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4gJiYgdGhpcy5pb25TZWFyY2hiYXIpIHtcbiAgICAgIHRoaXMuaW9uU2VhcmNoYmFyLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBERUJVR1xuICAgIC8vIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBXcml0aW5nIHZhbHVlOiAnLCB2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHRoaXMuZGlzcGxheVdpdGgodmFsdWUpO1xuXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbmVlZCB0byB1cGRhdGUgY29udHJvbHNcbiAgICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICB0aGlzLm1hdFNlbGVjdC5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb2N1c0lucHV0KHRoaXMubWF0SW5wdXRUZXh0KTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJJbnB1dFRleHRGb2N1c0V2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0IGlucHV0IGNvbnRlbnQnKTtcbiAgICBjb25zdCBoYXNDb250ZW50ID0gaXNOb3ROaWxPckJsYW5rKChldmVudC50YXJnZXQgYXMgYW55KT8udmFsdWUpO1xuXG4gICAgLy8gSWYgY29tYm8gaXMgZW1wdHksIG9yIGlmIGhhcyBjb250ZW50IGJ1dCBzaG91bGQgZm9yY2UgdG8gc2hvdyBwYW5lbCBvbiBmb2N1c1xuICAgIGlmICghaGFzQ29udGVudCB8fCB0aGlzLnNob3dQYW5lbE9uRm9jdXMgfHwgdGhpcy5zaG93QWxsT25Gb2N1cykge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVySW5wdXRUZXh0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBOZWVkIGEgdGltZW91dCB0byBwcmV2ZW50IGVhcmx5IGJsdXIgZXZlbnQgd2l0aG91dCB0cmlnZ2VyaW5nIGZvcm1DaGFuZ2UgZXZlbnRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBldmVudCBmcm9tIG1hdC1vcHRpb25cbiAgICAgIGlmIChcbiAgICAgICAgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykgfHxcbiAgICAgICAgLy8gT3IgYXV0b2NvbXBsZXRlIHBhbmVsIGlzIG9wZW4gYmVjYXVzZSBldmVudC5yZWxhdGVkVGFyZ2V0IGlzIG51bGwgKGNmLiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yNDE4MilcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGU/LmlzT3BlblxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIGJsdXIgZXZlbnRcIik7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQmx1cjogbW92ZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nJyk7XG5cbiAgICAgIC8vIE1vdmUgY2FyZXQgdG8gdGhlIGJlZ2lubmluZyAoZml4IGlzc3VlIElNQUdJTkUtNDY5KVxuICAgICAgc2VsZWN0SW5wdXRSYW5nZShldmVudC50YXJnZXQgYXMgYW55LCAwLCAwKTtcblxuICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpb25TZWFyY2hCYXJDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIEdldCB0aGUgdmFsdWUgdG8gc2VhcmNoXG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8U2VhcmNoYmFyQ2hhbmdlRXZlbnREZXRhaWw+KT8uZGV0YWlsLnZhbHVlO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBSZWNlaXZlZCA8aW9uLXNlYXJjaGJhcj4gY2hhbmdlc1wiLCB2YWx1ZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRpc3BsYXkgdmFsdWUgKGluIHRoZSB2aXNpYmxlIGZvcm0gY29udHJvbClcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIE1hcmsgY29tcG9uZW50IGFzIGxvYWRpbmdcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIC8vIFJlbG9hZCBpdGVtc1xuICAgIHRoaXMucmVsb2FkSXRlbXModmFsdWUpO1xuXG4gICAgLy8gVE9ETyBGaW5kIGEgd2F5IHRvIGF2b2lkIG1hdC1zZWxlY3QgdG8gZ2l2ZSBmb2N1cyB0byBhbiBvcHRpb24sIHdoZW4gdHlwaW5nXG4gICAgLyppZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5tYXRTZWxlY3QuX2VsZW1lbnRSZWY7XG4gICAgfSovXG4gIH1cblxuICBmaWx0ZXJNYXRTZWxlY3RGb2N1c0V2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIDxtYXQtc2VsZWN0PiBmb2N1cyBldmVudCcsIGV2ZW50KTtcblxuICAgIC8vIEVtaXQgZXZlbnRcbiAgICB0aGlzLmZvY3VzZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBmaWx0ZXJNYXRTZWxlY3RCbHVyRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIC8vIERFQlVHXG4gICAgLy8gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIDxtYXQtc2VsZWN0PiBibHVyIGV2ZW50XCIsIGV2ZW50KTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgLy8gSWdub3JlIGV2ZW50IGZyb20gbWF0LW9wdGlvblxuICAgICAgKGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ01BVC1PUFRJT04nIHx8XG4gICAgICAgIChldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdESVYnICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXQtbWRjLXNlbGVjdC1wYW5lbCcpKSB8fCAvLyBOZXcgTURDIHRhZyBhbmQgY2xhc3MgbmFtZSAoZXF1aXZhbGVudCB0byBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJylcbiAgICAgICAgKGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2VhcmNoYmFyLWlucHV0JykpKVxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgQ2FuY2VsbGluZyA8bWF0LXNlbGVjdD4gYmx1ciBldmVudFwiKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjbGVhclZhbHVlKGV2ZW50PzogRXZlbnQpIHtcbiAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmlvblNlYXJjaGJhcikge1xuICAgICAgdGhpcy5pb25TZWFyY2hiYXIudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgfVxuXG4gIF9pbml0QXV0b2NvbXBsZXRlSW5maW5pdGVTY3JvbGwodGhyZXNob2xkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgSW5pdCBhdXRvY29tcGxldGUgc2Nyb2xsIGxpc3RlbmVyJyk7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuZWQkOiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLmF1dG9jb21wbGV0ZS5faXNPcGVuID8gdGltZXIoMCkgOiB0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCQucGlwZShcbiAgICAgIG1hcCgoXykgPT4gdGhpcy5nZXRBdXRvY29tcGxldGVQYW5lbCgpKSxcbiAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICBzd2l0Y2hNYXAoKHBhbmVsKSA9PiBmcm9tU2Nyb2xsRW5kRXZlbnQocGFuZWwsIHRocmVzaG9sZCkpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuYXV0b2NvbXBsZXRlLmNsb3NlZClcbiAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZmV0Y2hNb3JlJC5lbWl0KCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgX2luaXRNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMubWF0U2VsZWN0KSByZXR1cm47IC8vIFNraXBcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBJbml0IG1hdC1zZWxlY3Qgc2Nyb2xsIGxpc3RlbmVyJyk7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuZWQkOiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4gPyB0aW1lcigwKSA6IHRoaXMubWF0U2VsZWN0Ll9vcGVuZWRTdHJlYW0ucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCQucGlwZShcbiAgICAgIG1hcCgoXykgPT4gdGhpcy5nZXRNYXRTZWxlY3RQYW5lbCgpKSxcbiAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICBzd2l0Y2hNYXAoKHBhbmVsKSA9PiBmcm9tU2Nyb2xsRW5kRXZlbnQocGFuZWwsIHRocmVzaG9sZCkpLFxuICAgICAgdGFrZVVudGlsKHRoaXMubWF0U2VsZWN0Ll9jbG9zZWRTdHJlYW0pXG4gICAgKTtcblxuICAgIC8vIFRyaWdnZXIgZmV0Y2ggbW9yZSwgZW5kIGVuZCBzY3JvbGwgcmVhY2hlZFxuICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbiA9IHNjcm9sbEVuZCQucGlwZShmaWx0ZXIoKF8pID0+IHRoaXMuX21vcmVJdGVtc0NvdW50ID4gMCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mZXRjaE1vcmUkLmVtaXQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoIXRoaXMubW9iaWxlICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHx8IHRoaXMubWF0U2VsZWN0Py5wYW5lbE9wZW4gfHwgZmFsc2U7XG4gIH1cblxuICBjbG9zZVBhbmVsKCkge1xuICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXI/LmNsb3NlUGFuZWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0U2VsZWN0Py5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMubWF0U2VsZWN0Py5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSBhc3luYyBzdWdnZXN0KHZhbHVlOiBhbnksIGZpbHRlcj86IGFueSk6IFByb21pc2U8YW55W10+IHtcbiAgICAvLyBTcGxpdCBzdHJpbmcgdmFsdWUsIGlmIGFsbG93ICguZS5nICdBQUEgLSBJdGVtIEFBQScgPT4gJ0FBQScpXG4gICAgaWYgKCF0aGlzLm1vYmlsZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTcGxpdCBzZWFyY2ggdGV4dCAoYW5kIGtlZXAgb25seSB0aGUgZmlyc3QgcGFydClcbiAgICAgIGlmICh0aGlzLnNwbGl0U2VhcmNoVGV4dCAmJiB0aGlzLmRpc3BsYXlTZXBhcmF0b3IpIHtcbiAgICAgICAgY29uc3QgZmlyc3RTZXBhcmF0b3JJbmRleCA9IHZhbHVlLmluZGV4T2YodGhpcy5kaXNwbGF5U2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGZpcnN0U2VwYXJhdG9ySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgZmlyc3RTZXBhcmF0b3JJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVHJpbSBzZWFyY2ggdGV4dFxuICAgICAgaWYgKHRoaXMudHJpbVNlYXJjaFRleHQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBzdWdnZXN0aW9uIGZ1bmN0aW9uXG4gICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgICByZXMgPSBbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgcmVzID0gcmVzIGFzIGFueVtdO1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gcmVzPy5sZW5ndGggfHwgMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgdG90YWwsIGZldGNoTW9yZSB9ID0gcmVzIGFzIExvYWRSZXN1bHQ8YW55PjtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHRvTnVtYmVyKHRvdGFsLCAoZGF0YSAmJiBkYXRhLmxlbmd0aCkgfHwgMCk7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAoZmV0Y2hNb3JlICYmIHRoaXMuX2l0ZW1Db3VudCAtIGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgcmVzID0gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEZpbHRlcmVkIGl0ZW1zIGJ5IHN1Z2dlc3RGbjonLCB2YWx1ZSwgcmVzKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTW9yZSgpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKCF0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrKSByZXR1cm4gW107XG5cbiAgICAvLyBTYXZlIHRoZW4gcmVtb3ZlIGZldGNoIGZ1bmN0aW9uICh0byBhdm9pZCBtdWx0aS1jYWxsKVxuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjaztcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgeyBkYXRhLCB0b3RhbCwgZmV0Y2hNb3JlIH0gPSBhd2FpdCBmZXRjaE1vcmVGbigpO1xuICAgIHRoaXMuX2l0ZW1Db3VudCA9IHRvdGFsIHx8IHRoaXMuX2l0ZW1Db3VudDtcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gTWF0aC5tYXgoMCwgdGhpcy5fbW9yZUl0ZW1zQ291bnQgLSBkYXRhLmxlbmd0aCk7IC8vIEJvcm5lIG1pbiA9IDBcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW1wbGljaXRWYWx1ZShpdGVtczogYW55W10pIHtcbiAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgaXRlbXM/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgYXBwbHlJbXBsaWNpdFZhbHVlID0gdHlwZW9mIHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlID09PSAnZnVuY3Rpb24nID8gdGhpcy5hcHBseUltcGxpY2l0VmFsdWUoaXRlbXNbMF0pIDogdGhpcy5hcHBseUltcGxpY2l0VmFsdWU7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gYXBwbHlJbXBsaWNpdFZhbHVlID8gaXRlbXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmVG91Y2hlZCgpIHtcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEF1dG9jb21wbGV0ZVBhbmVsKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGUgPSB0aGlzLmF1dG9jb21wbGV0ZT8ub3B0aW9ucy5sYXN0Py5fZ2V0SG9zdEVsZW1lbnQoKS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWxlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgY29uc29sZS53YXJuKHRoaXMubG9nUHJlZml4ICsgJyBVbmFibGUgdG8gZmluZCB0aGUgYXV0b2NvbXBsZXRlIGRpdi4uLicpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXRTZWxlY3RQYW5lbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlID0gdGhpcy5tYXRTZWxlY3Qub3B0aW9ucy5sYXN0Py5fZ2V0SG9zdEVsZW1lbnQoKS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWxlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgY29uc29sZS53YXJuKHRoaXMubG9nUHJlZml4ICsgJyBVbmFibGUgdG8gZmluZCB0aGUgbWF0LXNlbGVjdCBjb250YWluZXIuLi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0FzTG9hZGluZygpIHtcbiAgICBpZiAodGhpcy5fJGZpbHRlcmVkSXRlbXMudmFsdWUpIHtcbiAgICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLm5leHQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maXhNYXRTZWxlY3RQb3NpdGlvbkFuZFNlYXJjaGJhcigpIHtcbiAgICBpZiAoIXRoaXMubWF0U2VsZWN0KSByZXR1cm47XG5cbiAgICAvLyBIaWRlIHRoZSBwYW5lbCAod2lsbCBiZSBzaG93IHdoZW4gcmVhZHkpXG4gICAgdGhpcy5tYXRTZWxlY3QucGFuZWxDbGFzcyA9ICdoaWRkZW4nO1xuXG4gICAgbGV0IHNlYXJjaEJhclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLm1hdFNlbGVjdC5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKGFzeW5jIChvcGVuKSA9PiB7XG4gICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5tYXRTZWxlY3QucGFuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBvdmVybGF5UGFuZSA9IGZpbmRQYXJlbnRXaXRoQ2xhc3MocGFuZWxFbGVtZW50LCAnY2RrLW92ZXJsYXktcGFuZScpO1xuXG4gICAgICAgICAgLy8gRml4IHBhbmVsIHBvc2l0aW9uLCB3aGVuIG92ZXJsYXkgaGFzIGFuIHRyYW5zZm9ybVggKGFkZGVkIHdoZW4ga2V5Ym9hcmQgaXMgc2hvd24pXG4gICAgICAgICAgdGhpcy5fZml4TWF0U2VsZWN0UGFuZWxQb3NpdGlvbihvdmVybGF5UGFuZSk7XG5cbiAgICAgICAgICAvLyBGaXggb3ZlcmxheSwgZm9yIHNlYXJjaGJhclxuICAgICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hCYXIpIHtcbiAgICAgICAgICAgIHNlYXJjaEJhclN1YnNjcmlwdGlvbiA9IGF3YWl0IHRoaXMuX2ZpeFNlYXJjaGJhck92ZXJsYXkocGFuZWxFbGVtZW50LCBvdmVybGF5UGFuZSk7XG4gICAgICAgICAgICBpZiAoc2VhcmNoQmFyU3Vic2NyaXB0aW9uKSB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHNlYXJjaEJhclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2hvdyB0aGUgcGFuZWxcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHBhbmVsRWxlbWVudCwgJ2hpZGRlbicpO1xuICAgICAgICAgIHRoaXMubWF0U2VsZWN0LnBhbmVsQ2xhc3MgPSB0aGlzLnBhbmVsQ2xhc3M7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT04gY2xvc2VcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gVW5zdWJzY3JpYmUgc2VhcmNoIGJhciB3b3JrYXJvdW5kXG4gICAgICAgICAgaWYgKHNlYXJjaEJhclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc2VhcmNoQmFyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHNlYXJjaEJhclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBzZWFyY2hCYXJTdWJzY3JpcHRpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBIaWRlIHBhbmVsIGFnYWluXG4gICAgICAgICAgICB0aGlzLm1hdFNlbGVjdC5wYW5lbENsYXNzID0gJ2hpZGRlbic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9maXhNYXRTZWxlY3RQYW5lbFBvc2l0aW9uKG92ZXJsYXlQYW5lOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghb3ZlcmxheVBhbmUpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSB0aGUgdW53YW50ZWQgZGVmYXVsdCB0cmFuc2xhdGVYXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgIG92ZXJsYXlQYW5lLFxuICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICBvdmVybGF5UGFuZS5zdHlsZS50cmFuc2Zvcm1cbiAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgLmZpbHRlcigocHJvcCkgPT4gIXByb3AubWF0Y2goL150cmFuc2xhdGVYLykpXG4gICAgICAgIC5qb2luKCcgJylcbiAgICApO1xuXG4gICAgLy8gRml4IHBhbmVsIHdpZHRoIHRvIGZpZWxkIHdpZHRoIChpdCB3YXMgbm90IGZvcmNlZCBieSBASW5wdXQgcGFuZWxXaWR0aClcbiAgICBpZiAoIXRoaXMucGFuZWxXaWR0aCkge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5sb2dQcmVmaXh9IEZpeGluZyBzZWxlY3QgcGFuZWwgd2lkdGggdG8gdGhlIGZpZWxkIHNpemVgKTtcbiAgICAgIGNvbnN0IHdpZHRoID0gYCR7dGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gMX1weGA7XG4gICAgICBpZiAodGhpcy5fZGVmYXVsdFBhbmVsV2lkdGggIT09IHdpZHRoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQYW5lbFdpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICd3aWR0aCcsIHdpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaXggcGFuZWwncyBsZWZ0LCB0byBhdm9pZCBvdmVyZmxvdyBvbiB0aGUgcmlnaHRcbiAgICBjb25zdCBsZWZ0ID0gb3ZlcmxheVBhbmUuc3R5bGUubGVmdDtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGxlZnQpICYmICFsZWZ0LmluY2x1ZGVzKCdjYWxjKCcpICYmIGxlZnQuZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBGaXhpbmcgc2VsZWN0IHBhbmVsIGxlZnQsIHRvIGF2b2lkIG92ZXJmbG93IG9uIHRoZSByaWdodGApO1xuICAgICAgY29uc3Qgd2lkdGggPSBgJHtvdmVybGF5UGFuZS5jbGllbnRXaWR0aH1weGA7XG4gICAgICBjb25zdCBmaXhMZWZ0ID0gYGNhbGMoLSR7d2lkdGh9ICsgbWluKCR7bGVmdH0gKyAke3dpZHRofSwgLTMycHggKyAxMDB2dykpYDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICdsZWZ0JywgZml4TGVmdCwgUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnQpO1xuICAgIH1cblxuICAgIC8vIEZpeCBwYW5lbCdzIHRvcCwgdG8gYXZvaWQgb3ZlcmZsb3cgb24gdGhlIGJvdHRvbVxuICAgIGNvbnN0IHRvcCA9IG92ZXJsYXlQYW5lLnN0eWxlLnRvcDtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHRvcCkgJiYgIXRvcC5pbmNsdWRlcygnY2FsYygnKSAmJiB0b3AuZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBGaXhpbmcgc2VsZWN0IHBhbmVsIHRvcCwgdG8gYXZvaWQgb3ZlcmZsb3cgb24gdGhlIGJvdHRvbWApO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYCR7b3ZlcmxheVBhbmUuY2xpZW50SGVpZ2h0IHx8IDI3NX1weGA7XG4gICAgICBjb25zdCBmaXhUb3AgPSBgY2FsYygtJHtoZWlnaHR9ICsgbWluKCR7dG9wfSArICR7aGVpZ2h0fSwgLTMycHggKyAxMDB2aCkpYDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICd0b3AnLCBmaXhUb3AsIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFjayA6IGlmIHdlIGFyZSBpbiBhIElvbk1vZGFsLCBpdCdzIG5lY2Vzc2FyeSB0byBtb3ZlIHRoZSBDZGtPdmVybGF5IGNvbnRhaW5lclxuICAgKiAgICAgaW4gdGhlIElvbk1vZGFsIHRvIG1pZ2h0IGtlZXAgZm9jdXMgaW4gSW9uU2VhcmNoYmFyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFuZWxFbGVtZW50XG4gICAqIEBwYXJhbSBvdmVybGF5UGFuZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZml4U2VhcmNoYmFyT3ZlcmxheShwYW5lbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvdmVybGF5UGFuZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QgfHwgIXRoaXMuaW9uU2VhcmNoYmFyKSByZXR1cm47XG5cbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSBhd2FpdCB0aGlzLm1vZGFsQ29udHJvbGxlci5nZXRUb3AoKTtcbiAgICBpZiAoIW1vZGFsRWxlbWVudCkgcmV0dXJuOyAvLyBObyBtb2RhbDogc2tpcFxuXG4gICAgLy8gR2V0IHRoZSBDREsgb3ZlcmxheSBjb250YWluZXJcbiAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gZmluZFBhcmVudFdpdGhDbGFzcyhwYW5lbEVsZW1lbnQsICdjZGstb3ZlcmxheS1jb250YWluZXInKTtcbiAgICBpZiAoIW92ZXJsYXlDb250YWluZXIpIHJldHVybjtcbiAgICBjb25zdCBvcmlnaW5hbFBhcmVudCA9IG92ZXJsYXlDb250YWluZXIucGFyZW50RWxlbWVudDtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZylcbiAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fU1vdmluZyB0aGUgXCJjZGstb3ZlcmxheVwiIGNvbnRhaW5lciBmcm9tIHRoZSBcIiR7b3JpZ2luYWxQYXJlbnQ/LnRhZ05hbWUgfHwgJ2JvZHknfVwiIHRvIHRoZSBcImlvbi1tb2RhbFwiIGNvbnRhaW5lcmApO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChtb2RhbEVsZW1lbnQsIG92ZXJsYXlDb250YWluZXIpO1xuXG4gICAgY29uc3QgX2RvY3VtZW50ID0gdGhpcy5pbmplY3Rvci5nZXQoRE9DVU1FTlQpO1xuICAgIGNvbnN0IHNoaWZ0TGVmdCA9IChfZG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJXaWR0aCAtIG1vZGFsRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkgLyAyO1xuICAgIGNvbnN0IHNoaWZ0VG9wID0gKF9kb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCAtIG1vZGFsRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIC8gMjtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICdtYXJnaW4tdG9wJywgYC0ke3NoaWZ0VG9wfXB4YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5UGFuZSwgJ21hcmdpbi1sZWZ0JywgYC0ke3NoaWZ0TGVmdH1weGApO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXZlcnNlIGZ1bmN0aW9uLCB0byByZXBsYWNlIHRoZSBjb250YWluZXIgaW4gYm9keVxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2lmICh0aGlzLmRlYnVnKVxuICAgICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gbW92aW5nIHRoZSBcImNkay1vdmVybGF5XCIgY29udGFpbmVyIGZyb20gdGhlIFwiaW9uLW1vZGFsXCIgdG8gdGhlIFwiYm9keVwiIGNvbnRhaW5lcmApO1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG9yaWdpbmFsUGFyZW50IC8qdGhpcy5kb2N1bWVudC5ib2R5Ki8sIG92ZXJsYXlDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBmaWVsZC1jb250YWluZXJcIj5cbiAgPGlvbi1yb3c+XG4gICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPCEtLSByZWFkb25seSAtLT5cbiAgICAgIEBpZiAoX3JlYWRvbmx5KSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIl9kaXNwbGF5VmFsdWVcIlxuICAgICAgICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHk9XCJ0cnVlXCIgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICAgICAgICA8aW9uLXRleHQ+e3sgdmFsdWUgfCB0b1N0cmluZzogZGlzcGxheVdpdGggfX08L2lvbi10ZXh0PlxuICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBoaW50cyAtLT5cbiAgICAgICAgICBAaWYgKCFmb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbdGl0bGVdPVwiX2Rpc3BsYXlWYWx1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gTW9iaWxlIG9yIE11bHRpcGxlICh1c2UgPG1hdC1zZWxlY3Q+KSAtLT5cbiAgICAgICAgICBAaWYgKG1vYmlsZSB8fCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgI21hdFNlbGVjdFxuICAgICAgICAgICAgICBoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yXG4gICAgICAgICAgICAgIGRpc2FibGVPcHRpb25DZW50ZXJpbmdcbiAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiZGlzYWJsZVJpcHBsZVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJfdGFiaW5kZXhcIlxuICAgICAgICAgICAgICBbcGFuZWxDbGFzc109XCJwYW5lbENsYXNzXCJcbiAgICAgICAgICAgICAgW3BhbmVsV2lkdGhdPVwicGFuZWxXaWR0aCB8fCBfZGVmYXVsdFBhbmVsV2lkdGhcIlxuICAgICAgICAgICAgICAoZm9jdXMpPVwiZmlsdGVyTWF0U2VsZWN0Rm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiZmlsdGVyTWF0U2VsZWN0Qmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwia2V5ZG93bkVzY2FwZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwia2V5dXBFbnRlci5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiZXF1YWxzXCJcbiAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgW3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWxdPVwiZGVib3VuY2VUaW1lICogMTBcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPnt7IHZhbHVlIHwgdG9TdHJpbmc6IGRpc3BsYXlXaXRoIH19PC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJhciAtLT5cbiAgICAgICAgICAgICAgQGlmIChzaG93U2VhcmNoQmFyKSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBjbGFzcz1cIm1hdC1zZWxlY3Qtc2VhcmNoYmFyXCIgW2NsYXNzLm1hdC1zZWxlY3Qtc2VhcmNoYmFyLXN0aWNreV09XCJzdGlja3lTZWFyY2hCYXJcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gRklYTUUgb24gaU9TIGRldmljZXMsIHdoZW4gYW5pbWF0ZWQ9XCJ0cnVlXCIsIHRoZW4gdGhlIHNlYXJjaCBpY29uIG92ZXJsYXAgdGhlIHBsYWNlaG9sZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgPGlvbi1zZWFyY2hiYXJcbiAgICAgICAgICAgICAgICAgICAgI2lvblNlYXJjaGJhclxuICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBhbmltYXRlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWJvdW5jZV09XCJkZWJvdW5jZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAoaW9uQ2xlYXIpPVwibWFya0FzTG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlvbklucHV0KT1cImlvblNlYXJjaEJhckNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQ09NTU9OLkJUTl9TRUFSQ0gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgID48L2lvbi1zZWFyY2hiYXI+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXJzIC0tPlxuICAgICAgICAgICAgICA8aW9uLXJvd1xuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXNlbGVjdC1oZWFkZXIgY29sdW1uIGlvbi1uby1wYWRkaW5nXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtc2VsZWN0LXNlYXJjaGJhci1zdGlja3ldPVwic2hvd1NlYXJjaEJhciAmJiBzdGlja3lTZWFyY2hCYXJcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGZvciAoYXR0ciBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgYXR0cjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwiZGlzcGxheUNvbHVtbk5hbWVzW2ldIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgICAgICAgPCEtLSBOb25lIG9wdGlvbiAtLT5cbiAgICAgICAgICAgICAgQGlmICghcmVxdWlyZWQgJiYgIW11bHRpcGxlICYmICFjbGVhcmFibGUpIHtcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPjxpIHRyYW5zbGF0ZT5DT01NT04uRU1QVFlfT1BUSU9OPC9pPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoXyRmaWx0ZXJlZEl0ZW1zIHwgcHVzaDogJ3VzZXJCbG9ja2luZyc7IGFzIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBObyBpdGVtIG9wdGlvbiAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW1zIHwgaXNFbXB0eUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGk+e3sgbm9SZXN1bHRNZXNzYWdlIHwgdHJhbnNsYXRlIH19PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXJvdyBbY2xhc3NMaXN0XT1cIml0ZW0uY2xhc3NMaXN0IHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAocGF0aCBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgcGF0aDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiIGNsYXNzPVwiaW9uLWFsaWduLXNlbGYtY2VudGVyIGlvbi10ZXh0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydHlHZXQ6IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaWdobGlnaHQ6IHsgc2VhcmNoOiBpb25TZWFyY2hiYXI/LnZhbHVlLCB3aXRoQWNjZW50OiBoaWdobGlnaHRBY2NlbnQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPCEtLSBNb3JlIGl0ZW0gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChfbW9yZUl0ZW1zQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChuZ0luaXQpPVwiX2luaXRNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbCgpXCIgY2xhc3M9XCJpb24tcGFkZGluZ1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKChfZGlzcGxheVZhbHVlIHwgc3RyTGVuZ3RoKSA8IHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICA8IS0tIG5lZWQgbW9yZSBjaGFyYWN0ZXIgLS0+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyB0ZXh0LWl0YWxpY1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0lORk8uUExFQVNFX1RZUEVfTU9SRV9DSEFSQUNURVJTJyB8IHRyYW5zbGF0ZTogeyBtaW5MZW5ndGg6IHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgfSB9fVxuICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIGxvYWRpbmcgc3Bpbm5lciAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbUNvdW50OyBhcyBjb3VudCkge1xuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwibWF0LW9wdGlvbi1mb290ZXIgbWF0LWF1dG9jb21wbGV0ZS1mb290ZXIgaW9uLW5vLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi1mbG9hdC1lbmQgaW9uLXBhZGRpbmctZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpPnt7ICdDT01NT04uUkVTVUxUX0NPVU5UJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogY291bnQgfSB9fTwvaT5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIGRlc2t0b3AgKHVzZSBtYXQtYXV0b2NvbXBsZXRlKSAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAjbWF0SW5wdXRUZXh0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlUG9zaXRpb25dPVwibWF0QXV0b2NvbXBsZXRlUG9zaXRpb25cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmxvYXRMYWJlbCA9PT0gJ25ldmVyJyAmJiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIl90YWJpbmRleFwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJmaWx0ZXJJbnB1dFRleHRGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJrZXlkb3duRXNjYXBlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJrZXl1cEVudGVyLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwiIWF1dG9jb21wbGV0ZS5zaG93UGFuZWwgJiYgZHJvcEJ1dHRvbkNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPCEtLSBhdXRvY29tcGxldGUgLS0+XG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAjYXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgW2F1dG9BY3RpdmVGaXJzdE9wdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5V2l0aFwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJwYW5lbENsYXNzXCJcbiAgICAgICAgICAgICAgW3BhbmVsV2lkdGhdPVwicGFuZWxXaWR0aFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT1cImRpc2FibGVSaXBwbGVcIlxuICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib3B0aW9uU2VsZWN0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXJzIC0tPlxuICAgICAgICAgICAgICA8aW9uLXJvdyBjbGFzcz1cIm1hdC1hdXRvY29tcGxldGUtaGVhZGVyIGNvbHVtbiBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGF0dHIgb2YgZGlzcGxheUF0dHJpYnV0ZXM7IHRyYWNrIGF0dHI7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBbaW5uZXJIVE1MXT1cImRpc3BsYXlDb2x1bW5OYW1lc1tpXSB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICBAaWYgKF8kZmlsdGVyZWRJdGVtcyB8IHB1c2g6ICd1c2VyQmxvY2tpbmcnOyBhcyBpdGVtcykge1xuICAgICAgICAgICAgICAgIDwhLS0gTm8gaXRlbSBvcHRpb24gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtcyB8IGlzRW1wdHlBcnJheSkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZyB0ZXh0LWl0YWxpY1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpPnt7IG5vUmVzdWx0TWVzc2FnZSB8IHRyYW5zbGF0ZSB9fTwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXJvdyBbY2xhc3NMaXN0XT1cIml0ZW0uY2xhc3NMaXN0IHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAocGF0aCBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgcGF0aDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiIFt0aXRsZV09XCJ0ZXh0LmlubmVyVGV4dFwiIGNsYXNzPVwiaW9uLWFsaWduLXNlbGYtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHByb3BlcnR5R2V0OiBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaWdobGlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogbWF0SW5wdXRUZXh0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhBY2NlbnQ6IGhpZ2hsaWdodEFjY2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwhLS0gTW9yZSBpdGVtIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoX21vcmVJdGVtc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAobmdJbml0KT1cIl9pbml0QXV0b2NvbXBsZXRlSW5maW5pdGVTY3JvbGwoKVwiIGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIGlmICgoX2Rpc3BsYXlWYWx1ZSB8IHN0ckxlbmd0aCkgPCBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBOZWVkIG1vcmUgY2hhcmFjdGVycyAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSU5GTy5QTEVBU0VfVFlQRV9NT1JFX0NIQVJBQ1RFUlMnIHwgdHJhbnNsYXRlOiB7IG1pbkxlbmd0aDogc3VnZ2VzdExlbmd0aFRocmVzaG9sZCB9IH19XG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDwhLS0gTG9hZGluZyBzcGlubmVyIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDwhLS0gZm9vdGVyIC0tPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW1Db3VudDsgYXMgY291bnQpIHtcbiAgICAgICAgICAgICAgICA8aW9uLXJvdyBjbGFzcz1cIm1hdC1hdXRvY29tcGxldGUtZm9vdGVyIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLWZsb2F0LWVuZCBpb24tcGFkZGluZy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aT57eyAnQ09NTU9OLlJFU1VMVF9DT1VOVCcgfCB0cmFuc2xhdGU6IHsgY291bnQ6IGNvdW50IH0gfX08L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS1cbiAgICAgICAgICBOT1RFIDpcbiAgICAgICAgICAtIFwic2VsZWN0SW5wdXRDb250ZW50KCRldmVudCkgfHwgb25Gb2N1cy5lbWl0KCRldmVudClcIiA6IGNhbGwgb25Gb2N1cyBvbmx5IHdoZW4gdG8gdGhlIGlucHV0IGlzIGVtcHR5IChub3RoaW5nIHRvIHNlbGVjdClcbiAgICAgICAgICAtLT5cbiAgICAgICAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ2VudGl0eScpKSB7XG4gICAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9JTlZBTElEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRFcnJvclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPCEtLSBIaW50cyAtLT5cbiAgICAgICAgICBAaWYgKCFmb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuICAgIDwvaW9uLWNvbD5cbiAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRBZnRlcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9pb24tY29sPlxuICA8L2lvbi1yb3c+XG48L2lvbi1ncmlkPlxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIEBpZiAoIW1vYmlsZSAmJiAhbXVsdGlwbGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJkcm9wQnV0dG9uQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgIFtoaWRkZW5dPVwiZGlzYWJsZWRcIlxuICAgICAgW3RpdGxlXT1cImRyb3BCdXR0b25UaXRsZSB8fCAnJyB8IHRyYW5zbGF0ZVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9XG4gIEBpZiAoY2xlYXJhYmxlKSB7XG4gICAgPGJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgIFtoaWRkZW5dPVwiZGlzYWJsZWQgfHwgIWZvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgIFt0aXRsZV09XCJjbGVhckJ1dHRvblRpdGxlIHx8ICcnIHwgdHJhbnNsYXRlXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9XG5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEVycm9yVGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvcixbbWF0RXJyb3JdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRIaW50VGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC13cmFwcGVyXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWhpbnQ6bm90KFthbGlnbj0nZW5kJ10pLFttYXRIaW50XVwiPjwvbmctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyXCI+PC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWhpbnRbYWxpZ249J2VuZCddXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
1072
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFFVixLQUFLLEVBQ0wsZUFBZSxFQUdmLFFBQVEsRUFDUixNQUFNLEVBRU4sbUJBQW1CLEVBQ25CLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTRDLGlCQUFpQixFQUFzQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3SCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqSSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsS0FBSyxFQUNMLFlBQVksRUFDWixRQUFRLEVBQ1IsZUFBZSxFQUNmLGNBQWMsRUFDZCxlQUFlLEVBQ2YsY0FBYyxFQUNkLFFBQVEsR0FDVCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxVQUFVLEVBQWdCLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FB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QkFBekMsTUFBTTt1QkFBQyxpQkFBaUI7Z0JBRUQsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNLLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0csWUFBWTtzQkFBdkMsU0FBUzt1QkFBQyxlQUFlO2dCQUNTLG1CQUFtQjtzQkFBckQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBbUJwQixNQUFNO3NCQUFsQixLQUFLO2dCQVlzQyxRQUFRO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQVN6QixRQUFRO3NCQUFwQixLQUFLO2dCQVNPLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJTdHlsZUZsYWdzMixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGlzT2JzZXJ2YWJsZSwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRmV0Y2hNb3JlRm4sIExvYWRSZXN1bHQsIFN1Z2dlc3RGbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7XG4gIGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUsXG4gIGZpbmRQYXJlbnRXaXRoQ2xhc3MsXG4gIGlzQmxhbmtTdHJpbmcsXG4gIGlzTmlsLFxuICBpc05pbE9yQmxhbmssXG4gIGlzTm90TmlsLFxuICBpc05vdE5pbEJvb2xlYW4sXG4gIGlzTm90TmlsT2JqZWN0LFxuICBpc05vdE5pbE9yQmxhbmssXG4gIGlzTm90TmlsU3RyaW5nLFxuICB0b051bWJlcixcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7IGZvY3VzSW5wdXQsIElucHV0RWxlbWVudCwgc2VsZWN0SW5wdXRDb250ZW50LCBzZWxlY3RJbnB1dFJhbmdlIH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7IGZpcnN0Tm90TmlsUHJvbWlzZSB9IGZyb20gJy4uLy4uL29ic2VydmFibGVzJztcbmltcG9ydCB7IEFwcEZsb2F0TGFiZWxUeXBlLCBEaXNwbGF5Rm4sIEVxdWFsc0ZuIH0gZnJvbSAnLi4vLi4vZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdFNlbGVjdCwgTWF0U2VsZWN0Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBmcm9tU2Nyb2xsRW5kRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHsgSW9uU2VhcmNoYmFyLCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBpc01vYmlsZSB9IGZyb20gJy4uLy4uL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBzdWdnZXN0RnJvbUFycmF5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgU2VhcmNoYmFyQ2hhbmdlRXZlbnREZXRhaWwgfSBmcm9tICdAaW9uaWMvY29yZS9kaXN0L3R5cGVzL2NvbXBvbmVudHMvc2VhcmNoYmFyL3NlYXJjaGJhci1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscyB9IGZyb20gJy4vbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLnV0aWxzJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdAcngtYW5ndWxhci9jZGsvem9uZS1sZXNzL2Jyb3dzZXInO1xuaW1wb3J0IHsgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcblxuY29uc3Qgbm9vcCA9IChfPzogYW55KSA9PiB7fTtcbmV4cG9ydCB0eXBlIE1hdEF1dG9jb21wbGV0ZUZpZWxkU2VsZWN0Q2hhbmdlID0geyBzb3VyY2U6IE1hdFNlbGVjdCB8IE1hdEF1dG9jb21wbGV0ZTsgdmFsdWU6IGFueSB9O1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdtYXQtYXV0b2NvbXBsZXRlLWZpZWxkJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdEF1dG9jb21wbGV0ZUZpZWxkKSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0QXV0b2NvbXBsZXRlRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgSW5wdXRFbGVtZW50LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgcHJpdmF0ZSBfb25GZXRjaE1vcmVDYWxsYmFjazogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxhbnk+PjtcbiAgcHJpdmF0ZSBfaW1wbGljaXRWYWx1ZTogYW55O1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2l0ZW1zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX29wZW5lZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF8kZmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgX2l0ZW1Db3VudDogbnVtYmVyO1xuICBwcml2YXRlIF9yZWxvYWQkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIHByb3RlY3RlZCBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF90YWJpbmRleDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgXyRpbnB1dEl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIF8kZmlsdGVyZWRJdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBfZGlzcGxheVZhbHVlID0gJyc7XG4gIHByb3RlY3RlZCBfbW9yZUl0ZW1zQ291bnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmUkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgcHJvdGVjdGVkIF9kZWZhdWx0UGFuZWxXaWR0aDogc3RyaW5nID0gbnVsbDtcblxuICBASW5wdXQoKSBlcXVhbHM6IEVxdWFsc0ZuO1xuICBASW5wdXQoKSBsb2dQcmVmaXggPSAnW21hdC1hdXRvY29tcGxldGVdICc7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgZmxvYXRMYWJlbDogQXBwRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIEBJbnB1dCgpIHN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBzdWdnZXN0Rm46IFN1Z2dlc3RGbjxhbnksIGFueT47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2xlYXJhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIGRlYm91bmNlVGltZTogbnVtYmVyID0gbnVsbDtcbiAgQElucHV0KCkgZGlzcGxheVNlcGFyYXRvcjogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgZGlzcGxheVdpdGg6IERpc3BsYXlGbiB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtblNpemVzOiAobnVtYmVyIHwgJ2F1dG8nIHwgdW5kZWZpbmVkKVtdO1xuICBASW5wdXQoKSBkaXNwbGF5Q29sdW1uTmFtZXM6IHN0cmluZ1tdO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaGlnaGxpZ2h0QWNjZW50OiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FsbE9uRm9jdXM6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93UGFuZWxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGkxOG5QcmVmaXggPSAnUkVGRVJFTlRJQUwuJztcbiAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlID0gJ0NPTU1PTi5OT19SRVNVTFQnO1xuICBASW5wdXQoKSBwYW5lbENsYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhbmVsV2lkdGg6IHN0cmluZztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbWF0QXV0b2NvbXBsZXRlUG9zaXRpb246ICdhdXRvJyB8ICdhYm92ZScgfCAnYmVsb3cnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbXVsdGlwbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGZldGNoTW9yZVRocmVzaG9sZCA9ICcxNSUnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0xvYWRpbmdTcGlubmVyID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93U2VhcmNoQmFyID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHN0aWNreVNlYXJjaEJhciA9IGZhbHNlO1xuICBASW5wdXQoKSBhcHBseUltcGxpY2l0VmFsdWU6IGJvb2xlYW4gfCAoKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4pO1xuICBASW5wdXQoKSBkcm9wQnV0dG9uVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgY2xlYXJCdXR0b25UaXRsZTogc3RyaW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdHJpbVNlYXJjaFRleHQ6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzcGxpdFNlYXJjaFRleHQ6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgcGFuZWxDbGFzcyBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoeyBhbGlhczogJ2NsYXNzJyB9KSBzZXQgY2xhc3NMaXN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhbmVsQ2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBnZXQgY2xhc3NMaXN0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxDbGFzcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCdjbGljaycpIGNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCdibHVyJykgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoJ2ZvY3VzJykgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyb3BCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KHRydWUpO1xuICBAT3V0cHV0KCdrZXlkb3duLmVzY2FwZScpIGtleWRvd25Fc2NhcGUgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCdrZXl1cC5lbnRlcicpIGtleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoJ3NlbGVjdGlvbkNoYW5nZScpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWF0QXV0b2NvbXBsZXRlRmllbGRTZWxlY3RDaGFuZ2U+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWF0U2VsZWN0JykgbWF0U2VsZWN0OiBNYXRTZWxlY3Q7XG4gIEBWaWV3Q2hpbGQoJ2lvblNlYXJjaGJhcicpIGlvblNlYXJjaGJhcjogSW9uU2VhcmNoYmFyO1xuICBAVmlld0NoaWxkKCdtYXRJbnB1dFRleHQnKSBtYXRJbnB1dFRleHQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlKSBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge31cblxuICBnZXQgaXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1Db3VudDtcbiAgfVxuXG4gIGdldCBjYW5GZXRjaE1vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgJiYgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPiAwO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlcih2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kZmlsdGVyLnZhbHVlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgU2V0dGluZyBmaWx0ZXI6XCIsIHZhbHVlKTtcbiAgICAgIHRoaXMuXyRmaWx0ZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl8kZmlsdGVyLnZhbHVlO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpdGVtcyh2YWx1ZTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSkge1xuICAgIC8vIFJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gb24gaXRlbXMsIChpZiBleGl0cylcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgSXRlbXMgcmVjZWl2ZWQgdHdpY2UgIScpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmIChpc09ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbiA9IHZhbHVlLnN1YnNjcmliZSgodikgPT4gdGhpcy5fJGlucHV0SXRlbXMubmV4dCh2KSk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl8kaW5wdXRJdGVtcy52YWx1ZSkge1xuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcy5uZXh0KHZhbHVlIGFzIGFueVtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXRlbXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuXyRpbnB1dEl0ZW1zO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5IHx8IHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQ7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3JlYWRvbmx5ICYmIHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlZDtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05pbCh0aGlzLl8kZmlsdGVyZWRJdGVtcy52YWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPz8gKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZD4uXCIpO1xuXG4gICAgLy8gQ29uZmlndXJhdGlvbiBmcm9tIGNvbmZpZyBvYmplY3RcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gdGhpcy5zdWdnZXN0Rm4gPz8gdGhpcy5jb25maWcuc3VnZ2VzdEZuO1xuICAgICAgaWYgKCF0aGlzLnN1Z2dlc3RGbiAmJiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyID8/IHRoaXMuY29uZmlnLmZpbHRlcjtcbiAgICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID8/IHRoaXMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzID8/IHRoaXMuY29uZmlnLmNvbHVtblNpemVzO1xuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA/PyB0aGlzLmNvbmZpZy5jb2x1bW5OYW1lcztcbiAgICAgIHRoaXMuZGlzcGxheVNlcGFyYXRvciA9IHRoaXMuZGlzcGxheVNlcGFyYXRvciA/PyB0aGlzLmNvbmZpZy5kaXNwbGF5V2l0aFNlcGFyYXRvcjtcbiAgICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoID8/IHRoaXMuY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgdGhpcy5zcGxpdFNlYXJjaFRleHQgPSB0aGlzLnNwbGl0U2VhcmNoVGV4dCA/PyB0aGlzLmNvbmZpZy5zcGxpdFNlYXJjaFRleHQ7XG4gICAgICB0aGlzLnRyaW1TZWFyY2hUZXh0ID0gdGhpcy50cmltU2VhcmNoVGV4dCA/PyB0aGlzLmNvbmZpZy50cmltU2VhcmNoVGV4dDtcbiAgICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMgPz8gdGhpcy5jb25maWcuZXF1YWxzO1xuICAgICAgdGhpcy5tdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUgPz8gdGhpcy5jb25maWcubXVsdGlwbGU7XG4gICAgICB0aGlzLm1vYmlsZSA9IHRoaXMubW9iaWxlID8/IHRoaXMuY29uZmlnLm1vYmlsZTtcbiAgICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA/PyB0aGlzLmNvbmZpZy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkO1xuICAgICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd0FsbE9uRm9jdXM7XG4gICAgICB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPSB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2hvd1BhbmVsT25Gb2N1cztcbiAgICAgIHRoaXMucGFuZWxDbGFzcyA9IHRoaXMucGFuZWxDbGFzcyA/PyB0aGlzLmNvbmZpZy5wYW5lbENsYXNzID8/IHRoaXMuY29uZmlnLmNsYXNzO1xuICAgICAgdGhpcy5wYW5lbFdpZHRoID0gdGhpcy5wYW5lbFdpZHRoID8/IHRoaXMuY29uZmlnLnBhbmVsV2lkdGg7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZSA9IHRoaXMuZGVib3VuY2VUaW1lID8/IHRoaXMuY29uZmlnLmRlYm91bmNlVGltZTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0QWNjZW50ID0gdGhpcy5oaWdobGlnaHRBY2NlbnQgPz8gdGhpcy5jb25maWcuaGlnaGxpZ2h0QWNjZW50O1xuICAgICAgdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPSB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA/PyB0aGlzLmNvbmZpZy5hcHBseUltcGxpY2l0VmFsdWU7XG4gICAgICB0aGlzLnNlbGVjdElucHV0Q29udGVudE9uRm9jdXMgPSB0aGlzLnNlbGVjdElucHV0Q29udGVudE9uRm9jdXMgPz8gdGhpcy5jb25maWcuc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1cztcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIHRoaXMucmVxdWlyZWQgPSBpc05vdE5pbEJvb2xlYW4odGhpcy5yZXF1aXJlZClcbiAgICAgID8gdGhpcy5yZXF1aXJlZFxuICAgICAgOiB0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZCB8fCBpc0JsYW5rU3RyaW5nKHRoaXMucmVxdWlyZWQpO1xuICAgIHRoaXMubXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlID8/IGZhbHNlO1xuICAgIHRoaXMubW9iaWxlID0gdGhpcy5tb2JpbGUgPz8gaXNNb2JpbGUod2luZG93KTtcbiAgICB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA/PyB0aGlzLmZpbHRlcj8uYXR0cmlidXRlcyA/PyBbJ2xhYmVsJywgJ25hbWUnXTtcbiAgICB0aGlzLmRpc3BsYXlTZXBhcmF0b3IgPSB0aGlzLmRpc3BsYXlTZXBhcmF0b3IgPz8gREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SO1xuICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoIHx8IE1hdEF1dG9jb21wbGV0ZUZpZWxkVXRpbHMuY3JlYXRlRGlzcGxheUZuKHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMsIHRoaXMubXVsdGlwbGUsIHRoaXMuZGlzcGxheVNlcGFyYXRvcik7XG4gICAgdGhpcy5zcGxpdFNlYXJjaFRleHQgPSB0aGlzLnNwbGl0U2VhcmNoVGV4dCA/PyB0cnVlO1xuICAgIHRoaXMudHJpbVNlYXJjaFRleHQgPSB0aGlzLnRyaW1TZWFyY2hUZXh0ID8/ICF0aGlzLm1vYmlsZTsgLy8gVHJ1ZSBieSBkZWZhdWx0IG9uIGRlc2t0b3AsIGJ1dCBmYWxzZSBpbiBtb2JpbGUgKG5vdCBuZWVkIGluIHRoZSBzZWFyY2hiYXIpXG4gICAgdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID0gdGhpcy5zZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzID8/IGZhbHNlO1xuICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMgfHwgTWF0QXV0b2NvbXBsZXRlRmllbGRVdGlscy5kZWZhdWx0RXF1YWxzO1xuXG4gICAgdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgPVxuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgfHxcbiAgICAgIC8vIGlmIG9ubHkgY29sdW1uOiBhdXRvIHNpemVcbiAgICAgICh0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMSAmJiBbdW5kZWZpbmVkXSkgfHxcbiAgICAgIC8vIENvbXB1dGVkIGNvbHVtbiBzaXplOlxuICAgICAgLy8gLSBpZiBsYWJlbCB0aGVuIGNvbCBzaXplID0gMlxuICAgICAgLy8gLSBpZiByYW5rT3JkZXIgdGhlbiBjb2wgc2l6ZSA9IDFcbiAgICAgIC8vIC0gZXNlID0+IGF1dG8gc2l6ZVxuICAgICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGF0dHIgJiYgKGF0dHIuZW5kc1dpdGgoJ2xhYmVsJykgPyAzIDogYXR0ci5lbmRzV2l0aCgncmFua09yZGVyJykgPyAyIDogdW5kZWZpbmVkKSk7XG4gICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLm1hcChcbiAgICAgIChhdHRyLCBpbmRleCkgPT4gKHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzICYmIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzW2luZGV4XSkgfHwgdGhpcy5pMThuUHJlZml4ICsgY2hhbmdlQ2FzZVRvVW5kZXJzY29yZShhdHRyKS50b1VwcGVyQ2FzZSgpXG4gICAgKTtcbiAgICBjb25zdCBwYW5lbENsYXNzZXMgPSB0aGlzLnBhbmVsQ2xhc3M/LnNwbGl0KC9cXHMrLyk7XG4gICAgdGhpcy5wYW5lbFdpZHRoID1cbiAgICAgIHRoaXMucGFuZWxXaWR0aCA/P1xuICAgICAgKHBhbmVsQ2xhc3NlcyAmJlxuICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLW1lZGl1bScpICYmICczMDBweCcpIHx8XG4gICAgICAgICAgKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnbWluLXdpZHRoLWxhcmdlJykgJiYgJzQwMHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgteGxhcmdlJykgJiYgJzQ1MHB4JykgfHxcbiAgICAgICAgICAocGFuZWxDbGFzc2VzLmluY2x1ZGVzKCdtaW4td2lkdGgtODB2dycpICYmICc4MHZ3JykgfHxcbiAgICAgICAgICAoKHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC13aWR0aCcpIHx8IHBhbmVsQ2xhc3Nlcy5pbmNsdWRlcygnZnVsbC1zaXplJykpICYmICcxMDB2dycpKSk7XG4gICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID8/IDA7XG4gICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRoaXMuc2hvd0FsbE9uRm9jdXMgPz8gKHRoaXMubW9iaWxlICYmIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwKTtcbiAgICB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPSB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPz8gdHJ1ZTtcbiAgICB0aGlzLmRlYm91bmNlVGltZSA9IHRoaXMuZGVib3VuY2VUaW1lID8/ICh0aGlzLm1vYmlsZSA/IDY1MCA6IDI1MCk7XG4gICAgdGhpcy5oaWdobGlnaHRBY2NlbnQgPSB0aGlzLmhpZ2hsaWdodEFjY2VudCA/PyBmYWxzZTtcbiAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uID0gdGhpcy5tYXRBdXRvY29tcGxldGVQb3NpdGlvbiA/PyAnYXV0byc7XG4gICAgdGhpcy5hcHBseUltcGxpY2l0VmFsdWUgPSB0aGlzLmFwcGx5SW1wbGljaXRWYWx1ZSA/PyAhdGhpcy5tb2JpbGU7XG5cbiAgICAvLyBObyBzdWdnZXN0Rm46IGZpbHRlciBvbiB0aGUgZ2l2ZW4gaXRlbXNcbiAgICBpZiAoIXRoaXMuc3VnZ2VzdEZuKSB7XG4gICAgICBjb25zdCBzdWdnZXN0RnJvbUFycmF5Rm46IFN1Z2dlc3RGbjxhbnksIGFueT4gPSBhc3luYyAodmFsdWUsIGZpbHRlcikgPT5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQ2FsbGluZyBzdWdnZXN0RnJvbUFycmF5IHdpdGggdmFsdWU9JywgdmFsdWUpO1xuXG4gICAgICAgIHN1Z2dlc3RGcm9tQXJyYXkodGhpcy5fJGlucHV0SXRlbXMudmFsdWUsIHZhbHVlLCB7XG4gICAgICAgICAgc2VhcmNoQXR0cmlidXRlczogdGhpcy5kaXNwbGF5QXR0cmlidXRlcyxcbiAgICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBXYWl0IChvbmNlKSB0aGF0IGl0ZW1zIGFyZSBsb2FkZWQsIHRoZW4gY2FsbCBzdWdnZXN0IGZyb20gYXJyYXkgZm5cbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gYXN5bmMgKHZhbHVlLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKGlzTmlsKHRoaXMuXyRpbnB1dEl0ZW1zLnZhbHVlKSkge1xuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFdhaXRpbmcgaXRlbXMgdG8gYmUgc2V0Li4uXCIpO1xuXG4gICAgICAgICAgYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuXyRpbnB1dEl0ZW1zKTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIGl0ZW1zOlwiLCB0aGlzLmlucHV0SXRlbXMkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1Z2dlc3RGbiA9IHN1Z2dlc3RGcm9tQXJyYXlGbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpOyAvLyBMb29wXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNlbmQgdmFsdWUgdG8gc3VnZ2VzdCB3aGVuIDpcbiAgICAvLyAtIGlzIG5pbCBhbmQgJyonLCBhbmQgbm8gbWluIGxlbmd0aCB0aHJlc2hvbGRcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIG5vdCBhIHN0cmluZyB0eXBlIChlLmcuIG9iamVjdClcbiAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIGlzIGEgc3RyaW5nLCBhbmQgaGFzIGVub3VnaCBjaGFyYWN0ZXJcbiAgICBjb25zdCB0aHJlc2hvbGRGaWx0ZXJGbiA9ICh2YWx1ZTogYW55KSA9PlxuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDAgfHxcbiAgICAgIChpc05vdE5pbCh2YWx1ZSkgJiYgKCEodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgfHwgKHZhbHVlICE9PSAnKicgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+PSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpKSk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zQ2hhbmdlcyA9IG1lcmdlKFxuICAgICAgLy8gUmVsb2FkIGV2ZW50IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUsIHRvIGZvcmNlIHJlbG9hZCBldmVuIGlmIHNhbWUgdmFsdWUpXG4gICAgICB0aGlzLl9yZWxvYWQkLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pLFxuICAgICAgICB0YXAoKF8pID0+IHRoaXMuc2hvd0xvYWRpbmdTcGlubmVyICYmIHRoaXMubWFya0FzTG9hZGluZygpKVxuICAgICAgKSxcblxuICAgICAgLy8gU2VhcmNoIHRleHQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgYmVjYXVzZSBvZiB0aGUgZGVib3VuY2VUaW1lKCkgcGlwZSlcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+IHRoaXMuZW5hYmxlZCAmJiBpc05vdE5pbFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAvLyBNYXJrIGFzIGxvYWRpbmcgKHRvIHNob3cgbG9hZGluZyBzcGlubmVyKSAtIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBiZWZvcmUgZGVib3VuY2VUaW1lXG4gICAgICAgIHRhcCgoXykgPT4gdGhpcy5zaG93TG9hZGluZ1NwaW5uZXIgJiYgdGhpcy5tYXJrQXNMb2FkaW5nKCkpLFxuICAgICAgICAvLyBGaWx0ZXIgaWYgbm90IGVub3VnaCBjaGFyYWN0ZXJcbiAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICgodmFsdWU/Lmxlbmd0aCB8fCAwKSA8IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXkgdmFsdWUsIHRvIGVuYWJsZSB0aGUgbWVzc2FnZSBcIm5vdCBlbm91Z2ggY2hhcmFjdGVyc1wiXG4gICAgICAgICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pLFxuICAgICAgICAvLyBXYWl0IGEgZGVib3VuY2UgdGltZVxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWUpXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vLHRhcCgodmFsdWUpID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VhcmNoIHRleHQgY2hhbmdlczonLCB2YWx1ZSkpXG4gICAgICApLFxuXG4gICAgICAvLyBPYmplY3Qgc2V0OiB1c2UgaXQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgcGlwZSBuZWVkKVxuICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgc3RhcnRXaXRoPGFueT4odGhpcy5mb3JtQ29udHJvbC52YWx1ZSksXG4gICAgICAgIGZpbHRlcigodmFsdWUpID0+IGlzTm90TmlsT2JqZWN0KHZhbHVlKSksXG4gICAgICAgIHRhcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGNvbnRyb2wgdmFsdWUgY2hhbmdlczonLCB2YWx1ZSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIGRpc3BsYXkgdmFsdWUgKGlmIG5lZWQpXG4gICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5kaXNwbGF5V2l0aCh2YWx1ZSkgfHwgJyc7XG4gICAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlWYWx1ZSAhPT0gZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSBkaXNwbGF5VmFsdWU7XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IHRvIHRoZSBpbnB1dFt0eXBlPXRleHRdIGZpZWxkXG4gICAgICAgICAgICBpZiAodGhpcy5tYXRJbnB1dFRleHQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX2Rpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBJZiBtdWx0aXBsZTogZG8gbm90IHJlY29tcHV0ZSBpdGVtcyAob25seSBmb3IgdGhlIGZpcnN0IHRpbWUsIHdoZW4gbG9hZGluZylcbiAgICAgICAgLy8gd2hlbiBmb3JtQ29udHJvbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmxvYWRpbmcgfHwgKCF0aGlzLm11bHRpcGxlICYmICF0aGlzLnNob3dBbGxPbkZvY3VzKSlcbiAgICAgICksXG5cbiAgICAgIC8vIE1lcmdlIHNvbWUgb2JzZXJ2YWJsZXMsIHdpdGggYSBjb21tb24gZGlzdGluY3RVbnRpbENoYW5nZWQoKSBwaXBlXG4gICAgICBtZXJnZShcbiAgICAgICAgLy8gT24gZHJvcGRvd24gYnV0dG9uIGNsaWNrIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLnBpcGUoZmlsdGVyKChldmVudCkgPT4gIWV2ZW50IHx8ICFldmVudC5kZWZhdWx0UHJldmVudGVkKSksXG4gICAgICAgIC8vIEZvY3VzIG9yIGNsaWNrID0+IExvYWQgYWxsIChubyBkZWJvdW5jZVRpbWUpXG4gICAgICAgIG1lcmdlKHRoaXMuZm9jdXNlZCwgdGhpcy5jbGlja2VkKSxcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8ucGlwZSh0YXAoKF8pID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZm9jdXNlZCBvciBjbGlja2VkIGV2ZW50JykpKSxcbiAgICAgICAgLy8gSW5wdXQgaXRlbXMgb3IgZmlsdGVyIGNoYW5nZXNcbiAgICAgICAgbWVyZ2UodGhpcy5fJGlucHV0SXRlbXMsIHRoaXMuXyRmaWx0ZXIpLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfKSA9PiAhdGhpcy5sb2FkaW5nKVxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy90YXAoKF8pID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgJGlucHV0SXRlbXMgb3IgZmlsdGVyIGV2ZW50JykpXG4gICAgICAgIClcbiAgICAgICkucGlwZShcbiAgICAgICAgZmlsdGVyKChfKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBtYXAoKF8pID0+ICh0aGlzLnNob3dBbGxPbkZvY3VzID8gJyonIDogdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkpLFxuICAgICAgICAvLyBEaXN0aW5ndWlzaCBjaGFuZ2VzXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh2MSwgdjIpID0+XG4gICAgICAgICAgLy8gSWYgbG9hZGluZyAobm90IGxvYWRlZCB5ZXQpLCBzaW11bGF0ZSB0aGF0IHZhbHVlIGNoYW5nZWQgdG8gZm9yY2UgbG9hZFxuICAgICAgICAgIHRoaXMubG9hZGluZyA/IGZhbHNlIDogdjEgPT09IHYyIHx8IHRoaXMuZXF1YWxzKHYxLCB2MilcbiAgICAgICAgKSxcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBjaGFyYWN0ZXJzXG4gICAgICAgIGZpbHRlcih0aHJlc2hvbGRGaWx0ZXJGbiksXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIHRhcCgodmFsdWUpID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgdXBkYXRlIGV2ZW50OiAnLCB2YWx1ZSkpXG4gICAgICApXG4gICAgKS5waXBlKFxuICAgICAgLy8gU3VnZ2VzdCB2YWx1ZXNcbiAgICAgIG1lcmdlTWFwKCh2YWx1ZSkgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCB0aGlzLmZpbHRlcikpLFxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vdGFwKGl0ZW1zID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZnJvbSBzdWdnZXN0OiAnLCBpdGVtcykpLFxuXG4gICAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICAgIHRhcCgoaXRlbXMpID0+ICEodGhpcy5tb2JpbGUgfHwgdGhpcy5tdWx0aXBsZSkgJiYgdGhpcy51cGRhdGVJbXBsaWNpdFZhbHVlKGl0ZW1zKSlcbiAgICApO1xuXG4gICAgLy8gRmV0Y2ggbW9yZSBldmVudHNcbiAgICBjb25zdCBmZXRjaE1vcmVJdGVtc0NoYW5nZXMgPSB0aGlzLl9mZXRjaE1vcmUkLnBpcGUoXG4gICAgICB0YXAoKGV2ZW50KSA9PiBldmVudD8ucHJldmVudERlZmF1bHQoKSksIC8vIEF2b2lkIHRvIGNsb3NlIHRoZSBtYXQtc2VsZWN0XG4gICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jYW5GZXRjaE1vcmUpLFxuICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5mZXRjaE1vcmUoKSksXG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL3RhcChtb3JlSXRlbXMgPT4gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgZnJvbSBmZXRjaCBNb3JlOiAnLCBtb3JlSXRlbXMpKSxcblxuICAgICAgLy8gQ29uY2F0IHRvIGV4aXN0aW5nIGl0ZW1zXG4gICAgICBtYXAoKG1vcmVJdGVtcykgPT4gKHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnZhbHVlIHx8IFtdKS5jb25jYXQobW9yZUl0ZW1zKSlcbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIGZpbHRlcmVkIGl0ZW1zXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLl8kaW5wdXRJdGVtcyxcblxuICAgICAgICAvLyBVcGRhdGUgaXRlbXMgZXZlbnRzXG4gICAgICAgIGZpbHRlcmVkSXRlbXNDaGFuZ2VzLFxuXG4gICAgICAgIC8vIEZldGNoIG1vcmUgZXZlbnRzXG4gICAgICAgIGZldGNoTW9yZUl0ZW1zQ2hhbmdlc1xuICAgICAgKS5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBjb250cm9sIHZhbHVlIGlzIGluc2lkZSAobWF0LXNlbGVjdClcbiAgICAgICAgLy8gKG90aGVyd2lzZSBjdXJyZW50IHZhbHVlIHdpbGwgdmlzdWFsbHkgZGlzYXBwZWFyKVxuICAgICAgICBpZiAoaXRlbXMgJiYgKHRoaXMubW9iaWxlIHx8IHRoaXMubXVsdGlwbGUpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICAgICAgLy8gSWYgZm9ybSB2YWx1ZSBpcyBtaXNzaW5nOiBhcHBlbmQgdG8gbGlzdFxuICAgICAgICAgIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KHZhbHVlLmZpbHRlcigodikgPT4gaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiB0aGlzLmVxdWFscyhpdGVtLCB2KSkgPT09IC0xKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiB0aGlzLmVxdWFscyhpdGVtLCB2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgbmV3IGZpbHRlcmVkIGl0ZW1zJywgaXRlbXMpO1xuXG4gICAgICAgIC8vIEVtaXQgaXRlbXNcbiAgICAgICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMubmV4dChpdGVtcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBcHBseWluZyBpbXBsaWNpdCB2YWx1ZSwgb24gYmx1clxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmJsdXJyZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU2tpcCBpZiBtdWx0aXBsZSAobm8gaW1wbGljaXQgdmFsdWUpIG9yIGRpc2FibGVcbiAgICAgICAgICBmaWx0ZXIoKF8pID0+ICF0aGlzLm11bHRpcGxlICYmICF0aGlzLm1vYmlsZSAmJiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy8sdGFwKF8gPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBibHVycmVkIGV2ZW50JykpLFxuICAgICAgICAgIG1hcCgoXykgPT4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGxldCBpbnZhbGlkYXRlRmlsdGVyZWRJdGVtcyA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gV2hlbiBsZWF2ZSBjb21wb25lbnQgd2l0aG91dCBvYmplY3QsIHVzZSBpbXBsaWNpdCB2YWx1ZSBpZiA6XG4gICAgICAgICAgLy8gLSBhbiBleHBsaWNpdCB2YWx1ZVxuICAgICAgICAgIC8vIC0gZmllbGQgaXMgbm90IGVtcHR5ICh1c2VyIGZpbGwgc29tZXRoaW5nKVxuICAgICAgICAgIC8vIC0gT1IgZmllbGQgZW1wdHkgYnV0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKHRoaXMuX2ltcGxpY2l0VmFsdWUgJiYgKCh0aGlzLnJlcXVpcmVkICYmIGlzTmlsT3JCbGFuayh2YWx1ZSkpIHx8IChpc05vdE5pbE9yQmxhbmsodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX2ltcGxpY2l0VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGludmFsaWRhdGVGaWx0ZXJlZEl0ZW1zID0gdGhpcy5zaG93QWxsT25Gb2N1cztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTmlsIHZhbHVlXG4gICAgICAgICAgZWxzZSBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHsgZW1pdEV2ZW50OiBmYWxzZSwgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlciBoYXMgc2VsZWN0ZWQgYW4gaXRlbTogaW52YWxpZGF0ZSBpZiBzaG93QWxsT25Gb2N1c1xuICAgICAgICAgICAgaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMgPSB0aGlzLnNob3dBbGxPbkZvY3VzICYmIGlzTm90TmlsT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gbnVsbDsgLy8gcmVzZXQgdGhlIGltcGxpY2l0IHZhbHVlXG4gICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7IC8vIENsb25lIHBhbmVsXG5cbiAgICAgICAgICAvLyBJbnZhbGlkYXRlIGxvYWRlZCBpdGVtcyAobWFyayBhcyBsb2FkaW5nIHNob3VsZCBmb3JjZSBuZXd0IGZvY3VzIHRvIHJlbG9hZCBpdGVtcylcbiAgICAgICAgICBpZiAoaW52YWxpZGF0ZUZpbHRlcmVkSXRlbXMpIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gZm9ybSBjb250cm9sIHN0YXR1cyBjaGFuZ2VcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgIC8vIFVwZGF0ZSBjb21wb25lbnQgc3RhdGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNoZWNrSWZUb3VjaGVkKCkpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmtleWRvd25Fc2NhcGUuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAvLyBBdm9pZCBmb3JtIG9yIHBhZ2UgdG8gbWFuYWdlIGVzY2FwZSBldmVudFxuICAgICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgQ2xvc2luZyB0aGUgcGFuZWwgKGtleWRvd24uZXNjYXBlKVwiKTtcblxuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fZml4TWF0U2VsZWN0UG9zaXRpb25BbmRTZWFyY2hiYXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5faXRlbXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuXyRpbnB1dEl0ZW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fJGlucHV0SXRlbXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl8kZmlsdGVyZWRJdGVtcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVsb2FkJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXIuY29tcGxldGUoKTtcblxuICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5jbGlja2VkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5ibHVycmVkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mb2N1c2VkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXlkb3duRXNjYXBlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXl1cEVudGVyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZmV0Y2hNb3JlJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gbnVsbDtcbiAgICB0aGlzLmRpc3BsYXlXaXRoID0gbnVsbDtcbiAgICB0aGlzLmVxdWFscyA9IG51bGw7XG4gICAgdGhpcy5zdWdnZXN0Rm4gPSBudWxsO1xuICAgIHRoaXMuXyRmaWx0ZXJlZEl0ZW1zID0gbnVsbDtcbiAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgdGhpcy5wYW5lbENsYXNzID0gbnVsbDtcblxuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gbnVsbDtcblxuICAgIC8vIERlc3Ryb3kgdGhlICdhdXRvY29tcGxldGUnIGluc3RhbmNlLCB0byBhdm9pZCBtZW1vcnkgbGVha1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlPy5uZ09uRGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIHJlbG9hZCBjb250ZW50LiBVc2VmdWwgd2hlbiBmaWx0ZXIgaGFzIGJlZW4gY2hhbmdlZCBidXQgbm90IGRldGVjdGVkXG4gICAqL1xuICByZWxvYWRJdGVtcyh2YWx1ZT86IGFueSkge1xuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIEFza2luZyB0byByZWxvYWRJdGVtcygpXCIpO1xuICAgIC8vIEZvcmNlIGEgcmVmcmVzaFxuICAgIHRoaXMuX3JlbG9hZCQubmV4dCh2YWx1ZSB8fCAodGhpcy5zaG93QWxsT25Gb2N1cyAmJiB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKTtcblxuICAgIC8vIENsZWFyIHRoZSBzZWFyY2ggYmFyIChpZiBoaWRkZW4pXG4gICAgaWYgKHRoaXMubW9iaWxlICYmICF0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4gJiYgdGhpcy5pb25TZWFyY2hiYXIpIHtcbiAgICAgIHRoaXMuaW9uU2VhcmNoYmFyLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBERUJVR1xuICAgIC8vIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBXcml0aW5nIHZhbHVlOiAnLCB2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHRoaXMuZGlzcGxheVdpdGgodmFsdWUpO1xuXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgbmVlZCB0byB1cGRhdGUgY29udHJvbHNcbiAgICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICB0aGlzLm1hdFNlbGVjdC5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb2N1c0lucHV0KHRoaXMubWF0SW5wdXRUZXh0KTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJJbnB1dFRleHRGb2N1c0V2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VsZWN0IGlucHV0IGNvbnRlbnQnKTtcbiAgICBjb25zdCBoYXNDb250ZW50ID0gaXNOb3ROaWxPckJsYW5rKChldmVudC50YXJnZXQgYXMgYW55KT8udmFsdWUpO1xuXG4gICAgLy8gSWYgY29tYm8gaXMgZW1wdHksIG9yIGlmIGhhcyBjb250ZW50IGJ1dCBzaG91bGQgZm9yY2UgdG8gc2hvdyBwYW5lbCBvbiBmb2N1c1xuICAgIGlmICghaGFzQ29udGVudCB8fCB0aGlzLnNob3dQYW5lbE9uRm9jdXMgfHwgdGhpcy5zaG93QWxsT25Gb2N1cykge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgLy8gU2VsZWN0IGlucHV0IGNvbnRlbnQsIGlmIGVuYWJsZVxuICAgICAgaWYgKHRoaXMuc2VsZWN0SW5wdXRDb250ZW50T25Gb2N1cykge1xuICAgICAgICBzZWxlY3RJbnB1dENvbnRlbnQoZXZlbnQpO1xuICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTsgLy8gQXZvaWQgdG8gY2FyZXQgdG8gYmUgY2hhbmdlZFxuICAgICAgfVxuXG4gICAgICB0aGlzLmZvY3VzZWQuZW1pdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIC8vIE5lZWQgYSB0aW1lb3V0IHRvIHByZXZlbnQgZWFybHkgYmx1ciBldmVudCB3aXRob3V0IHRyaWdnZXJpbmcgZm9ybUNoYW5nZSBldmVudFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gSWdub3JlIGV2ZW50IGZyb20gbWF0LW9wdGlvblxuICAgICAgaWYgKFxuICAgICAgICAoZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ01BVC1PUFRJT04nKSB8fFxuICAgICAgICAvLyBPciBhdXRvY29tcGxldGUgcGFuZWwgaXMgb3BlbiBiZWNhdXNlIGV2ZW50LnJlbGF0ZWRUYXJnZXQgaXMgbnVsbCAoY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzI0MTgyKVxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuXG4gICAgICApIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIENhbmNlbGxpbmcgYmx1ciBldmVudFwiKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBCbHVyOiBtb3ZlIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcnKTtcblxuICAgICAgLy8gTW92ZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nIChmaXggaXNzdWUgSU1BR0lORS00NjkpXG4gICAgICBzZWxlY3RJbnB1dFJhbmdlKGV2ZW50LnRhcmdldCBhcyBhbnksIDAsIDApO1xuXG4gICAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlvblNlYXJjaEJhckNoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICF0aGlzLm1hdFNlbGVjdC5wYW5lbE9wZW4pIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gR2V0IHRoZSB2YWx1ZSB0byBzZWFyY2hcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudCBhcyBDdXN0b21FdmVudDxTZWFyY2hiYXJDaGFuZ2VFdmVudERldGFpbD4pPy5kZXRhaWwudmFsdWU7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIDxpb24tc2VhcmNoYmFyPiBjaGFuZ2VzXCIsIHZhbHVlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGlzcGxheSB2YWx1ZSAoaW4gdGhlIHZpc2libGUgZm9ybSBjb250cm9sKVxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gTWFyayBjb21wb25lbnQgYXMgbG9hZGluZ1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgLy8gUmVsb2FkIGl0ZW1zXG4gICAgdGhpcy5yZWxvYWRJdGVtcyh2YWx1ZSk7XG5cbiAgICAvLyBUT0RPIEZpbmQgYSB3YXkgdG8gYXZvaWQgbWF0LXNlbGVjdCB0byBnaXZlIGZvY3VzIHRvIGFuIG9wdGlvbiwgd2hlbiB0eXBpbmdcbiAgICAvKmlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLm1hdFNlbGVjdC5fZWxlbWVudFJlZjtcbiAgICB9Ki9cbiAgfVxuXG4gIGZpbHRlck1hdFNlbGVjdEZvY3VzRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgPG1hdC1zZWxlY3Q+IGZvY3VzIGV2ZW50JywgZXZlbnQpO1xuXG4gICAgLy8gRW1pdCBldmVudFxuICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGZpbHRlck1hdFNlbGVjdEJsdXJFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgLy8gREVCVUdcbiAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgPG1hdC1zZWxlY3Q+IGJsdXIgZXZlbnRcIiwgZXZlbnQpO1xuXG4gICAgaWYgKFxuICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG4gICAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgICAoZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnTUFULU9QVElPTicgfHxcbiAgICAgICAgKGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ0RJVicgJiYgZXZlbnQucmVsYXRlZFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1tZGMtc2VsZWN0LXBhbmVsJykpIHx8IC8vIE5ldyBNREMgdGFnIGFuZCBjbGFzcyBuYW1lIChlcXVpdmFsZW50IHRvIGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ01BVC1PUFRJT04nKVxuICAgICAgICAoZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2hiYXItaW5wdXQnKSkpXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIDxtYXQtc2VsZWN0PiBibHVyIGV2ZW50XCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoZXZlbnQ/OiBFdmVudCkge1xuICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaW9uU2VhcmNoYmFyKSB7XG4gICAgICB0aGlzLmlvblNlYXJjaGJhci52YWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICB9XG5cbiAgX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47IC8vIFNraXBcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBJbml0IGF1dG9jb21wbGV0ZSBzY3JvbGwgbGlzdGVuZXInKTtcblxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5lZCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuYXV0b2NvbXBsZXRlLl9pc09wZW4gPyB0aW1lcigwKSA6IHRoaXMuYXV0b2NvbXBsZXRlLm9wZW5lZC5waXBlKGRlYm91bmNlVGltZSgyMDApKTtcbiAgICBjb25zdCBzY3JvbGxFbmQkID0gb3BlbmVkJC5waXBlKFxuICAgICAgbWFwKChfKSA9PiB0aGlzLmdldEF1dG9jb21wbGV0ZVBhbmVsKCkpLFxuICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKSksXG4gICAgICB0YWtlVW50aWwodGhpcy5hdXRvY29tcGxldGUuY2xvc2VkKVxuICAgICk7XG5cbiAgICAvLyBUcmlnZ2VyIGZldGNoIG1vcmUsIGVuZCBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBzY3JvbGxFbmQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mZXRjaE1vcmUkLmVtaXQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBfaW5pdE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsKHRocmVzaG9sZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEluaXQgbWF0LXNlbGVjdCBzY3JvbGwgbGlzdGVuZXInKTtcblxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5lZCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMubWF0U2VsZWN0LnBhbmVsT3BlbiA/IHRpbWVyKDApIDogdGhpcy5tYXRTZWxlY3QuX29wZW5lZFN0cmVhbS5waXBlKGRlYm91bmNlVGltZSgyMDApKTtcbiAgICBjb25zdCBzY3JvbGxFbmQkID0gb3BlbmVkJC5waXBlKFxuICAgICAgbWFwKChfKSA9PiB0aGlzLmdldE1hdFNlbGVjdFBhbmVsKCkpLFxuICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKSksXG4gICAgICB0YWtlVW50aWwodGhpcy5tYXRTZWxlY3QuX2Nsb3NlZFN0cmVhbSlcbiAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJC5waXBlKGZpbHRlcigoXykgPT4gdGhpcy5fbW9yZUl0ZW1zQ291bnQgPiAwKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2ZldGNoTW9yZSQuZW1pdCgpKTtcblxuICAgIC8vIFJlZ2lzdGVyIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICghdGhpcy5tb2JpbGUgJiYgdGhpcy5hdXRvY29tcGxldGU/LmlzT3BlbikgfHwgdGhpcy5tYXRTZWxlY3Q/LnBhbmVsT3BlbiB8fCBmYWxzZTtcbiAgfVxuXG4gIGNsb3NlUGFuZWwoKSB7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8uY2xvc2VQYW5lbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRTZWxlY3Q/LnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5tYXRTZWxlY3Q/LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAtLSAqL1xuXG4gIHByb3RlY3RlZCBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLl8kZmlsdGVyZWRJdGVtcy52YWx1ZSkge1xuICAgICAgdGhpcy5fJGZpbHRlcmVkSXRlbXMubmV4dCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlbGVjdGlvbkNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7IHNvdXJjZTogZXZlbnQuc291cmNlLCB2YWx1ZTogZXZlbnQudmFsdWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25PcHRpb25TZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCkge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBzb3VyY2U6IGV2ZW50LnNvdXJjZSwgdmFsdWU6IGV2ZW50Lm9wdGlvbi52YWx1ZSB9KTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSBhc3luYyBzdWdnZXN0KHZhbHVlOiBhbnksIGZpbHRlcj86IGFueSk6IFByb21pc2U8YW55W10+IHtcbiAgICAvLyBTcGxpdCBzdHJpbmcgdmFsdWUsIGlmIGFsbG93ICguZS5nICdBQUEgLSBJdGVtIEFBQScgPT4gJ0FBQScpXG4gICAgaWYgKCF0aGlzLm1vYmlsZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTcGxpdCBzZWFyY2ggdGV4dCAoYW5kIGtlZXAgb25seSB0aGUgZmlyc3QgcGFydClcbiAgICAgIGlmICh0aGlzLnNwbGl0U2VhcmNoVGV4dCAmJiB0aGlzLmRpc3BsYXlTZXBhcmF0b3IpIHtcbiAgICAgICAgY29uc3QgZmlyc3RTZXBhcmF0b3JJbmRleCA9IHZhbHVlLmluZGV4T2YodGhpcy5kaXNwbGF5U2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGZpcnN0U2VwYXJhdG9ySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgZmlyc3RTZXBhcmF0b3JJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVHJpbSBzZWFyY2ggdGV4dFxuICAgICAgaWYgKHRoaXMudHJpbVNlYXJjaFRleHQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBzdWdnZXN0aW9uIGZ1bmN0aW9uXG4gICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgICByZXMgPSBbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgcmVzID0gcmVzIGFzIGFueVtdO1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gcmVzPy5sZW5ndGggfHwgMDtcbiAgICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tb3JlSXRlbXNDb3VudCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgdG90YWwsIGZldGNoTW9yZSB9ID0gcmVzIGFzIExvYWRSZXN1bHQ8YW55PjtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHRvTnVtYmVyKHRvdGFsLCAoZGF0YSAmJiBkYXRhLmxlbmd0aCkgfHwgMCk7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAoZmV0Y2hNb3JlICYmIHRoaXMuX2l0ZW1Db3VudCAtIGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgcmVzID0gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEZpbHRlcmVkIGl0ZW1zIGJ5IHN1Z2dlc3RGbjonLCB2YWx1ZSwgcmVzKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTW9yZSgpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKCF0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrKSByZXR1cm4gW107XG5cbiAgICAvLyBTYXZlIHRoZW4gcmVtb3ZlIGZldGNoIGZ1bmN0aW9uICh0byBhdm9pZCBtdWx0aS1jYWxsKVxuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjaztcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgeyBkYXRhLCB0b3RhbCwgZmV0Y2hNb3JlIH0gPSBhd2FpdCBmZXRjaE1vcmVGbigpO1xuICAgIHRoaXMuX2l0ZW1Db3VudCA9IHRvdGFsIHx8IHRoaXMuX2l0ZW1Db3VudDtcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gTWF0aC5tYXgoMCwgdGhpcy5fbW9yZUl0ZW1zQ291bnQgLSBkYXRhLmxlbmd0aCk7IC8vIEJvcm5lIG1pbiA9IDBcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW1wbGljaXRWYWx1ZShpdGVtczogYW55W10pIHtcbiAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgaXRlbXM/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgYXBwbHlJbXBsaWNpdFZhbHVlID0gdHlwZW9mIHRoaXMuYXBwbHlJbXBsaWNpdFZhbHVlID09PSAnZnVuY3Rpb24nID8gdGhpcy5hcHBseUltcGxpY2l0VmFsdWUoaXRlbXNbMF0pIDogdGhpcy5hcHBseUltcGxpY2l0VmFsdWU7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gYXBwbHlJbXBsaWNpdFZhbHVlID8gaXRlbXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmVG91Y2hlZCgpIHtcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEF1dG9jb21wbGV0ZVBhbmVsKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGUgPSB0aGlzLmF1dG9jb21wbGV0ZT8ub3B0aW9ucy5sYXN0Py5fZ2V0SG9zdEVsZW1lbnQoKS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWxlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgY29uc29sZS53YXJuKHRoaXMubG9nUHJlZml4ICsgJyBVbmFibGUgdG8gZmluZCB0aGUgYXV0b2NvbXBsZXRlIGRpdi4uLicpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXRTZWxlY3RQYW5lbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlID0gdGhpcy5tYXRTZWxlY3Qub3B0aW9ucy5sYXN0Py5fZ2V0SG9zdEVsZW1lbnQoKS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWxlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgY29uc29sZS53YXJuKHRoaXMubG9nUHJlZml4ICsgJyBVbmFibGUgdG8gZmluZCB0aGUgbWF0LXNlbGVjdCBjb250YWluZXIuLi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF9maXhNYXRTZWxlY3RQb3NpdGlvbkFuZFNlYXJjaGJhcigpIHtcbiAgICBpZiAoIXRoaXMubWF0U2VsZWN0KSByZXR1cm47XG5cbiAgICAvLyBIaWRlIHRoZSBwYW5lbCAod2lsbCBiZSBzaG93IHdoZW4gcmVhZHkpXG4gICAgdGhpcy5tYXRTZWxlY3QucGFuZWxDbGFzcyA9ICdoaWRkZW4nO1xuXG4gICAgbGV0IHNlYXJjaEJhclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLm1hdFNlbGVjdC5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKGFzeW5jIChvcGVuKSA9PiB7XG4gICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5tYXRTZWxlY3QucGFuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBvdmVybGF5UGFuZSA9IGZpbmRQYXJlbnRXaXRoQ2xhc3MocGFuZWxFbGVtZW50LCAnY2RrLW92ZXJsYXktcGFuZScpO1xuXG4gICAgICAgICAgLy8gRml4IHBhbmVsIHBvc2l0aW9uLCB3aGVuIG92ZXJsYXkgaGFzIGFuIHRyYW5zZm9ybVggKGFkZGVkIHdoZW4ga2V5Ym9hcmQgaXMgc2hvd24pXG4gICAgICAgICAgdGhpcy5fZml4TWF0U2VsZWN0UGFuZWxQb3NpdGlvbihvdmVybGF5UGFuZSk7XG5cbiAgICAgICAgICAvLyBGaXggb3ZlcmxheSwgZm9yIHNlYXJjaGJhclxuICAgICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hCYXIpIHtcbiAgICAgICAgICAgIHNlYXJjaEJhclN1YnNjcmlwdGlvbiA9IGF3YWl0IHRoaXMuX2ZpeFNlYXJjaGJhck92ZXJsYXkocGFuZWxFbGVtZW50LCBvdmVybGF5UGFuZSk7XG4gICAgICAgICAgICBpZiAoc2VhcmNoQmFyU3Vic2NyaXB0aW9uKSB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHNlYXJjaEJhclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2hvdyB0aGUgcGFuZWxcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHBhbmVsRWxlbWVudCwgJ2hpZGRlbicpO1xuICAgICAgICAgIHRoaXMubWF0U2VsZWN0LnBhbmVsQ2xhc3MgPSB0aGlzLnBhbmVsQ2xhc3M7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT04gY2xvc2VcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gVW5zdWJzY3JpYmUgc2VhcmNoIGJhciB3b3JrYXJvdW5kXG4gICAgICAgICAgaWYgKHNlYXJjaEJhclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc2VhcmNoQmFyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHNlYXJjaEJhclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBzZWFyY2hCYXJTdWJzY3JpcHRpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBIaWRlIHBhbmVsIGFnYWluXG4gICAgICAgICAgICB0aGlzLm1hdFNlbGVjdC5wYW5lbENsYXNzID0gJ2hpZGRlbic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9maXhNYXRTZWxlY3RQYW5lbFBvc2l0aW9uKG92ZXJsYXlQYW5lOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghb3ZlcmxheVBhbmUpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSB0aGUgdW53YW50ZWQgZGVmYXVsdCB0cmFuc2xhdGVYXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgIG92ZXJsYXlQYW5lLFxuICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICBvdmVybGF5UGFuZS5zdHlsZS50cmFuc2Zvcm1cbiAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgLmZpbHRlcigocHJvcCkgPT4gIXByb3AubWF0Y2goL150cmFuc2xhdGVYLykpXG4gICAgICAgIC5qb2luKCcgJylcbiAgICApO1xuXG4gICAgLy8gRml4IHBhbmVsIHdpZHRoIHRvIGZpZWxkIHdpZHRoIChpdCB3YXMgbm90IGZvcmNlZCBieSBASW5wdXQgcGFuZWxXaWR0aClcbiAgICBpZiAoIXRoaXMucGFuZWxXaWR0aCkge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5sb2dQcmVmaXh9IEZpeGluZyBzZWxlY3QgcGFuZWwgd2lkdGggdG8gdGhlIGZpZWxkIHNpemVgKTtcbiAgICAgIGNvbnN0IHdpZHRoID0gYCR7dGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gMX1weGA7XG4gICAgICBpZiAodGhpcy5fZGVmYXVsdFBhbmVsV2lkdGggIT09IHdpZHRoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQYW5lbFdpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICd3aWR0aCcsIHdpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaXggcGFuZWwncyBsZWZ0LCB0byBhdm9pZCBvdmVyZmxvdyBvbiB0aGUgcmlnaHRcbiAgICBjb25zdCBsZWZ0ID0gb3ZlcmxheVBhbmUuc3R5bGUubGVmdDtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGxlZnQpICYmICFsZWZ0LmluY2x1ZGVzKCdjYWxjKCcpICYmIGxlZnQuZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBGaXhpbmcgc2VsZWN0IHBhbmVsIGxlZnQsIHRvIGF2b2lkIG92ZXJmbG93IG9uIHRoZSByaWdodGApO1xuICAgICAgY29uc3Qgd2lkdGggPSBgJHtvdmVybGF5UGFuZS5jbGllbnRXaWR0aH1weGA7XG4gICAgICBjb25zdCBmaXhMZWZ0ID0gYGNhbGMoLSR7d2lkdGh9ICsgbWluKCR7bGVmdH0gKyAke3dpZHRofSwgLTMycHggKyAxMDB2dykpYDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICdsZWZ0JywgZml4TGVmdCwgUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnQpO1xuICAgIH1cblxuICAgIC8vIEZpeCBwYW5lbCdzIHRvcCwgdG8gYXZvaWQgb3ZlcmZsb3cgb24gdGhlIGJvdHRvbVxuICAgIGNvbnN0IHRvcCA9IG92ZXJsYXlQYW5lLnN0eWxlLnRvcDtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHRvcCkgJiYgIXRvcC5pbmNsdWRlcygnY2FsYygnKSAmJiB0b3AuZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBGaXhpbmcgc2VsZWN0IHBhbmVsIHRvcCwgdG8gYXZvaWQgb3ZlcmZsb3cgb24gdGhlIGJvdHRvbWApO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYCR7b3ZlcmxheVBhbmUuY2xpZW50SGVpZ2h0IHx8IDI3NX1weGA7XG4gICAgICBjb25zdCBmaXhUb3AgPSBgY2FsYygtJHtoZWlnaHR9ICsgbWluKCR7dG9wfSArICR7aGVpZ2h0fSwgLTMycHggKyAxMDB2aCkpYDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICd0b3AnLCBmaXhUb3AsIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFjayA6IGlmIHdlIGFyZSBpbiBhIElvbk1vZGFsLCBpdCdzIG5lY2Vzc2FyeSB0byBtb3ZlIHRoZSBDZGtPdmVybGF5IGNvbnRhaW5lclxuICAgKiAgICAgaW4gdGhlIElvbk1vZGFsIHRvIG1pZ2h0IGtlZXAgZm9jdXMgaW4gSW9uU2VhcmNoYmFyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFuZWxFbGVtZW50XG4gICAqIEBwYXJhbSBvdmVybGF5UGFuZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZml4U2VhcmNoYmFyT3ZlcmxheShwYW5lbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvdmVybGF5UGFuZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5tYXRTZWxlY3QgfHwgIXRoaXMuaW9uU2VhcmNoYmFyKSByZXR1cm47XG5cbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSBhd2FpdCB0aGlzLm1vZGFsQ29udHJvbGxlci5nZXRUb3AoKTtcbiAgICBpZiAoIW1vZGFsRWxlbWVudCkgcmV0dXJuOyAvLyBObyBtb2RhbDogc2tpcFxuXG4gICAgLy8gR2V0IHRoZSBDREsgb3ZlcmxheSBjb250YWluZXJcbiAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gZmluZFBhcmVudFdpdGhDbGFzcyhwYW5lbEVsZW1lbnQsICdjZGstb3ZlcmxheS1jb250YWluZXInKTtcbiAgICBpZiAoIW92ZXJsYXlDb250YWluZXIpIHJldHVybjtcbiAgICBjb25zdCBvcmlnaW5hbFBhcmVudCA9IG92ZXJsYXlDb250YWluZXIucGFyZW50RWxlbWVudDtcblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZylcbiAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fU1vdmluZyB0aGUgXCJjZGstb3ZlcmxheVwiIGNvbnRhaW5lciBmcm9tIHRoZSBcIiR7b3JpZ2luYWxQYXJlbnQ/LnRhZ05hbWUgfHwgJ2JvZHknfVwiIHRvIHRoZSBcImlvbi1tb2RhbFwiIGNvbnRhaW5lcmApO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChtb2RhbEVsZW1lbnQsIG92ZXJsYXlDb250YWluZXIpO1xuXG4gICAgY29uc3QgX2RvY3VtZW50ID0gdGhpcy5pbmplY3Rvci5nZXQoRE9DVU1FTlQpO1xuICAgIGNvbnN0IHNoaWZ0TGVmdCA9IChfZG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJXaWR0aCAtIG1vZGFsRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkgLyAyO1xuICAgIGNvbnN0IHNoaWZ0VG9wID0gKF9kb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCAtIG1vZGFsRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIC8gMjtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3ZlcmxheVBhbmUsICdtYXJnaW4tdG9wJywgYC0ke3NoaWZ0VG9wfXB4YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvdmVybGF5UGFuZSwgJ21hcmdpbi1sZWZ0JywgYC0ke3NoaWZ0TGVmdH1weGApO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXZlcnNlIGZ1bmN0aW9uLCB0byByZXBsYWNlIHRoZSBjb250YWluZXIgaW4gYm9keVxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2lmICh0aGlzLmRlYnVnKVxuICAgICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gbW92aW5nIHRoZSBcImNkay1vdmVybGF5XCIgY29udGFpbmVyIGZyb20gdGhlIFwiaW9uLW1vZGFsXCIgdG8gdGhlIFwiYm9keVwiIGNvbnRhaW5lcmApO1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG9yaWdpbmFsUGFyZW50IC8qdGhpcy5kb2N1bWVudC5ib2R5Ki8sIG92ZXJsYXlDb250YWluZXIpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBmaWVsZC1jb250YWluZXJcIj5cbiAgPGlvbi1yb3c+XG4gICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPCEtLSByZWFkb25seSAtLT5cbiAgICAgIEBpZiAoX3JlYWRvbmx5KSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIl9kaXNwbGF5VmFsdWVcIlxuICAgICAgICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHk9XCJ0cnVlXCIgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICAgICAgICA8aW9uLXRleHQ+e3sgdmFsdWUgfCB0b1N0cmluZzogZGlzcGxheVdpdGggfX08L2lvbi10ZXh0PlxuICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBoaW50cyAtLT5cbiAgICAgICAgICBAaWYgKCFmb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbdGl0bGVdPVwiX2Rpc3BsYXlWYWx1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gTW9iaWxlIG9yIE11bHRpcGxlICh1c2UgPG1hdC1zZWxlY3Q+KSAtLT5cbiAgICAgICAgICBAaWYgKG1vYmlsZSB8fCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgI21hdFNlbGVjdFxuICAgICAgICAgICAgICBoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yXG4gICAgICAgICAgICAgIGRpc2FibGVPcHRpb25DZW50ZXJpbmdcbiAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiZGlzYWJsZVJpcHBsZVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJfdGFiaW5kZXhcIlxuICAgICAgICAgICAgICBbcGFuZWxDbGFzc109XCJwYW5lbENsYXNzXCJcbiAgICAgICAgICAgICAgW3BhbmVsV2lkdGhdPVwicGFuZWxXaWR0aCB8fCBfZGVmYXVsdFBhbmVsV2lkdGhcIlxuICAgICAgICAgICAgICAoZm9jdXMpPVwiZmlsdGVyTWF0U2VsZWN0Rm9jdXNFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiZmlsdGVyTWF0U2VsZWN0Qmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwia2V5ZG93bkVzY2FwZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwia2V5dXBFbnRlci5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiZXF1YWxzXCJcbiAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgW3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWxdPVwiZGVib3VuY2VUaW1lICogMTBcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPnt7IHZhbHVlIHwgdG9TdHJpbmc6IGRpc3BsYXlXaXRoIH19PC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJhciAtLT5cbiAgICAgICAgICAgICAgQGlmIChzaG93U2VhcmNoQmFyKSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBjbGFzcz1cIm1hdC1zZWxlY3Qtc2VhcmNoYmFyXCIgW2NsYXNzLm1hdC1zZWxlY3Qtc2VhcmNoYmFyLXN0aWNreV09XCJzdGlja3lTZWFyY2hCYXJcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gRklYTUUgb24gaU9TIGRldmljZXMsIHdoZW4gYW5pbWF0ZWQ9XCJ0cnVlXCIsIHRoZW4gdGhlIHNlYXJjaCBpY29uIG92ZXJsYXAgdGhlIHBsYWNlaG9sZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgPGlvbi1zZWFyY2hiYXJcbiAgICAgICAgICAgICAgICAgICAgI2lvblNlYXJjaGJhclxuICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBhbmltYXRlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWJvdW5jZV09XCJkZWJvdW5jZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAoaW9uQ2xlYXIpPVwibWFya0FzTG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlvbklucHV0KT1cImlvblNlYXJjaEJhckNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQ09NTU9OLkJUTl9TRUFSQ0gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgID48L2lvbi1zZWFyY2hiYXI+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXJzIC0tPlxuICAgICAgICAgICAgICA8aW9uLXJvd1xuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXNlbGVjdC1oZWFkZXIgY29sdW1uIGlvbi1uby1wYWRkaW5nXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtc2VsZWN0LXNlYXJjaGJhci1zdGlja3ldPVwic2hvd1NlYXJjaEJhciAmJiBzdGlja3lTZWFyY2hCYXJcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGZvciAoYXR0ciBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgYXR0cjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwiZGlzcGxheUNvbHVtbk5hbWVzW2ldIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgICAgICAgPCEtLSBOb25lIG9wdGlvbiAtLT5cbiAgICAgICAgICAgICAgQGlmICghcmVxdWlyZWQgJiYgIW11bHRpcGxlICYmICFjbGVhcmFibGUpIHtcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPjxpIHRyYW5zbGF0ZT5DT01NT04uRU1QVFlfT1BUSU9OPC9pPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoXyRmaWx0ZXJlZEl0ZW1zIHwgcHVzaDogJ3VzZXJCbG9ja2luZyc7IGFzIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBObyBpdGVtIG9wdGlvbiAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW1zIHwgaXNFbXB0eUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGk+e3sgbm9SZXN1bHRNZXNzYWdlIHwgdHJhbnNsYXRlIH19PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDwhLS0gT3B0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLXJvdyBbY2xhc3NMaXN0XT1cIml0ZW0uY2xhc3NMaXN0IHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChwYXRoIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyB0cmFjayBwYXRoOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJkaXNwbGF5Q29sdW1uU2l6ZXNbaV1cIiBjbGFzcz1cImlvbi1hbGlnbi1zZWxmLWNlbnRlciBpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydHlHZXQ6IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhpZ2hsaWdodDogeyBzZWFyY2g6IGlvblNlYXJjaGJhcj8udmFsdWUsIHdpdGhBY2NlbnQ6IGhpZ2hsaWdodEFjY2VudCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8IS0tIE1vcmUgaXRlbSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKF9tb3JlSXRlbXNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKG5nSW5pdCk9XCJfaW5pdE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsKClcIiBjbGFzcz1cImlvbi1wYWRkaW5nXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoKF9kaXNwbGF5VmFsdWUgfCBzdHJMZW5ndGgpIDwgc3VnZ2VzdExlbmd0aFRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIDwhLS0gbmVlZCBtb3JlIGNoYXJhY3RlciAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSU5GTy5QTEVBU0VfVFlQRV9NT1JFX0NIQVJBQ1RFUlMnIHwgdHJhbnNsYXRlOiB7IG1pbkxlbmd0aDogc3VnZ2VzdExlbmd0aFRocmVzaG9sZCB9IH19XG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDwhLS0gbG9hZGluZyBzcGlubmVyIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8IS0tIGZvb3RlciAtLT5cbiAgICAgICAgICAgICAgQGlmIChpdGVtQ291bnQ7IGFzIGNvdW50KSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJtYXQtb3B0aW9uLWZvb3RlciBtYXQtYXV0b2NvbXBsZXRlLWZvb3RlciBpb24tbm8tcGFkZGluZ1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLWZsb2F0LWVuZCBpb24tcGFkZGluZy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+e3sgJ0NPTU1PTi5SRVNVTFRfQ09VTlQnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiBjb3VudCB9IH19PC9pPlxuICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDwhLS0gZGVza3RvcCAodXNlIG1hdC1hdXRvY29tcGxldGUpIC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICNtYXRJbnB1dFRleHRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVQb3NpdGlvbl09XCJtYXRBdXRvY29tcGxldGVQb3NpdGlvblwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmbG9hdExhYmVsID09PSAnbmV2ZXInICYmIHBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiX3RhYmluZGV4XCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cImZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChibHVyKT1cImZpbHRlcklucHV0VGV4dEJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImtleWRvd25Fc2NhcGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImtleXVwRW50ZXIuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmFycm93RG93bik9XCIhYXV0b2NvbXBsZXRlLnNob3dQYW5lbCAmJiBkcm9wQnV0dG9uQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8IS0tIGF1dG9jb21wbGV0ZSAtLT5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICNhdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICBbYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlXaXRoXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cInBhbmVsQ2xhc3NcIlxuICAgICAgICAgICAgICBbcGFuZWxXaWR0aF09XCJwYW5lbFdpZHRoXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiZGlzYWJsZVJpcHBsZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwibWF0LWF1dG9jb21wbGV0ZS1oZWFkZXIgY29sdW1uIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoYXR0ciBvZiBkaXNwbGF5QXR0cmlidXRlczsgdHJhY2sgYXR0cjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tY29sIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwiZGlzcGxheUNvbHVtbk5hbWVzW2ldIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgIEBpZiAoXyRmaWx0ZXJlZEl0ZW1zIHwgcHVzaDogJ3VzZXJCbG9ja2luZyc7IGFzIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBObyBpdGVtIG9wdGlvbiAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW1zIHwgaXNFbXB0eUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImlvbi1wYWRkaW5nIHRleHQtaXRhbGljXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGk+e3sgbm9SZXN1bHRNZXNzYWdlIHwgdHJhbnNsYXRlIH19PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDwhLS0gT3B0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLXJvdyBbY2xhc3NMaXN0XT1cIml0ZW0uY2xhc3NMaXN0IHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChwYXRoIG9mIGRpc3BsYXlBdHRyaWJ1dGVzOyB0cmFjayBwYXRoOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cImRpc3BsYXlDb2x1bW5TaXplc1tpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInRleHQuaW5uZXJUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1hbGlnbi1zZWxmLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydHlHZXQ6IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGlnaGxpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiBtYXRJbnB1dFRleHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQWNjZW50OiBoaWdobGlnaHRBY2NlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPCEtLSBNb3JlIGl0ZW0gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChfbW9yZUl0ZW1zQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChuZ0luaXQpPVwiX2luaXRBdXRvY29tcGxldGVJbmZpbml0ZVNjcm9sbCgpXCIgY2xhc3M9XCJpb24tcGFkZGluZ1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKChfZGlzcGxheVZhbHVlIHwgc3RyTGVuZ3RoKSA8IHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICA8IS0tIE5lZWQgbW9yZSBjaGFyYWN0ZXJzIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaW9uLXBhZGRpbmcgdGV4dC1pdGFsaWNcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdJTkZPLlBMRUFTRV9UWVBFX01PUkVfQ0hBUkFDVEVSUycgfCB0cmFuc2xhdGU6IHsgbWluTGVuZ3RoOiBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkIH0gfX1cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPCEtLSBMb2FkaW5nIHNwaW5uZXIgLS0+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJpb24tcGFkZGluZ1wiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbUNvdW50OyBhcyBjb3VudCkge1xuICAgICAgICAgICAgICAgIDxpb24tcm93IGNsYXNzPVwibWF0LWF1dG9jb21wbGV0ZS1mb290ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tZmxvYXQtZW5kIGlvbi1wYWRkaW5nLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpPnt7ICdDT01NT04uUkVTVUxUX0NPVU5UJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogY291bnQgfSB9fTwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLVxuICAgICAgICAgIE5PVEUgOlxuICAgICAgICAgIC0gXCJzZWxlY3RJbnB1dENvbnRlbnQoJGV2ZW50KSB8fCBvbkZvY3VzLmVtaXQoJGV2ZW50KVwiIDogY2FsbCBvbkZvY3VzIG9ubHkgd2hlbiB0byB0aGUgaW5wdXQgaXMgZW1wdHkgKG5vdGhpbmcgdG8gc2VsZWN0KVxuICAgICAgICAgIC0tPlxuICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChmb3JtQ29udHJvbC5oYXNFcnJvcignZW50aXR5JykpIHtcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX0lOVkFMSUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEVycm9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8IS0tIEhpbnRzIC0tPlxuICAgICAgICAgIEBpZiAoIWZvcm1Db250cm9sLmludmFsaWQpIHtcbiAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICB9XG4gICAgPC9pb24tY29sPlxuICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdEFmdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L2lvbi1jb2w+XG4gIDwvaW9uLXJvdz5cbjwvaW9uLWdyaWQ+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRTdWZmaXhUZW1wbGF0ZT5cbiAgQGlmICghbW9iaWxlICYmICFtdWx0aXBsZSkge1xuICAgIDxidXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImRyb3BCdXR0b25DbGljay5lbWl0KCRldmVudClcIlxuICAgICAgW2hpZGRlbl09XCJkaXNhYmxlZFwiXG4gICAgICBbdGl0bGVdPVwiZHJvcEJ1dHRvblRpdGxlIHx8ICcnIHwgdHJhbnNsYXRlXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cbiAgQGlmIChjbGVhcmFibGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgW2hpZGRlbl09XCJkaXNhYmxlZCB8fCAhZm9ybUNvbnRyb2wudmFsdWVcIlxuICAgICAgW3RpdGxlXT1cImNsZWFyQnV0dG9uVGl0bGUgfHwgJycgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cblxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0RXJyb3JUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yLFttYXRFcnJvcl1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEhpbnRUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludDpub3QoW2FsaWduPSdlbmQnXSksW21hdEhpbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludFthbGlnbj0nZW5kJ11cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==