@seniorsistemas/angular-components 19.10.1 → 19.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.d.ts +6 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +3 -3
- package/esm2022/lib/locale/fallback.mjs +2 -1
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +2 -2
- package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +6 -4
- package/esm2022/select/lib/select/select.component.mjs +41 -8
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.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-select.mjs +45 -10
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +1 -0
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/package.json +1 -1
- package/select/README.md +18 -0
- package/select/lib/select/components/select-option/select-option.component.d.ts +3 -1
- package/select/lib/select/select.component.d.ts +17 -2
|
@@ -8,6 +8,8 @@ export class SelectOptionComponent {
|
|
|
8
8
|
checkmark = input.required();
|
|
9
9
|
isGrouper = input.required();
|
|
10
10
|
isFocused = input.required();
|
|
11
|
+
/** @description Modo somente leitura: a opção não responde a clique/teclado e não exibe hover. @default false */
|
|
12
|
+
readonly = input(false);
|
|
11
13
|
isSelected = model.required();
|
|
12
14
|
/** @description Classe do ícone de checkmark exibido quando a opção está selecionada. @default 'far fa-check' */
|
|
13
15
|
checkIconClass = input('far fa-check');
|
|
@@ -35,13 +37,13 @@ export class SelectOptionComponent {
|
|
|
35
37
|
setsize = input(null);
|
|
36
38
|
selected = output();
|
|
37
39
|
onClick() {
|
|
38
|
-
if (this.isGrouper()) {
|
|
40
|
+
if (this.isGrouper() || this.readonly()) {
|
|
39
41
|
return;
|
|
40
42
|
}
|
|
41
43
|
this.selected.emit();
|
|
42
44
|
}
|
|
43
45
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
44
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SelectOptionComponent, isStandalone: true, selector: "s-select-option", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: true, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: true, transformFunction: null }, isGrouper: { classPropertyName: "isGrouper", publicName: "isGrouper", isSignal: true, isRequired: true, transformFunction: null }, isFocused: { classPropertyName: "isFocused", publicName: "isFocused", isSignal: true, isRequired: true, transformFunction: null }, isSelected: { classPropertyName: "isSelected", publicName: "isSelected", isSignal: true, isRequired: true, transformFunction: null }, checkIconClass: { classPropertyName: "checkIconClass", publicName: "checkIconClass", isSignal: true, isRequired: false, transformFunction: null }, groupAnnouncement: { classPropertyName: "groupAnnouncement", publicName: "groupAnnouncement", isSignal: true, isRequired: false, transformFunction: null }, posinset: { classPropertyName: "posinset", publicName: "posinset", isSignal: true, isRequired: false, transformFunction: null }, setsize: { classPropertyName: "setsize", publicName: "setsize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isSelected: "isSelectedChange", selected: "selected" }, host: { attributes: { "role": "presentation" } }, ngImport: i0, template: "<div\n [attr.id]=\"id()\"\n [attr.role]=\"isGrouper() ? 'presentation' : 'option'\"\n [attr.aria-selected]=\"isGrouper() ? null : isSelected()\"\n [attr.aria-describedby]=\"groupAnnouncement() ? id() + '-group' : null\"\n [attr.aria-posinset]=\"isGrouper() ? null : posinset()\"\n [attr.aria-setsize]=\"isGrouper() ? null : setsize()\"\n class=\"flex select-none items-center gap-3 px-3 py-2\"\n [class.hover:bg-grayscale-10]=\"!isGrouper()\"\n [class.bg-grayscale-10]=\"!isGrouper() && isFocused()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onClick()\"\n (keydown.space)=\"onClick(); $event.preventDefault()\"\n>\n @if (!isGrouper() && checkmark() && !multiple() && isSelected()) {\n <i\n class=\"text-grayscale-60\"\n [class]=\"checkIconClass()\"\n aria-hidden=\"true\"\n ></i>\n }\n\n @if (!isGrouper() && multiple()) {\n <!-- aria-hidden: puramente visual \u2014 o clique borbulha pro (click) do pr\u00F3prio option acima,\n e o estado de sele\u00E7\u00E3o j\u00E1 \u00E9 comunicado pelo aria-selected do option. Sem isso, esse\n checkbox aninhado (sem aria-label, com seu pr\u00F3prio aria-checked independente) era um\n segundo objeto de acessibilidade \"concorrente\" anunciando o mesmo estado \u2014 reportado\n via NVDA: o leitor de tela anunciava esse checkbox (sem nome/posi\u00E7\u00E3o pr\u00F3pria) antes\n da op\u00E7\u00E3o correta ser anunciada. -->\n <s-checkbox\n [checked]=\"isSelected()\"\n aria-hidden=\"true\"\n ></s-checkbox>\n }\n <span\n [class]=\"isSelected() ? 'text-[#428BCA]' : 'text-grayscale-90'\"\n [class.font-bold]=\"isGrouper()\"\n >\n {{ label() }}\n </span>\n\n @if (groupAnnouncement()) {\n <!-- aria-hidden pra n\u00E3o entrar no nome acess\u00EDvel da op\u00E7\u00E3o (computado a partir do\n conte\u00FAdo de texto vis\u00EDvel) \u2014 o `aria-describedby` acima ainda consegue ler seu\n texto normalmente, j\u00E1 que essa leitura ignora deliberadamente o aria-hidden do\n elemento referenciado. Sem isso, o texto seria anunciado duas vezes (uma como\n parte do nome, outra como descri\u00E7\u00E3o). -->\n <span\n class=\"sr-only\"\n [id]=\"id() + '-group'\"\n aria-hidden=\"true\"\n >{{ groupAnnouncement() }}</span>\n }\n</div>\n\n", dependencies: [{ kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }] });
|
|
46
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SelectOptionComponent, isStandalone: true, selector: "s-select-option", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: true, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: true, transformFunction: null }, isGrouper: { classPropertyName: "isGrouper", publicName: "isGrouper", isSignal: true, isRequired: true, transformFunction: null }, isFocused: { classPropertyName: "isFocused", publicName: "isFocused", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, isSelected: { classPropertyName: "isSelected", publicName: "isSelected", isSignal: true, isRequired: true, transformFunction: null }, checkIconClass: { classPropertyName: "checkIconClass", publicName: "checkIconClass", isSignal: true, isRequired: false, transformFunction: null }, groupAnnouncement: { classPropertyName: "groupAnnouncement", publicName: "groupAnnouncement", isSignal: true, isRequired: false, transformFunction: null }, posinset: { classPropertyName: "posinset", publicName: "posinset", isSignal: true, isRequired: false, transformFunction: null }, setsize: { classPropertyName: "setsize", publicName: "setsize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isSelected: "isSelectedChange", selected: "selected" }, host: { attributes: { "role": "presentation" } }, ngImport: i0, template: "<div\n [attr.id]=\"id()\"\n [attr.role]=\"isGrouper() ? 'presentation' : 'option'\"\n [attr.aria-selected]=\"isGrouper() ? null : isSelected()\"\n [attr.aria-disabled]=\"!isGrouper() && readonly() ? true : null\"\n [attr.aria-describedby]=\"groupAnnouncement() ? id() + '-group' : null\"\n [attr.aria-posinset]=\"isGrouper() ? null : posinset()\"\n [attr.aria-setsize]=\"isGrouper() ? null : setsize()\"\n class=\"flex select-none items-center gap-3 px-3 py-2\"\n [class.hover:bg-grayscale-10]=\"!isGrouper() && !readonly()\"\n [class.bg-grayscale-10]=\"!isGrouper() && isFocused()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onClick()\"\n (keydown.space)=\"onClick(); $event.preventDefault()\"\n>\n @if (!isGrouper() && checkmark() && !multiple() && isSelected()) {\n <i\n class=\"text-grayscale-60\"\n [class]=\"checkIconClass()\"\n aria-hidden=\"true\"\n ></i>\n }\n\n @if (!isGrouper() && multiple()) {\n <!-- aria-hidden: puramente visual \u2014 o clique borbulha pro (click) do pr\u00F3prio option acima,\n e o estado de sele\u00E7\u00E3o j\u00E1 \u00E9 comunicado pelo aria-selected do option. Sem isso, esse\n checkbox aninhado (sem aria-label, com seu pr\u00F3prio aria-checked independente) era um\n segundo objeto de acessibilidade \"concorrente\" anunciando o mesmo estado \u2014 reportado\n via NVDA: o leitor de tela anunciava esse checkbox (sem nome/posi\u00E7\u00E3o pr\u00F3pria) antes\n da op\u00E7\u00E3o correta ser anunciada. -->\n <s-checkbox\n [checked]=\"isSelected()\"\n aria-hidden=\"true\"\n ></s-checkbox>\n }\n <span\n [class]=\"isSelected() ? 'text-[#428BCA]' : 'text-grayscale-90'\"\n [class.font-bold]=\"isGrouper()\"\n >\n {{ label() }}\n </span>\n\n @if (groupAnnouncement()) {\n <!-- aria-hidden pra n\u00E3o entrar no nome acess\u00EDvel da op\u00E7\u00E3o (computado a partir do\n conte\u00FAdo de texto vis\u00EDvel) \u2014 o `aria-describedby` acima ainda consegue ler seu\n texto normalmente, j\u00E1 que essa leitura ignora deliberadamente o aria-hidden do\n elemento referenciado. Sem isso, o texto seria anunciado duas vezes (uma como\n parte do nome, outra como descri\u00E7\u00E3o). -->\n <span\n class=\"sr-only\"\n [id]=\"id() + '-group'\"\n aria-hidden=\"true\"\n >{{ groupAnnouncement() }}</span>\n }\n</div>\n\n", dependencies: [{ kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }] });
|
|
45
47
|
}
|
|
46
48
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectOptionComponent, decorators: [{
|
|
47
49
|
type: Component,
|
|
@@ -51,6 +53,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
51
53
|
// e o role="option" do template interno (ver WAI-ARIA APG: wrappers entre um
|
|
52
54
|
// role pai e um role filho precisam de role="presentation"/"none").
|
|
53
55
|
role: 'presentation',
|
|
54
|
-
}, template: "<div\n [attr.id]=\"id()\"\n [attr.role]=\"isGrouper() ? 'presentation' : 'option'\"\n [attr.aria-selected]=\"isGrouper() ? null : isSelected()\"\n [attr.aria-describedby]=\"groupAnnouncement() ? id() + '-group' : null\"\n [attr.aria-posinset]=\"isGrouper() ? null : posinset()\"\n [attr.aria-setsize]=\"isGrouper() ? null : setsize()\"\n class=\"flex select-none items-center gap-3 px-3 py-2\"\n [class.hover:bg-grayscale-10]=\"!isGrouper()\"\n [class.bg-grayscale-10]=\"!isGrouper() && isFocused()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onClick()\"\n (keydown.space)=\"onClick(); $event.preventDefault()\"\n>\n @if (!isGrouper() && checkmark() && !multiple() && isSelected()) {\n <i\n class=\"text-grayscale-60\"\n [class]=\"checkIconClass()\"\n aria-hidden=\"true\"\n ></i>\n }\n\n @if (!isGrouper() && multiple()) {\n <!-- aria-hidden: puramente visual \u2014 o clique borbulha pro (click) do pr\u00F3prio option acima,\n e o estado de sele\u00E7\u00E3o j\u00E1 \u00E9 comunicado pelo aria-selected do option. Sem isso, esse\n checkbox aninhado (sem aria-label, com seu pr\u00F3prio aria-checked independente) era um\n segundo objeto de acessibilidade \"concorrente\" anunciando o mesmo estado \u2014 reportado\n via NVDA: o leitor de tela anunciava esse checkbox (sem nome/posi\u00E7\u00E3o pr\u00F3pria) antes\n da op\u00E7\u00E3o correta ser anunciada. -->\n <s-checkbox\n [checked]=\"isSelected()\"\n aria-hidden=\"true\"\n ></s-checkbox>\n }\n <span\n [class]=\"isSelected() ? 'text-[#428BCA]' : 'text-grayscale-90'\"\n [class.font-bold]=\"isGrouper()\"\n >\n {{ label() }}\n </span>\n\n @if (groupAnnouncement()) {\n <!-- aria-hidden pra n\u00E3o entrar no nome acess\u00EDvel da op\u00E7\u00E3o (computado a partir do\n conte\u00FAdo de texto vis\u00EDvel) \u2014 o `aria-describedby` acima ainda consegue ler seu\n texto normalmente, j\u00E1 que essa leitura ignora deliberadamente o aria-hidden do\n elemento referenciado. Sem isso, o texto seria anunciado duas vezes (uma como\n parte do nome, outra como descri\u00E7\u00E3o). -->\n <span\n class=\"sr-only\"\n [id]=\"id() + '-group'\"\n aria-hidden=\"true\"\n >{{ groupAnnouncement() }}</span>\n }\n</div>\n\n" }]
|
|
56
|
+
}, template: "<div\n [attr.id]=\"id()\"\n [attr.role]=\"isGrouper() ? 'presentation' : 'option'\"\n [attr.aria-selected]=\"isGrouper() ? null : isSelected()\"\n [attr.aria-disabled]=\"!isGrouper() && readonly() ? true : null\"\n [attr.aria-describedby]=\"groupAnnouncement() ? id() + '-group' : null\"\n [attr.aria-posinset]=\"isGrouper() ? null : posinset()\"\n [attr.aria-setsize]=\"isGrouper() ? null : setsize()\"\n class=\"flex select-none items-center gap-3 px-3 py-2\"\n [class.hover:bg-grayscale-10]=\"!isGrouper() && !readonly()\"\n [class.bg-grayscale-10]=\"!isGrouper() && isFocused()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onClick()\"\n (keydown.space)=\"onClick(); $event.preventDefault()\"\n>\n @if (!isGrouper() && checkmark() && !multiple() && isSelected()) {\n <i\n class=\"text-grayscale-60\"\n [class]=\"checkIconClass()\"\n aria-hidden=\"true\"\n ></i>\n }\n\n @if (!isGrouper() && multiple()) {\n <!-- aria-hidden: puramente visual \u2014 o clique borbulha pro (click) do pr\u00F3prio option acima,\n e o estado de sele\u00E7\u00E3o j\u00E1 \u00E9 comunicado pelo aria-selected do option. Sem isso, esse\n checkbox aninhado (sem aria-label, com seu pr\u00F3prio aria-checked independente) era um\n segundo objeto de acessibilidade \"concorrente\" anunciando o mesmo estado \u2014 reportado\n via NVDA: o leitor de tela anunciava esse checkbox (sem nome/posi\u00E7\u00E3o pr\u00F3pria) antes\n da op\u00E7\u00E3o correta ser anunciada. -->\n <s-checkbox\n [checked]=\"isSelected()\"\n aria-hidden=\"true\"\n ></s-checkbox>\n }\n <span\n [class]=\"isSelected() ? 'text-[#428BCA]' : 'text-grayscale-90'\"\n [class.font-bold]=\"isGrouper()\"\n >\n {{ label() }}\n </span>\n\n @if (groupAnnouncement()) {\n <!-- aria-hidden pra n\u00E3o entrar no nome acess\u00EDvel da op\u00E7\u00E3o (computado a partir do\n conte\u00FAdo de texto vis\u00EDvel) \u2014 o `aria-describedby` acima ainda consegue ler seu\n texto normalmente, j\u00E1 que essa leitura ignora deliberadamente o aria-hidden do\n elemento referenciado. Sem isso, o texto seria anunciado duas vezes (uma como\n parte do nome, outra como descri\u00E7\u00E3o). -->\n <span\n class=\"sr-only\"\n [id]=\"id() + '-group'\"\n aria-hidden=\"true\"\n >{{ groupAnnouncement() }}</span>\n }\n</div>\n\n" }]
|
|
55
57
|
}] });
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LW9wdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc2VsZWN0L3NyYy9saWIvc2VsZWN0L2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3QvY29tcG9uZW50cy9zZWxlY3Qtb3B0aW9uL3NlbGVjdC1vcHRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7QUFlaEYsTUFBTSxPQUFPLHFCQUFxQjtJQUN2QixFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO0lBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7SUFDakMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVcsQ0FBQztJQUNyQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO0lBQ3RDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFXLENBQUM7SUFDdEMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVcsQ0FBQztJQUU3QyxpSEFBaUg7SUFDMUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4QixVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO0lBRTlDLGlIQUFpSDtJQUMxRyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTlDOzs7Ozs7T0FNRztJQUNJLGlCQUFpQixHQUFHLEtBQUssQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFdEQ7Ozs7OztPQU1HO0lBQ0ksUUFBUSxHQUFHLEtBQUssQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFN0M7Ozs7T0FJRztJQUNJLE9BQU8sR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRXJDLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUVwQixPQUFPO1FBQ1YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBakRRLHFCQUFxQjs0RkFBckIscUJBQXFCLCt1RENqQmxDLDRpRkF3REEsNENEaERjLGlCQUFpQjs7NEZBU2xCLHFCQUFxQjtrQkFiakMsU0FBUzsrQkFDSSxpQkFBaUIsY0FFZixJQUFJLFdBQ1AsQ0FBQyxpQkFBaUIsQ0FBQyxRQUN0Qjt3QkFDRiw2RUFBNkU7d0JBQzdFLCtFQUErRTt3QkFDL0UsNkVBQTZFO3dCQUM3RSxvRUFBb0U7d0JBQ3BFLElBQUksRUFBRSxjQUFjO3FCQUN2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAncy1zZWxlY3Qtb3B0aW9uJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbQ2hlY2tib3hDb21wb25lbnRdLFxyXG4gICAgaG9zdDoge1xyXG4gICAgICAgIC8vIFNlbSByb2xlPVwicHJlc2VudGF0aW9uXCIgZXN0ZSBlbGVtZW50byBjdXN0b20gcG9kZSBxdWVicmFyLCBlbSBkZXRlcm1pbmFkYXNcclxuICAgICAgICAvLyBjb21iaW5hw6fDtWVzIGRlIG5hdmVnYWRvci9BVCwgYSByZWxhw6fDo28gQVJJQSBwYWkvZmlsaG8gZW50cmUgbyByb2xlPVwibGlzdGJveFwiXHJcbiAgICAgICAgLy8gZSBvIHJvbGU9XCJvcHRpb25cIiBkbyB0ZW1wbGF0ZSBpbnRlcm5vICh2ZXIgV0FJLUFSSUEgQVBHOiB3cmFwcGVycyBlbnRyZSB1bVxyXG4gICAgICAgIC8vIHJvbGUgcGFpIGUgdW0gcm9sZSBmaWxobyBwcmVjaXNhbSBkZSByb2xlPVwicHJlc2VudGF0aW9uXCIvXCJub25lXCIpLlxyXG4gICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxyXG4gICAgfSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlbGVjdE9wdGlvbkNvbXBvbmVudCB7XHJcbiAgICBwdWJsaWMgaWQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XHJcbiAgICBwdWJsaWMgbGFiZWwgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XHJcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dC5yZXF1aXJlZDxib29sZWFuPigpO1xyXG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0LnJlcXVpcmVkPGJvb2xlYW4+KCk7XHJcbiAgICBwdWJsaWMgaXNHcm91cGVyID0gaW5wdXQucmVxdWlyZWQ8Ym9vbGVhbj4oKTtcclxuICAgIHB1YmxpYyBpc0ZvY3VzZWQgPSBpbnB1dC5yZXF1aXJlZDxib29sZWFuPigpO1xyXG5cclxuICAgIC8qKiBAZGVzY3JpcHRpb24gTW9kbyBzb21lbnRlIGxlaXR1cmE6IGEgb3DDp8OjbyBuw6NvIHJlc3BvbmRlIGEgY2xpcXVlL3RlY2xhZG8gZSBuw6NvIGV4aWJlIGhvdmVyLiBAZGVmYXVsdCBmYWxzZSAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5ID0gaW5wdXQoZmFsc2UpO1xyXG5cclxuICAgIHB1YmxpYyBpc1NlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIENsYXNzZSBkbyDDrWNvbmUgZGUgY2hlY2ttYXJrIGV4aWJpZG8gcXVhbmRvIGEgb3DDp8OjbyBlc3TDoSBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgJ2ZhciBmYS1jaGVjaycgKi9cclxuICAgIHB1YmxpYyBjaGVja0ljb25DbGFzcyA9IGlucHV0KCdmYXIgZmEtY2hlY2snKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBUZXh0byBhbnVuY2lhZG8gdmlhIGBhcmlhLWRlc2NyaWJlZGJ5YCBpbmZvcm1hbmRvIGEgcXVlIGdydXBvIGVzdGEgb3DDp8Ojb1xyXG4gICAgICogcGVydGVuY2UuIE8gYWdydXBhZG9yIHZpc3VhbCB0ZW0gYHJvbGU9XCJwcmVzZW50YXRpb25cImAgKHNpbGVuY2lvc28gcHJvIGxlaXRvciBkZSB0ZWxhKSwgZVxyXG4gICAgICogYHNlbGVjdC5jb21wb25lbnQudHNgIHPDsyBwYXNzYSBlc3RlIGlucHV0IG5hIHByaW1laXJhIG9ww6fDo28gZGUgY2FkYSBncnVwbywgcHJhIG7Do28gcmVwZXRpclxyXG4gICAgICogbyBhbsO6bmNpbyBlbSB0b2RhIG9ww6fDo28gc3Vic2VxdWVudGUuXHJcbiAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBncm91cEFubm91bmNlbWVudCA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFBvc2nDp8OjbyAoMS1iYXNlZCkgZGVzdGEgb3DDp8OjbyBkZW50cm8gZG8gY29uanVudG8gbmF2ZWfDoXZlbCwgZXhwb3N0YSB2aWFcclxuICAgICAqIGBhcmlhLXBvc2luc2V0YC4gTmVjZXNzw6FyaW8gY29tIGB2aXJ0dWFsU2Nyb2xsYCwgasOhIHF1ZSBzw7MgdW1hIGphbmVsYSBkZSBvcMOnw7VlcyBleGlzdGUgZGVcclxuICAgICAqIGZhdG8gbm8gRE9NIGEgY2FkYSBtb21lbnRvIOKAlCBzZW0gaXNzbywgbyBsZWl0b3IgZGUgdGVsYSB0ZW50YSBpbmZlcmlyIGEgcG9zacOnw6NvIGNvbnRhbmRvXHJcbiAgICAgKiBvcyBgcm9sZT1cIm9wdGlvblwiYCBpcm3Do29zIHByZXNlbnRlcyBubyBET00sIG8gcXVlIGZpY2EgZXJyYWRvIG51bWEgbGlzdGEgdmlydHVhbGl6YWRhLlxyXG4gICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG9zaW5zZXQgPSBpbnB1dDxudW1iZXIgfCBudWxsPihudWxsKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBUYW1hbmhvIHRvdGFsIGRvIGNvbmp1bnRvIG5hdmVnw6F2ZWwgYW8gcXVhbCBlc3RhIG9ww6fDo28gcGVydGVuY2UsIGV4cG9zdG8gdmlhXHJcbiAgICAgKiBgYXJpYS1zZXRzaXplYC4gVmVyIGBwb3NpbnNldGAuXHJcbiAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRzaXplID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gICAgcHVibGljIHNlbGVjdGVkID0gb3V0cHV0KCk7XHJcblxyXG4gICAgcHVibGljIG9uQ2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNHcm91cGVyKCkgfHwgdGhpcy5yZWFkb25seSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCgpO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXZcbiAgICBbYXR0ci5pZF09XCJpZCgpXCJcbiAgICBbYXR0ci5yb2xlXT1cImlzR3JvdXBlcigpID8gJ3ByZXNlbnRhdGlvbicgOiAnb3B0aW9uJ1wiXG4gICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0dyb3VwZXIoKSA/IG51bGwgOiBpc1NlbGVjdGVkKClcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWlzR3JvdXBlcigpICYmIHJlYWRvbmx5KCkgPyB0cnVlIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJncm91cEFubm91bmNlbWVudCgpID8gaWQoKSArICctZ3JvdXAnIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1wb3NpbnNldF09XCJpc0dyb3VwZXIoKSA/IG51bGwgOiBwb3NpbnNldCgpXCJcbiAgICBbYXR0ci5hcmlhLXNldHNpemVdPVwiaXNHcm91cGVyKCkgPyBudWxsIDogc2V0c2l6ZSgpXCJcbiAgICBjbGFzcz1cImZsZXggc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIGdhcC0zIHB4LTMgcHktMlwiXG4gICAgW2NsYXNzLmhvdmVyOmJnLWdyYXlzY2FsZS0xMF09XCIhaXNHcm91cGVyKCkgJiYgIXJlYWRvbmx5KClcIlxuICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMTBdPVwiIWlzR3JvdXBlcigpICYmIGlzRm9jdXNlZCgpXCJcbiAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkNsaWNrKClcIlxuICAgIChrZXlkb3duLnNwYWNlKT1cIm9uQ2xpY2soKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuPlxuICAgIEBpZiAoIWlzR3JvdXBlcigpICYmIGNoZWNrbWFyaygpICYmICFtdWx0aXBsZSgpICYmIGlzU2VsZWN0ZWQoKSkge1xuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY2hlY2tJY29uQ2xhc3MoKVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9pPlxuICAgIH1cblxuICAgIEBpZiAoIWlzR3JvdXBlcigpICYmIG11bHRpcGxlKCkpIHtcbiAgICAgICAgPCEtLSBhcmlhLWhpZGRlbjogcHVyYW1lbnRlIHZpc3VhbCDigJQgbyBjbGlxdWUgYm9yYnVsaGEgcHJvIChjbGljaykgZG8gcHLDs3ByaW8gb3B0aW9uIGFjaW1hLFxuICAgICAgICAgICAgIGUgbyBlc3RhZG8gZGUgc2VsZcOnw6NvIGrDoSDDqSBjb211bmljYWRvIHBlbG8gYXJpYS1zZWxlY3RlZCBkbyBvcHRpb24uIFNlbSBpc3NvLCBlc3NlXG4gICAgICAgICAgICAgY2hlY2tib3ggYW5pbmhhZG8gKHNlbSBhcmlhLWxhYmVsLCBjb20gc2V1IHByw7NwcmlvIGFyaWEtY2hlY2tlZCBpbmRlcGVuZGVudGUpIGVyYSB1bVxuICAgICAgICAgICAgIHNlZ3VuZG8gb2JqZXRvIGRlIGFjZXNzaWJpbGlkYWRlIFwiY29uY29ycmVudGVcIiBhbnVuY2lhbmRvIG8gbWVzbW8gZXN0YWRvIOKAlCByZXBvcnRhZG9cbiAgICAgICAgICAgICB2aWEgTlZEQTogbyBsZWl0b3IgZGUgdGVsYSBhbnVuY2lhdmEgZXNzZSBjaGVja2JveCAoc2VtIG5vbWUvcG9zacOnw6NvIHByw7NwcmlhKSBhbnRlc1xuICAgICAgICAgICAgIGRhIG9ww6fDo28gY29ycmV0YSBzZXIgYW51bmNpYWRhLiAtLT5cbiAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9zLWNoZWNrYm94PlxuICAgIH1cbiAgICA8c3BhblxuICAgICAgICBbY2xhc3NdPVwiaXNTZWxlY3RlZCgpID8gJ3RleHQtWyM0MjhCQ0FdJyA6ICd0ZXh0LWdyYXlzY2FsZS05MCdcIlxuICAgICAgICBbY2xhc3MuZm9udC1ib2xkXT1cImlzR3JvdXBlcigpXCJcbiAgICA+XG4gICAgICAgIHt7IGxhYmVsKCkgfX1cbiAgICA8L3NwYW4+XG5cbiAgICBAaWYgKGdyb3VwQW5ub3VuY2VtZW50KCkpIHtcbiAgICAgICAgPCEtLSBhcmlhLWhpZGRlbiBwcmEgbsOjbyBlbnRyYXIgbm8gbm9tZSBhY2Vzc8OtdmVsIGRhIG9ww6fDo28gKGNvbXB1dGFkbyBhIHBhcnRpciBkb1xuICAgICAgICAgICAgIGNvbnRlw7pkbyBkZSB0ZXh0byB2aXPDrXZlbCkg4oCUIG8gYGFyaWEtZGVzY3JpYmVkYnlgIGFjaW1hIGFpbmRhIGNvbnNlZ3VlIGxlciBzZXVcbiAgICAgICAgICAgICB0ZXh0byBub3JtYWxtZW50ZSwgasOhIHF1ZSBlc3NhIGxlaXR1cmEgaWdub3JhIGRlbGliZXJhZGFtZW50ZSBvIGFyaWEtaGlkZGVuIGRvXG4gICAgICAgICAgICAgZWxlbWVudG8gcmVmZXJlbmNpYWRvLiBTZW0gaXNzbywgbyB0ZXh0byBzZXJpYSBhbnVuY2lhZG8gZHVhcyB2ZXplcyAodW1hIGNvbW9cbiAgICAgICAgICAgICBwYXJ0ZSBkbyBub21lLCBvdXRyYSBjb21vIGRlc2NyacOnw6NvKS4gLS0+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICAgICAgW2lkXT1cImlkKCkgKyAnLWdyb3VwJ1wiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+e3sgZ3JvdXBBbm5vdW5jZW1lbnQoKSB9fTwvc3Bhbj5cbiAgICB9XG48L2Rpdj5cblxuIl19
|