@seniorsistemas/angular-components 19.9.4 → 19.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/autocomplete/README.md +4 -0
- package/autocomplete/lib/autocomplete/autocomplete.component.d.ts +7 -1
- package/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +3 -1
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +10 -4
- package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +5 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +2 -2
- package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
- package/esm2022/insights/lib/insights/components/insights-card/insights-card.component.mjs +21 -3
- package/esm2022/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.mjs +14 -3
- package/esm2022/insights/lib/insights/insights.component.mjs +15 -4
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +2 -2
- package/esm2022/rating-scale/lib/rating-scale/models/rating-scale-node.mjs +1 -1
- package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +23 -3
- package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +5 -3
- package/esm2022/select/lib/select/select.component.mjs +6 -4
- package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +7 -3
- package/esm2022/split-button/lib/split-button/split-button.component.mjs +11 -3
- package/esm2022/table/lib/table/table-column/table-columns.component.mjs +1 -1
- package/esm2022/text-area/lib/text-area/text-area.component.mjs +1 -1
- package/esm2022/token-list/lib/token-list/token-list.component.mjs +7 -3
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +13 -5
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-insights.mjs +47 -7
- package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +22 -2
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +9 -5
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +6 -2
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs +10 -2
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs +6 -2
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
- package/insights/README.md +12 -0
- package/insights/lib/insights/components/insights-card/insights-card.component.d.ts +22 -1
- package/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.d.ts +9 -1
- package/insights/lib/insights/insights.component.d.ts +9 -1
- package/package.json +7 -7
- package/rating-scale/README.md +38 -13
- package/rating-scale/lib/rating-scale/models/rating-scale-node.d.ts +8 -0
- package/rating-scale/lib/rating-scale/rating-scale.component.d.ts +4 -1
- package/select/README.md +2 -0
- package/select/lib/select/components/select-option/select-option.component.d.ts +3 -1
- package/select/lib/select/select.component.d.ts +3 -1
- package/speech-recognition/README.md +1 -0
- package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +3 -1
- package/split-button/README.md +2 -0
- package/split-button/lib/split-button/split-button.component.d.ts +5 -1
- package/token-list/lib/token-list/token-list.component.d.ts +3 -1
package/autocomplete/README.md
CHANGED
|
@@ -54,6 +54,8 @@ export class MeuComponent {}
|
|
|
54
54
|
| `multiple` | `boolean` | `false` | não | Habilita seleção de múltiplos itens como chips |
|
|
55
55
|
| `dropdown` | `boolean` | `false` | não | Exibe botão de seta para abrir a lista sem digitar |
|
|
56
56
|
| `checkmark` | `boolean` | `false` | não | Exibe ícone de check na opção selecionada |
|
|
57
|
+
| `clearIconClass` | `string` | `'far fa-times'` | não | Classe do ícone do botão de limpar o valor do campo |
|
|
58
|
+
| `checkIconClass` | `string` | `'far fa-check'` | não | Classe do ícone de checkmark exibido ao lado da opção selecionada (com `checkmark` e `multiple`) |
|
|
57
59
|
| `lazy` | `boolean` | `false` | não | Ativa carregamento assíncrono via output `lazyLoad` |
|
|
58
60
|
| `virtualScroll` | `boolean` | `false` | não | Virtualiza a lista para melhor performance |
|
|
59
61
|
| `virtualScrollItemSize` | `number` | `37` | não | Altura em pixels de cada item no virtual scroll |
|
|
@@ -118,6 +120,8 @@ filtrar(event: { query: string }) {
|
|
|
118
120
|
</s-autocomplete>
|
|
119
121
|
```
|
|
120
122
|
|
|
123
|
+
No modo múltiplo, cada item selecionado é exibido como um chip (`AutocompleteChipComponent`, interno) com um botão de remover. O ícone desse botão pode ser customizado através do input `removeIconClass` (`string`, padrão `'far fa-times'`) do próprio `AutocompleteChipComponent`.
|
|
124
|
+
|
|
121
125
|
### Lazy loading (dados de API)
|
|
122
126
|
|
|
123
127
|
```html
|
|
@@ -62,6 +62,12 @@ export declare class AutocompleteComponent<T> implements ControlValueAccessor {
|
|
|
62
62
|
forceSelection: import("@angular/core").InputSignal<boolean>;
|
|
63
63
|
/** @description Exibe ícone de checkmark ao lado da opção selecionada no dropdown. @default false */
|
|
64
64
|
checkmark: import("@angular/core").InputSignal<boolean>;
|
|
65
|
+
/** @description Classe do ícone do botão de limpar o valor do campo. @default 'far fa-times' */
|
|
66
|
+
clearIconClass: import("@angular/core").InputSignal<string>;
|
|
67
|
+
/** @description Classe do ícone de checkmark exibido ao lado da opção selecionada no dropdown. @default 'far fa-check' */
|
|
68
|
+
checkIconClass: import("@angular/core").InputSignal<string>;
|
|
69
|
+
/** @description Classe do ícone do botão de remover chip, exibido no modo `multiple`. @default 'far fa-times' */
|
|
70
|
+
removeIconClass: import("@angular/core").InputSignal<string>;
|
|
65
71
|
/** @description Habilita seleção de múltiplos itens exibidos como chips no campo. @default false */
|
|
66
72
|
multiple: import("@angular/core").InputSignal<boolean>;
|
|
67
73
|
/** @description Quantidade mínima de caracteres necessária para acionar a busca por sugestões. @default 1 */
|
|
@@ -297,6 +303,6 @@ export declare class AutocompleteComponent<T> implements ControlValueAccessor {
|
|
|
297
303
|
*/
|
|
298
304
|
private _validateInputs;
|
|
299
305
|
static ɵfac: i0.ɵɵFactoryDeclaration<AutocompleteComponent<any>, never>;
|
|
300
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteComponent<any>, "s-autocomplete", never, { "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "suggestionValue": { "alias": "suggestionValue"; "required": false; "isSignal": true; }; "suggestionLabel": { "alias": "suggestionLabel"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "dropdown": { "alias": "dropdown"; "required": false; "isSignal": true; }; "forceSelection": { "alias": "forceSelection"; "required": false; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "minLengthToSearch": { "alias": "minLengthToSearch"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; "dataKey": { "alias": "dataKey"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "values": "valuesChange"; "disabled": "disabledChange"; "lazyLoad": "lazyLoad"; "selected": "selected"; "unselected": "unselected"; "blurred": "blurred"; "cleared": "cleared"; "keyUp": "keyUp"; "focused": "focused"; "completeMethod": "completeMethod"; }, never, never, true, never>;
|
|
306
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteComponent<any>, "s-autocomplete", never, { "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "suggestionValue": { "alias": "suggestionValue"; "required": false; "isSignal": true; }; "suggestionLabel": { "alias": "suggestionLabel"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "dropdown": { "alias": "dropdown"; "required": false; "isSignal": true; }; "forceSelection": { "alias": "forceSelection"; "required": false; "isSignal": true; }; "checkmark": { "alias": "checkmark"; "required": false; "isSignal": true; }; "clearIconClass": { "alias": "clearIconClass"; "required": false; "isSignal": true; }; "checkIconClass": { "alias": "checkIconClass"; "required": false; "isSignal": true; }; "removeIconClass": { "alias": "removeIconClass"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "minLengthToSearch": { "alias": "minLengthToSearch"; "required": false; "isSignal": true; }; "inputClass": { "alias": "inputClass"; "required": false; "isSignal": true; }; "dataKey": { "alias": "dataKey"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "values": "valuesChange"; "disabled": "disabledChange"; "lazyLoad": "lazyLoad"; "selected": "selected"; "unselected": "unselected"; "blurred": "blurred"; "cleared": "cleared"; "keyUp": "keyUp"; "focused": "focused"; "completeMethod": "completeMethod"; }, never, never, true, never>;
|
|
301
307
|
}
|
|
302
308
|
export {};
|
package/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts
CHANGED
|
@@ -2,8 +2,10 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
export declare class AutocompleteChipComponent<T> {
|
|
3
3
|
suggestion: import("@angular/core").InputSignal<T>;
|
|
4
4
|
suggestionLabel: import("@angular/core").InputSignal<keyof T | undefined>;
|
|
5
|
+
/** @description Classe do ícone do botão de remover o chip. @default 'far fa-times' */
|
|
6
|
+
removeIconClass: import("@angular/core").InputSignal<string>;
|
|
5
7
|
suggestionRemoved: import("@angular/core").OutputEmitterRef<T>;
|
|
6
8
|
removeSuggestion(): void;
|
|
7
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<AutocompleteChipComponent<any>, never>;
|
|
8
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteChipComponent<any>, "s-autocomplete-chip", never, { "suggestion": { "alias": "suggestion"; "required": true; "isSignal": true; }; "suggestionLabel": { "alias": "suggestionLabel"; "required": false; "isSignal": true; }; }, { "suggestionRemoved": "suggestionRemoved"; }, never, never, true, never>;
|
|
10
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AutocompleteChipComponent<any>, "s-autocomplete-chip", never, { "suggestion": { "alias": "suggestion"; "required": true; "isSignal": true; }; "suggestionLabel": { "alias": "suggestionLabel"; "required": false; "isSignal": true; }; "removeIconClass": { "alias": "removeIconClass"; "required": false; "isSignal": true; }; }, { "suggestionRemoved": "suggestionRemoved"; }, never, never, true, never>;
|
|
9
11
|
}
|
|
@@ -63,6 +63,12 @@ export class AutocompleteComponent {
|
|
|
63
63
|
forceSelection = input(false);
|
|
64
64
|
/** @description Exibe ícone de checkmark ao lado da opção selecionada no dropdown. @default false */
|
|
65
65
|
checkmark = input(false);
|
|
66
|
+
/** @description Classe do ícone do botão de limpar o valor do campo. @default 'far fa-times' */
|
|
67
|
+
clearIconClass = input('far fa-times');
|
|
68
|
+
/** @description Classe do ícone de checkmark exibido ao lado da opção selecionada no dropdown. @default 'far fa-check' */
|
|
69
|
+
checkIconClass = input('far fa-check');
|
|
70
|
+
/** @description Classe do ícone do botão de remover chip, exibido no modo `multiple`. @default 'far fa-times' */
|
|
71
|
+
removeIconClass = input('far fa-times');
|
|
66
72
|
/** @description Habilita seleção de múltiplos itens exibidos como chips no campo. @default false */
|
|
67
73
|
multiple = input(false);
|
|
68
74
|
/** @description Quantidade mínima de caracteres necessária para acionar a busca por sugestões. @default 1 */
|
|
@@ -574,13 +580,13 @@ export class AutocompleteComponent {
|
|
|
574
580
|
}
|
|
575
581
|
}
|
|
576
582
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
577
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "s-autocomplete", inputs: { suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, suggestionValue: { classPropertyName: "suggestionValue", publicName: "suggestionValue", isSignal: true, isRequired: false, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, dropdown: { classPropertyName: "dropdown", publicName: "dropdown", isSignal: true, isRequired: false, transformFunction: null }, forceSelection: { classPropertyName: "forceSelection", publicName: "forceSelection", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, minLengthToSearch: { classPropertyName: "minLengthToSearch", publicName: "minLengthToSearch", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange", disabled: "disabledChange", lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen()", "attr.aria-haspopup": "\"listbox\"", "attr.aria-owns": "isOpen() ? \"dropdown-container-\" + componentId : null" } }, providers: [
|
|
583
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "s-autocomplete", inputs: { suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, suggestionValue: { classPropertyName: "suggestionValue", publicName: "suggestionValue", isSignal: true, isRequired: false, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, dropdown: { classPropertyName: "dropdown", publicName: "dropdown", isSignal: true, isRequired: false, transformFunction: null }, forceSelection: { classPropertyName: "forceSelection", publicName: "forceSelection", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, clearIconClass: { classPropertyName: "clearIconClass", publicName: "clearIconClass", isSignal: true, isRequired: false, transformFunction: null }, checkIconClass: { classPropertyName: "checkIconClass", publicName: "checkIconClass", isSignal: true, isRequired: false, transformFunction: null }, removeIconClass: { classPropertyName: "removeIconClass", publicName: "removeIconClass", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, minLengthToSearch: { classPropertyName: "minLengthToSearch", publicName: "minLengthToSearch", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange", disabled: "disabledChange", lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen()", "attr.aria-haspopup": "\"listbox\"", "attr.aria-owns": "isOpen() ? \"dropdown-container-\" + componentId : null" } }, providers: [
|
|
578
584
|
{
|
|
579
585
|
provide: NG_VALUE_ACCESSOR,
|
|
580
586
|
useExisting: forwardRef(() => AutocompleteComponent),
|
|
581
587
|
multi: true,
|
|
582
588
|
},
|
|
583
|
-
], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-xsmall flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "component", type: AutocompleteChipComponent, selector: "s-autocomplete-chip", inputs: ["suggestion", "suggestionLabel"], outputs: ["suggestionRemoved"] }] });
|
|
589
|
+
], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n [removeIconClass]=\"removeIconClass()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i\n class=\"text-grayscale-60\"\n [class]=\"clearIconClass()\"\n ></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-xsmall flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i [class]=\"checkIconClass()\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "component", type: AutocompleteChipComponent, selector: "s-autocomplete-chip", inputs: ["suggestion", "suggestionLabel", "removeIconClass"], outputs: ["suggestionRemoved"] }] });
|
|
584
590
|
}
|
|
585
591
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, decorators: [{
|
|
586
592
|
type: Component,
|
|
@@ -604,6 +610,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
604
610
|
'[attr.aria-haspopup]': '"listbox"',
|
|
605
611
|
'[attr.aria-owns]': 'isOpen() ? "dropdown-container-" + componentId : null',
|
|
606
612
|
'(window:resize)': 'onWindowResize()',
|
|
607
|
-
}, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i
|
|
613
|
+
}, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n [removeIconClass]=\"removeIconClass()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i\n class=\"text-grayscale-60\"\n [class]=\"clearIconClass()\"\n ></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-xsmall flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i [class]=\"checkIconClass()\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n\n" }]
|
|
608
614
|
}], ctorParameters: () => [] });
|
|
609
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFFVixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7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LGVBQWUsNEZBQ2YseUJBQXlCOzs0RkFpQnBCLHFCQUFxQjtrQkE1QmpDLFNBQVM7K0JBQ0ksZ0JBQWdCLGNBQ2QsSUFBSSxXQUVQO3dCQUNMLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixlQUFlO3dCQUNmLHlCQUF5QjtxQkFDNUIsYUFDVTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzs0QkFDcEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osUUFDSzt3QkFDRixJQUFJLEVBQUUsVUFBVTt3QkFDaEIsc0JBQXNCLEVBQUUsVUFBVTt3QkFDbEMsc0JBQXNCLEVBQUUsV0FBVzt3QkFDbkMsa0JBQWtCLEVBQUUsdURBQXVEO3dCQUMzRSxpQkFBaUIsRUFBRSxrQkFBa0I7cUJBQ3hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBjb21wdXRlZCxcclxuICAgIERlc3Ryb3lSZWYsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIGluamVjdCxcclxuICAgIGlucHV0LFxyXG4gICAgbW9kZWwsXHJcbiAgICBvdXRwdXQsXHJcbiAgICBzaWduYWwsXHJcbiAgICB2aWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRvY29tcGxldGUtY2hpcC9hdXRvY29tcGxldGUtY2hpcC5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudGEgdW0gaXRlbSBkZSBzdWdlc3TDo28gZW5jYXBzdWxhZG8sIHV0aWxpemFkbyBlbSBjb21wb25lbnRlcyBkZSBhdXRvY29tcGxldGUuXHJcbiAqIEB0ZW1wbGF0ZSBUIFRpcG8gZG9zIGRhZG9zIGFzc29jaWFkb3Mgw6Agc3VnZXN0w6NvLlxyXG4gKiBAcHJvcGVydHkgZGF0YSBPcyBkYWRvcyBkYSBzdWdlc3TDo28uXHJcbiAqIEBwcm9wZXJ0eSBpZCBJZGVudGlmaWNhZG9yIMO6bmljbyBkYSBzdWdlc3TDo28uXHJcbiAqIEBwcm9wZXJ0eSBbaXNTZWxlY3RlZF0gSW5kaWNhIHNlIGEgc3VnZXN0w6NvIGVzdMOhIHNlbGVjaW9uYWRhLlxyXG4gKi9cclxuaW50ZXJmYWNlIFN1Z2dlc3Rpb25XcmFwcGVyPFQ+IHtcclxuICAgIGRhdGE6IFQ7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBhdXRvY29tcGxldGFyIGNvbSBzdWdlc3TDtWVzIGRpbsOibWljYXMsIHN1cG9ydGFuZG8gc2VsZcOnw6NvIHNpbXBsZXNcclxuICogZSBtw7psdGlwbGEuIEltcGxlbWVudGEge0BsaW5rIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBwYXJhIGludGVncmHDp8OjbyBjb20gZm9ybXVsw6FyaW9zIEFuZ3VsYXIuXHJcbiAqIE9mZXJlY2UgY2FycmVnYW1lbnRvIGxhenkgZGUgc3VnZXN0w7VlcyB2aWEgb3V0cHV0IGBsYXp5TG9hZGAsIHZpcnR1YWxpemHDp8OjbyBkZSBsaXN0YSxcclxuICogc2VsZcOnw6NvIGNvbSBjaGlwcyBubyBtb2RvIG3Dumx0aXBsbyBlIGFjZXNzaWJpbGlkYWRlIEFSSUEgY29tcGxldGEgKGNvbWJvYm94IHJvbGUpLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxzLWF1dG9jb21wbGV0ZVxyXG4gKiAgIGZvcm1Db250cm9sTmFtZT1cImNpZGFkZVwiXHJcbiAqICAgcGxhY2Vob2xkZXI9XCJCdXNjYXIgY2lkYWRlLi4uXCJcclxuICogICBbc3VnZ2VzdGlvbnNdPVwiY2lkYWRlc1wiXHJcbiAqICAgc3VnZ2VzdGlvbkxhYmVsPVwibm9tZVwiXHJcbiAqICAgW2RlbGF5XT1cIjQwMFwiXHJcbiAqICAgKGNvbXBsZXRlTWV0aG9kKT1cImJ1c2NhcigkZXZlbnQpXCIgLz5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBjYXRlZ29yeSBJbnB1dHNcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzLWF1dG9jb21wbGV0ZScsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcclxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXHJcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxyXG4gICAgICAgIEF1dG9jb21wbGV0ZUNoaXBDb21wb25lbnQsXHJcbiAgICBdLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXV0b2NvbXBsZXRlQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgIF0sXHJcbiAgICBob3N0OiB7XHJcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcclxuICAgICAgICAnW2F0dHIuYXJpYS1leHBhbmRlZF0nOiAnaXNPcGVuKCknLFxyXG4gICAgICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdcImxpc3Rib3hcIicsXHJcbiAgICAgICAgJ1thdHRyLmFyaWEtb3duc10nOiAnaXNPcGVuKCkgPyBcImRyb3Bkb3duLWNvbnRhaW5lci1cIiArIGNvbXBvbmVudElkIDogbnVsbCcsXHJcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgpJyxcclxuICAgIH0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRvY29tcGxldGVDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGlzdGEgZXN0w6F0aWNhIGRlIHN1Z2VzdMO1ZXMgZXhpYmlkYXMgbm8gZHJvcGRvd24uIE5vIG1vZG8gbGF6eSwgcHJlZmlyYSB1c2FyIG8gb3V0cHV0IGBsYXp5TG9hZGAuIEBkZWZhdWx0IFtdICovXHJcbiAgICBwdWJsaWMgc3VnZ2VzdGlvbnMgPSBpbnB1dDxUW10+KFtdKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIFRleHRvIGV4aWJpZG8gbm8gaW5wdXQgcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby4gKi9cclxuICAgIHB1YmxpYyBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBzdWdlc3TDo28gY3VqbyB2YWxvciBzZXLDoSBlbWl0aWRvIGFvIGZvcm11bMOhcmlvLiAqL1xyXG4gICAgcHVibGljIHN1Z2dlc3Rpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgc3VnZXN0w6NvIHVzYWRhIGNvbW8gdGV4dG8gZGUgZXhpYmnDp8OjbyBubyBkcm9wZG93bi4gKi9cclxuICAgIHB1YmxpYyBzdWdnZXN0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVG9ybmEgbyBjYW1wbyBzb21lbnRlIGxlaXR1cmEsIGltcGVkaW5kbyBkaWdpdGHDp8OjbyBlIHNlbGXDp8Ojby4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGV4aWJpZGEgbm8gZHJvcGRvd24gcXVhbmRvIG5lbmh1bWEgc3VnZXN0w6NvIMOpIGVuY29udHJhZGEuICovXHJcbiAgICBwdWJsaWMgZW1wdHlNZXNzYWdlID0gaW5wdXQ8c3RyaW5nPigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVGVtcG8gZGUgZXNwZXJhIGVtIG1zIGFww7NzIGEgw7psdGltYSB0ZWNsYSBhbnRlcyBkZSBhY2lvbmFyIGEgYnVzY2EgcG9yIHN1Z2VzdMO1ZXMuIEBkZWZhdWx0IDMwMCAqL1xyXG4gICAgcHVibGljIGRlbGF5ID0gaW5wdXQoMzAwKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIGVzdGFkbyBkZSBlcnJvIHZpc3VhbCBubyBjYW1wbyBkZSBpbnB1dC4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBpbnZhbGlkID0gaW5wdXQoZmFsc2UpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdmlydHVhbGl6YcOnw6NvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgcGFyYSBtZWxob3IgcGVyZm9ybWFuY2UgY29tIGdyYW5kZXMgdm9sdW1lcyBkZSBkYWRvcy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsID0gaW5wdXQoZmFsc2UpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gQWx0dXJhIGZpeGEgZW0gcGl4ZWxzIGRlIGNhZGEgaXRlbSBubyB2aXJ0dWFsIHNjcm9sbC4gQGRlZmF1bHQgMzcgKi9cclxuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSBpbnB1dCgzNyk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBBdGl2YSBvIGNhcnJlZ2FtZW50byBhc3PDrW5jcm9ubyBkZSBzdWdlc3TDtWVzIHZpYSBvIG91dHB1dCBgbGF6eUxvYWRgLiBAZGVmYXVsdCBmYWxzZSAqL1xyXG4gICAgcHVibGljIGxhenkgPSBpbnB1dChmYWxzZSk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSBib3TDo28gZGUgZHJvcGRvd24gcGFyYSBhYnJpciBhIGxpc3RhIHNlbSBuZWNlc3NpZGFkZSBkZSBkaWdpdGHDp8Ojby4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBkcm9wZG93biA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIG8gdmFsb3IgZG8gY2FtcG8gZGV2ZSBzZXIgb2JyaWdhdG9yaWFtZW50ZSB1bWEgZGFzIG9ww6fDtWVzIHN1Z2VyaWRhcy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBmb3JjZVNlbGVjdGlvbiA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIMOtY29uZSBkZSBjaGVja21hcmsgYW8gbGFkbyBkYSBvcMOnw6NvIHNlbGVjaW9uYWRhIG5vIGRyb3Bkb3duLiBAZGVmYXVsdCBmYWxzZSAqL1xyXG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHNlbGXDp8OjbyBkZSBtw7psdGlwbG9zIGl0ZW5zIGV4aWJpZG9zIGNvbW8gY2hpcHMgbm8gY2FtcG8uIEBkZWZhdWx0IGZhbHNlICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBRdWFudGlkYWRlIG3DrW5pbWEgZGUgY2FyYWN0ZXJlcyBuZWNlc3PDoXJpYSBwYXJhIGFjaW9uYXIgYSBidXNjYSBwb3Igc3VnZXN0w7Vlcy4gQGRlZmF1bHQgMSAqL1xyXG4gICAgcHVibGljIG1pbkxlbmd0aFRvU2VhcmNoID0gaW5wdXQoMSk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDbGFzc2UgQ1NTIGFkaWNpb25hbCBhcGxpY2FkYSBhbyBlbGVtZW50byBgPGlucHV0PmAgaW50ZXJuby4gQGRlZmF1bHQgJycgKi9cclxuICAgIHB1YmxpYyBpbnB1dENsYXNzID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gdXNhZGEgcGFyYSBjb21wYXJhw6fDo28gZGUgaWRlbnRpZGFkZSBlbnRyZSBvcMOnw7VlcywgZXZpdGFuZG8gZHVwbGljYXRhcyBuYSBzZWxlw6fDo28gbcO6bHRpcGxhLiAqL1xyXG4gICAgcHVibGljIGRhdGFLZXkgPSBpbnB1dDxrZXlvZiBUPigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVmFsb3IgYXR1YWxtZW50ZSBzZWxlY2lvbmFkbyBubyBtb2RvIHNpbXBsZXMsIHZpYSB0d28td2F5IGJpbmRpbmcuICovXHJcbiAgICBwdWJsaWMgdmFsdWUgPSBtb2RlbDxUIHwgbnVsbD4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zIG5vIG1vZG8gbcO6bHRpcGxvLCB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBbXSAqL1xyXG4gICAgcHVibGljIHZhbHVlcyA9IG1vZGVsPFRbXT4oW10pO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgbyBlc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUgdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIG5vIG1vZG8gbGF6eSBxdWFuZG8gbyB1c3XDoXJpbyBkaWdpdGEgZSBvIGNvbXBvbmVudGUgZXN0w6EgcHJvbnRvIHBhcmEgcmVjZWJlciBub3ZhcyBzdWdlc3TDtWVzLlxyXG4gICAgICogTyBldmVudG8gY29udMOpbSBgcXVlcnlgICh0ZXh0byBkaWdpdGFkbykgZSBgcmVzcG9uc2VgIChmdW7Dp8OjbyBjYWxsYmFjayBwYXJhIGZvcm5lY2VyIG9zIGRhZG9zKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxhenlMb2FkID0gb3V0cHV0PHsgcXVlcnk6IHN0cmluZzsgcmVzcG9uc2U6IChkYXRhOiBUW10pID0+IHZvaWQgfT4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gc2VsZWNpb25hIHVtYSBzdWdlc3TDo28gZG8gZHJvcGRvd24uICovXHJcbiAgICBwdWJsaWMgc2VsZWN0ZWQgPSBvdXRwdXQ8VD4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gcmVtb3ZlIHVtYSBzdWdlc3TDo28gc2VsZWNpb25hZGEgKG1vZG8gbcO6bHRpcGxvKS4gKi9cclxuICAgIHB1YmxpYyB1bnNlbGVjdGVkID0gb3V0cHV0PFQ+KCk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHBlcmRlIG8gZm9jby4gKi9cclxuICAgIHB1YmxpYyBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyDDqSBsaW1wbyBwZWxvIHVzdcOhcmlvLiAqL1xyXG4gICAgcHVibGljIGNsZWFyZWQgPSBvdXRwdXQoKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gYSBjYWRhIHByZXNzaW9uYW1lbnRvIGRlIHRlY2xhIG5vIGNhbXBvIGRlIGlucHV0LiAqL1xyXG4gICAgcHVibGljIGtleVVwID0gb3V0cHV0PEV2ZW50PigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyByZWNlYmUgZm9jby4gKi9cclxuICAgIHB1YmxpYyBmb2N1c2VkID0gb3V0cHV0PGFueT4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gZGlnaXRhIG5vIGNhbXBvLCBmb3JuZWNlbmRvIG8gdGV4dG8gYXR1YWwgcGFyYSBmaWx0cmFnZW0gZGUgc3VnZXN0w7Vlcy4gKi9cclxuICAgIHB1YmxpYyBjb21wbGV0ZU1ldGhvZCA9IG91dHB1dDx7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcclxuXHJcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcclxuICAgIHB1YmxpYyBpc09wZW4gPSBzaWduYWwoZmFsc2UpO1xyXG4gICAgcHVibGljIGZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBzaWduYWw8U3VnZ2VzdGlvbldyYXBwZXI8VD5bXT4oW10pO1xyXG4gICAgcHVibGljIHNob3dFbXB0eU1lc3NhZ2UgPSBzaWduYWwoZmFsc2UpO1xyXG4gICAgcHVibGljIGZpbHRlclRleHQgPSBzaWduYWwoJycpO1xyXG4gICAgcHVibGljIGlucHV0VmFsdWUgPSBzaWduYWwoJycpO1xyXG4gICAgcHVibGljIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICAgIHB1YmxpYyBjb21wb25lbnRJZCA9IGBhdXRvY29tcGxldGVfJHtBdXRvY29tcGxldGVDb21wb25lbnQubmV4dElkKyt9YDtcclxuICAgIHB1YmxpYyBpbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdpbnB1dEVsJyk7XHJcblxyXG4gICAgcHJpdmF0ZSBfaW5wdXRTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgX2xhenlMb2FkU3ViamVjdCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U/OiAodmFsdWU6IGFueSB8IGFueVtdKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkPzogKCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVkIHF1ZSByZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCxcclxuICAgICAqIGFkaWNpb25hbmRvIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBzdWdlc3TDo28uXHJcbiAgICAgKiBAcmV0dXJucyBVbWEgbGlzdGEgZGUgc3VnZXN0w7VlcyBwcm9jZXNzYWRhcyBjb20gaWRlbnRpZmljYWRvcmVzIMO6bmljb3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcm5hbFN1Z2dlc3Rpb24gPSBjb21wdXRlZDxTdWdnZXN0aW9uV3JhcHBlcjxUPltdPigoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuc3VnZ2VzdGlvbnMoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKG9wdHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHVtIGNvbmp1bnRvIChgU2V0YCkgY29tIG9zIElEcyBkYXMgc3VnZXN0w7VlcyBzZWxlY2lvbmFkYXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RlZFN1Z2dlc3Rpb25JZHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMudmFsdWVzKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFxyXG4gICAgICAgICAgICBjdXJyZW50VmFsdWVzLm1hcCgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbmQoKHMpID0+IEpTT04uc3RyaW5naWZ5KHMuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk/LmlkO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZW5yaXF1ZWNpZGFzIGNvbSBhIHByb3ByaWVkYWRlIGBpc1NlbGVjdGVkYC5cclxuICAgICAqIENhZGEgc3VnZXN0w6NvIHJlY2ViZSB1bSBjYW1wbyBib29sZWFubyBgaXNTZWxlY3RlZGAgaW5kaWNhbmRvIHNlIGVsYSBlc3TDoSBzZWxlY2lvbmFkYSxcclxuICAgICAqIGNvbSBiYXNlIG5vcyBJRHMgZGFzIHN1Z2VzdMO1ZXMgc2VsZWNpb25hZGFzIGUgbm8gdmFsb3IgZGEgc3VnZXN0w6NvLlxyXG4gICAgICogQHJldHVybnMgVW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLCBjYWRhIHVtYSBjb20gYSBwcm9wcmllZGFkZSBhZGljaW9uYWwgYGlzU2VsZWN0ZWRgLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW5yaWNoZWRGaWx0ZXJlZFN1Z2dlc3Rpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbklkcygpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlsdGVyZWQubWFwKChzdWdnZXN0aW9uKSA9PiAoe1xyXG4gICAgICAgICAgICAuLi5zdWdnZXN0aW9uLFxyXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZElkcy5oYXMoc3VnZ2VzdGlvbi5pZCksXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbnB1dHMoKTtcclxuICAgICAgICB0aGlzLl9zZXR1cElucHV0RGVib3VuY2UoKTtcclxuICAgICAgICB0aGlzLl9zZXR1cExhenlMb2FkRGVib3VuY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZSBvIHZhbG9yIGRvIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBWYWxvciBhIHNlciBkZWZpbmlkbywgw7puaWNvIG91IGFycmF5LCBjb25mb3JtZSBzZWxlw6fDo28gbcO6bHRpcGxhLlxyXG4gICAgICogQHRocm93cyBTZSBtw7psdGlwbG8gZm9yIGZhbHNvIGUgdmFsdWUgZm9yIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IFRbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25MYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQodmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFt2YWx1ZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBtdXN0IG5vdCBiZSBhbiBhcnJheSB3aGVuIG11bHRpcGxlIGlzIGZhbHNlLicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCF2YWx1ZSA/ICcnIDogc3VnZ2VzdGlvbkxhYmVsID8gU3RyaW5nKHZhbHVlW3N1Z2dlc3Rpb25MYWJlbF0pIDogU3RyaW5nKHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHNlbXByZSBxdWUgbyB2YWxvciBkbyBjb21wb25lbnRlIG11ZGFyLlxyXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGEgc2VyIGNoYW1hZGEgcXVhbmRvIG8gdmFsb3IgbXVkYXIuIFJlY2ViZSBvIG5vdm8gdmFsb3IgY29tbyBhcmd1bWVudG8sIHF1ZSBwb2RlIHNlciB1bSDDum5pY28gdmFsb3Igb3UgdW0gYXJyYXkgZGUgdmFsb3Jlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10pID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2FkbyAocGVyZGVyIG8gZm9jbykuXHJcbiAgICAgKiBAcGFyYW0gb25Ub3VjaGVkIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIGEgc2VyIGNoYW1hZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgdG9jYWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxyXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBlbnRyYWRhIGRvIHVzdcOhcmlvIG5vIGNhbXBvIGRlIHRleHRvIGRvIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEVzdGUgbcOpdG9kbyDDqSBjaGFtYWRvIHNlbXByZSBxdWUgbyB1c3XDoXJpbyBkaWdpdGEgYWxnbyBubyBjYW1wbyBkZSBlbnRyYWRhLlxyXG4gICAgICogRWxlIGV4ZWN1dGEgYXMgc2VndWludGVzIGHDp8O1ZXM6XHJcbiAgICAgKiAtIERpc3BhcmEgbyBjYWxsYmFjayBkZSBcInRvdWNoZWRcIiBwYXJhIGNvbnRyb2xlIGRlIGZvcm11bMOhcmlvcy5cclxuICAgICAqIC0gT2J0w6ltIG8gdmFsb3IgYXR1YWwgZG8gY2FtcG8gZGUgZW50cmFkYS5cclxuICAgICAqIC0gU2UgbyBtb2RvIGxhenkgZXN0aXZlciBhdGl2YWRvLCBlbWl0ZSBvIGV2ZW50byBkZSBsYXp5TG9hZCBjb20gYSBjb25zdWx0YSBlIGFicmUgbyBwYWluZWwgZGUgc3VnZXN0w7Vlcy5cclxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCBhdHVhbGl6YSBvIHRleHRvIGRlIGZpbHRybywgbm90aWZpY2Egb3Mgb2JzZXJ2YWRvcmVzIGUgYWJyZSBvIHBhaW5lbCBkZSBzdWdlc3TDtWVzIHNlIGhvdXZlciBzdWdlc3TDtWVzIGRpc3BvbsOtdmVpcy5cclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGUgZW50cmFkYSBkbyB0aXBvIGBFdmVudGAgcHJvdmVuaWVudGUgZG8gY2FtcG8gZGUgdGV4dG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbklucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZD8uKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF6eSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCQubmV4dCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJUZXh0LnNldCh2YWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29tcGxldGVNZXRob2QuZW1pdCh7IHF1ZXJ5OiB2YWx1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5wdXRTdWJqZWN0JC5uZXh0KHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcGVyZGEgZGUgZm9jbyAoYmx1cikgZG8gY2FtcG8gZGUgZW50cmFkYSBkbyBhdXRvY29tcGxldGUuXHJcbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgbyB2YWxvciBkaWdpdGFkbyBwZWxvIHVzdcOhcmlvIGNvcnJlc3BvbmRlIGV4YXRhbWVudGUgYSBhbGd1bSBkb3MgaXRlbnMgc3VnZXJpZG9zLlxyXG4gICAgICogLSBTZSBob3V2ZXIgY29ycmVzcG9uZMOqbmNpYTpcclxuICAgICAqICAgLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIGFkaWNpb25hIG8gaXRlbSBzZWxlY2lvbmFkbyDDoCBsaXN0YSBkZSB2YWxvcmVzLCBjYXNvIGFpbmRhIG7Do28gZXN0ZWphIHByZXNlbnRlLlxyXG4gICAgICogICAtIE5vIG1vZG8gc2ltcGxlcywgc2VsZWNpb25hIG8gaXRlbSBjb3JyZXNwb25kZW50ZSBzZSBhaW5kYSBuw6NvIGVzdGl2ZXIgc2VsZWNpb25hZG8uXHJcbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIGNvcnJlc3BvbmTDqm5jaWEsIGxpbXBhIG8gY2FtcG8gZGUgZW50cmFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSW5wdXRCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5pbnB1dFZhbHVlKCkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBtYXRjaCA9IHN1Z2dlc3Rpb25zLmZpbmQoKHsgZGF0YSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IGRhdGFbdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogZGF0YTtcclxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhsYWJlbCkudG9Mb3dlckNhc2UoKSA9PT0gaW5wdXRWYWx1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSB0aGlzLnZhbHVlcygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gY3VycmVudFZhbHVlcy5zb21lKFxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyB2YWx1ZVt0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpIV0gOiB2YWx1ZSkgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpID8gbWF0Y2guZGF0YVt0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpIV0gOiBtYXRjaC5kYXRhKSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbLi4uY3VycmVudFZhbHVlcywgbWF0Y2guZGF0YV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKCkgIT09IG1hdGNoLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24obWF0Y2guZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwYXJhIG8gZXZlbnRvIGRlIGZvY28gcXVhbmRvIG8gY2FtcG8gZGUgZW50cmFkYSByZWNlYmUgZm9jby5cclxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSBmb2NvIGRpc3BhcmFkbyBwZWxvIGVsZW1lbnRvIGRlIGVudHJhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbklucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxyXG4gICAgICogRXN0ZSBtw6l0b2RvIGdlcmVuY2lhIGEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgc3VnZXN0w7VlcyB1c2FuZG8gYXMgdGVjbGFzIGRvIHRlY2xhZG8uXHJcbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgc3VnZXN0w6NvLlxyXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBzdWdlc3TDo28gYW50ZXJpb3IuXHJcbiAgICAgKiAtICdFbnRlcicgb3UgJ1RhYic6IFNlbGVjaW9uYSBhIHN1Z2VzdMOjbyBhdHVhbG1lbnRlIGZvY2FkYSBlIGZlY2hhIGEgbGlzdGEgZGUgc3VnZXN0w7Vlcy5cclxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBzZW0gc2VsZWNpb25hciBuZW5odW0gaXRlbS5cclxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBwZWxvIHVzdcOhcmlvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkPy4oKTtcclxuXHJcbiAgICAgICAgY29uc3QgX3NlbGVjdFN1Z2dlc3Rpb24gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c1N1Z2dlc3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XHJcbiAgICAgICAgICAgICAgICBfc2VsZWN0U3VnZ2VzdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRlIHVtIGV2ZW50byBxdWFuZG8gdW1hIHRlY2xhIMOpIGxpYmVyYWRhIG5vIGNvbXBvbmVudGUuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBhc3NvY2lhZG8gw6AgdGVjbGEgbGliZXJhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbktleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMua2V5VXAuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGVtIGV2ZW50b3MgZGUgcmVkaW1lbnNpb25hbWVudG8gZGUgamFuZWxhLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY2lvbmEgdW1hIHN1Z2VzdMOjbyBkYSBsaXN0YSBkZSBzdWdlc3TDtWVzLlxyXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gKGBtdWx0aXBsZSgpYCByZXRvcm5hIHRydWUpLCBhZGljaW9uYSBhIHN1Z2VzdMOjbyDDoCBsaXN0YSBkZSBzdWdnZXN0w7VlcyBzZWxlY2lvbmFkYXMsXHJcbiAgICAgKiBjYXNvIGVsYSBhaW5kYSBuw6NvIGVzdGVqYSBwcmVzZW50ZS4gRW0gc2VndWlkYSwgbGltcGEgbyB2YWxvciBkbyBjYW1wbyBkZSBlbnRyYWRhLlxyXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgZGVmaW5lIGEgc3VnZXN0w6NvIGNvbW8gdmFsb3Igc2VsZWNpb25hZG8gZSBhdHVhbGl6YSBvIGNhbXBvIGRlIGVudHJhZGFcclxuICAgICAqIGNvbSBvIHLDs3R1bG8gY29ycmVzcG9uZGVudGUuXHJcbiAgICAgKiBFbSBhbWJvcyBvcyBjYXNvcywgZGlzcGFyYSBvIGNhbGxiYWNrIGBfb25DaGFuZ2VgIGNvbSBvIG5vdm8gdmFsb3IgZSBmZWNoYSBvIHBhaW5lbCBkZSBzdWdlc3TDtWVzLlxyXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24gLSBBIHN1Z2VzdMOjbyBhIHNlciBzZWxlY2lvbmFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMudmFsdWVzKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGN1cnJlbnRWYWx1ZXMuc29tZShcclxuICAgICAgICAgICAgICAgICh2YWx1ZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHZhbHVlW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHZhbHVlKSA9PT1cclxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbiksXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFsuLi5jdXJyZW50VmFsdWVzLCBzdWdnZXN0aW9uXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZT8uKHRoaXMudmFsdWVzKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChzdWdnZXN0aW9uKTtcclxuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbjtcclxuICAgICAgICAgICAgY29uc3QgX2lucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogc3VnZ2VzdGlvbik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KF9pbnB1dFZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/LihfdmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xyXG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxyXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHJlbW92ZSB0b2RvcyBvcyB2YWxvcmVzIHNlbGVjaW9uYWRvcy5cclxuICAgICAqIENhc28gY29udHLDoXJpbywgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvLlxyXG4gICAgICogVGFtYsOpbSBsaW1wYSBhcyBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlc1xyXG4gICAgICogZSBsaW1wYSBvIHZhbG9yIGRvIGNhbXBvIGRlIGVudHJhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQoW10pO1xyXG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlLnNldCgnJyk7XHJcbiAgICAgICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRvIGRyb3Bkb3duIGRlIHN1Z2VzdMO1ZXMgZG8gYXV0b2NvbXBsZXRlLlxyXG4gICAgICogRXN0ZSBtw6l0b2RvIGNvbmZpZ3VyYSBvIGRlYm91bmNlIGRvIGlucHV0LCB2ZXJpZmljYSBzZSBow6Egc3VnZXN0w7VlcyBmaWx0cmFkYXNcclxuICAgICAqIGUsIGNhc28gbsOjbyBoYWphIHN1Z2VzdMO1ZXMgZSBvIHRleHRvIGRvIGZpbHRybyBlc3RlamEgdmF6aW8sIHJlZGVmaW5lIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxyXG4gICAgICogUG9yIGZpbSwgYWx0ZXJuYSBvIGVzdGFkbyBkZSBhYmVydHVyYSBkbyBkcm9wZG93bi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NldHVwSW5wdXREZWJvdW5jZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJUZXh0KCkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenkoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KCcnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCghdGhpcy5pc09wZW4oKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW7Dp8OjbyB1dGlsaXphZGEgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3RhcyBubyBBbmd1bGFyLCBwZXJtaXRpbmRvIHF1ZSBvIGZyYW1ld29ya1xyXG4gICAgICogaWRlbnRpZmlxdWUgY2FkYSBpdGVtIGRlIGZvcm1hIMO6bmljYSBwZWxvIHNldSBgaWRgLiBEZXZlIHNlciB1dGlsaXphZGEgY29tbyBmdW7Dp8OjbyBkZSBgdHJhY2tCeWBcclxuICAgICAqIGVtIGJsb2NvcyBjb21vIGBAZm9yYC5cclxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIE9iamV0byBkbyB0aXBvIGBTdWdnZXN0aW9uV3JhcHBlcjxUPmAgcXVlIHJlcHJlc2VudGEgbyBpdGVtIGF0dWFsLlxyXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZG8gaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSB1bWEgc3VnZXN0w6NvIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxyXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24gTyBpdGVtIGEgc2VyIHJlbW92aWRvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IFQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzdWdnZXN0aW9uVmFsdWUgPSB0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnZhbHVlcy5zZXQoXHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmlsdGVyKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVtzdWdnZXN0aW9uVmFsdWVdICE9PSBzdWdnZXN0aW9uW3N1Z2dlc3Rpb25WYWx1ZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHN1Z2dlc3Rpb247XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih0aGlzLnZhbHVlcygpKTtcclxuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuZW1pdChzdWdnZXN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlaW5pY2lhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXHJcbiAgICAgKiBTZSBvIG1vZG8gbGF6eSBlc3RpdmVyIGF0aXZhZG8sIGVtaXRlIHVtIGV2ZW50byBwYXJhIGNhcnJlZ2FyIHN1Z2VzdMO1ZXMgY29tIHVtYSBjb25zdWx0YSB2YXppYS5cclxuICAgICAqIEVtIHNlZ3VpZGEsIHJlZGVmaW5lIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzIHBhcmEgbyB2YWxvciByZXRvcm5hZG8gcG9yIGBpbnRlcm5hbFN1Z2dlc3Rpb24oKWAuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc2V0RmlsdGVyZWRTdWdnZXN0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KCcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KHRoaXMuaW50ZXJuYWxTdWdnZXN0aW9uKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBzdWdlc3TDo28gbmEgbGlzdGEgZGUgc3VnZXN0w7Vlcywgc2UgaG91dmVyLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9ucyBMaXN0YSBkZSBzdWdlc3TDtWVzIGRpc3BvbsOtdmVpcy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9uczogU3VnZ2VzdGlvbldyYXBwZXI8VD5bXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcclxuXHJcbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkU3VnZ2VzdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBzdWdlc3TDo28gYW50ZXJpb3IgbmEgbGlzdGEgZGUgc3VnZXN0w7Vlcywgc2UgaG91dmVyLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c1N1Z2dlc3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xyXG5cclxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHByZXZJbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIHN1Z2VzdMOjbyBhdHVhbG1lbnRlIGZvY2FkYSBlc3RlamEgdmlzw612ZWwuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zY3JvbGxUb0ZvY3VzZWRTdWdnZXN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xyXG5cclxuICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgc3VnZXN0w6NvIGZvcm5lY2lkYS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbnMgLSBVbSBhcnJheSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gVC5cclxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIG9iamV0b3MgYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCwgY2FkYSB1bSBjb250ZW5kbyBhIHN1Z2VzdMOjbyBvcmlnaW5hbCBlIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9hZGRJZFRvU3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnM6IFRbXSk6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPy5tYXAoKHN1Z2dlc3Rpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc3VnZ2VzdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5kYXRhS2V5KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcoc3VnZ2VzdGlvblt0aGlzLmRhdGFLZXkoKSFdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICgodHlwZW9mIHN1Z2dlc3Rpb24gIT09ICdvYmplY3QnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3VnZ2VzdGlvbj8udG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC52YWx1ZXMoc3VnZ2VzdGlvbiBhcyBPYmplY3QpLmpvaW4oJ18nKSkgPz8gJycpLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSkgPz8gW11cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZmlndXJhIG8gZGVib3VuY2UgZSBzd2l0Y2hNYXAgcGFyYSBsYXp5IGxvYWRpbmcsIHJlc29sdmVuZG8gcmFjZSBjb25kaXRpb25zLlxyXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgc3dpdGNoTWFwIHBhcmEgY2FuY2VsYXIgcmVxdWlzacOnw7VlcyBhbnRlcmlvcmVzIGF1dG9tYXRpY2FtZW50ZVxyXG4gICAgICogcXVhbmRvIHVtYSBub3ZhIGJ1c2NhIMOpIGluaWNpYWRhLCBldml0YW5kbyBxdWUgcmVzdWx0YWRvcyBhbnRpZ29zIHNvYnJlc2NyZXZhbVxyXG4gICAgICogcmVzdWx0YWRvcyBtYWlzIHJlY2VudGVzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfc2V0dXBMYXp5TG9hZERlYm91bmNlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCRcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWxheSgpKSxcclxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYW50ZXIgZmVjaGFkbyBvIGRyb3Bkb3duZCBhdMOpIGEgYnVzY2EgZXN0aXZlciBjb25jbHXDrWRhXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFRbXT4oKHN1YnNjcmliZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ0xhenkgbG9hZCB0aW1lb3V0JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUNhbGxiYWNrID0gKGRhdGE6IFRbXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWQuZW1pdCh7IHF1ZXJ5LCByZXNwb25zZTogcmVzcG9uc2VDYWxsYmFjayB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGE6IFRbXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFicmlyIG8gZHJvcGRvd24gc29tZW50ZSBhcXVpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFN1Z2dlc3Rpb25zID0gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQod3JhcHBlZFN1Z2dlc3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2Uuc2V0KHdyYXBwZWRTdWdnZXN0aW9ucy5sZW5ndGggPT09IDApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBYnJpciBvIGRyb3Bkb3duIHNvbWVudGUgYXF1aVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0xhenkgbG9hZCBlcnJvcjonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZmlndXJhIG8gZGVib3VuY2UgcGFyYSBvIGlucHV0IGRvIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEVzdGUgbcOpdG9kbyB1dGlsaXphIHVtIFN1YmplY3QgcGFyYSBlc2N1dGFyIGFzIG11ZGFuw6dhcyBubyB2YWxvciBkbyBpbnB1dCxcclxuICAgICAqIGFwbGljYW5kbyB1bSBkZWJvdW5jZSBjb20gbyB0ZW1wbyBkZWZpbmlkbyBwb3IgYHRoaXMuZGVsYXkoKWAuIFF1YW5kbyB1bSBub3ZvIHZhbG9yIMOpIGVtaXRpZG86XHJcbiAgICAgKiAtIFNlIGhvdXZlciB2YWxvciwgZmlsdHJhIGFzIHN1Z2VzdMO1ZXMgY29tIGJhc2Ugbm8gdGV4dG8gZGlnaXRhZG8gZSBhdHVhbGl6YSBhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxyXG4gICAgICogLSBTZSBuw6NvIGhvdXZlciB2YWxvciBlIG8gZHJvcGRvd24gZXN0aXZlciBhdGl2bywgcmVzZXRhIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxyXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGxpbXBhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXHJcbiAgICAgKiBUYW1iw6ltIGF0dWFsaXphIG8gZXN0YWRvIGRhIG1lbnNhZ2VtIGRlIGxpc3RhIHZhemlhIGUsIHNlIGEgc2VsZcOnw6NvIGZvciBsaXZyZSAoYGZvcmNlU2VsZWN0aW9uYCBmb3IgZmFsc28pLFxyXG4gICAgICogcHJvcGFnYSBhIG11ZGFuw6dhIGRlIHZhbG9yIHBhcmEgbyBmb3JtdWzDoXJpby5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NldHVwSW5wdXREZWJvdW5jZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkoKSksXHJcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUubGVuZ3RoID49IHRoaXMubWluTGVuZ3RoVG9TZWFyY2goKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApLFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbHRlcigoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gU3RyaW5nKHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBkYXRhW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPT09IDApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyb3Bkb3duKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVyZWRTdWdnZXN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFtdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9yY2VTZWxlY3Rpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2UgYXMgc3VnZXN0w7VlcyBmb3JlbSBvYmpldG9zIGUgYHN1Z2dlc3Rpb25MYWJlbGAgbsOjbyBmb3IgZm9ybmVjaWRvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnMoKTtcclxuXHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGFzT2JqZWN0U3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5zb21lKFxyXG4gICAgICAgICAgICAoc3VnZ2VzdGlvbikgPT4gdHlwZW9mIHN1Z2dlc3Rpb24gPT09ICdvYmplY3QnICYmIHN1Z2dlc3Rpb24gIT09IG51bGwsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGhhc09iamVjdFN1Z2dlc3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3VnZ2VzdGlvbkxhYmVsIGlucHV0IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBzdWdnZXN0aW9ucyBhcmUgb2JqZWN0cy4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwiZmxleCBoLVszNXB4XSB3LWZ1bGwgaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVs0cHhdIGJvcmRlciBmb2N1cy13aXRoaW46Ym9yZGVyLTIgZm9jdXMtd2l0aGluOmJvcmRlci1wcmltYXJ5IGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgW2NsYXNzXT1cImlucHV0Q2xhc3MoKVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBib3JkZXItZ3JheXNjYWxlLTIwIGJnLWdyYXlzY2FsZS01IHRleHQtZ3JheXNjYWxlLTMwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLWF1dG8gYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCB0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICAnYm9yZGVyLWNyaXRpY2FsaXR5LXJlZCc6IGludmFsaWQoKSxcbiAgICB9XCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgZ2FwLTIgcHgtMlwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdib3JkZXItcic6IGRyb3Bkb3duKCksXG4gICAgICAgICAgICAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRyb3Bkb3duKCkgJiYgZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdib3JkZXItZ3JheXNjYWxlLTMwIGZvY3VzLXdpdGhpbjpib3JkZXItci0yIGZvY3VzLXdpdGhpbjpib3JkZXItci1wcmltYXJ5JzogZHJvcGRvd24oKSAmJiAhZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAnYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkgJiYgdmFsdWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHN1Z2dlc3Rpb24gb2YgdmFsdWVzKCk7IHRyYWNrIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtYXV0b2NvbXBsZXRlLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdWdnZXN0aW9uXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25MYWJlbF09XCJzdWdnZXN0aW9uTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc3VnZ2VzdGlvblJlbW92ZWQpPVwicmVtb3ZlU3VnZ2VzdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1hdXRvY29tcGxldGUtY2hpcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNpbnB1dEVsXG4gICAgICAgICAgICBjbGFzcz1cIm1pbi1oLVszNXB4XSBncm93IG91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnR5cGVfdG9fc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYXV0b2NvbXBsZXRlXT1cIm11bHRpcGxlKCkgPyAnbGlzdCcgOiAnYm90aCdcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImZvY3VzZWRJbmRleCgpID49IDAgPyBmaWx0ZXJlZFN1Z2dlc3Rpb25zKClbZm9jdXNlZEluZGV4KCldLmlkIDogbnVsbFwiXG4gICAgICAgICAgICByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleVVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN5PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcj1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQyOGJjYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1Ni41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKHZhbHVlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXRpbWVzIHRleHQtZ3JheXNjYWxlLTYwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGRyb3Bkb3duKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LVszNXB4XSBmbGV4LXNocmluay0wIGZsZXgtZ3Jvdy0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmEtY2FyZXQtZG93bl09XCIhaXNPcGVuKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuQGlmIChzaG93RW1wdHlNZXNzYWdlKCkgfHwgKGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwICYmICFyZWFkb25seSgpKSkge1xuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgICAgICAoYmFja2Ryb3BDbGljayk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4gICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgICAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgICAgICBjbGFzcz1cIm10LTAuNSByb3VuZGVkLVs0cHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1heC1oLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAodmlydHVhbFNjcm9sbCgpICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1Z2dlc3Rpb24gb2YgZW5yaWNoZWRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gJGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5SWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHN1Z2dlc3Rpb24sIGkgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgICAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTsgdHJhY2sgc3VnZ2VzdGlvbi5pZDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzdWdnZXN0aW9uSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzdWdnZXN0aW9uLCBpIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93RW1wdHlNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxufVxuXG48bmctdGVtcGxhdGVcbiAgICAjc3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVxuICAgIGxldC1zdWdnZXN0aW9uPVwic3VnZ2VzdGlvblwiXG4gICAgbGV0LWk9XCJpXCJcbj5cbiAgICA8bGlcbiAgICAgICAgW2lkXT1cInN1Z2dlc3Rpb24uaWRcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQteHNtYWxsIGZsZXggY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMiB0ZXh0LWdyYXlzY2FsZS03MFwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMTBdPVwiaSA9PT0gZm9jdXNlZEluZGV4KClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTIwXT1cInN1Z2dlc3Rpb24uaXNTZWxlY3RlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwic3VnZ2VzdGlvbi5pc1NlbGVjdGVkXCJcbiAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24uZGF0YSlcIlxuICAgID5cbiAgICAgICAgQGlmIChjaGVja21hcmsoKSAmJiBtdWx0aXBsZSgpICYmIHN1Z2dlc3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgIH1cbiAgICAgICAge3sgc3VnZ2VzdGlvbkxhYmVsKCkgPyBzdWdnZXN0aW9uLmRhdGFbc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IHN1Z2dlc3Rpb24uZGF0YSB9fVxuICAgIDwvbGk+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
|
|
615
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFFVixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7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QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO2dCQUNwRCxLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0osOElDNUVMLGl2T0EwTEEsMkNENUhRLFlBQVksbVNBQ1osV0FBVyw4bUJBQ1gsbUJBQW1CLDhCQUNuQixhQUFhLHV0REFDYixlQUFlLDhCQUNmLGVBQWUsNEZBQ2YseUJBQXlCOzs0RkFpQnBCLHFCQUFxQjtrQkE1QmpDLFNBQVM7K0JBQ0ksZ0JBQWdCLGNBQ2QsSUFBSSxXQUVQO3dCQUNMLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixlQUFlO3dCQUNmLHlCQUF5QjtxQkFDNUIsYUFDVTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzs0QkFDcEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osUUFDSzt3QkFDRixJQUFJLEVBQUUsVUFBVTt3QkFDaEIsc0JBQXNCLEVBQUUsVUFBVTt3QkFDbEMsc0JBQXNCLEVBQUUsV0FBVzt3QkFDbkMsa0JBQWtCLEVBQUUsdURBQXVEO3dCQUMzRSxpQkFBaUIsRUFBRSxrQkFBa0I7cUJBQ3hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBjb21wdXRlZCxcclxuICAgIERlc3Ryb3lSZWYsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIGluamVjdCxcclxuICAgIGlucHV0LFxyXG4gICAgbW9kZWwsXHJcbiAgICBvdXRwdXQsXHJcbiAgICBzaWduYWwsXHJcbiAgICB2aWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRvY29tcGxldGUtY2hpcC9hdXRvY29tcGxldGUtY2hpcC5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudGEgdW0gaXRlbSBkZSBzdWdlc3TDo28gZW5jYXBzdWxhZG8sIHV0aWxpemFkbyBlbSBjb21wb25lbnRlcyBkZSBhdXRvY29tcGxldGUuXHJcbiAqIEB0ZW1wbGF0ZSBUIFRpcG8gZG9zIGRhZG9zIGFzc29jaWFkb3Mgw6Agc3VnZXN0w6NvLlxyXG4gKiBAcHJvcGVydHkgZGF0YSBPcyBkYWRvcyBkYSBzdWdlc3TDo28uXHJcbiAqIEBwcm9wZXJ0eSBpZCBJZGVudGlmaWNhZG9yIMO6bmljbyBkYSBzdWdlc3TDo28uXHJcbiAqIEBwcm9wZXJ0eSBbaXNTZWxlY3RlZF0gSW5kaWNhIHNlIGEgc3VnZXN0w6NvIGVzdMOhIHNlbGVjaW9uYWRhLlxyXG4gKi9cclxuaW50ZXJmYWNlIFN1Z2dlc3Rpb25XcmFwcGVyPFQ+IHtcclxuICAgIGRhdGE6IFQ7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBhdXRvY29tcGxldGFyIGNvbSBzdWdlc3TDtWVzIGRpbsOibWljYXMsIHN1cG9ydGFuZG8gc2VsZcOnw6NvIHNpbXBsZXNcclxuICogZSBtw7psdGlwbGEuIEltcGxlbWVudGEge0BsaW5rIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBwYXJhIGludGVncmHDp8OjbyBjb20gZm9ybXVsw6FyaW9zIEFuZ3VsYXIuXHJcbiAqIE9mZXJlY2UgY2FycmVnYW1lbnRvIGxhenkgZGUgc3VnZXN0w7VlcyB2aWEgb3V0cHV0IGBsYXp5TG9hZGAsIHZpcnR1YWxpemHDp8OjbyBkZSBsaXN0YSxcclxuICogc2VsZcOnw6NvIGNvbSBjaGlwcyBubyBtb2RvIG3Dumx0aXBsbyBlIGFjZXNzaWJpbGlkYWRlIEFSSUEgY29tcGxldGEgKGNvbWJvYm94IHJvbGUpLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxzLWF1dG9jb21wbGV0ZVxyXG4gKiAgIGZvcm1Db250cm9sTmFtZT1cImNpZGFkZVwiXHJcbiAqICAgcGxhY2Vob2xkZXI9XCJCdXNjYXIgY2lkYWRlLi4uXCJcclxuICogICBbc3VnZ2VzdGlvbnNdPVwiY2lkYWRlc1wiXHJcbiAqICAgc3VnZ2VzdGlvbkxhYmVsPVwibm9tZVwiXHJcbiAqICAgW2RlbGF5XT1cIjQwMFwiXHJcbiAqICAgKGNvbXBsZXRlTWV0aG9kKT1cImJ1c2NhcigkZXZlbnQpXCIgLz5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBjYXRlZ29yeSBJbnB1dHNcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzLWF1dG9jb21wbGV0ZScsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcclxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXHJcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxyXG4gICAgICAgIEF1dG9jb21wbGV0ZUNoaXBDb21wb25lbnQsXHJcbiAgICBdLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXV0b2NvbXBsZXRlQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgIF0sXHJcbiAgICBob3N0OiB7XHJcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcclxuICAgICAgICAnW2F0dHIuYXJpYS1leHBhbmRlZF0nOiAnaXNPcGVuKCknLFxyXG4gICAgICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdcImxpc3Rib3hcIicsXHJcbiAgICAgICAgJ1thdHRyLmFyaWEtb3duc10nOiAnaXNPcGVuKCkgPyBcImRyb3Bkb3duLWNvbnRhaW5lci1cIiArIGNvbXBvbmVudElkIDogbnVsbCcsXHJcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgpJyxcclxuICAgIH0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRvY29tcGxldGVDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGlzdGEgZXN0w6F0aWNhIGRlIHN1Z2VzdMO1ZXMgZXhpYmlkYXMgbm8gZHJvcGRvd24uIE5vIG1vZG8gbGF6eSwgcHJlZmlyYSB1c2FyIG8gb3V0cHV0IGBsYXp5TG9hZGAuIEBkZWZhdWx0IFtdICovXHJcbiAgICBwdWJsaWMgc3VnZ2VzdGlvbnMgPSBpbnB1dDxUW10+KFtdKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIFRleHRvIGV4aWJpZG8gbm8gaW5wdXQgcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby4gKi9cclxuICAgIHB1YmxpYyBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBzdWdlc3TDo28gY3VqbyB2YWxvciBzZXLDoSBlbWl0aWRvIGFvIGZvcm11bMOhcmlvLiAqL1xyXG4gICAgcHVibGljIHN1Z2dlc3Rpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgc3VnZXN0w6NvIHVzYWRhIGNvbW8gdGV4dG8gZGUgZXhpYmnDp8OjbyBubyBkcm9wZG93bi4gKi9cclxuICAgIHB1YmxpYyBzdWdnZXN0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVG9ybmEgbyBjYW1wbyBzb21lbnRlIGxlaXR1cmEsIGltcGVkaW5kbyBkaWdpdGHDp8OjbyBlIHNlbGXDp8Ojby4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGV4aWJpZGEgbm8gZHJvcGRvd24gcXVhbmRvIG5lbmh1bWEgc3VnZXN0w6NvIMOpIGVuY29udHJhZGEuICovXHJcbiAgICBwdWJsaWMgZW1wdHlNZXNzYWdlID0gaW5wdXQ8c3RyaW5nPigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVGVtcG8gZGUgZXNwZXJhIGVtIG1zIGFww7NzIGEgw7psdGltYSB0ZWNsYSBhbnRlcyBkZSBhY2lvbmFyIGEgYnVzY2EgcG9yIHN1Z2VzdMO1ZXMuIEBkZWZhdWx0IDMwMCAqL1xyXG4gICAgcHVibGljIGRlbGF5ID0gaW5wdXQoMzAwKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIGVzdGFkbyBkZSBlcnJvIHZpc3VhbCBubyBjYW1wbyBkZSBpbnB1dC4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBpbnZhbGlkID0gaW5wdXQoZmFsc2UpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdmlydHVhbGl6YcOnw6NvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgcGFyYSBtZWxob3IgcGVyZm9ybWFuY2UgY29tIGdyYW5kZXMgdm9sdW1lcyBkZSBkYWRvcy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsID0gaW5wdXQoZmFsc2UpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gQWx0dXJhIGZpeGEgZW0gcGl4ZWxzIGRlIGNhZGEgaXRlbSBubyB2aXJ0dWFsIHNjcm9sbC4gQGRlZmF1bHQgMzcgKi9cclxuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSBpbnB1dCgzNyk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBBdGl2YSBvIGNhcnJlZ2FtZW50byBhc3PDrW5jcm9ubyBkZSBzdWdlc3TDtWVzIHZpYSBvIG91dHB1dCBgbGF6eUxvYWRgLiBAZGVmYXVsdCBmYWxzZSAqL1xyXG4gICAgcHVibGljIGxhenkgPSBpbnB1dChmYWxzZSk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSBib3TDo28gZGUgZHJvcGRvd24gcGFyYSBhYnJpciBhIGxpc3RhIHNlbSBuZWNlc3NpZGFkZSBkZSBkaWdpdGHDp8Ojby4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBkcm9wZG93biA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIG8gdmFsb3IgZG8gY2FtcG8gZGV2ZSBzZXIgb2JyaWdhdG9yaWFtZW50ZSB1bWEgZGFzIG9ww6fDtWVzIHN1Z2VyaWRhcy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBmb3JjZVNlbGVjdGlvbiA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIMOtY29uZSBkZSBjaGVja21hcmsgYW8gbGFkbyBkYSBvcMOnw6NvIHNlbGVjaW9uYWRhIG5vIGRyb3Bkb3duLiBAZGVmYXVsdCBmYWxzZSAqL1xyXG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIENsYXNzZSBkbyDDrWNvbmUgZG8gYm90w6NvIGRlIGxpbXBhciBvIHZhbG9yIGRvIGNhbXBvLiBAZGVmYXVsdCAnZmFyIGZhLXRpbWVzJyAqL1xyXG4gICAgcHVibGljIGNsZWFySWNvbkNsYXNzID0gaW5wdXQoJ2ZhciBmYS10aW1lcycpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2xhc3NlIGRvIMOtY29uZSBkZSBjaGVja21hcmsgZXhpYmlkbyBhbyBsYWRvIGRhIG9ww6fDo28gc2VsZWNpb25hZGEgbm8gZHJvcGRvd24uIEBkZWZhdWx0ICdmYXIgZmEtY2hlY2snICovXHJcbiAgICBwdWJsaWMgY2hlY2tJY29uQ2xhc3MgPSBpbnB1dCgnZmFyIGZhLWNoZWNrJyk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDbGFzc2UgZG8gw61jb25lIGRvIGJvdMOjbyBkZSByZW1vdmVyIGNoaXAsIGV4aWJpZG8gbm8gbW9kbyBgbXVsdGlwbGVgLiBAZGVmYXVsdCAnZmFyIGZhLXRpbWVzJyAqL1xyXG4gICAgcHVibGljIHJlbW92ZUljb25DbGFzcyA9IGlucHV0KCdmYXIgZmEtdGltZXMnKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHNlbGXDp8OjbyBkZSBtw7psdGlwbG9zIGl0ZW5zIGV4aWJpZG9zIGNvbW8gY2hpcHMgbm8gY2FtcG8uIEBkZWZhdWx0IGZhbHNlICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBRdWFudGlkYWRlIG3DrW5pbWEgZGUgY2FyYWN0ZXJlcyBuZWNlc3PDoXJpYSBwYXJhIGFjaW9uYXIgYSBidXNjYSBwb3Igc3VnZXN0w7Vlcy4gQGRlZmF1bHQgMSAqL1xyXG4gICAgcHVibGljIG1pbkxlbmd0aFRvU2VhcmNoID0gaW5wdXQoMSk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDbGFzc2UgQ1NTIGFkaWNpb25hbCBhcGxpY2FkYSBhbyBlbGVtZW50byBgPGlucHV0PmAgaW50ZXJuby4gQGRlZmF1bHQgJycgKi9cclxuICAgIHB1YmxpYyBpbnB1dENsYXNzID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gdXNhZGEgcGFyYSBjb21wYXJhw6fDo28gZGUgaWRlbnRpZGFkZSBlbnRyZSBvcMOnw7VlcywgZXZpdGFuZG8gZHVwbGljYXRhcyBuYSBzZWxlw6fDo28gbcO6bHRpcGxhLiAqL1xyXG4gICAgcHVibGljIGRhdGFLZXkgPSBpbnB1dDxrZXlvZiBUPigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVmFsb3IgYXR1YWxtZW50ZSBzZWxlY2lvbmFkbyBubyBtb2RvIHNpbXBsZXMsIHZpYSB0d28td2F5IGJpbmRpbmcuICovXHJcbiAgICBwdWJsaWMgdmFsdWUgPSBtb2RlbDxUIHwgbnVsbD4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zIG5vIG1vZG8gbcO6bHRpcGxvLCB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBbXSAqL1xyXG4gICAgcHVibGljIHZhbHVlcyA9IG1vZGVsPFRbXT4oW10pO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgbyBlc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUgdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIG5vIG1vZG8gbGF6eSBxdWFuZG8gbyB1c3XDoXJpbyBkaWdpdGEgZSBvIGNvbXBvbmVudGUgZXN0w6EgcHJvbnRvIHBhcmEgcmVjZWJlciBub3ZhcyBzdWdlc3TDtWVzLlxyXG4gICAgICogTyBldmVudG8gY29udMOpbSBgcXVlcnlgICh0ZXh0byBkaWdpdGFkbykgZSBgcmVzcG9uc2VgIChmdW7Dp8OjbyBjYWxsYmFjayBwYXJhIGZvcm5lY2VyIG9zIGRhZG9zKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxhenlMb2FkID0gb3V0cHV0PHsgcXVlcnk6IHN0cmluZzsgcmVzcG9uc2U6IChkYXRhOiBUW10pID0+IHZvaWQgfT4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gc2VsZWNpb25hIHVtYSBzdWdlc3TDo28gZG8gZHJvcGRvd24uICovXHJcbiAgICBwdWJsaWMgc2VsZWN0ZWQgPSBvdXRwdXQ8VD4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gcmVtb3ZlIHVtYSBzdWdlc3TDo28gc2VsZWNpb25hZGEgKG1vZG8gbcO6bHRpcGxvKS4gKi9cclxuICAgIHB1YmxpYyB1bnNlbGVjdGVkID0gb3V0cHV0PFQ+KCk7XHJcblxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHBlcmRlIG8gZm9jby4gKi9cclxuICAgIHB1YmxpYyBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyDDqSBsaW1wbyBwZWxvIHVzdcOhcmlvLiAqL1xyXG4gICAgcHVibGljIGNsZWFyZWQgPSBvdXRwdXQoKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gYSBjYWRhIHByZXNzaW9uYW1lbnRvIGRlIHRlY2xhIG5vIGNhbXBvIGRlIGlucHV0LiAqL1xyXG4gICAgcHVibGljIGtleVVwID0gb3V0cHV0PEV2ZW50PigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyByZWNlYmUgZm9jby4gKi9cclxuICAgIHB1YmxpYyBmb2N1c2VkID0gb3V0cHV0PGFueT4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gZGlnaXRhIG5vIGNhbXBvLCBmb3JuZWNlbmRvIG8gdGV4dG8gYXR1YWwgcGFyYSBmaWx0cmFnZW0gZGUgc3VnZXN0w7Vlcy4gKi9cclxuICAgIHB1YmxpYyBjb21wbGV0ZU1ldGhvZCA9IG91dHB1dDx7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcclxuXHJcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcclxuICAgIHB1YmxpYyBpc09wZW4gPSBzaWduYWwoZmFsc2UpO1xyXG4gICAgcHVibGljIGZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBzaWduYWw8U3VnZ2VzdGlvbldyYXBwZXI8VD5bXT4oW10pO1xyXG4gICAgcHVibGljIHNob3dFbXB0eU1lc3NhZ2UgPSBzaWduYWwoZmFsc2UpO1xyXG4gICAgcHVibGljIGZpbHRlclRleHQgPSBzaWduYWwoJycpO1xyXG4gICAgcHVibGljIGlucHV0VmFsdWUgPSBzaWduYWwoJycpO1xyXG4gICAgcHVibGljIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICAgIHB1YmxpYyBjb21wb25lbnRJZCA9IGBhdXRvY29tcGxldGVfJHtBdXRvY29tcGxldGVDb21wb25lbnQubmV4dElkKyt9YDtcclxuICAgIHB1YmxpYyBpbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdpbnB1dEVsJyk7XHJcblxyXG4gICAgcHJpdmF0ZSBfaW5wdXRTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgX2xhenlMb2FkU3ViamVjdCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U/OiAodmFsdWU6IGFueSB8IGFueVtdKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkPzogKCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGVkIHF1ZSByZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCxcclxuICAgICAqIGFkaWNpb25hbmRvIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBzdWdlc3TDo28uXHJcbiAgICAgKiBAcmV0dXJucyBVbWEgbGlzdGEgZGUgc3VnZXN0w7VlcyBwcm9jZXNzYWRhcyBjb20gaWRlbnRpZmljYWRvcmVzIMO6bmljb3MuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcm5hbFN1Z2dlc3Rpb24gPSBjb21wdXRlZDxTdWdnZXN0aW9uV3JhcHBlcjxUPltdPigoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuc3VnZ2VzdGlvbnMoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKG9wdHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHVtIGNvbmp1bnRvIChgU2V0YCkgY29tIG9zIElEcyBkYXMgc3VnZXN0w7VlcyBzZWxlY2lvbmFkYXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RlZFN1Z2dlc3Rpb25JZHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMudmFsdWVzKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFxyXG4gICAgICAgICAgICBjdXJyZW50VmFsdWVzLm1hcCgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbmQoKHMpID0+IEpTT04uc3RyaW5naWZ5KHMuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk/LmlkO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZW5yaXF1ZWNpZGFzIGNvbSBhIHByb3ByaWVkYWRlIGBpc1NlbGVjdGVkYC5cclxuICAgICAqIENhZGEgc3VnZXN0w6NvIHJlY2ViZSB1bSBjYW1wbyBib29sZWFubyBgaXNTZWxlY3RlZGAgaW5kaWNhbmRvIHNlIGVsYSBlc3TDoSBzZWxlY2lvbmFkYSxcclxuICAgICAqIGNvbSBiYXNlIG5vcyBJRHMgZGFzIHN1Z2VzdMO1ZXMgc2VsZWNpb25hZGFzIGUgbm8gdmFsb3IgZGEgc3VnZXN0w6NvLlxyXG4gICAgICogQHJldHVybnMgVW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLCBjYWRhIHVtYSBjb20gYSBwcm9wcmllZGFkZSBhZGljaW9uYWwgYGlzU2VsZWN0ZWRgLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW5yaWNoZWRGaWx0ZXJlZFN1Z2dlc3Rpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbklkcygpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlsdGVyZWQubWFwKChzdWdnZXN0aW9uKSA9PiAoe1xyXG4gICAgICAgICAgICAuLi5zdWdnZXN0aW9uLFxyXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZElkcy5oYXMoc3VnZ2VzdGlvbi5pZCksXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbnB1dHMoKTtcclxuICAgICAgICB0aGlzLl9zZXR1cElucHV0RGVib3VuY2UoKTtcclxuICAgICAgICB0aGlzLl9zZXR1cExhenlMb2FkRGVib3VuY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZSBvIHZhbG9yIGRvIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBWYWxvciBhIHNlciBkZWZpbmlkbywgw7puaWNvIG91IGFycmF5LCBjb25mb3JtZSBzZWxlw6fDo28gbcO6bHRpcGxhLlxyXG4gICAgICogQHRocm93cyBTZSBtw7psdGlwbG8gZm9yIGZhbHNvIGUgdmFsdWUgZm9yIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IFRbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25MYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQodmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFt2YWx1ZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBtdXN0IG5vdCBiZSBhbiBhcnJheSB3aGVuIG11bHRpcGxlIGlzIGZhbHNlLicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCF2YWx1ZSA/ICcnIDogc3VnZ2VzdGlvbkxhYmVsID8gU3RyaW5nKHZhbHVlW3N1Z2dlc3Rpb25MYWJlbF0pIDogU3RyaW5nKHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHNlbXByZSBxdWUgbyB2YWxvciBkbyBjb21wb25lbnRlIG11ZGFyLlxyXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGEgc2VyIGNoYW1hZGEgcXVhbmRvIG8gdmFsb3IgbXVkYXIuIFJlY2ViZSBvIG5vdm8gdmFsb3IgY29tbyBhcmd1bWVudG8sIHF1ZSBwb2RlIHNlciB1bSDDum5pY28gdmFsb3Igb3UgdW0gYXJyYXkgZGUgdmFsb3Jlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10pID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2FkbyAocGVyZGVyIG8gZm9jbykuXHJcbiAgICAgKiBAcGFyYW0gb25Ub3VjaGVkIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIGEgc2VyIGNoYW1hZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgdG9jYWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxyXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBlbnRyYWRhIGRvIHVzdcOhcmlvIG5vIGNhbXBvIGRlIHRleHRvIGRvIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEVzdGUgbcOpdG9kbyDDqSBjaGFtYWRvIHNlbXByZSBxdWUgbyB1c3XDoXJpbyBkaWdpdGEgYWxnbyBubyBjYW1wbyBkZSBlbnRyYWRhLlxyXG4gICAgICogRWxlIGV4ZWN1dGEgYXMgc2VndWludGVzIGHDp8O1ZXM6XHJcbiAgICAgKiAtIERpc3BhcmEgbyBjYWxsYmFjayBkZSBcInRvdWNoZWRcIiBwYXJhIGNvbnRyb2xlIGRlIGZvcm11bMOhcmlvcy5cclxuICAgICAqIC0gT2J0w6ltIG8gdmFsb3IgYXR1YWwgZG8gY2FtcG8gZGUgZW50cmFkYS5cclxuICAgICAqIC0gU2UgbyBtb2RvIGxhenkgZXN0aXZlciBhdGl2YWRvLCBlbWl0ZSBvIGV2ZW50byBkZSBsYXp5TG9hZCBjb20gYSBjb25zdWx0YSBlIGFicmUgbyBwYWluZWwgZGUgc3VnZXN0w7Vlcy5cclxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCBhdHVhbGl6YSBvIHRleHRvIGRlIGZpbHRybywgbm90aWZpY2Egb3Mgb2JzZXJ2YWRvcmVzIGUgYWJyZSBvIHBhaW5lbCBkZSBzdWdlc3TDtWVzIHNlIGhvdXZlciBzdWdlc3TDtWVzIGRpc3BvbsOtdmVpcy5cclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGUgZW50cmFkYSBkbyB0aXBvIGBFdmVudGAgcHJvdmVuaWVudGUgZG8gY2FtcG8gZGUgdGV4dG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbklucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZD8uKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF6eSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCQubmV4dCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJUZXh0LnNldCh2YWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29tcGxldGVNZXRob2QuZW1pdCh7IHF1ZXJ5OiB2YWx1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5wdXRTdWJqZWN0JC5uZXh0KHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcGVyZGEgZGUgZm9jbyAoYmx1cikgZG8gY2FtcG8gZGUgZW50cmFkYSBkbyBhdXRvY29tcGxldGUuXHJcbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgbyB2YWxvciBkaWdpdGFkbyBwZWxvIHVzdcOhcmlvIGNvcnJlc3BvbmRlIGV4YXRhbWVudGUgYSBhbGd1bSBkb3MgaXRlbnMgc3VnZXJpZG9zLlxyXG4gICAgICogLSBTZSBob3V2ZXIgY29ycmVzcG9uZMOqbmNpYTpcclxuICAgICAqICAgLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIGFkaWNpb25hIG8gaXRlbSBzZWxlY2lvbmFkbyDDoCBsaXN0YSBkZSB2YWxvcmVzLCBjYXNvIGFpbmRhIG7Do28gZXN0ZWphIHByZXNlbnRlLlxyXG4gICAgICogICAtIE5vIG1vZG8gc2ltcGxlcywgc2VsZWNpb25hIG8gaXRlbSBjb3JyZXNwb25kZW50ZSBzZSBhaW5kYSBuw6NvIGVzdGl2ZXIgc2VsZWNpb25hZG8uXHJcbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIGNvcnJlc3BvbmTDqm5jaWEsIGxpbXBhIG8gY2FtcG8gZGUgZW50cmFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSW5wdXRCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5pbnB1dFZhbHVlKCkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBtYXRjaCA9IHN1Z2dlc3Rpb25zLmZpbmQoKHsgZGF0YSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IGRhdGFbdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogZGF0YTtcclxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhsYWJlbCkudG9Mb3dlckNhc2UoKSA9PT0gaW5wdXRWYWx1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSB0aGlzLnZhbHVlcygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gY3VycmVudFZhbHVlcy5zb21lKFxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyB2YWx1ZVt0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpIV0gOiB2YWx1ZSkgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpID8gbWF0Y2guZGF0YVt0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpIV0gOiBtYXRjaC5kYXRhKSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbLi4uY3VycmVudFZhbHVlcywgbWF0Y2guZGF0YV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKCkgIT09IG1hdGNoLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24obWF0Y2guZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwYXJhIG8gZXZlbnRvIGRlIGZvY28gcXVhbmRvIG8gY2FtcG8gZGUgZW50cmFkYSByZWNlYmUgZm9jby5cclxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSBmb2NvIGRpc3BhcmFkbyBwZWxvIGVsZW1lbnRvIGRlIGVudHJhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbklucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxyXG4gICAgICogRXN0ZSBtw6l0b2RvIGdlcmVuY2lhIGEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgc3VnZXN0w7VlcyB1c2FuZG8gYXMgdGVjbGFzIGRvIHRlY2xhZG8uXHJcbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgc3VnZXN0w6NvLlxyXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBzdWdlc3TDo28gYW50ZXJpb3IuXHJcbiAgICAgKiAtICdFbnRlcicgb3UgJ1RhYic6IFNlbGVjaW9uYSBhIHN1Z2VzdMOjbyBhdHVhbG1lbnRlIGZvY2FkYSBlIGZlY2hhIGEgbGlzdGEgZGUgc3VnZXN0w7Vlcy5cclxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBzZW0gc2VsZWNpb25hciBuZW5odW0gaXRlbS5cclxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBwZWxvIHVzdcOhcmlvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkPy4oKTtcclxuXHJcbiAgICAgICAgY29uc3QgX3NlbGVjdFN1Z2dlc3Rpb24gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c1N1Z2dlc3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XHJcbiAgICAgICAgICAgICAgICBfc2VsZWN0U3VnZ2VzdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRlIHVtIGV2ZW50byBxdWFuZG8gdW1hIHRlY2xhIMOpIGxpYmVyYWRhIG5vIGNvbXBvbmVudGUuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBhc3NvY2lhZG8gw6AgdGVjbGEgbGliZXJhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbktleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMua2V5VXAuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGVtIGV2ZW50b3MgZGUgcmVkaW1lbnNpb25hbWVudG8gZGUgamFuZWxhLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY2lvbmEgdW1hIHN1Z2VzdMOjbyBkYSBsaXN0YSBkZSBzdWdlc3TDtWVzLlxyXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gKGBtdWx0aXBsZSgpYCByZXRvcm5hIHRydWUpLCBhZGljaW9uYSBhIHN1Z2VzdMOjbyDDoCBsaXN0YSBkZSBzdWdnZXN0w7VlcyBzZWxlY2lvbmFkYXMsXHJcbiAgICAgKiBjYXNvIGVsYSBhaW5kYSBuw6NvIGVzdGVqYSBwcmVzZW50ZS4gRW0gc2VndWlkYSwgbGltcGEgbyB2YWxvciBkbyBjYW1wbyBkZSBlbnRyYWRhLlxyXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgZGVmaW5lIGEgc3VnZXN0w6NvIGNvbW8gdmFsb3Igc2VsZWNpb25hZG8gZSBhdHVhbGl6YSBvIGNhbXBvIGRlIGVudHJhZGFcclxuICAgICAqIGNvbSBvIHLDs3R1bG8gY29ycmVzcG9uZGVudGUuXHJcbiAgICAgKiBFbSBhbWJvcyBvcyBjYXNvcywgZGlzcGFyYSBvIGNhbGxiYWNrIGBfb25DaGFuZ2VgIGNvbSBvIG5vdm8gdmFsb3IgZSBmZWNoYSBvIHBhaW5lbCBkZSBzdWdlc3TDtWVzLlxyXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24gLSBBIHN1Z2VzdMOjbyBhIHNlciBzZWxlY2lvbmFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMudmFsdWVzKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGN1cnJlbnRWYWx1ZXMuc29tZShcclxuICAgICAgICAgICAgICAgICh2YWx1ZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHZhbHVlW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHZhbHVlKSA9PT1cclxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbiksXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFsuLi5jdXJyZW50VmFsdWVzLCBzdWdnZXN0aW9uXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZT8uKHRoaXMudmFsdWVzKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChzdWdnZXN0aW9uKTtcclxuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbjtcclxuICAgICAgICAgICAgY29uc3QgX2lucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogc3VnZ2VzdGlvbik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KF9pbnB1dFZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/LihfdmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xyXG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxyXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHJlbW92ZSB0b2RvcyBvcyB2YWxvcmVzIHNlbGVjaW9uYWRvcy5cclxuICAgICAqIENhc28gY29udHLDoXJpbywgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvLlxyXG4gICAgICogVGFtYsOpbSBsaW1wYSBhcyBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlc1xyXG4gICAgICogZSBsaW1wYSBvIHZhbG9yIGRvIGNhbXBvIGRlIGVudHJhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQoW10pO1xyXG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlLnNldCgnJyk7XHJcbiAgICAgICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRvIGRyb3Bkb3duIGRlIHN1Z2VzdMO1ZXMgZG8gYXV0b2NvbXBsZXRlLlxyXG4gICAgICogRXN0ZSBtw6l0b2RvIGNvbmZpZ3VyYSBvIGRlYm91bmNlIGRvIGlucHV0LCB2ZXJpZmljYSBzZSBow6Egc3VnZXN0w7VlcyBmaWx0cmFkYXNcclxuICAgICAqIGUsIGNhc28gbsOjbyBoYWphIHN1Z2VzdMO1ZXMgZSBvIHRleHRvIGRvIGZpbHRybyBlc3RlamEgdmF6aW8sIHJlZGVmaW5lIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxyXG4gICAgICogUG9yIGZpbSwgYWx0ZXJuYSBvIGVzdGFkbyBkZSBhYmVydHVyYSBkbyBkcm9wZG93bi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NldHVwSW5wdXREZWJvdW5jZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJUZXh0KCkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenkoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KCcnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCghdGhpcy5pc09wZW4oKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW7Dp8OjbyB1dGlsaXphZGEgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3RhcyBubyBBbmd1bGFyLCBwZXJtaXRpbmRvIHF1ZSBvIGZyYW1ld29ya1xyXG4gICAgICogaWRlbnRpZmlxdWUgY2FkYSBpdGVtIGRlIGZvcm1hIMO6bmljYSBwZWxvIHNldSBgaWRgLiBEZXZlIHNlciB1dGlsaXphZGEgY29tbyBmdW7Dp8OjbyBkZSBgdHJhY2tCeWBcclxuICAgICAqIGVtIGJsb2NvcyBjb21vIGBAZm9yYC5cclxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIE9iamV0byBkbyB0aXBvIGBTdWdnZXN0aW9uV3JhcHBlcjxUPmAgcXVlIHJlcHJlc2VudGEgbyBpdGVtIGF0dWFsLlxyXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZG8gaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSB1bWEgc3VnZXN0w6NvIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxyXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24gTyBpdGVtIGEgc2VyIHJlbW92aWRvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IFQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzdWdnZXN0aW9uVmFsdWUgPSB0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnZhbHVlcy5zZXQoXHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmlsdGVyKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVtzdWdnZXN0aW9uVmFsdWVdICE9PSBzdWdnZXN0aW9uW3N1Z2dlc3Rpb25WYWx1ZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHN1Z2dlc3Rpb247XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih0aGlzLnZhbHVlcygpKTtcclxuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuZW1pdChzdWdnZXN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlaW5pY2lhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXHJcbiAgICAgKiBTZSBvIG1vZG8gbGF6eSBlc3RpdmVyIGF0aXZhZG8sIGVtaXRlIHVtIGV2ZW50byBwYXJhIGNhcnJlZ2FyIHN1Z2VzdMO1ZXMgY29tIHVtYSBjb25zdWx0YSB2YXppYS5cclxuICAgICAqIEVtIHNlZ3VpZGEsIHJlZGVmaW5lIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzIHBhcmEgbyB2YWxvciByZXRvcm5hZG8gcG9yIGBpbnRlcm5hbFN1Z2dlc3Rpb24oKWAuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc2V0RmlsdGVyZWRTdWdnZXN0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KCcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KHRoaXMuaW50ZXJuYWxTdWdnZXN0aW9uKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBzdWdlc3TDo28gbmEgbGlzdGEgZGUgc3VnZXN0w7Vlcywgc2UgaG91dmVyLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9ucyBMaXN0YSBkZSBzdWdlc3TDtWVzIGRpc3BvbsOtdmVpcy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9uczogU3VnZ2VzdGlvbldyYXBwZXI8VD5bXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcclxuXHJcbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkU3VnZ2VzdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBzdWdlc3TDo28gYW50ZXJpb3IgbmEgbGlzdGEgZGUgc3VnZXN0w7Vlcywgc2UgaG91dmVyLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c1N1Z2dlc3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xyXG5cclxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHByZXZJbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIHN1Z2VzdMOjbyBhdHVhbG1lbnRlIGZvY2FkYSBlc3RlamEgdmlzw612ZWwuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zY3JvbGxUb0ZvY3VzZWRTdWdnZXN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xyXG5cclxuICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgc3VnZXN0w6NvIGZvcm5lY2lkYS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbnMgLSBVbSBhcnJheSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gVC5cclxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIG9iamV0b3MgYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCwgY2FkYSB1bSBjb250ZW5kbyBhIHN1Z2VzdMOjbyBvcmlnaW5hbCBlIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9hZGRJZFRvU3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnM6IFRbXSk6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPy5tYXAoKHN1Z2dlc3Rpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc3VnZ2VzdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5kYXRhS2V5KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcoc3VnZ2VzdGlvblt0aGlzLmRhdGFLZXkoKSFdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICgodHlwZW9mIHN1Z2dlc3Rpb24gIT09ICdvYmplY3QnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3VnZ2VzdGlvbj8udG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC52YWx1ZXMoc3VnZ2VzdGlvbiBhcyBPYmplY3QpLmpvaW4oJ18nKSkgPz8gJycpLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSkgPz8gW11cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZmlndXJhIG8gZGVib3VuY2UgZSBzd2l0Y2hNYXAgcGFyYSBsYXp5IGxvYWRpbmcsIHJlc29sdmVuZG8gcmFjZSBjb25kaXRpb25zLlxyXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgc3dpdGNoTWFwIHBhcmEgY2FuY2VsYXIgcmVxdWlzacOnw7VlcyBhbnRlcmlvcmVzIGF1dG9tYXRpY2FtZW50ZVxyXG4gICAgICogcXVhbmRvIHVtYSBub3ZhIGJ1c2NhIMOpIGluaWNpYWRhLCBldml0YW5kbyBxdWUgcmVzdWx0YWRvcyBhbnRpZ29zIHNvYnJlc2NyZXZhbVxyXG4gICAgICogcmVzdWx0YWRvcyBtYWlzIHJlY2VudGVzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfc2V0dXBMYXp5TG9hZERlYm91bmNlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCRcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWxheSgpKSxcclxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYW50ZXIgZmVjaGFkbyBvIGRyb3Bkb3duZCBhdMOpIGEgYnVzY2EgZXN0aXZlciBjb25jbHXDrWRhXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFRbXT4oKHN1YnNjcmliZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ0xhenkgbG9hZCB0aW1lb3V0JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUNhbGxiYWNrID0gKGRhdGE6IFRbXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWQuZW1pdCh7IHF1ZXJ5LCByZXNwb25zZTogcmVzcG9uc2VDYWxsYmFjayB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGE6IFRbXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFicmlyIG8gZHJvcGRvd24gc29tZW50ZSBhcXVpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFN1Z2dlc3Rpb25zID0gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQod3JhcHBlZFN1Z2dlc3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2Uuc2V0KHdyYXBwZWRTdWdnZXN0aW9ucy5sZW5ndGggPT09IDApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBYnJpciBvIGRyb3Bkb3duIHNvbWVudGUgYXF1aVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0xhenkgbG9hZCBlcnJvcjonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZmlndXJhIG8gZGVib3VuY2UgcGFyYSBvIGlucHV0IGRvIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEVzdGUgbcOpdG9kbyB1dGlsaXphIHVtIFN1YmplY3QgcGFyYSBlc2N1dGFyIGFzIG11ZGFuw6dhcyBubyB2YWxvciBkbyBpbnB1dCxcclxuICAgICAqIGFwbGljYW5kbyB1bSBkZWJvdW5jZSBjb20gbyB0ZW1wbyBkZWZpbmlkbyBwb3IgYHRoaXMuZGVsYXkoKWAuIFF1YW5kbyB1bSBub3ZvIHZhbG9yIMOpIGVtaXRpZG86XHJcbiAgICAgKiAtIFNlIGhvdXZlciB2YWxvciwgZmlsdHJhIGFzIHN1Z2VzdMO1ZXMgY29tIGJhc2Ugbm8gdGV4dG8gZGlnaXRhZG8gZSBhdHVhbGl6YSBhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxyXG4gICAgICogLSBTZSBuw6NvIGhvdXZlciB2YWxvciBlIG8gZHJvcGRvd24gZXN0aXZlciBhdGl2bywgcmVzZXRhIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxyXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGxpbXBhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXHJcbiAgICAgKiBUYW1iw6ltIGF0dWFsaXphIG8gZXN0YWRvIGRhIG1lbnNhZ2VtIGRlIGxpc3RhIHZhemlhIGUsIHNlIGEgc2VsZcOnw6NvIGZvciBsaXZyZSAoYGZvcmNlU2VsZWN0aW9uYCBmb3IgZmFsc28pLFxyXG4gICAgICogcHJvcGFnYSBhIG11ZGFuw6dhIGRlIHZhbG9yIHBhcmEgbyBmb3JtdWzDoXJpby5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NldHVwSW5wdXREZWJvdW5jZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkoKSksXHJcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUubGVuZ3RoID49IHRoaXMubWluTGVuZ3RoVG9TZWFyY2goKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApLFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbHRlcigoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gU3RyaW5nKHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBkYXRhW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPT09IDApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyb3Bkb3duKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVyZWRTdWdnZXN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFtdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9yY2VTZWxlY3Rpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIGF1dG9jb21wbGV0ZS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2UgYXMgc3VnZXN0w7VlcyBmb3JlbSBvYmpldG9zIGUgYHN1Z2dlc3Rpb25MYWJlbGAgbsOjbyBmb3IgZm9ybmVjaWRvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnMoKTtcclxuXHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGFzT2JqZWN0U3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5zb21lKFxyXG4gICAgICAgICAgICAoc3VnZ2VzdGlvbikgPT4gdHlwZW9mIHN1Z2dlc3Rpb24gPT09ICdvYmplY3QnICYmIHN1Z2dlc3Rpb24gIT09IG51bGwsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGhhc09iamVjdFN1Z2dlc3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3VnZ2VzdGlvbkxhYmVsIGlucHV0IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBzdWdnZXN0aW9ucyBhcmUgb2JqZWN0cy4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwiZmxleCBoLVszNXB4XSB3LWZ1bGwgaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVs0cHhdIGJvcmRlciBmb2N1cy13aXRoaW46Ym9yZGVyLTIgZm9jdXMtd2l0aGluOmJvcmRlci1wcmltYXJ5IGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgW2NsYXNzXT1cImlucHV0Q2xhc3MoKVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBib3JkZXItZ3JheXNjYWxlLTIwIGJnLWdyYXlzY2FsZS01IHRleHQtZ3JheXNjYWxlLTMwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLWF1dG8gYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCB0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICAnYm9yZGVyLWNyaXRpY2FsaXR5LXJlZCc6IGludmFsaWQoKSxcbiAgICB9XCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgZ2FwLTIgcHgtMlwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdib3JkZXItcic6IGRyb3Bkb3duKCksXG4gICAgICAgICAgICAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRyb3Bkb3duKCkgJiYgZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdib3JkZXItZ3JheXNjYWxlLTMwIGZvY3VzLXdpdGhpbjpib3JkZXItci0yIGZvY3VzLXdpdGhpbjpib3JkZXItci1wcmltYXJ5JzogZHJvcGRvd24oKSAmJiAhZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAnYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkgJiYgdmFsdWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHN1Z2dlc3Rpb24gb2YgdmFsdWVzKCk7IHRyYWNrIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtYXV0b2NvbXBsZXRlLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdWdnZXN0aW9uXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25MYWJlbF09XCJzdWdnZXN0aW9uTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZlSWNvbkNsYXNzXT1cInJlbW92ZUljb25DbGFzcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzdWdnZXN0aW9uUmVtb3ZlZCk9XCJyZW1vdmVTdWdnZXN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLWF1dG9jb21wbGV0ZS1jaGlwPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2lucHV0RWxcbiAgICAgICAgICAgIGNsYXNzPVwibWluLWgtWzM1cHhdIGdyb3cgb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpID8/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudHlwZV90b19zZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRWYWx1ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwibXVsdGlwbGUoKSA/ICdsaXN0JyA6ICdib3RoJ1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZEluZGV4KCkgPj0gMCA/IGZpbHRlcmVkU3VnZ2VzdGlvbnMoKVtmb2N1c2VkSW5kZXgoKV0uaWQgOiBudWxsXCJcbiAgICAgICAgICAgIHJvbGU9XCJzZWFyY2hib3hcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5VXApPVwib25LZXlVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChibHVyKT1cIm9uSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgLz5cblxuICAgICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYW5pbWF0ZS1zcGluXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGN4PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY3k9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByPVwiOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNDI4YmNhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjU2LjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZiAodmFsdWUoKSAmJiAhdGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNsZWFySWNvbkNsYXNzKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGRyb3Bkb3duKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LVszNXB4XSBmbGV4LXNocmluay0wIGZsZXgtZ3Jvdy0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmEtY2FyZXQtZG93bl09XCIhaXNPcGVuKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuQGlmIChzaG93RW1wdHlNZXNzYWdlKCkgfHwgKGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwICYmICFyZWFkb25seSgpKSkge1xuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgICAgICAoYmFja2Ryb3BDbGljayk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4gICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgICAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgICAgICBjbGFzcz1cIm10LTAuNSByb3VuZGVkLVs0cHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1heC1oLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAodmlydHVhbFNjcm9sbCgpICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1Z2dlc3Rpb24gb2YgZW5yaWNoZWRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gJGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5SWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHN1Z2dlc3Rpb24sIGkgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgICAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTsgdHJhY2sgc3VnZ2VzdGlvbi5pZDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzdWdnZXN0aW9uSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzdWdnZXN0aW9uLCBpIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93RW1wdHlNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxufVxuXG48bmctdGVtcGxhdGVcbiAgICAjc3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVxuICAgIGxldC1zdWdnZXN0aW9uPVwic3VnZ2VzdGlvblwiXG4gICAgbGV0LWk9XCJpXCJcbj5cbiAgICA8bGlcbiAgICAgICAgW2lkXT1cInN1Z2dlc3Rpb24uaWRcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQteHNtYWxsIGZsZXggY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMiB0ZXh0LWdyYXlzY2FsZS03MFwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMTBdPVwiaSA9PT0gZm9jdXNlZEluZGV4KClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTIwXT1cInN1Z2dlc3Rpb24uaXNTZWxlY3RlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwic3VnZ2VzdGlvbi5pc1NlbGVjdGVkXCJcbiAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24uZGF0YSlcIlxuICAgID5cbiAgICAgICAgQGlmIChjaGVja21hcmsoKSAmJiBtdWx0aXBsZSgpICYmIHN1Z2dlc3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgPGkgW2NsYXNzXT1cImNoZWNrSWNvbkNsYXNzKClcIj48L2k+XG4gICAgICAgIH1cbiAgICAgICAge3sgc3VnZ2VzdGlvbkxhYmVsKCkgPyBzdWdnZXN0aW9uLmRhdGFbc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IHN1Z2dlc3Rpb24uZGF0YSB9fVxuICAgIDwvbGk+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
|
|
@@ -3,15 +3,17 @@ import * as i0 from "@angular/core";
|
|
|
3
3
|
export class AutocompleteChipComponent {
|
|
4
4
|
suggestion = input.required();
|
|
5
5
|
suggestionLabel = input();
|
|
6
|
+
/** @description Classe do ícone do botão de remover o chip. @default 'far fa-times' */
|
|
7
|
+
removeIconClass = input('far fa-times');
|
|
6
8
|
suggestionRemoved = output();
|
|
7
9
|
removeSuggestion() {
|
|
8
10
|
this.suggestionRemoved.emit(this.suggestion());
|
|
9
11
|
}
|
|
10
12
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: AutocompleteChipComponent, isStandalone: true, selector: "s-autocomplete-chip", inputs: { suggestion: { classPropertyName: "suggestion", publicName: "suggestion", isSignal: true, isRequired: true, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { suggestionRemoved: "suggestionRemoved" }, ngImport: i0, template: "<div class=\"flex items-center gap-2 rounded-[4px] border border-grayscale-50 bg-grayscale-10 px-2\">\n <span class=\"text-nowrap\">{{ suggestionLabel() ? suggestion()[suggestionLabel()!] : suggestion() }}</span>\n <button (click)=\"removeSuggestion()\">\n <i class=\"
|
|
13
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: AutocompleteChipComponent, isStandalone: true, selector: "s-autocomplete-chip", inputs: { suggestion: { classPropertyName: "suggestion", publicName: "suggestion", isSignal: true, isRequired: true, transformFunction: null }, suggestionLabel: { classPropertyName: "suggestionLabel", publicName: "suggestionLabel", isSignal: true, isRequired: false, transformFunction: null }, removeIconClass: { classPropertyName: "removeIconClass", publicName: "removeIconClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { suggestionRemoved: "suggestionRemoved" }, ngImport: i0, template: "<div class=\"flex items-center gap-2 rounded-[4px] border border-grayscale-50 bg-grayscale-10 px-2\">\n <span class=\"text-nowrap\">{{ suggestionLabel() ? suggestion()[suggestionLabel()!] : suggestion() }}</span>\n <button (click)=\"removeSuggestion()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n</div>\n" });
|
|
12
14
|
}
|
|
13
15
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteChipComponent, decorators: [{
|
|
14
16
|
type: Component,
|
|
15
|
-
args: [{ selector: 's-autocomplete-chip', standalone: true, template: "<div class=\"flex items-center gap-2 rounded-[4px] border border-grayscale-50 bg-grayscale-10 px-2\">\n <span class=\"text-nowrap\">{{ suggestionLabel() ? suggestion()[suggestionLabel()!] : suggestion() }}</span>\n <button (click)=\"removeSuggestion()\">\n <i class=\"
|
|
17
|
+
args: [{ selector: 's-autocomplete-chip', standalone: true, template: "<div class=\"flex items-center gap-2 rounded-[4px] border border-grayscale-50 bg-grayscale-10 px-2\">\n <span class=\"text-nowrap\">{{ suggestionLabel() ? suggestion()[suggestionLabel()!] : suggestion() }}</span>\n <button (click)=\"removeSuggestion()\">\n <i [class]=\"removeIconClass()\"></i>\n </button>\n</div>\n" }]
|
|
16
18
|
}] });
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLWNoaXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2F1dG9jb21wbGV0ZS9zcmMvbGliL2F1dG9jb21wbGV0ZS9jb21wb25lbnRzL2F1dG9jb21wbGV0ZS1jaGlwL2F1dG9jb21wbGV0ZS1jaGlwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvY29tcG9uZW50cy9hdXRvY29tcGxldGUtY2hpcC9hdXRvY29tcGxldGUtY2hpcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBT3pELE1BQU0sT0FBTyx5QkFBeUI7SUFDM0IsVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUssQ0FBQztJQUNqQyxlQUFlLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFFMUMsdUZBQXVGO0lBQ2hGLGVBQWUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFeEMsaUJBQWlCLEdBQUcsTUFBTSxFQUFLLENBQUM7SUFFaEMsZ0JBQWdCO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0FYUSx5QkFBeUI7NEZBQXpCLHlCQUF5Qixra0JDUHRDLDhVQU1BOzs0RkRDYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0kscUJBQXFCLGNBRW5CLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWF1dG9jb21wbGV0ZS1jaGlwJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLWNoaXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUNoaXBDb21wb25lbnQ8VD4ge1xuICAgIHB1YmxpYyBzdWdnZXN0aW9uID0gaW5wdXQucmVxdWlyZWQ8VD4oKTtcbiAgICBwdWJsaWMgc3VnZ2VzdGlvbkxhYmVsID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2xhc3NlIGRvIMOtY29uZSBkbyBib3TDo28gZGUgcmVtb3ZlciBvIGNoaXAuIEBkZWZhdWx0ICdmYXIgZmEtdGltZXMnICovXG4gICAgcHVibGljIHJlbW92ZUljb25DbGFzcyA9IGlucHV0KCdmYXIgZmEtdGltZXMnKTtcblxuICAgIHB1YmxpYyBzdWdnZXN0aW9uUmVtb3ZlZCA9IG91dHB1dDxUPigpO1xuXG4gICAgcHVibGljIHJlbW92ZVN1Z2dlc3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc3VnZ2VzdGlvblJlbW92ZWQuZW1pdCh0aGlzLnN1Z2dlc3Rpb24oKSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtWzRweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtNTAgYmctZ3JheXNjYWxlLTEwIHB4LTJcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbm93cmFwXCI+e3sgc3VnZ2VzdGlvbkxhYmVsKCkgPyBzdWdnZXN0aW9uKClbc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IHN1Z2dlc3Rpb24oKSB9fTwvc3Bhbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJyZW1vdmVTdWdnZXN0aW9uKClcIj5cbiAgICAgICAgPGkgW2NsYXNzXT1cInJlbW92ZUljb25DbGFzcygpXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|