@byuhbll/components 5.1.0-beta.1 → 5.1.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild, inject, HostListener, } from '@angular/core';
1
+ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewChildren, inject, HostListener, } from '@angular/core';
2
2
  import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
3
3
  import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
4
4
  import { Subscription } from 'rxjs';
@@ -12,7 +12,9 @@ import * as i3 from "@angular/common";
12
12
  export class SimpleSearchComponent {
13
13
  constructor() {
14
14
  this.fb = inject(FormBuilder);
15
+ this.el = inject(ElementRef);
15
16
  this.subscription = new Subscription();
17
+ this.supportedSuggestionScopes = [];
16
18
  this.suggestions = [];
17
19
  this.simpleSearch = new EventEmitter();
18
20
  this.clearSimpleSearch = new EventEmitter();
@@ -20,6 +22,7 @@ export class SimpleSearchComponent {
20
22
  this.isSubmitted = false;
21
23
  this.showSuggestions = false;
22
24
  this.selectedSuggestionIndex = -1;
25
+ this.expandedSuggestions = new Set();
23
26
  this.skipNextSuggest = false;
24
27
  this.searchForm = this.fb.nonNullable.group({
25
28
  simpleQuery: ['', Validators.required],
@@ -31,6 +34,7 @@ export class SimpleSearchComponent {
31
34
  this.showSearchValidationToolTip();
32
35
  return;
33
36
  }
37
+ this.hideSuggestions();
34
38
  this.simpleSearch.emit({
35
39
  ...this.config,
36
40
  q: this.simpleQuery.value,
@@ -49,6 +53,15 @@ export class SimpleSearchComponent {
49
53
  this.hideSuggestions();
50
54
  this.emitSimpleSearch(true);
51
55
  };
56
+ this.toggleExpand = (index, event) => {
57
+ event.stopPropagation();
58
+ if (this.expandedSuggestions.has(index)) {
59
+ this.expandedSuggestions.delete(index);
60
+ }
61
+ else {
62
+ this.expandedSuggestions.add(index);
63
+ }
64
+ };
52
65
  this.onInputKeydown = (event) => {
53
66
  if (!this.showSuggestions || this.suggestions.length === 0) {
54
67
  return;
@@ -57,10 +70,12 @@ export class SimpleSearchComponent {
57
70
  case 'ArrowDown':
58
71
  event.preventDefault();
59
72
  this.selectedSuggestionIndex = Math.min(this.selectedSuggestionIndex + 1, this.suggestions.length - 1);
73
+ this.scrollToSelected();
60
74
  break;
61
75
  case 'ArrowUp':
62
76
  event.preventDefault();
63
77
  this.selectedSuggestionIndex = Math.max(this.selectedSuggestionIndex - 1, -1);
78
+ this.scrollToSelected();
64
79
  break;
65
80
  case 'Enter':
66
81
  if (this.selectedSuggestionIndex >= 0) {
@@ -68,14 +83,17 @@ export class SimpleSearchComponent {
68
83
  this.selectSuggestion(this.suggestions[this.selectedSuggestionIndex]);
69
84
  }
70
85
  break;
71
- case 'Escape':
72
- this.hideSuggestions();
73
- break;
74
86
  }
75
87
  };
76
88
  this.setupForm = () => {
77
89
  this.simpleQuery.setValue(this.config.q || this.config.advancedSearchQueryRows[0]?.query || '');
78
90
  };
91
+ this.scrollToSelected = () => {
92
+ const item = this.suggestionItems.toArray()[this.selectedSuggestionIndex];
93
+ if (item) {
94
+ item.nativeElement.scrollIntoView({ block: 'nearest' });
95
+ }
96
+ };
79
97
  this.showSearchValidationToolTip = () => {
80
98
  this.searchInput.nativeElement.focus();
81
99
  this.inputTooltip.disabled = false;
@@ -84,6 +102,7 @@ export class SimpleSearchComponent {
84
102
  this.hideSuggestions = () => {
85
103
  this.showSuggestions = false;
86
104
  this.selectedSuggestionIndex = -1;
105
+ this.expandedSuggestions.clear();
87
106
  };
88
107
  }
89
108
  set config(config) {
@@ -103,15 +122,24 @@ export class SimpleSearchComponent {
103
122
  .pipe(filter(() => !!this.inputTooltip))
104
123
  .subscribe(() => {
105
124
  this.inputTooltip.disabled = true;
125
+ this.inputTooltip.hide();
106
126
  }));
107
127
  // Emit suggestion requests with debounce
108
128
  this.subscription.add(this.simpleQuery.valueChanges
109
- .pipe(debounceTime(300), distinctUntilChanged(), filter((value) => value.trim().length > 0))
129
+ .pipe(debounceTime(200), distinctUntilChanged())
110
130
  .subscribe((value) => {
131
+ // Only suggest for supported scopes
132
+ if (!this.supportedSuggestionScopes.includes(this.config.scope)) {
133
+ return;
134
+ }
111
135
  if (this.skipNextSuggest) {
112
136
  this.skipNextSuggest = false;
113
137
  return;
114
138
  }
139
+ if (value.trim().length === 0) {
140
+ this.hideSuggestions();
141
+ return;
142
+ }
115
143
  this.suggest.emit({ ...this.config, q: value });
116
144
  this.showSuggestions = true;
117
145
  this.selectedSuggestionIndex = -1;
@@ -126,21 +154,32 @@ export class SimpleSearchComponent {
126
154
  this.hideSuggestions();
127
155
  }
128
156
  }
157
+ onFocusOut(event) {
158
+ if (!this.el.nativeElement.contains(event.relatedTarget)) {
159
+ this.hideSuggestions();
160
+ this.inputTooltip?.hide();
161
+ }
162
+ }
129
163
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: SimpleSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
130
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: SimpleSearchComponent, isStandalone: true, selector: "lib-ss-simple-search", inputs: { config: "config", suggestions: "suggestions" }, outputs: { simpleSearch: "simpleSearch", clearSimpleSearch: "clearSimpleSearch", suggest: "suggest" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<div class=\"ss-container\">\n <form [formGroup]=\"searchForm\" (submit)=\"emitSimpleSearch()\" data-testid=\"searchForm\">\n <input\n #searchInput\n data-testid=\"searchInput\"\n id=\"q\"\n name=\"q\"\n type=\"text\"\n required\n aria-required=\"true\"\n aria-label=\"search input\"\n autocapitalize=\"off\"\n formControlName=\"simpleQuery\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && simpleQuery.invalid\"\n (keydown)=\"onInputKeydown($event)\"\n />\n <label for=\"q\" data-testid=\"label\">{{\n config.scope === 'local'\n ? 'Books, media, special collections and more'\n : 'Ebooks, articles, journals, databases, streaming media and more'\n }}</label>\n <button\n type=\"submit\"\n aria-label=\"search\"\n data-testid=\"searchBtn\"\n [ngClass]=\"{ ensign: config.institution === 'ensign' }\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> search </span>\n </button>\n </form>\n\n @if (simpleQuery.value) {\n <button id=\"clear\" (click)=\"clearQuery()\" data-testid=\"clearBtn\">\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n\n @if (showSuggestions && suggestions.length > 0) {\n <ul class=\"suggestions-list\" role=\"listbox\" data-testid=\"suggestionsList\">\n @for (suggestion of suggestions; track suggestion; let i = $index) {\n <li\n class=\"suggestion-item\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (click)=\"selectSuggestion(suggestion)\"\n (keydown.enter)=\"selectSuggestion(suggestion)\"\n (keydown.space)=\"selectSuggestion(suggestion); $event.preventDefault()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"i === selectedSuggestionIndex\"\n data-testid=\"suggestionItem\"\n >\n {{ suggestion }}\n </li>\n }\n </ul>\n }\n</div>\n", styles: ["a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}.ss-container{position:relative}form{display:flex}.ss-icon{font-size:1em}button[type=submit]{background:#fff;border-radius:0 4px 4px 0;margin:0;width:3em;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:color .2s,background-color .2s}button[type=submit] .ss-icon{color:#0047ba;font-size:1.7em}button[type=submit]:hover .ss-icon{color:#6892ca}button[type=submit].ensign .ss-icon{color:#2b6042}button[type=submit].ensign .ss-icon:hover{color:#357551}#clear{position:absolute;right:3em;top:0%;height:100%;display:flex;justify-content:center;align-items:center;padding:0 0 0 .375rem}#clear .ss-icon{height:auto;color:#acacac;transition:color ease-in-out .05s}#clear:hover .ss-icon{color:#666}input[type=text]{background-color:#fff;color:#000;font-family:inherit;border:none;font-weight:600;margin:0;overflow:hidden;cursor:text;width:calc(100% - 3em);font-size:1em;border-radius:4px 0 0 4px;padding:.56em 2em .56em .56em}input[type=text]:focus{outline:none}input[type=text]:valid+label,input[type=text]:focus+label{font-size:.75em;top:-.8em;padding-top:0;padding-bottom:0;pointer-events:none;margin-top:0;margin-left:.56em;cursor:default}input[type=text]:valid+label:before,input[type=text]:focus+label:before{opacity:1}label{cursor:text;transition:all .1s ease-in-out;position:absolute;padding:.5em .28em;margin-left:.28em;left:0;color:#707070;z-index:1;max-width:calc(100% - 3.4em);white-space:nowrap;line-height:normal;overflow:hidden;text-overflow:ellipsis;border-radius:4px}label:before{transition:all .1s ease-in-out;background-color:#fff;content:\"\";position:absolute;inset:0;opacity:0;z-index:-1}.suggestions-list{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #d0d0d0;border-top:none;border-radius:0 0 4px 4px;list-style:none;margin:0;padding:0;max-height:300px;overflow-y:auto;box-shadow:0 4px 6px #0000001a;z-index:1000}.suggestion-item{padding:.75em 1em;cursor:pointer;transition:background-color .15s ease;color:#333;font-size:1em}.suggestion-item:hover,.suggestion-item.selected{background-color:#f0f0f0}.suggestion-item.selected{background-color:#e6f2ff}.suggestion-item:last-child{border-radius:0 0 4px 4px}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
164
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: SimpleSearchComponent, isStandalone: true, selector: "lib-ss-simple-search", inputs: { config: "config", supportedSuggestionScopes: "supportedSuggestionScopes", suggestions: "suggestions" }, outputs: { simpleSearch: "simpleSearch", clearSimpleSearch: "clearSimpleSearch", suggest: "suggest" }, host: { listeners: { "document:click": "onDocumentClick($event)", "focusout": "onFocusOut($event)" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }, { propertyName: "suggestionItems", predicate: ["suggestionItem"], descendants: true }], ngImport: i0, template: "<div class=\"ss-container\">\n <form [formGroup]=\"searchForm\" (submit)=\"emitSimpleSearch()\" data-testid=\"searchForm\">\n <input\n #searchInput\n data-testid=\"searchInput\"\n id=\"q\"\n name=\"q\"\n type=\"text\"\n autocomplete=\"off\"\n required\n aria-required=\"true\"\n aria-label=\"search input\"\n autocapitalize=\"off\"\n formControlName=\"simpleQuery\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && simpleQuery.invalid\"\n (keydown)=\"onInputKeydown($event)\"\n />\n <label for=\"q\" data-testid=\"label\">{{\n config.scope === 'local'\n ? 'Books, media, special collections and more'\n : 'Ebooks, articles, journals, databases, streaming media and more'\n }}</label>\n <button\n type=\"submit\"\n aria-label=\"search\"\n data-testid=\"searchBtn\"\n [ngClass]=\"{ ensign: config.institution === 'ensign' }\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> search </span>\n </button>\n </form>\n\n @if (simpleQuery.value) {\n <button id=\"clear\" (click)=\"clearQuery()\" data-testid=\"clearBtn\">\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n\n @if (showSuggestions && suggestions.length > 0) {\n <ul class=\"suggestions-list\" role=\"listbox\" data-testid=\"suggestionsList\">\n @for (suggestion of suggestions; track $index; let i = $index) {\n <li\n #suggestionItem\n class=\"suggestion-item\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (click)=\"selectSuggestion(suggestion)\"\n (keydown.enter)=\"selectSuggestion(suggestion)\"\n (keydown.space)=\"selectSuggestion(suggestion); $event.preventDefault()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"i === selectedSuggestionIndex\"\n data-testid=\"suggestionItem\"\n >\n <span class=\"suggestion-text\" [title]=\"suggestion\">\n {{\n expandedSuggestions.has(i) || suggestion.length <= 500\n ? suggestion\n : (suggestion | slice: 0 : 500) + '...'\n }}\n </span>\n @if (suggestion.length > 500) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand(i, $event)\"\n [attr.aria-label]=\"\n expandedSuggestions.has(i) ? 'Collapse' : 'Expand suggestion'\n \"\n >\n <span class=\"material-symbols-outlined\">\n {{ expandedSuggestions.has(i) ? 'expand_less' : 'expand_more' }}\n </span>\n </button>\n }\n </li>\n }\n </ul>\n }\n</div>\n", styles: ["a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}.ss-container{position:relative}form{display:flex}.ss-icon{font-size:1em}button[type=submit]{background:#fff;border-radius:0 4px 4px 0;margin:0;width:3em;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:color .2s,background-color .2s}button[type=submit] .ss-icon{color:#0047ba;font-size:1.7em}button[type=submit]:hover .ss-icon{color:#6892ca}button[type=submit].ensign .ss-icon{color:#2b6042}button[type=submit].ensign .ss-icon:hover{color:#357551}#clear{position:absolute;right:3em;top:0%;height:100%;display:flex;justify-content:center;align-items:center;padding:0 0 0 .375rem}#clear .ss-icon{height:auto;color:#acacac;transition:color ease-in-out .05s}#clear:hover .ss-icon{color:#666}input[type=text]{background-color:#fff;color:#000;font-family:inherit;border:none;font-weight:600;margin:0;overflow:hidden;cursor:text;width:calc(100% - 3em);font-size:1em;border-radius:4px 0 0 4px;padding:.56em 2em .56em .56em}input[type=text]:focus{outline:none}input[type=text]:valid+label,input[type=text]:focus+label{font-size:.75em;top:-.8em;padding-top:0;padding-bottom:0;pointer-events:none;margin-top:0;margin-left:.56em;cursor:default}input[type=text]:valid+label:before,input[type=text]:focus+label:before{opacity:1}label{cursor:text;transition:all .1s ease-in-out;position:absolute;padding:.5em .28em;margin-left:.28em;left:0;color:#707070;z-index:1;max-width:calc(100% - 3.4em);white-space:nowrap;line-height:normal;overflow:hidden;text-overflow:ellipsis;border-radius:4px}label:before{transition:all .1s ease-in-out;background-color:#fff;content:\"\";position:absolute;inset:0;opacity:0;z-index:-1}.suggestions-list{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #d0d0d0;border-top:none;border-radius:0 0 4px 4px;list-style:none;margin:0;padding:0;max-height:300px;overflow-y:auto;box-shadow:0 4px 6px #0000001a;z-index:1000}.suggestion-item{padding:.75em 1em;cursor:pointer;transition:background-color .15s ease;color:#333;font-size:1em;display:flex;align-items:center;gap:.5em}.suggestion-item:hover,.suggestion-item.selected{background-color:#f0f0f0}.suggestion-item.selected{background-color:#e6f2ff}.suggestion-item:last-child{border-radius:0 0 4px 4px}.suggestion-text{flex:1;overflow-wrap:break-word}.expand-btn{background:none;border:none;cursor:pointer;padding:2px;display:flex;align-items:center;justify-content:center;color:#707070;border-radius:50%;transition:background-color .2s}.expand-btn:hover{background-color:#0000000d;color:#0047ba}.expand-btn .material-symbols-outlined{font-size:1.25em}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.SlicePipe, name: "slice" }] }); }
131
165
  }
132
166
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: SimpleSearchComponent, decorators: [{
133
167
  type: Component,
134
- args: [{ selector: 'lib-ss-simple-search', standalone: true, imports: [MatTooltipModule, MatIconModule, ReactiveFormsModule, CommonModule], template: "<div class=\"ss-container\">\n <form [formGroup]=\"searchForm\" (submit)=\"emitSimpleSearch()\" data-testid=\"searchForm\">\n <input\n #searchInput\n data-testid=\"searchInput\"\n id=\"q\"\n name=\"q\"\n type=\"text\"\n required\n aria-required=\"true\"\n aria-label=\"search input\"\n autocapitalize=\"off\"\n formControlName=\"simpleQuery\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && simpleQuery.invalid\"\n (keydown)=\"onInputKeydown($event)\"\n />\n <label for=\"q\" data-testid=\"label\">{{\n config.scope === 'local'\n ? 'Books, media, special collections and more'\n : 'Ebooks, articles, journals, databases, streaming media and more'\n }}</label>\n <button\n type=\"submit\"\n aria-label=\"search\"\n data-testid=\"searchBtn\"\n [ngClass]=\"{ ensign: config.institution === 'ensign' }\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> search </span>\n </button>\n </form>\n\n @if (simpleQuery.value) {\n <button id=\"clear\" (click)=\"clearQuery()\" data-testid=\"clearBtn\">\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n\n @if (showSuggestions && suggestions.length > 0) {\n <ul class=\"suggestions-list\" role=\"listbox\" data-testid=\"suggestionsList\">\n @for (suggestion of suggestions; track suggestion; let i = $index) {\n <li\n class=\"suggestion-item\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (click)=\"selectSuggestion(suggestion)\"\n (keydown.enter)=\"selectSuggestion(suggestion)\"\n (keydown.space)=\"selectSuggestion(suggestion); $event.preventDefault()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"i === selectedSuggestionIndex\"\n data-testid=\"suggestionItem\"\n >\n {{ suggestion }}\n </li>\n }\n </ul>\n }\n</div>\n", styles: ["a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}.ss-container{position:relative}form{display:flex}.ss-icon{font-size:1em}button[type=submit]{background:#fff;border-radius:0 4px 4px 0;margin:0;width:3em;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:color .2s,background-color .2s}button[type=submit] .ss-icon{color:#0047ba;font-size:1.7em}button[type=submit]:hover .ss-icon{color:#6892ca}button[type=submit].ensign .ss-icon{color:#2b6042}button[type=submit].ensign .ss-icon:hover{color:#357551}#clear{position:absolute;right:3em;top:0%;height:100%;display:flex;justify-content:center;align-items:center;padding:0 0 0 .375rem}#clear .ss-icon{height:auto;color:#acacac;transition:color ease-in-out .05s}#clear:hover .ss-icon{color:#666}input[type=text]{background-color:#fff;color:#000;font-family:inherit;border:none;font-weight:600;margin:0;overflow:hidden;cursor:text;width:calc(100% - 3em);font-size:1em;border-radius:4px 0 0 4px;padding:.56em 2em .56em .56em}input[type=text]:focus{outline:none}input[type=text]:valid+label,input[type=text]:focus+label{font-size:.75em;top:-.8em;padding-top:0;padding-bottom:0;pointer-events:none;margin-top:0;margin-left:.56em;cursor:default}input[type=text]:valid+label:before,input[type=text]:focus+label:before{opacity:1}label{cursor:text;transition:all .1s ease-in-out;position:absolute;padding:.5em .28em;margin-left:.28em;left:0;color:#707070;z-index:1;max-width:calc(100% - 3.4em);white-space:nowrap;line-height:normal;overflow:hidden;text-overflow:ellipsis;border-radius:4px}label:before{transition:all .1s ease-in-out;background-color:#fff;content:\"\";position:absolute;inset:0;opacity:0;z-index:-1}.suggestions-list{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #d0d0d0;border-top:none;border-radius:0 0 4px 4px;list-style:none;margin:0;padding:0;max-height:300px;overflow-y:auto;box-shadow:0 4px 6px #0000001a;z-index:1000}.suggestion-item{padding:.75em 1em;cursor:pointer;transition:background-color .15s ease;color:#333;font-size:1em}.suggestion-item:hover,.suggestion-item.selected{background-color:#f0f0f0}.suggestion-item.selected{background-color:#e6f2ff}.suggestion-item:last-child{border-radius:0 0 4px 4px}\n"] }]
168
+ args: [{ selector: 'lib-ss-simple-search', standalone: true, imports: [MatTooltipModule, MatIconModule, ReactiveFormsModule, CommonModule], template: "<div class=\"ss-container\">\n <form [formGroup]=\"searchForm\" (submit)=\"emitSimpleSearch()\" data-testid=\"searchForm\">\n <input\n #searchInput\n data-testid=\"searchInput\"\n id=\"q\"\n name=\"q\"\n type=\"text\"\n autocomplete=\"off\"\n required\n aria-required=\"true\"\n aria-label=\"search input\"\n autocapitalize=\"off\"\n formControlName=\"simpleQuery\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && simpleQuery.invalid\"\n (keydown)=\"onInputKeydown($event)\"\n />\n <label for=\"q\" data-testid=\"label\">{{\n config.scope === 'local'\n ? 'Books, media, special collections and more'\n : 'Ebooks, articles, journals, databases, streaming media and more'\n }}</label>\n <button\n type=\"submit\"\n aria-label=\"search\"\n data-testid=\"searchBtn\"\n [ngClass]=\"{ ensign: config.institution === 'ensign' }\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> search </span>\n </button>\n </form>\n\n @if (simpleQuery.value) {\n <button id=\"clear\" (click)=\"clearQuery()\" data-testid=\"clearBtn\">\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n\n @if (showSuggestions && suggestions.length > 0) {\n <ul class=\"suggestions-list\" role=\"listbox\" data-testid=\"suggestionsList\">\n @for (suggestion of suggestions; track $index; let i = $index) {\n <li\n #suggestionItem\n class=\"suggestion-item\"\n [class.selected]=\"i === selectedSuggestionIndex\"\n (click)=\"selectSuggestion(suggestion)\"\n (keydown.enter)=\"selectSuggestion(suggestion)\"\n (keydown.space)=\"selectSuggestion(suggestion); $event.preventDefault()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"i === selectedSuggestionIndex\"\n data-testid=\"suggestionItem\"\n >\n <span class=\"suggestion-text\" [title]=\"suggestion\">\n {{\n expandedSuggestions.has(i) || suggestion.length <= 500\n ? suggestion\n : (suggestion | slice: 0 : 500) + '...'\n }}\n </span>\n @if (suggestion.length > 500) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand(i, $event)\"\n [attr.aria-label]=\"\n expandedSuggestions.has(i) ? 'Collapse' : 'Expand suggestion'\n \"\n >\n <span class=\"material-symbols-outlined\">\n {{ expandedSuggestions.has(i) ? 'expand_less' : 'expand_more' }}\n </span>\n </button>\n }\n </li>\n }\n </ul>\n }\n</div>\n", styles: ["a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}.ss-container{position:relative}form{display:flex}.ss-icon{font-size:1em}button[type=submit]{background:#fff;border-radius:0 4px 4px 0;margin:0;width:3em;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:color .2s,background-color .2s}button[type=submit] .ss-icon{color:#0047ba;font-size:1.7em}button[type=submit]:hover .ss-icon{color:#6892ca}button[type=submit].ensign .ss-icon{color:#2b6042}button[type=submit].ensign .ss-icon:hover{color:#357551}#clear{position:absolute;right:3em;top:0%;height:100%;display:flex;justify-content:center;align-items:center;padding:0 0 0 .375rem}#clear .ss-icon{height:auto;color:#acacac;transition:color ease-in-out .05s}#clear:hover .ss-icon{color:#666}input[type=text]{background-color:#fff;color:#000;font-family:inherit;border:none;font-weight:600;margin:0;overflow:hidden;cursor:text;width:calc(100% - 3em);font-size:1em;border-radius:4px 0 0 4px;padding:.56em 2em .56em .56em}input[type=text]:focus{outline:none}input[type=text]:valid+label,input[type=text]:focus+label{font-size:.75em;top:-.8em;padding-top:0;padding-bottom:0;pointer-events:none;margin-top:0;margin-left:.56em;cursor:default}input[type=text]:valid+label:before,input[type=text]:focus+label:before{opacity:1}label{cursor:text;transition:all .1s ease-in-out;position:absolute;padding:.5em .28em;margin-left:.28em;left:0;color:#707070;z-index:1;max-width:calc(100% - 3.4em);white-space:nowrap;line-height:normal;overflow:hidden;text-overflow:ellipsis;border-radius:4px}label:before{transition:all .1s ease-in-out;background-color:#fff;content:\"\";position:absolute;inset:0;opacity:0;z-index:-1}.suggestions-list{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #d0d0d0;border-top:none;border-radius:0 0 4px 4px;list-style:none;margin:0;padding:0;max-height:300px;overflow-y:auto;box-shadow:0 4px 6px #0000001a;z-index:1000}.suggestion-item{padding:.75em 1em;cursor:pointer;transition:background-color .15s ease;color:#333;font-size:1em;display:flex;align-items:center;gap:.5em}.suggestion-item:hover,.suggestion-item.selected{background-color:#f0f0f0}.suggestion-item.selected{background-color:#e6f2ff}.suggestion-item:last-child{border-radius:0 0 4px 4px}.suggestion-text{flex:1;overflow-wrap:break-word}.expand-btn{background:none;border:none;cursor:pointer;padding:2px;display:flex;align-items:center;justify-content:center;color:#707070;border-radius:50%;transition:background-color .2s}.expand-btn:hover{background-color:#0000000d;color:#0047ba}.expand-btn .material-symbols-outlined{font-size:1.25em}\n"] }]
135
169
  }], propDecorators: { searchInput: [{
136
170
  type: ViewChild,
137
171
  args: ['searchInput']
172
+ }], suggestionItems: [{
173
+ type: ViewChildren,
174
+ args: ['suggestionItem']
138
175
  }], inputTooltip: [{
139
176
  type: ViewChild,
140
177
  args: [MatTooltip]
141
178
  }], config: [{
142
179
  type: Input,
143
180
  args: [{ required: true }]
181
+ }], supportedSuggestionScopes: [{
182
+ type: Input
144
183
  }], suggestions: [{
145
184
  type: Input
146
185
  }], simpleSearch: [{
@@ -152,5 +191,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
152
191
  }], onDocumentClick: [{
153
192
  type: HostListener,
154
193
  args: ['document:click', ['$event']]
194
+ }], onFocusOut: [{
195
+ type: HostListener,
196
+ args: ['focusout', ['$event']]
155
197
  }] } });
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc3Mtc2VhcmNoLWJhci9zaW1wbGUtc2VhcmNoL3NpbXBsZS1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvc2ltcGxlLXNlYXJjaC9zaW1wbGUtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEdBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBZSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7OztBQVUvQyxNQUFNLE9BQU8scUJBQXFCO0lBUGxDO1FBUXFCLE9BQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFNbEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBU2pDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWdC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QixDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDTCxDQUFDOzhHQWxJUSxxQkFBcUI7a0dBQXJCLHFCQUFxQixrY0FNbkIsVUFBVSxnRENqQ3pCLGk1RUE0REEsaTNFRHJDYyxnQkFBZ0IsNFRBQUUsYUFBYSw4QkFBRSxtQkFBbUIseXFDQUFFLFlBQVk7OzJGQUluRSxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0ksc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUM7OEJBTTNDLFdBQVc7c0JBQTVDLFNBQVM7dUJBQUMsYUFBYTtnQkFJTyxZQUFZO3NCQUExQyxTQUFTO3VCQUFDLFVBQVU7Z0JBR1UsTUFBTTtzQkFBcEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBT2hCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkEwR1AsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbiAgICBIb3N0TGlzdGVuZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCwgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIGZpbHRlciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTZWFyY2hDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLWNvbmZpZy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLXNzLXNpbXBsZS1zZWFyY2gnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW01hdFRvb2x0aXBNb2R1bGUsIE1hdEljb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NpbXBsZS1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NpbXBsZS1zZWFyY2guY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2ltcGxlU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JykgcHJpdmF0ZSBzZWFyY2hJbnB1dCE6IEVsZW1lbnRSZWY7XG4gICAgLy8gVGhlIHRvb2x0aXAgaXMgZGlzYWJsZWQgaW4gdGhlIHRlbXBsYXRlLlxuICAgIC8vIEl0IGlzIGVuYWJsZWQgYW5kIGRpc3BsYXllZCBpZiBhIHVzZXIgc2VhcmNoZXMgYWdhaW5zdCBhbiBlbXB0eSBxdWVyeSAoc2ltcGxlIG9yIHExKS5cbiAgICAvLyBBbnkgY2hhbmdlIHRvIHRoZSBzZWFyY2ggZmllbGQgZGlzYWJsZXMgdGhlIHRvb2x0aXAuXG4gICAgQFZpZXdDaGlsZChNYXRUb29sdGlwKSBwcml2YXRlIGlucHV0VG9vbHRpcCE6IE1hdFRvb2x0aXA7XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgcHJpdmF0ZSBfY29uZmlnITogU2VhcmNoQ29uZmlnO1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNldCBjb25maWcoY29uZmlnOiBTZWFyY2hDb25maWcpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNldHVwRm9ybSgpO1xuICAgIH1cbiAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICAgIH1cbiAgICBASW5wdXQoKSBzdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBAT3V0cHV0KCkgc2ltcGxlU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG4gICAgQE91dHB1dCgpIGNsZWFyU2ltcGxlU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSBzdWdnZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG4gICAgcHJvdGVjdGVkIGlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHNob3dTdWdnZXN0aW9ucyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBzZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IC0xO1xuICAgIHByaXZhdGUgc2tpcE5leHRTdWdnZXN0ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHNlYXJjaEZvcm0gPSB0aGlzLmZiLm5vbk51bGxhYmxlLmdyb3VwKHtcbiAgICAgICAgc2ltcGxlUXVlcnk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgfSk7XG5cbiAgICBnZXQgc2ltcGxlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdzaW1wbGVRdWVyeScpIGFzIEZvcm1Db250cm9sO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBFbnN1cmUgdmFsaWRhdGlvbiB0b29sdGlwIGNsb3NlcyB3aGVuIHVzZXMgZW50ZXJzIGEgcXVlcnlcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5zaW1wbGVRdWVyeS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShzdGFydFdpdGgoJycpKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhIXRoaXMuaW5wdXRUb29sdGlwKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgc3VnZ2VzdGlvbiByZXF1ZXN0cyB3aXRoIGRlYm91bmNlXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMuc2ltcGxlUXVlcnkudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNraXBOZXh0U3VnZ2VzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwTmV4dFN1Z2dlc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Z2dlc3QuZW1pdCh7IC4uLnRoaXMuY29uZmlnLCBxOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRTaW1wbGVTZWFyY2ggPSAoaXNTdWdnZXN0aW9uOiBib29sZWFuID0gZmFsc2UpID0+IHtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIC8vIERvbid0IHBlcmZvcm0gYSBzZWFyY2ggdW5sZXNzIHRoZXJlIGlzIGEgcXVlcnlcbiAgICAgICAgaWYgKHRoaXMuc2ltcGxlUXVlcnkuaW52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoVmFsaWRhdGlvblRvb2xUaXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpbXBsZVNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgcTogdGhpcy5zaW1wbGVRdWVyeS52YWx1ZSxcbiAgICAgICAgICAgIGlzU3VnZ2VzdGlvbjogaXNTdWdnZXN0aW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgY2xlYXJRdWVyeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zaW1wbGVRdWVyeS5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuY2xlYXJTaW1wbGVTZWFyY2guZW1pdCgpO1xuICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0U3VnZ2VzdGlvbiA9IChzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5za2lwTmV4dFN1Z2dlc3QgPSB0cnVlO1xuICAgICAgICB0aGlzLnNpbXBsZVF1ZXJ5LnNldFZhbHVlKHN1Z2dlc3Rpb24pO1xuICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xuICAgICAgICB0aGlzLmVtaXRTaW1wbGVTZWFyY2godHJ1ZSk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBvbklucHV0S2V5ZG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2hvd1N1Z2dlc3Rpb25zIHx8IHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCArIDEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gTWF0aC5tYXgodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCAtIDEsIC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbih0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICAgIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghdGFyZ2V0LmNsb3Nlc3QoJy5zcy1jb250YWluZXInKSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBGb3JtID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNpbXBsZVF1ZXJ5LnNldFZhbHVlKFxuICAgICAgICAgICAgdGhpcy5jb25maWcucSB8fCB0aGlzLmNvbmZpZy5hZHZhbmNlZFNlYXJjaFF1ZXJ5Um93c1swXT8ucXVlcnkgfHwgJycsXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuc2hvdygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhpZGVTdWdnZXN0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IC0xO1xuICAgIH07XG59XG4iLCI8ZGl2IGNsYXNzPVwic3MtY29udGFpbmVyXCI+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJzZWFyY2hGb3JtXCIgKHN1Ym1pdCk9XCJlbWl0U2ltcGxlU2VhcmNoKClcIiBkYXRhLXRlc3RpZD1cInNlYXJjaEZvcm1cIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwic2VhcmNoSW5wdXRcIlxuICAgICAgICAgICAgaWQ9XCJxXCJcbiAgICAgICAgICAgIG5hbWU9XCJxXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwic2VhcmNoIGlucHV0XCJcbiAgICAgICAgICAgIGF1dG9jYXBpdGFsaXplPVwib2ZmXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNpbXBsZVF1ZXJ5XCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJGaWxsIG91dCB0aGlzIGZpZWxkXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2Fib3ZlJ1wiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIHNpbXBsZVF1ZXJ5LmludmFsaWRcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJxXCIgZGF0YS10ZXN0aWQ9XCJsYWJlbFwiPnt7XG4gICAgICAgICAgICBjb25maWcuc2NvcGUgPT09ICdsb2NhbCdcbiAgICAgICAgICAgICAgICA/ICdCb29rcywgbWVkaWEsIHNwZWNpYWwgY29sbGVjdGlvbnMgYW5kIG1vcmUnXG4gICAgICAgICAgICAgICAgOiAnRWJvb2tzLCBhcnRpY2xlcywgam91cm5hbHMsIGRhdGFiYXNlcywgc3RyZWFtaW5nIG1lZGlhIGFuZCBtb3JlJ1xuICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cInNlYXJjaFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInNlYXJjaEJ0blwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGVuc2lnbjogY29uZmlnLmluc3RpdHV0aW9uID09PSAnZW5zaWduJyB9XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNzLWljb25cIj4gc2VhcmNoIDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9mb3JtPlxuXG4gICAgQGlmIChzaW1wbGVRdWVyeS52YWx1ZSkge1xuICAgICAgICA8YnV0dG9uIGlkPVwiY2xlYXJcIiAoY2xpY2spPVwiY2xlYXJRdWVyeSgpXCIgZGF0YS10ZXN0aWQ9XCJjbGVhckJ0blwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNzLWljb25cIj4gY2FuY2VsIDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgQGlmIChzaG93U3VnZ2VzdGlvbnMgJiYgc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICA8dWwgY2xhc3M9XCJzdWdnZXN0aW9ucy1saXN0XCIgcm9sZT1cImxpc3Rib3hcIiBkYXRhLXRlc3RpZD1cInN1Z2dlc3Rpb25zTGlzdFwiPlxuICAgICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBzdWdnZXN0aW9uczsgdHJhY2sgc3VnZ2VzdGlvbjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9uLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaSA9PT0gc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24pOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImkgPT09IHNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJzdWdnZXN0aW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBzdWdnZXN0aW9uIH19XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc3Mtc2VhcmNoLWJhci9zaW1wbGUtc2VhcmNoL3NpbXBsZS1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvc2ltcGxlLXNlYXJjaC9zaW1wbGUtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBRVosTUFBTSxFQUNOLFlBQVksR0FDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFlLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBVy9DLE1BQU0sT0FBTyxxQkFBcUI7SUFQbEM7UUFRcUIsT0FBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QixPQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBT2pDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FB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LFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBpbmplY3QsXG4gICAgSG9zdExpc3RlbmVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFRvb2x0aXAsIE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3RhcnRXaXRoLCBmaWx0ZXIsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU2VhcmNoQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL3NlYXJjaC1jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgU2VhcmNoU2NvcGUgfSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLXNjb3BlLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItc3Mtc2ltcGxlLXNlYXJjaCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTWF0VG9vbHRpcE1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2ltcGxlLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2ltcGxlLXNlYXJjaC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTaW1wbGVTZWFyY2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGRyZW4oJ3N1Z2dlc3Rpb25JdGVtJykgcHJpdmF0ZSBzdWdnZXN0aW9uSXRlbXMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gICAgLy8gVGhlIHRvb2x0aXAgaXMgZGlzYWJsZWQgaW4gdGhlIHRlbXBsYXRlLlxuICAgIC8vIEl0IGlzIGVuYWJsZWQgYW5kIGRpc3BsYXllZCBpZiBhIHVzZXIgc2VhcmNoZXMgYWdhaW5zdCBhbiBlbXB0eSBxdWVyeSAoc2ltcGxlIG9yIHExKS5cbiAgICAvLyBBbnkgY2hhbmdlIHRvIHRoZSBzZWFyY2ggZmllbGQgZGlzYWJsZXMgdGhlIHRvb2x0aXAuXG4gICAgQFZpZXdDaGlsZChNYXRUb29sdGlwKSBwcml2YXRlIGlucHV0VG9vbHRpcCE6IE1hdFRvb2x0aXA7XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgcHJpdmF0ZSBfY29uZmlnITogU2VhcmNoQ29uZmlnO1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNldCBjb25maWcoY29uZmlnOiBTZWFyY2hDb25maWcpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNldHVwRm9ybSgpO1xuICAgIH1cbiAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICAgIH1cbiAgICBASW5wdXQoKSBzdXBwb3J0ZWRTdWdnZXN0aW9uU2NvcGVzOiBTZWFyY2hTY29wZVtdID0gW107XG4gICAgQElucHV0KCkgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgQE91dHB1dCgpIHNpbXBsZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VhcmNoQ29uZmlnPigpO1xuICAgIEBPdXRwdXQoKSBjbGVhclNpbXBsZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgc3VnZ2VzdCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VhcmNoQ29uZmlnPigpO1xuICAgIHByb3RlY3RlZCBpc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBzaG93U3VnZ2VzdGlvbnMgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSAtMTtcbiAgICBwcm90ZWN0ZWQgZXhwYW5kZWRTdWdnZXN0aW9ucyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIHByaXZhdGUgc2tpcE5leHRTdWdnZXN0ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHNlYXJjaEZvcm0gPSB0aGlzLmZiLm5vbk51bGxhYmxlLmdyb3VwKHtcbiAgICAgICAgc2ltcGxlUXVlcnk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgfSk7XG5cbiAgICBnZXQgc2ltcGxlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdzaW1wbGVRdWVyeScpIGFzIEZvcm1Db250cm9sO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBFbnN1cmUgdmFsaWRhdGlvbiB0b29sdGlwIGNsb3NlcyB3aGVuIHVzZXMgZW50ZXJzIGEgcXVlcnlcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5zaW1wbGVRdWVyeS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShzdGFydFdpdGgoJycpKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhIXRoaXMuaW5wdXRUb29sdGlwKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0VG9vbHRpcC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRW1pdCBzdWdnZXN0aW9uIHJlcXVlc3RzIHdpdGggZGVib3VuY2VcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5zaW1wbGVRdWVyeS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMjAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHN1Z2dlc3QgZm9yIHN1cHBvcnRlZCBzY29wZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRlZFN1Z2dlc3Rpb25TY29wZXMuaW5jbHVkZXModGhpcy5jb25maWcuc2NvcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2tpcE5leHRTdWdnZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBOZXh0U3VnZ2VzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VnZ2VzdC5lbWl0KHsgLi4udGhpcy5jb25maWcsIHE6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dTdWdnZXN0aW9ucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZW1pdFNpbXBsZVNlYXJjaCA9IChpc1N1Z2dlc3Rpb246IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gRG9uJ3QgcGVyZm9ybSBhIHNlYXJjaCB1bmxlc3MgdGhlcmUgaXMgYSBxdWVyeVxuICAgICAgICBpZiAodGhpcy5zaW1wbGVRdWVyeS5pbnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dTZWFyY2hWYWxpZGF0aW9uVG9vbFRpcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zKCk7XG4gICAgICAgIHRoaXMuc2ltcGxlU2VhcmNoLmVtaXQoe1xuICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICBxOiB0aGlzLnNpbXBsZVF1ZXJ5LnZhbHVlLFxuICAgICAgICAgICAgaXNTdWdnZXN0aW9uOiBpc1N1Z2dlc3Rpb24sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBjbGVhclF1ZXJ5ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNpbXBsZVF1ZXJ5LnNldFZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy5jbGVhclNpbXBsZVNlYXJjaC5lbWl0KCk7XG4gICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zKCk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBzZWxlY3RTdWdnZXN0aW9uID0gKHN1Z2dlc3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLnNraXBOZXh0U3VnZ2VzdCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2ltcGxlUXVlcnkuc2V0VmFsdWUoc3VnZ2VzdGlvbik7XG4gICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zKCk7XG4gICAgICAgIHRoaXMuZW1pdFNpbXBsZVNlYXJjaCh0cnVlKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIHRvZ2dsZUV4cGFuZCA9IChpbmRleDogbnVtYmVyLCBldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmV4cGFuZGVkU3VnZ2VzdGlvbnMuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZFN1Z2dlc3Rpb25zLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkU3VnZ2VzdGlvbnMuYWRkKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgb25JbnB1dEtleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dTdWdnZXN0aW9ucyB8fCB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggKyAxLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IE1hdGgubWF4KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggLSAxLCAtMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24odGhpcy5zdWdnZXN0aW9uc1t0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIXRhcmdldC5jbG9zZXN0KCcuc3MtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcsIFsnJGV2ZW50J10pXG4gICAgb25Gb2N1c091dChldmVudDogRm9jdXNFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuZWwubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUb29sdGlwPy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwRm9ybSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zaW1wbGVRdWVyeS5zZXRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnEgfHwgdGhpcy5jb25maWcuYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3NbMF0/LnF1ZXJ5IHx8ICcnLFxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnN1Z2dlc3Rpb25JdGVtcy50b0FycmF5KClbdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleF07XG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuc2hvdygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhpZGVTdWdnZXN0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IC0xO1xuICAgICAgICB0aGlzLmV4cGFuZGVkU3VnZ2VzdGlvbnMuY2xlYXIoKTtcbiAgICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cInNzLWNvbnRhaW5lclwiPlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2VhcmNoRm9ybVwiIChzdWJtaXQpPVwiZW1pdFNpbXBsZVNlYXJjaCgpXCIgZGF0YS10ZXN0aWQ9XCJzZWFyY2hGb3JtXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInNlYXJjaElucHV0XCJcbiAgICAgICAgICAgIGlkPVwicVwiXG4gICAgICAgICAgICBuYW1lPVwicVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJzZWFyY2ggaW5wdXRcIlxuICAgICAgICAgICAgYXV0b2NhcGl0YWxpemU9XCJvZmZcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2ltcGxlUXVlcnlcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkZpbGwgb3V0IHRoaXMgZmllbGRcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaXNTdWJtaXR0ZWQgJiYgc2ltcGxlUXVlcnkuaW52YWxpZFwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGxhYmVsIGZvcj1cInFcIiBkYXRhLXRlc3RpZD1cImxhYmVsXCI+e3tcbiAgICAgICAgICAgIGNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJ1xuICAgICAgICAgICAgICAgID8gJ0Jvb2tzLCBtZWRpYSwgc3BlY2lhbCBjb2xsZWN0aW9ucyBhbmQgbW9yZSdcbiAgICAgICAgICAgICAgICA6ICdFYm9va3MsIGFydGljbGVzLCBqb3VybmFscywgZGF0YWJhc2VzLCBzdHJlYW1pbmcgbWVkaWEgYW5kIG1vcmUnXG4gICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwic2VhcmNoXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwic2VhcmNoQnRuXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZW5zaWduOiBjb25maWcuaW5zdGl0dXRpb24gPT09ICdlbnNpZ24nIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgc3MtaWNvblwiPiBzZWFyY2ggPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Zvcm0+XG5cbiAgICBAaWYgKHNpbXBsZVF1ZXJ5LnZhbHVlKSB7XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbGVhclwiIChjbGljayk9XCJjbGVhclF1ZXJ5KClcIiBkYXRhLXRlc3RpZD1cImNsZWFyQnRuXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgc3MtaWNvblwiPiBjYW5jZWwgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICBAaWYgKHNob3dTdWdnZXN0aW9ucyAmJiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIDx1bCBjbGFzcz1cInN1Z2dlc3Rpb25zLWxpc3RcIiByb2xlPVwibGlzdGJveFwiIGRhdGEtdGVzdGlkPVwic3VnZ2VzdGlvbnNMaXN0XCI+XG4gICAgICAgICAgICBAZm9yIChzdWdnZXN0aW9uIG9mIHN1Z2dlc3Rpb25zOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICNzdWdnZXN0aW9uSXRlbVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN1Z2dlc3Rpb24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpID09PSBzZWxlY3RlZFN1Z2dlc3Rpb25JbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbik7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaSA9PT0gc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInN1Z2dlc3Rpb25JdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VnZ2VzdGlvbi10ZXh0XCIgW3RpdGxlXT1cInN1Z2dlc3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRTdWdnZXN0aW9ucy5oYXMoaSkgfHwgc3VnZ2VzdGlvbi5sZW5ndGggPD0gNTAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3VnZ2VzdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzdWdnZXN0aW9uIHwgc2xpY2U6IDAgOiA1MDApICsgJy4uLidcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzdWdnZXN0aW9uLmxlbmd0aCA+IDUwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhwYW5kLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZChpLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFN1Z2dlc3Rpb25zLmhhcyhpKSA/ICdDb2xsYXBzZScgOiAnRXhwYW5kIHN1Z2dlc3Rpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXhwYW5kZWRTdWdnZXN0aW9ucy5oYXMoaSkgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cbiAgICB9XG48L2Rpdj5cbiJdfQ==